1 前言
CSS 作为网页样式的描述语言,在百度一直有着广泛的应用。本文档的目标是使 CSS 代码风格保持一致,容易被理解和被维护。
虽然本文档是针对 CSS 设计的,但是在使用各种 CSS 的预编译器(如 less、sass、stylus 等)时,适用的部分也应尽量遵循本文档的约定。
2 代码风格
2.1 空格
[强制] 选择器
与 {
之间必须包含空格。
示例:
|
|
[强制] 属性名
与之后的 :
之间不允许包含空格, :
与 属性值
之间必须包含空格。
示例:
|
|
[强制] 列表型属性值
书写在单行时,,
后必须跟一个空格。
示例:
|
|
2.4 行长度
[强制] 每行不得超过 120
个字符,除非单行不可分割。
解释:
常见不可分割的场景为URL超长。
[建议] 对于超长的样式,在样式值的 空格
处或 ,
后换行,建议按逻辑分组。
示例:
|
|
2.5 选择器
[强制] 当一个 rule 包含多个 selector 时,每个选择器声明必须独占一行。
示例:
|
|
[强制] >
、+
、~
选择器的两边各保留一个空格。
示例:
|
|
[强制] 属性选择器中的值必须用双引号包围。
解释:
不允许使用单引号,不允许不使用引号。
示例:
|
|
2.6 属性
[强制] 属性定义必须另起一行。
示例:
|
|
[强制] 属性定义后必须以分号结尾。
示例:
|
|
3 通用
3.1 选择器
[强制] 如无必要,不得为 id
、class
选择器添加类型选择器进行限定。
解释:
在性能和维护性上,都有一定的影响。
示例:
|
|
[建议] 选择器的嵌套层级应不大于 3
级,位置靠后的限定条件应尽可能精确。
示例:
|
|
3.2 属性缩写
[建议] 在可以使用缩写的情况下,尽量使用属性缩写。
示例:
|
|
[建议] 使用 border
/ margin
/ padding
等缩写时,应注意隐含值对实际数值的影响,确实需要设置多个方向的值时才使用缩写。
解释:
border
/ margin
/ padding
等缩写会同时设置多个属性的值,容易覆盖不需要覆盖的设定。如某些方向需要继承其他声明的值,则应该分开设置。
示例:
|
|
3.3 属性书写顺序
[建议] 同一 rule set 下的属性在书写时,应按功能进行分组,并以 Formatting Model(布局方式、位置) > Box Model(尺寸) > Typographic(文本相关) > Visual(视觉效果) 的顺序书写,以提高代码的可读性。
解释:
- Formatting Model 相关属性包括:
position
/top
/right
/bottom
/left
/float
/display
/overflow
等 - Box Model 相关属性包括:
border
/margin
/padding
/width
/height
等 - Typographic 相关属性包括:
font
/line-height
/text-align
/word-wrap
等 - Visual 相关属性包括:
background
/color
/transition
/list-style
等
另外,如果包含 content
属性,应放在最前面。
示例:
|
|
4 值与单位
4.1 文本
[强制] 文本内容必须用双引号包围。
解释:
文本类型的内容可能在选择器、属性值等内容中。
示例:
|
|
4.2 数值
[强制] 当数值为 0 - 1 之间的小数时,省略整数部分的 0
。
示例:
|
|
4.3 url()
[强制] url()
函数中的路径不加引号。
示例:
|
|
[建议] url()
函数中的绝对路径可省去协议名。
示例:
|
|
4.4 长度
[强制] 长度为 0
时须省略单位。 (也只有长度单位可省)
示例:
|
|
4.5 颜色
[强制] RGB颜色值必须使用十六进制记号形式 #rrggbb
。不允许使用 rgb()
。
解释:
带有alpha的颜色信息可以使用 rgba()
。使用 rgba()
时每个逗号后必须保留一个空格。
示例:
|
|
[强制] 颜色值可以缩写时,必须使用缩写形式。
示例:
|
|
[强制] 颜色值不允许使用命名色值。
示例:
|
|
[建议] 颜色值中的英文字符采用小写。如不用小写也需要保证同一项目内保持大小写一致。
示例:
|
|
5 文本编排
5.1 字体族
[强制] font-family
属性中的字体族名称应使用字体的英文 Family Name
,其中如有空格,须放置在引号中。
解释:
所谓英文 Family Name,为字体文件的一个元数据,常见名称如下:
字体 | 操作系统 | Family Name |
---|---|---|
宋体 (中易宋体) | Windows | SimSun |
黑体 (中易黑体) | Windows | SimHei |
微软雅黑 | Windows | Microsoft YaHei |
微软正黑 | Windows | Microsoft JhengHei |
华文黑体 | Mac/iOS | STHeiti |
冬青黑体 | Mac/iOS | Hiragino Sans GB |
文泉驿正黑 | Linux | WenQuanYi Zen Hei |
文泉驿微米黑 | Linux | WenQuanYi Micro Hei |
示例:
|
|
[强制] font-family
按「西文字体在前、中文字体在后」、「效果佳 (质量高/更能满足需求) 的字体在前、效果一般的字体在后」的顺序编写,最后必须指定一个通用字体族( serif
/ sans-serif
)。
解释:
更详细说明可参考本文。
示例:
|
|
[强制] font-family
不区分大小写,但在同一个项目中,同样的 Family Name
大小写必须统一。
示例:
|
|
5.2 字号
[强制] 需要在 Windows 平台显示的中文内容,其字号应不小于 12px
。
解释:
由于 Windows 的字体渲染机制,小于 12px
的文字显示效果极差、难以辨认。
5.3 行高
[建议] line-height
在定义文本段落时,应使用数值。
解释:
将 line-height
设置为数值,浏览器会基于当前元素设置的 font-size
进行再次计算。在不同字号的文本段落组合中,能达到较为舒适的行间间隔效果,避免在每个设置了 font-size
都需要设置 line-height
。
当 line-height
用于控制垂直居中时,还是应该设置成与容器高度一致。
示例:
|
|
6 变换与动画
[强制] 使用 transition
时应指定 transition-property
。
示例:
|
|
[建议] 尽可能在浏览器能高效实现的属性上添加过渡和动画。
解释:
见本文,在可能的情况下应选择这样四种变换:
transform: translate(npx, npx);
transform: scale(n);
transform: rotate(ndeg);
opacity: 0..1;
典型的,可以使用 translate
来代替 left
作为动画属性。
示例:
|
|
7 响应式
[强制] Media Query
不得单独编排,必须与相关的规则一起定义。
示例:
|
|
[强制] Media Query
如果有多个逗号分隔的条件时,应将每个条件放在单独一行中。
示例:
|
|
[建议] 尽可能给出在高分辨率设备 (Retina) 下效果更佳的样式。
8 兼容性
8.1 属性前缀
[强制] 带私有前缀的属性由长到短排列,按冒号位置对齐。
解释:
标准属性放在最后,按冒号对齐方便阅读,也便于在编辑器内进行多行编辑。
示例:
|
|
8.2 Hack
[建议] 需要添加 hack
时应尽可能考虑是否可以采用其他方式解决。
解释:
如果能通过合理的 HTML 结构或使用其他的 CSS 定义达到理想的样式,则不应该使用 hack 手段解决问题。通常 hack 会导致维护成本的增加。
[建议] 尽量使用 选择器 hack
处理兼容性,而非 属性 hack
。
解释:
尽量使用符合 CSS 语法的 selector hack,可以避免一些第三方库无法识别 hack 语法的问题。
示例:
|
|
[建议] 尽量使用简单的 属性 hack
。
示例:
|
|