前端八股
- HTML部分
- 1、对HTML语义化的理解
- 2、DOCTYPE(文档类型) 的作用
- 3、script标签中defer和async的区别
- 4、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
- 5、浏览器是如何对 HTML5 的离线储存资源进行管理和加载
- 6、Canvas 和 SVG 的区别
- SVG
- Canvas
- 7、HTML5 drag API
- CSS部分
- 1、display 的block、inline和inline-block 的区别
- 2、link 和@import 的区别
- 3、CSS3 中有哪些新特性
- 4、对CSS Sprites的理解
- 5、常见的CSS布局单位
- 6、水平垂直居中的实现
- 7、对 BFC 的理解,如何创建 BFC
- 创建自适应两栏布局
- 8、position中的参数以及区别
- 9、元素的层叠顺序
- 10、如何解决1px问题?
- 11、对CSS工程化的理解
- 12、CSS优化和提高性能的方法有哪些?
- ① 加载性能
- ② 选择器性能
- ③ 渲染性能
- ④ 可维护性、健壮性
HTML部分
1、对HTML语义化的理解
语义化是指根据内容的结构化(内容语义化),选择合适的标签(代码语义化)。通俗来讲就是用正确的标签做正确的事情。
语义化的优点如下:
对机器友好,带有语义的文字表现力丰富,更适合搜索引擎的爬虫爬取有效信息,有利于 SEO。除此之外,语义类还支持读屏软件,根据文章可以自动生成目录;
对开发者友好,使用语义类标签增强了可读性,结构更加清晰,开发者能清晰的看出网页的结构,便于团队的开发与维护。
SEO是搜索引擎优化的英文缩写。通过对网站内容的调整,满足搜索引擎的排名需求
常见的语义化标签
① <header></header>
头部
② <nav></nav>
导航栏
③ <section></section>
区块,有语义化的div
④ <main></main>
主要区域
⑤ <article></article>
主要内容
⑥ <aside></aside>
侧边栏
⑦ <footer></footer>
底部
2、DOCTYPE(文档类型) 的作用
DOCTYPE 是 HTML5 中一种标准通用标记语言的文档类型声明,它的目的是告诉浏览器(解析器)应该以什么样(html 或 xhtml)的文档类型定义来解析文档,不同的渲染模式会影响浏览器对 CSS 代码甚至JavaScript 脚本的解析。它必须声明在 HTML文档的第一行。
浏览器渲染页面的两种模式(可以通过document.compatMode
获取,比如语雀官网的文档类型是CSS1Compat
):
CSS1Compat
:标准模式(Strick mode
),默认模式,浏览器使用 W3C的标准解析渲染页面。在标准模式中,浏览器以其支持的最高标准呈现页面。
BackCompat
:怪异模式(混杂模式)(Quick mode
),浏览器使用自己的怪异模式解析渲染页面。在怪异模式中,页面以一种比较宽松的向后兼容的方式显示。
3、script标签中defer和async的区别
如果没有defer
或async
属性,浏览器会立即加载并执行相应的脚本。它不会等待后续加载的文档元素,读取到就会开始加载和执行,这样就阻塞了后续文档的加载。
其中蓝色代表 js 脚本网络加载时间,红色代表 js 脚本执行时间,绿色代表 html 解析。
defer
和 async
属性都是去异步加载外部的 JS 脚本文件,它们都不会阻塞页面的解析,其区别如下:
① 执行顺序:多个带 async
属性的标签,不能保证加载的顺序;多个带defer
属性的标签,按照加载顺序执行;
② 脚本是否并行执行:async
属性,表示后续文档的加载和执行与 js脚本的加载和执行是并行进行的,即异步执行;defer
属性,加载后续文档的过程和 js 脚本的加载(此时仅加载不执行)是并行进行的(异步),js 脚本需要等到文档所有元素解析完成之后才执行,DOMContentLoaded
事件触发执行之前。
4、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
① 行内元素有:a b span img input select strong;
② 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p;
③ 空元素,即没有内容的 HTML 元素。空元素是在开始标签中关闭的,也就是空元素没有闭合标签:
- 常见的有:
<br>
、<hr>
、<img>
、<input>
、<link>
、<meta>
; - 鲜见的有:
<area>
、<base>
、<col>
、<colgroup>
、<command>
、<embed>
、<keygen>
、<param>
、<source>
、<track>
、<wbr>
。
5、浏览器是如何对 HTML5 的离线储存资源进行管理和加载
- ① 在线的情况下,浏览器发现 html 头部有 manifest 属性,它会请求manifest 文件,如果是第一次访问页面 ,那么浏览器就会根据manifest 文件的内容下载相应的资源并且进行离线存储。如果已经访问过页面并且资源已经进行离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest 文件与旧的manifest 文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,就会重新下载文件中的资源并进行离线存储。
- ② 离线的情况下,浏览器会直接使用离线存储的资源。
6、Canvas 和 SVG 的区别
SVG
SVG 可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言 XML 描述的 2D 图形的语言,SVG 基于 XML 就意味着 SVG DOM中的每个元素都是可用的,可以为某个元素附加 Javascript 事件处理器。在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。
特点如下:
- 不依赖分辨率
- 支持事件处理器
- 最适合带有大型渲染区域的应用程序(比如谷歌地图)
- 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
- 不适合游戏应用
Canvas
Canvas 是画布,通过 Javascript 来绘制 2D 图形,是逐像素进行渲染的。其位置发生改变,就会重新进行绘制。
特点如下:
- 依赖分辨率
- 不支持事件处理器
- 弱的文本渲染能力
- 能够以
.png
或.jpg
格式保存结果图像 - 最适合图像密集型的游戏,其中的许多对象会被频繁重绘
注:矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。
7、HTML5 drag API
dragstart
:事件主体是被拖放元素,在开始拖放被拖放元素时触发。darg
:事件主体是被拖放元素,在正在拖放被拖放元素时触发。dragenter
:事件主体是目标元素,在被拖放元素进入某元素时触发。dragover
:事件主体是目标元素,在被拖放在某元素内移动时触发。dragleave
:事件主体是目标元素,在被拖放元素移出目标元素是触发。drop
:事件主体是目标元素,在目标元素完全接受被拖放元素时触发。dragend
:事件主体是被拖放元素,在整个拖放操作结束时触发。
CSS部分
1、display 的block、inline和inline-block 的区别
① block:会独占一行,多个元素会另起一行,可以设置width、height、margin和padding属性,默认排列从上到下。
② inline:元素不会独占一行,设置width、height属性无效;可以设置水平方向的 margin 和 padding 属性,不能设置垂直方向的 padding 和 margin;不会自动换行。
③ inline-block:将对象设置为inline对象,但内容作为block对象呈现,之后的内联对象会被排列在同一行内。
2、link 和@import 的区别
两者都是外部引用CSS的方式,区别如下:
① link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS。
② link引入CSS时,在页面载入时同时加载;@import需要页面完全载入后加载。
③ link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。
④ link支持使用JavaScript控制DOM去改变样式;@import不支持。
3、CSS3 中有哪些新特性
- 新增CSS选择器:
not(.input)
所有 class 不是“input”
的节点 - 圆角 (
border-radius:8px
) - 多列布局 (
multi-column layout
) - 阴影和反射 (
Shadoweflect
) - 文字特效 (
text-shadow
) - 文字渲染 (
Text-decoration
) - 线性渐变 (
gradient
) - 旋转 (
transform
) - 增加了旋转,缩放,定位,倾斜,动画,多背景
4、对CSS Sprites的理解
CSSSprites(精灵图),将一个页面涉及到的所有图片都包含到一张大图中去,然后利用 CSS 的 background-image
,background-repeat
,background-position
属性的组合进行背景定位。
优点
- 利用 CSS Sprites 能很好地减少网页的 http 请求,从而大大提高了页面的性能,这是 CSS Sprites 最大的优点;CSS Sprites 能减少图片的字节,把 3 张图片合并成 1 张图片的字节总是小于这 3 张图片的字节总和。
缺点
- 缺点:在图片合并时,要把多张图片有序的、合理的合并成一张图片,还要留好足够的空间,防止板块内出现不必要的背景。在宽屏及高分辨率下的自适应页面,如果背景不够宽,很容易出现背景断裂;
- CSS Sprites 在开发的时候相对来说有点麻烦,需要借助 photoshop或其他工具来对每个背景单元测量其准确的位置。
- 维护方面:CSS Sprites 在维护的时候比较麻烦,页面背景有少许改动时,就要改这张合并的图片,无需改的地方尽量不要动,这样避免改动更多的 CSS,如果在原来的地方放不下,又只能(最好)往下加图片,这样图片的字节就增加了,还要改动 CSS。
5、常见的CSS布局单位
常用的布局单位包括:像素(px
),百分比(%
),em
,rem
,vw/vh
。
① 像素(px
)是页面布局的基础,一个像素表示终端(电脑、手机、平板等)屏幕所能显示的最小的区域,像素分为两种类型:CSS像素和物理像素
- CSS 像素:为 web 开发者提供,在 CSS 中使用的一个抽象单位;
- 物理像素:只与设备的硬件密度有关,任何设备的物理像素都是固定的
②百分比(%
),当浏览器的宽度或者高度发生变化时,通过百分比单位可以使得浏览器中的组件的宽和高随着浏览器的变化而变化,从而实现响应式的效果。一般认为子元素的百分比相对于直接父元素。
③ em
和 rem
相对于 px
更具灵活性,它们都是相对长度单位,它们之间的区别:em
相对于父元素,rem
相对于根元素。
em
: 文本相对长度单位。相对于当前对象内文本的字体尺寸。如果当前行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸(默认16px
)。(相对父元素的字体大小倍数)。rem
:rem
是 CSS3 新增的一个相对单位,相对于根元素(html
元素)的 font-size 的倍数。作用:利用rem
可以实现简单的响应式布局,可以利用html
元素中字体的大小与屏幕间的比值来设置font-size
的值,以此实现当屏幕分辨率变化时让元素也随之变化。
④ vw/vh
是与视图窗口有关的单位,vw
表示相对于视图窗口的宽度,vh
表示相对于视图窗口高度,除了 vw
和vh
外,还有 vmin
和 vmax
两个相关的单位。
vw
:相对于视窗的宽度,视窗宽度是100vw
;vh
:相对于视窗的高度,视窗高度是100vh
;vmin
:vw
和vh
中的较小值;vmax
:vw
和vh
中的较大值
vw/vh
和百分比很类似,两者的区别:
百分比(%
):大部分相对于祖先元素,也有相对于自身的情况比如(border-radius
、translate
等)
vw/vh
:相对于视窗的尺寸
6、水平垂直居中的实现
① 利用绝对定位,先将元素的左上角通过 top:50%
和 left:50%
定位到页面的中心,然后再通过 translate
来调整元素的中心点到页面的中心。该方法需要考虑浏览器兼容问题。
.parent{
position: relative;
}
.child{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
② 利用绝对定位,设置四个方向的值都为 0,并将 margin 设置为 auto,由于宽高固定,因此对应方向实现平分,可以实现水平和垂直方向上的居中。该方法适用于盒子有宽高的情况
.parent{
position: relative;
}
.child{
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
③ 利用绝对定位,先将元素的左上角通过 top:50%
和 left:50%
定位到页面的中心,然后再通过 margin 负值来调整元素的中心点到页面的中心。该方法适用于盒子宽高已知的情况
.parent{
position: relative;
}
.child{
width: 100px;
height: 100px;
background-color: red;
position: absolute;
top: 50%;
left: 50%;
margin-top: -50px; /* 自身height的一半 */
margin-left: -50px; /* 自身width的一半 */
}
④ 使 用 flex 布 局(弹性盒子) ,通 过 align-items:center
和justify-content:center
设置容器的垂直和水平方向上为居中对齐,然后它的子元素也可以实现垂直和水平的居中。该方法要考虑兼容的问题,该方法在移动端用的较多:
.parent{
display: flex;
justify-content: center;
align-items: center;
}
7、对 BFC 的理解,如何创建 BFC
- Box: Box 是 CSS 布局的对象和基本单位,一个页面是由很多个 Box组成的,这个 Box 就是我们所说的盒模型。
- Formatting context:块级上下⽂格式化,它是⻚⾯中的⼀块渲染区域,并且有⼀套渲染规则,它决定了其⼦元素将如何定位,以及和其他元素的关系和相互作⽤。
- 块格式化上下文(Block Formatting Context,BFC)是 Web 页面的可视化 CSS 渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。
通俗来讲:BFC 是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定规则进行物品摆放,并且不会影响其它环境中的物品。如果一个元素符合触发 BFC 的条件,则 BFC 中的元素布局不受外部影响。
创建BFC的条件
- 根元素:body;
- 元素设置浮动:float 除 none 以外的值;
- 元素设置绝对定位:position (absolute、fixed);
- display 值为:inline-block、table-cell、table-caption、flex等;
- overflow 值为:hidden、auto、scroll;
BFC的特点
- 垂直方向上,自上而下排列,和文档流的排列方式一致。
- 在 BFC 中上下相邻的两个容器的 margin 会重叠
- 计算 BFC 的高度时,需要计算浮动元素的高度
- BFC 区域不会与浮动的容器发生重叠
- BFC 是独立的容器,容器内部元素不会影响外部元素
- 每个元素的左 margin 值和容器的左 border 相接触
BFC的作用
- 解决 margin 的重叠问题:由于 BFC 是一个独立的区域,内部的元素和外部的元素互不影响,将两个元素变为两个 BFC,就解决了 margin重叠的问题。
- 解决高度塌陷的问题:在对子元素设置浮动后,父元素会发生高度塌陷,也就是父元素的高度变为 0。解决这个问题,只需要把父元素变成一个 BFC。常用的办法是给父元素设置
overflow:hidden
。
创建自适应两栏布局
创建自适应两栏布局:左边的宽度固定,右边的宽度自适应
<style>
.left{
width: 100px;
height: 200px;
background-color: red;
float: left;
}
.right{
height: 300px;
background-color: blue;
overflow: hidden;
}
</style>
<div class="left"></div>
<div class="right"></div>
左侧设置
float:left
,右侧设置overflow: hidden
。这样右边就触发了 BFC,BFC 的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠,实现了自适应两栏布局。
8、position中的参数以及区别
① 静态定位:static(默认值)
元素在文档流中正常定位,不受其他定位属性影响。(忽略 top, bottom, left, right 或者 z-index声明)
② 相对定位:relative
元素相对于其正常位置进行定位,通过设置top、right、bottom和left属性来调整元素的位置。相对定位不会影响其他元素的位置。可通过z-index进行层次分级。
③ 绝对定位:absolute
元素相对于其最近的已定位祖先元素进行定位,如果没有已定位的祖先元素,则相对于文档的body元素进行定位。通过设置top、right、bottom和left属性来调整元素的位置。绝对定位会影响其他元素的位置。而且不论元素是行内元素还是块级元素,都会生成一个块级框,也就是例如行内元素span设置了absolute后就可以设置height和width属性。可通过z-index进行层次分级。
④ 固定定位:fixed
元素相对于浏览器窗口进行定位,即使页面滚动,元素的位置也不会改变。通过设置top、right、bottom和left属性来调整元素的位置。固定定位会影响其他元素的位置。可通过z-index进行层次分级。
⑤ sticky
元素在滚动时表现为相对定位和固定定位的混合。当元素在容器中可见时,它的行为类似于相对定位,当元素滚出容器时,它的行为类似于固定定位。通过设置top、right、bottom和left属性来调整元素的位置。
9、元素的层叠顺序
层叠顺序,英文称作 stacking order,表示元素发生层叠时有着特定的垂直显示顺序。
对于上图,由上到下分别是:
① 背景和边框:建立当前层叠上下文元素的背景和边框。
② 负的 z-index:当前层叠上下文中,z-index 属性值为负的元素。
③ 块级盒:文档流内非行内级非定位后代元素。
④ 浮动盒:非定位浮动元素。
⑤ 行内盒:文档流内行内级非定位后代元素。
⑥ z-index=0:层叠级数为 0 的定位元素。
⑦ 正 z-index:z-index 属性值为正的定位元素。
注意: 当定位元素 z-index:auto,生成盒在当前层叠上下文中的层
级为 0,不会建立新的层叠上下文,除非是根元素。
10、如何解决1px问题?
1px 问题指的是:在一些 Retina 屏幕 的机型上,移动端页面的 1px会变得很粗,呈现出不止 1px 的效果。原因很简单——CSS 中的 1px并不能和移动设备上的 1px 划等号。它们之间的比例关系有一个专门的属性来描述:
window.devicePixelRatio = 设备的物理像素/CSS像素
打开 Chrome 浏览器,启动移动端调试模式,在控制台去输出这个devicePixelRatio 的值。这里选中 iPhone 14 Pro Max的机型,输出的结果就是 3:
这就意味着设置的 1px CSS 像素,在这个设备上实际会用3个物理像素单元来进行渲染,所以实际看到的一定会比 1px 粗一些。
解决思路1
可以先在 JS 中拿到window.devicePixelRatio
的值,然后把这个值通过 JSX 或者模板语法给到CSS的data里,达到效果。
例如使用JSX语法:
<div id='container' data-device={{window.devicePixelRatio}}></div>
然后就可以在 CSS 中用属性选择器来命中devicePixelRatio
为某一值的情况,比如说这里尝试命中devicePixelRatio
为2的情况:
#container[data-device="2"]{
/* 直接把1px改成 1/devicePixelRatio 后的值 */
}
直接把 1px 改成
1/devicePixelRatio
后的值,这是目前为止最简单的一种方法。这种方法的缺陷在于兼容性不行,IOS 系统需要 8 及以上的版本,安卓系统则直接不兼容。
解决思路2:伪元素先放大后缩小
这个方法的可行性会更高,兼容性也更好。唯一的缺点是代码会变多。思路是先放大、后缩小:在目标元素的后面追加一个 ::after
伪元素,让这个元素布局为 absolute
之后、整个伸展开铺在目标元素上,然后把它的宽和高都设置为目标元素的两倍,比如border 值设为 1px。接着借助 CSS 动画特效中的放缩能力,把整个伪元素缩小为原来50%。此时,伪元素的宽高刚好可以和原有的目标元素对齐,而 border也缩小为了 1px 的二分之一,间接地实现了 0.5px 的效果。
#container[data-device="2"]{
position: relative;
}
#container[data-device="2"]::after{
position: absolute;
top: 0;
left: 0;
width: 200%;
height: 200%;
content: "";
transform: scale(0.5);
transform-origin: left top;
box-sizing: border-box;
border: 1px solid #000;
}
11、对CSS工程化的理解
CSS 工程化是为了解决以下问题:
① 宏观设计:CSS 代码如何组织、如何拆分、模块结构怎样设计?
② 编码优化:怎样写出更好的 CSS?
③ 构建:如何处理我的 CSS,才能让它的打包结果最优?
④ 可维护性:代码写完了,如何最小化它后续的变更成本?如何确保任何一个同事都能轻松接手?
以下三个方向都是时下比较流行的、普适性非常好的 CSS 工程化实践:
① 预处理器:Less、 Sass 等;
为什么要用预处理器?它的出现是为了解决什么问题?
预处理器,其实就是 CSS 世界的“轮子”。预处理器支持我们写一种类似 CSS、但实际并不是 CSS 的语言,然后把它编译成 CSS 代码。
随着前端业务复杂度的提高,前端工程中对 CSS 提出了以下的诉:
① 宏观设计上:我们希望能优化 CSS 文件的目录结构,对现有的 CSS文件实现复用;
② 编码优化上:我们希望能写出结构清晰、简明易懂的 CSS,需要它具有一目了然的嵌套层级关系,而不是无差别的一铺到底写法;我们希望它具有变量特征、计算能力、循环能力等等更强的可编程性,这样我们可以少写一些无用的代码;
③ 可维护性上:更强的可编程性意味着更优质的代码结构,实现复用意味着更简单的目录结构和更强的拓展能力,这两点如果能做到,自然会带来更强的可维护性。
这三点是传统 CSS 所做不到的,也正是预处理器所解决掉的问题。
预处理器普遍会具备这样的特性:
- 嵌套代码的能力,通过嵌套来反映不同 css 属性之间的层级关系
- 支持定义 css 变量;
- 提供计算函数;
- 允许对代码片段进行 extend 和 mixin;
- 支持循环语句的使用;
- 支持将 CSS 文件模块化,实现复用
② 重要的工程化插件: PostCss;
PostCss 是如何工作的?我们在什么场景下会使用PostCss?
PostCss 仍然是一个对 CSS 进行解析和处理的工具。
它和预处理器的不同就在于,预处理器处理的是 类 CSS,而 PostCss处理的就是 CSS 本身。Babel 可以将高版本的 JS 代码转换为低版本的 JS 代码。PostCss 做的是类似的事情:它可以编译尚未被浏览器广泛支持的先进的 CSS 语法,还可以自动为一些需要额外兼容的语法增加前缀。更强的是,由于 PostCss 有着强大的插件机制,支持各种各样的扩展,极大地强化了 CSS 的能力。
PostCss 在业务中的使用场景非常多:
① 提高 CSS 代码的可读性:PostCss 其实可以做类似预处理器能做的工作;
② 当 我 们 的 CSS 代 码 需 要 适 配 低 版 本 浏 览 器 时 , PostCss 的Autoprefixer 插件可以帮助我们自动增加浏览器前缀;
③ 允许我们编写面向未来的 CSS:PostCss 能够帮助我们编译 CSS next 代码。
③ Webpack loader 等 。
Webpack 能处理 CSS 吗?如何实现?
Webpack 能处理 CSS 吗:
① Webpack 在裸奔的状态下,是不能处理 CSS 的,Webpack 本身是一个面向 JavaScript 且只能处理 JavaScript 代码的模块化打包工具;
② Webpack 在 loader 的辅助下,是可以处理 CSS 的。
如何用 Webpack 实现对 CSS 的处理:
Webpack 中操作 CSS 需要使用的两个关键的 loader:css-loader
和style-loader
①css-loader
:导入 CSS 模块,对 CSS 代码进行编译处理;
②style-loader
:创建 style 标签,把 CSS 内容写入标签。
在实际使用中,css-loader
的执行顺序一定要安排在style-loader
的前面。因为只有完成了编译过程,才可以对 css 代码进行插入;若提前插入了未编译的代码,那么 webpack 是无法理解这坨东西的,它会无情报错。
12、CSS优化和提高性能的方法有哪些?
① 加载性能
- css 压缩:将写好的 css 进行打包压缩,可以减小文件体积。
- css 单一样式:当需要下边距和左边距的时候,很多时候会选择使用
margin:top 0 bottom 0;
,但margin-bottom:bottom;margin-left:left;
执行效率会更高。 - 减少使用
@import
,建议使用link
,因为后者在页面加载时一起加载,前者是等待页面加载完成之后再进行加载。
② 选择器性能
- 关键选择器(key selector)。选择器的最后面的部分为关键选择器(即用来匹配目标元素的部分)。CSS 选择符是从右到左进行匹配的。当使用后代选择器的时候,浏览器会遍历所有子元素来确定是否是指定的元素等等;
- 如果规则拥有 ID 选择器作为其关键选择器,则不要为规则增加标签。过滤掉无关的规则(这样样式系统就不会浪费时间去匹配它们了)。
- 避免使用通配规则,如
*{}
计算次数惊人,只对需要用到的元素进行选择。 - 尽量少的去对标签进行选择,而是用
class
。 - 尽量少的去使用后代选择器,降低选择器的权重值。后代选择器的开销是最高的,尽量将选择器的深度降到最低,最高不要超过三层,更多的使用类来关联每一个标签元素。
- 了解哪些属性是可以通过继承而来的,然后避免对这些属性重复指定规则
③ 渲染性能
- 慎重使用高性能属性:浮动、定位。
- 尽量减少页面重排、重绘。
- 去除空规则:
{}
。空规则的产生原因一般来说是为了预留样式。去除这些空规则无疑能减少 css 文档体积。 - 属性值为 0 时,不加单位。
- 属性值为浮动小数
0.**
,可以省略小数点之前的 0。 - 标准化各种浏览器前缀:带浏览器前缀的在前。标准属性在后。
- 不使用
@import
前缀,它会影响 css 的加载速度。 - 选择器优化嵌套,尽量避免层级过深。
- css 雪碧图,同一页面相近部分的小图标,方便使用,减少页面的请求次数,但是同时图片本身会变大,使用时,优劣考虑清楚,再使用。
- 正确使用
display
的属性,由于display
的作用,某些样式组合会无效,徒增样式体积的同时也影响解析性能。 - 不滥用 web 字体。对于中文网站来说 WebFonts 可能很陌生,国外却很流行。web fonts 通常体积庞大,而且一些浏览器在下载 web fonts 时会阻塞页面渲染损伤性能。
④ 可维护性、健壮性
- 将具有相同属性的样式抽离出来,整合并通过 class 在页面中进行使用,提高 css 的可维护性。
- 样式与内容分离:将 css 代码定义到外部 css 中。