1. 文件
文件格式
- 字符编码 字符编码必须是UTF-8无BOM格式
- VS Code →
文件
›首选项
›设置
›文件
›Encoding
›utf8
- VS Code →
- 行尾序列 必须设置为Unix (LF)?
- VS Code →
文件
›首选项
›设置
›文件
›Eol
›\n
- VS Code →
文件名称
文件的名称必须使用英文单词,特殊情况下可使用汉语拼音缩写。
- 字母 必须全部小写
- e.g.
sidebar.css
- e.g.
- 单词 必须分开并且使用
-
连接- e.g.
social-media-widget.css
- e.g.
▲ 目录
2. 文档设置
本节展示了CSS文件的文档设置。
- 字符编码 必须在css文件第一行指定
- e.g.
@charset 'utf-8';
- 注意,必须要定义在 CSS 文件所有字符的前面(包括编码注释),
@charset
才会生效。
- e.g.
▲ 目录
1. 字符编码
字符编码必须在css文件第一行指定
✖ 错误
/* 字符编码 */
@charset "utf-8";
↳ 错误,因为 @charset
在 /* 字符编码 */
之后,没有设置在第一行。
✔ 正确
@charset "utf-8";
▲ 文档设置
3. 注释
本节介绍如何格式化和使用注释。
- 单行注释 必须独占一行,星号与内容之间必须保留一个空格。
- e.g.
/*·This is a comment·*/
- e.g.
- 多行注释 必须在他们自己的行上开始和结束,星号要一列对齐,星号与内容之间必须保留一个空格。
- e.g.
/**
↵
*·Line number one
↵
*·Line number two
↵
*/
- e.g.
- 单行样式注释 必须在该条样式属性后使用
空格
+单行注释
的样式。- e.g.
width:·10px;·/*·宽度10px·*/
- e.g.
- 文件注释 必须在顶部添加关于本文件/模块的注释。
▲ 目录
1. 单行注释
单行注释必须独占一行,星号与内容之间必须保留一个空格。
✖ 错误
/*
This is a comment
*/
↳ 错误,因为 /*
, This is a comment
和 */
应该在一行内。
/*This is a comment*/
↳ 错误,因为 This is a comment
的前后没有被空格包围。
✔ 正确
/* This is a comment */
2. 多行注释
多行注释必须在他们自己的行上开始和结束,星号要一列对齐,星号与内容之间必须保留一个空格。
✖ 错误
/** This is a comment
that spans multiple lines
*/
↳ 错误, 因为 /**
和 This is a comment
在一行上。
/**
*This is a comment
*that spans multiple lines
*/
↳ 错误, 因为 This is a comment
和 that spans multiple lines
之前没有空格。
✔ 正确
/**
* This is a comment
* that spans multiple lines
*/
3. 单行样式注释
单行样式注释必须在该条样式属性后使用空格+单行注释的样式。
✖ 错误
#foo {
position: relative;/* 设置定位方式 */
}
↳ 错误, 因为 /*
和 position: relative;
之间没有空格。
✔ 正确
#foo {
position: relative; /* 设置定位方式 */
}
4. 文件注释
文件注释必须在顶部添加关于本文件/模块的注释。
示例
@charset 'utf-8';
/**
* @name: 文件名或模块名
* @description: 文件或模块描述
* @author: author-name(mail-name@domain.com)
* author-name2(mail-name2@domain.com)
* @update: 2015-04-29 00:02
*/
▲ 注释
4. 格式化
本节概述了与css样式声明和空格相关的各种常规格式规则。
- 当规则声明块中有多个样式声明时,每条样式独占一行。
- 在规则声明块的左大括号
{
前加一个空格。 - 在样式属性的冒号
:
后面加上一个空格,前面不加空格。 - 在每条样式后面都以分号
;
结尾。 - 规则声明块的右大括号
}
独占一行。 - 每个规则声明间用空行分隔。
- 所有最外层引号使用单引号
'
。 - 当一个属性有多个属性值时,以逗号
,
分隔属性值,每个逗号后添加一个空格,当单个属性值过长时,每个属性值独占一行。 - 所有行禁止添加尾空格。
▲ 目录
示例
.footer,.header {
position: relative;
}
.content {
background:
linear-gradient(135deg, deeppink 25%, transparent 25%) -50px 0,
linear-gradient(225deg, deeppink 25%, transparent 25%) -50px 0,
linear-gradient(315deg, deeppink 25%, transparent 25%),
linear-gradient(45deg, deeppink 25%, transparent 25%);
}
.content::before {
content: '';
}
▲ 格式化
5. 样式属性顺序
单个样式规则下的属性在书写时,应按功能进行分组,并以 Positioning Model
> Box Model
> Typographic
> Visual
的顺序书写,提高代码的可读性。
- 如果包含
content
属性,应放在最前面; Positioning Model
布局方式、位置,相关属性包括:display / flex / float / position / top / right / bottom / left / z-index / ...
Box Model
盒模型,相关属性包括:width / height / padding / margin / border / overflow / ...
Typographic
文本排版,相关属性包括:line-height / text-align / word-wrap / font / ...
Visual
视觉外观,相关属性包括:color / background / list-style / transform / animation / transition / ...
Positioning Model
处在第一位,因为他可以使一个元素脱离正常文本流,并且覆盖盒模型相关的样式。盒模型紧跟其后,因为他决定了一个组件的大小和位置。其他属性只在组件内部起作用或者不会对前面两种情况的结果产生影响,所以他们排在后面。
▲ 目录
示例
.foo::before {
content: ' ';
display: block;
position: absolute;
top: 0;
left: 0;
z-index: 9999;
width: 0;
height: 0;
padding: 0;
margin: 0;
border: 0;
overflow: hidden;
line-height: 2;
text-align: center;
word-break: break-all;
word-wrap: break-word;
font-size: 16px;
color: #fff;
background: #f8f9fa;
transform: translateX(10px);
transition: all .3s;
}
▲ 样式属性顺序
6. 数值与单位
本节主要介绍了特殊数值和单位的书写规则。
- 当属性值或颜色参数为
0-1
之间的数时,省略小数点前的0
。 - 当
长度值
为0
时省略单位。 - 十六进制的颜色属性值使用小写和尽量简写。
flex
属性需要设置为0px
时应带单位。
▲ 目录
▲ 数值与单位
7. 最佳实践
- 使用Normalize.css重置样式
- 合理使用使用引号
- i.e. 正确
background-image: url('...');
, 错误background-image: url(...);
- i.e. 正确
- 避免使用
!important
- 尽量使用缩写属性
- e.g.
margin: 0 10px; background: url('...') no-repeat;
- e.g.
- 理解css选择器的权重
- 合理使用伪元素
- 兼容性
- 合适的嵌套层级
- 适当添加媒体查询完成一定的页面适配
- 添加浏览器前缀
- base64图片 禁止使用
▲ 目录
1. 使用Normalize.css重置样式
相比于传统的CSS reset
, Normalize.css
是一种现代的、为HTML5准备的优质替代方案,其体积也很小,而且还具有以下优点:
- 保护有用的浏览器样式而不是去掉他们。
- 一般化的样式:为大部分HTML元素提供。
- 修复浏览器自身的bug并保证各浏览器的一致性。
- 优化css可用性:用一些小技巧。
- 解释代码:有注释和详细的文档。
2. 合理使用使用引号
在某些样式中,会出现一些含有空格的关键字或者中文关键字,我们需要添加合适的引号保证代码的兼容性。
例如:
-
font-family
内使用引号当字体名字中间有空格,中文名字体及 Unicode 字符编码表示的中文字体,为了保证兼容性,都建议在字体两端添加单引号或者双引号:
body { font-family: 'Microsoft YaHei', '黑体-简', '\5b8b\4f53'; }
-
background-image
的url
内使用引号如果路径里面有空格,旧版 IE 是无法识别的,会导致路径失效,建议不管是否存在空格,都添加上单引号:
div { background-image: url('...'); }
3. 避免使用 !important
使用 !important
会造成代码难以维护,当你考虑使用 !important
的时候,请先考虑以下情形:
- 是否已经读懂所要维护的代码,考虑是否可以通过修改原来的样式实现页面效果。
- 是否可以通过增加选择器权重来实现。
- 是否可以通过其他方式实现效果。
如果以上情形都已经考虑,还是要用 !important
,那么请在这条样式前添加注释说明这么做的理由,提高代码的可维护性。
示例
.hide {
/* 将该类设置为最高权限隐藏类 */
display: none !important;
}
5. 理解css选择器的权重
浏览器是通过判断CSS优先级,来决定到底哪些属性值是与元素最为相关的,从而作用到该元素上。CSS选择器的合理组成规则决定了优先级,为此,我们需要对选择器的优先级及权重有深刻的理解,才可优雅地编写和维护CSS样式代码。
CSS选择器优先级顺序:
- 内联样式
- ID 选择器
- 伪类
- 属性选择器
- 类选择器
- 元素(类型)选择器
- 通用选择器
CSS选择器权重顺序:
- 内联样式,如:
style=""
,权值为1000
。 - ID选择器,如:
#content
,权值为100
。 - 类,伪类和属性选择器,如
.content
,权值为10
。 - 类型选择器和伪元素选择器,如
div p
,权值为1
。
注意:通用选择器(*),子选择器(>)和相邻同胞选择器(+)并不在这四个等级中,所以他们的权值都为0。
6. 合理使用伪元素
当只需要用到表现类的元素时,考虑使用伪元素。
示例
/* 添加一个小矩形 */
.foo::before {
content: ' ';
display: block;
position: absolute;
top: 2px;
left: 0;
width: 5px;
height: 10px;
...
}
7. 兼容性
在书写css规则时考虑兼容IE9,并添加浏览器回退样式。
示例
.foo {
border: 10px solid;
border-color: #000; /* IE9不支持border-image,添加此样式在IE9下会回退到具有没有渐变颜色的边框样式 */
border-image: linear-gradient(#000, #fff) 10;
}
8. 合适的嵌套层级
一般来说,书写CSS样式应总是从 id
开始,且一般情况下嵌套层级不超过 3
级,特殊情况下最多不超过 5
级。
✖ 错误
#first .second .third div ul li {
...
}
↳ 错误, 因为嵌套层级超过了 3
级。
✔ 正确
#first .second .third {
...
}
9. 适当添加媒体查询完成一定的页面适配
某些情况下,我们的样式需要对不同屏幕进行适配,如果不需要改变布局,可以通过 @media
规则直接写在该类的后面,如果是不同布局,如手机屏幕的分辨率,则在该样式文件的最后面统一书写。
示例
#main-container {
margin: 10px;
}
@media screen and (min-width: 1601px) {
#main-container {
margin: 20px;
}
}
10. 添加浏览器前缀
如果需要书写CSS3的样式属性,可通过编辑器插件或者webpack插件等形式为样式属性添加浏览器前缀。
如在 VS CODE
中可以安装 Autoprefixer
拓展插件,IDEA 和 Sublime 也有类似的工具。
11. base64图片
将图片转化为Base64后的的字符通常会占用较大的存储空间,css文件也会比原来大很多,因此在样式文件中使用base64是没有必要的,但这不意味着不可以在其他地方使用。
12. 禁止使用@important
与 <link>
相比,@import
更慢,使用这种方式将添加额外的页面请求,并可能导致其他无法预料的问题。