前端面试题考点汇总

选择器

子选择器和后代选择器:

子选择器:(>)
后代选择器:(空格)

区别:> 作用于元素的第一代后代,空格作用于元素的所有后代。

属性选择器

(a[rel = "external"])

相邻选择器

(h1 + p)

继承

可继承的样式:

  1. font-size

  2. font-family

  3. color

  4. text-indent

不可继承的样式:

  1. border

  2. padding

  3. margin

  4. width

  5. height

优先级算法:

  1. 优先级就近原则,同权重情况下样式定义最近者为准;

  2. 载入样式以最后载入的定位为准;

  3. !important > id > class > tag

  4. important 比 内联优先级高,但内联比 id 要高

CSS3 新增伪类举例:

  • p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。

  • p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。

  • p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。

  • p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。

  • p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。

  • :enabled :disabled 控制表单控件的禁用状态。

  • :checked 单选框或复选框被选中。

display 的值及作用:

  1. block

  2. inline-block

  3. inline

  4. list-item 象块类型元素一样显示,并添加样式列表标记。

  5. none:隐藏元素,在页面中不占据空间

position 的值的定位区别:

  1. absolute 生成绝对定位的元素,相对于 static 定位以外的第一个祖先元素进行定位。

  2. fixed 生成固定定位的元素,相对于浏览器窗口进行定位(老 IE 不支持)。

  3. relative 生成相对定位的元素,相对于其在普通流中的位置进行定位。

  4. static 默认值(静态)。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right z-index 声明)。

  5. inherit 规定从父元素继承 position 属性的值。

css3新特性

  1. CSS3 实现圆角(border-radius),阴影(box-shadow)

  2. 对文字加特效(text-shadow、),线性渐变(gradient),转换(transform)

  3. transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋转, 缩放, 定位, 倾斜

  4. 增加了更多的 CSS 选择器 多背景 rgba

  5. 在 CSS3 中唯一引入的伪类是 ::selection.

  6. 媒体查询,多栏布局

  7. border-image

转换(transform)

  1. 平移
1
2
3
4
5
transform:translateX(-30px);  水平方向   左右,负正

transform:translateY(-30px); 垂直方向 正上;负下

transform:translate(-30px,30px); 斜
  1. 旋转 :角度
1
transform:rotate (180deg)
  1. 缩放:倍数
1
2
3
4
5
transform:scale

transform:scaleX

transform:scaleY
  1. 斜切:角度
1
2
3
4
5
transform:skew

transform:skewX

transform:skewY
  1. 过度:对运动过程进行控制
1
2
3
transition;all  2s  1s  ease;

属性名称 持续时间 延迟 运动方式(贝塞尔曲线)
  1. 阴影
1
box-shadow: 0px  0px  10px   10px  rgba(0,0,0,0.4)

第一个参数:水平方向 正 右; 负 左; 0 左右

第二个参数: 垂直方向 正上 ; 负下 ; 0 上下

第三个参数: 迷糊程度 值越大越模糊

第四个参数:阴影大小

第五个参数: 阴影颜色

第六个参数: 内阴影 inset;

  1. 文本阴影
1
text-shadow: 5px 5px 5px #FF0000;

边框图片

引入图片:
boder-image-source:url('');

设置边框图片的宽度:
boder-image-width:20px;

切片 九个区域 四个角 四个边 中间 fill:
boder-image-slice:45;

重复:
stretch 拉伸(默认)
repeat 重复(不完整)
round 重复(完整)
boder-image-repeat:round;

渐变

线性渐变

添加属性:background-image
linear-gradient(top,red,yellow);
第一参数:渐变开始的方向
第二参数:开始的颜色
第三参数:结束的颜色
颜色:关键字,十六进制,rgb,rgba
方向:关键字 left top bottom right
角度: 0deg
均匀的线性渐变
不均匀的线形渐变:(百分比 纯色)
linear-gradient(top,red 30%,yellow);
重复性渐变:
repeating-linear-gradient(top,red,yellow 20%);

径向渐变

添加属性:background-image
radial-gradient(at 30px 30px,red,yellow);
第一参数:中心点位置
第二参数:开始的颜色
第三参数:结束的颜色
不均匀径向渐变
重复性径向渐变:
repeating-gradial-gradient(red,yellow 20%);

文本修饰(下划线等)

上划线:h1 {text-decoration:overline}
删除线:h2 {text-decoration:line-through}
下划线:h3 {text-decoration:underline}
(不支持IE,Chrome,Safari):h4 {text-decoration:blink}

对BFC规范的理解

块格式化上下文(Block Formatting Context,BFC)是 Web 页面的可视化 CSS 渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。

BFC,块级格式化上下文,一个创建了新的 BFC 的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个 BFC 中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin 会发生折叠。

W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行布局,以及与其他元素的关系和相互作用。

CSS sprites

CSS Sprites 其实就是把网页中一些背景图片整合到一张图片文件中,再利用 CSS 的 “background-image”,”background-repeat”,”background-position” 的组合进行背景定位,background-position 可以用数字能精确的定位出背景图片的位置。这样可以减少很多图片请求的开销,因为请求耗时比较长;请求虽然可以并发,但是也有限制,一般浏览器都是 6 个。对于未来而言,就不需要这样做了,因为有了 http2。

DOCTYPE

  1. <!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器以何种模式来渲染文档。
  2. 严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。
  3. 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
  4. DOCTYPE 不存在或格式不正确会导致文档以混杂模式呈现。

    DOCTYPE类型

  5. 该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
  6. HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。
  7. XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。
  8. Standards (标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,而 Quirks(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。

HTML 与 XHTML

最主要的不同:
XHTML 元素必须被正确地嵌套。
XHTML 元素必须被关闭。
标签名必须用小写字母。
XHTML 文档必须拥有根元素。

html 常见兼容性问题

  1. png24 位的图片在 iE6 浏览器上出现背景
    解决方案:做成 PNG8,也可以引用一段脚本处理.

  2. 浏览器默认的 margin 和 padding 不同
    解决方案:加一个全局的 margin:0;padding:0; 来统一。

  3. IE6 双边距 bug:在 IE6 下,如果对元素设置了浮动,同时又设置了 margin-left 或 margin-right,margin 值会加倍。
    box float:left; width:10px; margin:0 0 0 10px;
    这种情况之下 IE 会产生 20px 的距离
    解决方案:在 float 的标签样式控制中加入 _display:inline; 将其转化为行内属性。( _ 这个符号只有 ie6 会识别)

  4. 渐进识别的方式,从总体中逐渐排除局部。
    首先,巧妙的使用 “\9” 这一标记,将 IE 游览器从所有情况中分离出来。
    接着,再次使用 “+” 将 IE8 和 IE7、IE6 分离开来,这样 IE8 已经独立识别。

1
2
3
4
5
6
.bb{
    background-color:#f1ee18; /所有识别/
    .background-color:#00deff\9; /IE6、7、8识别/
    +background-color:#a200ff; /IE6、7识别/
    background-color:#1e0bd1; /IE6识别/ 
}

5.IE 下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox 下, 只能使用 getAttribute() 获取自定义属性
解决方法:统一通过 getAttribute() 获取自定义属性
6. IE 下,event 对象有 x、y 属性,但是没有 pageX、pageY 属性; Firefox 下,event 对象有 pageX、pageY 属性,但是没有 x、y 属性
解决方法:(条件注释)缺点是在 IE 浏览器下可能会增加额外的 HTTP 请求数。
7. Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示
解决方法:可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决
8. 超链接访问过后 hover 样式就不出现了,被点击访问过的超链接样式不在具有 hover 和 active 了
解决方法:改变 CSS 属性的排列顺序 L-V-H-A

a:link {}
a:visited {}
a:hover {}
a:active {}

  1. 怪异模式问题:漏写 DTD 声明,Firefox 仍然会按照标准模式来解析网页,但在 IE 中会触发怪异模式。为避免怪异模式给我们带来不必要的麻烦,最好养成书写 DTD 声明的好习惯。现在可以使用 html5(http://www.w3.org/TR/html5/single-page.html) 推荐的写法:<!DOCTYPE html>

  2. 上下 margin 重合问题:ie 和 ff 都存在,相邻的两个 div 的 margin-left 和 margin-right 不会重合,但是 margin-top 和 margin-bottom 却会发生重合。
    解决方法:养成良好的代码编写习惯,同时采用 margin-top 或者同时采用 margin-bottom。

  3. ie6 对 png 图片格式支持不好
    解决方案:引用一段脚本处理

清除浮动

浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。

  1. 使用空标签清除浮动。
    这种方法是在所有浮动标签后面添加一个空标签 定义 css clear:both. 弊端就是增加了无意义标签。

  2. 使用 overflow。
    给包含浮动元素的父标签添加 css 属性 overflow:auto; zoom:1; zoom:1 用于兼容 IE6。可以给父元素设置 overflow:auto 或者 hidden。

  3. 使用 after 伪对象清除浮动。
    该方法只适用于非 IE 浏览器。具体写法可参照以下示例。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;

IE 8 以下版本的浏览器中的盒模型有什么不同

IE8 以下浏览器的盒模型中定义的元素的宽高包括内边距和边框

DOM 操作——怎样添加、移除、移动、复制、创建和查找节点。

  1. 创建新节点
    createDocumentFragment() // 创建一个DOM片段
    createElement() // 创建一个具体的元素
    createTextNode() // 创建一个文本节点

  2. 添加、移除、替换、插入
    appendChild()
    removeChild()
    replaceChild()
    insertBefore() // 在已有的子节点前插入一个新的子节点

  3. 查找
    getElementsByTagName() // 通过标签名称
    getElementsByName() // 通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
    getElementById() // 通过元素Id,唯一性

html5 有哪些新特性、移除了那些元素?如何处理 HTML5 新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

新特性:
HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。

  1. 拖拽释放 (Drag and drop) API
  2. 语义化更好的内容标签(header,nav,footer,aside,article,section)
  3. 音频、视频 API(audio,video)
  4. 画布 (Canvas) API
  5. 地理 (Geolocation) API
  6. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
  7. sessionStorage 的数据在浏览器关闭后自动删除
  8. 表单控件,calendar、date、time、email、url、search
  9. 新的技术 webworker, websocket, Geolocation

移除的元素:

  1. 纯表现的元素:basefont,big,center,font, s,strike,tt,u;
  2. 对可用性产生负面影响的元素:frame,frameset,noframes;

支持 HTML5 新标签:

  1. IE8/IE7/IE6 支持通过 document.createElement 方法产生的标签,可以利用这一特性让这些浏览器支持 HTML5 新标签,浏览器支持新标签后,还需要添加标签默认的样式(当然最好的方式是直接使用成熟的框架、使用最多的是 html5shiv 框架):
1
2
3
<!--[if lt IE 9]> 
<script> src="http://html5shiv.googlecode.com/svn/trunk/html5.js"</script> 
<![endif]-->

如何区分:
DOCTYPE 声明新增的结构元素、功能元素

iframe 的优缺点?

优点:

  1. 解决加载缓慢的第三方内容如图标和广告等的加载问题
  2. Security sandbox
  3. 并行加载脚本

缺点:

  1. iframe 会阻塞主页面的 Onload 事件
  2. 即时内容为空,加载也需要时间
  3. 没有语意

如何实现浏览器内多个标签页之间的通信?

使用本地存储方法

  1. cookie
    (1)客户端和服务器端都会请求服务器,性能下降
    (2)存储限制,4kb
    (3)页面的 cookie 是共享的

  2. storage
    只是在客户端使用,不会请求服务器处理, 存储量比较大, 只能存储字符串,非字符串的数据在存储之前会被转换为字符串
    1). sessionStorage

    临时性的,页面打开有,页面关闭没有 
    数据不共享 

    2).localStorage

    永久性的存储 
    数据共享 

    3).api

    clear()删除所有值,ff 中没有实现 
    getItem()根据指定的名字 name 获取对应的值 
    key(index)获得 index 处的值 
    removeItem(name)删除由 name 指定的明值对 
    setItem(name,value)

webSocket 如何兼容低浏览器?

Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHR

线程与进程的区别

进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体, 是 CPU 调度和分派的基本单位。

  1. 一个程序至少有一个进程, 一个进程至少有一个线程
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高
  3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别

如何对网站的文件和资源进行优化?

这道题考察《雅虎军规》

  1. 尽可能减少 http 请求次数,将 css, js, 图片各自合并
  2. 使用 CDN,降低通信距离
  3. 添加 Expire/Cache-Control 头
  4. 启用 Gzip 压缩文件
  5. 将 css 放在页面最上面
  6. 将 script 放在页面最下面
  7. 避免在 css 中使用表达式
  8. 将 css, js 都放在外部文件中
  9. 减少 DNS 查询
    1. 最小化 css, js,减小文件体积
  10. 避免重定向
  11. 移除重复脚本
  12. 配置实体标签 ETag
  13. 使用 AJAX 缓存,让网站内容分批加载,局部更新

六种减少页面加载时间的方法

  1. 优化图片
  2. 图像格式的选择(GIF:提供的颜色较少,可用在一些对颜色要求不高的地方)
  3. 优化 CSS(压缩合并 css,如 margin-top, margin-left…)
  4. 网址后加斜杠(如 www.campr.com / 目录,会判断这个目录是什么文件类型,或者是目录。)
  5. 标明高度和宽度(如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小,如果图片很多,浏览器需要不断地调整页面。这不但影响速度,也影响浏览体验。
    当浏览器知道了高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容。从而加载时间快了,浏览体验也更好了)
  6. 减少 http 请求(合并文件,合并图片)

你都使用哪些工具来测试代码的性能?(暂弃)

  1. Profiler
  2. JSPerf(http://jsperf.com/nexttick-vs-setzerotimeout-vs-settimeout)
  3. Dromaeo

什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?

FOUC - Flash Of Unstyled Content 文档样式闪烁

<style type="text/css" media="all">@import "../fouc.css";</style>
而引用 CSS 文件的 @import 就是造成这个问题的罪魁祸首。IE 会先加载整个 HTML 文档的 DOM,然后再去导入外部的 CSS 文件,因此,在页面 DOM 加载完成到 CSS 导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。
解决方法简单的出奇,只要在 <head> 之间加入一个 < link > 或者 < script > 元素就可以了。

本文作者:Yanng

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。

本文链接: https://blog.yanng.io/2018/08/03/%E7%89%9B%E5%AE%A2%E9%9D%A2%E8%AF%95%E9%A2%98%E6%89%8B%E8%AE%B0/