1
+ < div class ="heading " id ="css ">
2
+ < h2 > CSS</ h2 >
3
+ </ div >
4
+
5
+ < div class ="section " id ="css-syntax ">
6
+ < div class ="col ">
7
+ < h3 > 语法</ h3 >
8
+ < ul >
9
+ < li > 使用四个空格的 soft tabs — 这是保证代码在各种环境下显示一致的唯一方式。</ li >
10
+ < li > 使用组合选择器时,保持每个独立的选择器占用一行。</ li >
11
+ < li > 为了代码的易读性,在每个声明的左括号前增加一个空格。</ li >
12
+ < li > 声明块的右括号应该另起一行。</ li >
13
+ < li > 每条声明 < code > :</ code > 后应该插入一个空格。</ li >
14
+ < li > 每条声明应该只占用一行来保证错误报告更加准确。</ li >
15
+ < li > 所有声明应该以分号结尾。虽然最后一条声明后的分号是可选的,但是如果没有他,你的代码会更容易出错。</ li >
16
+ < li > 逗号分隔的取值,都应该在逗号之后增加一个空格。比如说box-shadow</ li >
17
+ < li > 不要在颜色值 < code > rgb()</ code > < code > rgba()</ code > < code > hsl()</ code > < code > hsla()</ code > 和 < code > rect()</ code > < em > 中</ em > 增加空格,并且不要带有取值前面不必要的 0 (比如,使用 .5 替代 0.5)。This helps differentiate multiple color values (comma, no space) from multiple property values (comma with space).</ li >
18
+ < li > 所有的十六进制值都应该使用小写字母,例如 < code > #fff</ code > 。因为小写字母有更多样的外形,在浏览文档时,他们能够更轻松的被区分开来。</ li >
19
+ < li > 尽可能使用短的十六进制数值,例如使用 < code > #fff</ code > 替代 < code > #ffffff</ code > 。</ li >
20
+ < li > 为选择器中的属性取值添加引号,例如 < code > input[type="text"]</ code > 。 < a href ="http://mathiasbynens.be/notes/unquoted-attribute-values#css "> 他们只在某些情况下可有可无</ a > ,所以都使用引号可以增加一致性。</ li >
21
+ < li > 不要为 0 指明单位,比如使用 < code > margin: 0;</ code > 而不是 < code > margin: 0px;</ code > 。</ li >
22
+ </ ul >
23
+ < p > 对这里提到的规则有问题吗?参考 Wikipedia 中的< a href ="http://en.wikipedia.org/wiki/Cascading_Style_Sheets#Syntax "> CSS 语法部分</ a > 。</ p >
24
+ </ div >
25
+ < div class ="col ">
26
+ {% highlight css %}{% include css/syntax.css %}{% endhighlight %}
27
+ </ div >
28
+ </ div >
29
+
30
+ < div class ="section " id ="css-declaration-order ">
31
+ < div class ="col ">
32
+ < h3 > 声明顺序</ h3 >
33
+ < p > 相关的属性声明应该以下面的顺序分组处理:</ p >
34
+ < ol >
35
+ < li > Positioning</ li >
36
+ < li > Box model 盒模型</ li >
37
+ < li > Typographic 排版</ li >
38
+ < li > Visual 外观</ li >
39
+ </ ol >
40
+ < p > Positioning 处在第一位,因为他可以使一个元素脱离正常文本流,并且覆盖盒模型相关的样式。盒模型紧跟其后,因为他决定了一个组件的大小和位置。</ p >
41
+ < p > 其他属性只在组件 < em > 内部</ em > 起作用或者不会对前面两种情况的结果产生影响,所以他们排在后面。</ p >
42
+ < p > 关于完整的属性以及他们的顺序,请参考 < a href ="http://twitter.github.com/recess "> Recess</ a > 。</ p >
43
+ </ div >
44
+ < div class ="col ">
45
+ {% highlight css %}{% include css/declaration-order.css %}{% endhighlight %}
46
+ {% highlight javascript %}{% include css/declaration-order.js %}{% endhighlight %}
47
+ </ div >
48
+ </ div >
49
+
50
+ < div class ="section " id ="css-import ">
51
+ < div class ="col ">
52
+ < h3 > Don't use < code > @import</ code > </ h3 >
53
+ < p > Compared to < code > <link></ code > s, < code > @import</ code > is slower, adds extra page requests, and can cause other unforeseen problems. Avoid them and instead opt for an alternate approach:</ p >
54
+ < ul >
55
+ < li > Use multiple < code > <link></ code > elements</ li >
56
+ < li > Compile your CSS with a preprocessor like Sass or Less into a single file</ li >
57
+ < li > Concatenate your CSS files with features provided in Rails, Jekyll, and other environments</ li >
58
+ </ ul >
59
+ < p > For more information, < a href ="http://www.stevesouders.com/blog/2009/04/09/dont-use-import/ "> read this article by Steve Souders</ a > .</ p >
60
+ </ div >
61
+ < div class ="col ">
62
+ {% highlight html %}{% include css/import.html %}{% endhighlight %}
63
+ </ div >
64
+ </ div >
65
+
66
+ < div class ="section " id ="css-media-queries ">
67
+ < div class ="col ">
68
+ < h3 > 媒体查询位置</ h3 >
69
+ < p > 尽量将媒体查询的位置靠近他们相关的规则。不要将他们一起放到一个独立的样式文件中,或者丢在文档的最底部。这样做只会让大家以后更容易忘记他们。这里是一个典型的案例。</ p >
70
+ </ div >
71
+ < div class ="col ">
72
+ {% highlight css %}{% include css/media-queries.css %}{% endhighlight %}
73
+ </ div >
74
+ </ div >
75
+
76
+ < div class ="section " id ="css-prefixed-properties ">
77
+ < div class ="col ">
78
+ < h3 > 前缀属性</ h3 >
79
+ < p > 当使用厂商前缀属性时,通过缩进使取值垂直对齐以便多行编辑。</ p >
80
+ < p > 在 Textmate 中,使用 < strong > Text → Edit Each Line in Selection</ strong > (⌃⌘A)。 在 Sublime Text 2 中, 使用 < strong > Selection → Add Previous Line</ strong > (⌃⇧↑) 和 < strong > Selection → Add Next Line</ strong > (⌃⇧↓)。</ p >
81
+ </ div >
82
+ < div class ="col ">
83
+ {% highlight css %}{% include css/prefixed-properties.css %}{% endhighlight %}
84
+ </ div >
85
+ </ div >
86
+
87
+ < div class ="section " id ="css-single-declarations ">
88
+ < div class ="col ">
89
+ < h3 > 单条声明的声明块</ h3 >
90
+ < p > 在一个声明块中< strong > 只包含一条声明</ strong > 的情况下,为了易读性和快速编辑可以考虑移除其中的换行。所有包含多条声明的声明块应该分为多行。</ p >
91
+ < p > 这样做的关键因素是错误检测 - 例如,一个 CSS 验证程序显示你在 183 行有一个语法错误,如果是一个单条声明的行,那就是他了。在多个声明的情况下,你必须为哪里出错了费下脑子。</ p >
92
+ </ div >
93
+ < div class ="col ">
94
+ {% highlight css %}{% include css/single-declarations.css %}{% endhighlight %}
95
+ </ div >
96
+ </ div >
97
+
98
+ < div class ="section " id ="css-shorthand ">
99
+ < div class ="col ">
100
+ < h3 > 属性简写</ h3 >
101
+ < p > 坚持限制属性取值简写的使用,属性简写需要你必须显式设置所有取值。常见的属性简写滥用包括:</ p >
102
+ < ul >
103
+ < li > < code > padding</ code > </ li >
104
+ < li > < code > margin</ code > </ li >
105
+ < li > < code > font</ code > </ li >
106
+ < li > < code > background</ code > </ li >
107
+ < li > < code > border</ code > </ li >
108
+ < li > < code > border-radius</ code > </ li >
109
+ </ ul >
110
+ < p > 大多数情况下,我们并不需要设置属性简写中包含的所有值。例如,HTML 头部只设置上下的 margin,所以如果需要,只设置这两个值。过度使用属性简写往往会导致更混乱的代码,其中包含不必要的重写和意想不到的副作用。</ p >
111
+ < p > Mozilla Developer Network 有一篇对不熟悉属性简写及其行为的人来说很棒的关于 < a href ="https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties "> shorthand properties</ a > 的文章。</ p >
112
+ </ div >
113
+ < div class ="col ">
114
+ {% highlight css %}{% include css/shorthand.css %}{% endhighlight %}
115
+ </ div >
116
+ </ div >
117
+
118
+ < div class ="section " id ="css-nesting ">
119
+ < div class ="col ">
120
+ < h3 > Less 和 Sass 中的嵌套</ h3 >
121
+ < p > 避免不必要的嵌套。可以进行嵌套,不意味着你应该这样做。只有在需要给父元素增加样式并且同时存在多个子元素时才需要考虑嵌套。</ p >
122
+ </ div >
123
+ < div class ="col ">
124
+ {% highlight scss %}{% include css/nesting.scss %}{% endhighlight %}
125
+ </ div >
126
+ </ div >
127
+
128
+ < div class ="section " id ="css-comments ">
129
+ < div class ="col ">
130
+ < h3 > 代码注释</ h3 >
131
+ < p > 代码是由人来编写和维护的。保证你的代码是描述性的,包含好的注释,并且容易被他人理解。好的代码注释传达上下文和目标。不要简单地重申组件或者 class 名称。</ p >
132
+ < p > Be sure to write in complete sentences or larger comments and succinct phrases for general notes.</ p >
133
+ </ div >
134
+ < div class ="col ">
135
+ {% highlight css %}{% include css/comments.css %}{% endhighlight %}
136
+ </ div >
137
+ </ div >
138
+
139
+ < div class ="section " id ="css-classes ">
140
+ < div class ="col ">
141
+ < h3 > Class 命名</ h3 >
142
+ < ul >
143
+ < li > 保持 Class 命名为全小写,可以使用短划线(不要使用下划线和 camelCase 命名)。短划线应该作为相关类的自然间断。(例如,< code > .btn</ code > 和 < code > .btn-danger</ code > )。</ li >
144
+ < li > 避免过度使用简写。< code > .btn</ code > 可以很好地描述 < em > button</ em > ,但是 < code > .s</ code > 不能代表任何元素。</ li >
145
+ < li > Class 的命名应该尽量短,也要尽量明确。</ li >
146
+ < li > 使用有意义的名称;使用结构化或者作用目标相关,而不是抽象的名称。</ li >
147
+ < li > 命名时使用最近的父节点或者父 class 作为前缀。</ li >
148
+ < li > 使用 < code > .js-*</ code > classes 来表示行为(相对于样式),但是不要在 CSS 中包含这些 classes。</ li >
149
+ </ ul >
150
+ </ div >
151
+ < div class ="col ">
152
+ {% highlight css %}{% include css/class-names.css %}{% endhighlight %}
153
+ </ div >
154
+ </ div >
155
+
156
+ < div class ="section " id ="css-selectors ">
157
+ < div class ="col ">
158
+ < h3 > 选择器</ h3 >
159
+ < ul >
160
+ < li > 使用 classes 而不是通用元素标签来优化渲染性能。</ li >
161
+ < li > 避免在经常出现的组件中使用一些属性选择器 (例如,< code > [class^="..."]</ code > )。浏览器性能会受到这些情况的影响。</ li >
162
+ < li > 减少选择器的长度,每个组合选择器选择器的条目应该尽量控制在 3 个以内。</ li >
163
+ < li > < strong > 只</ strong > 在必要的情况下使用后代选择器 (例如,没有使用带前缀 classes 的情况).</ li >
164
+ </ ul >
165
+ < p > 扩展阅读:</ p >
166
+ < ul >
167
+ < li > < a href ="http://markdotto.com/2012/02/16/scope-css-classes-with-prefixes/ "> Scope CSS classes with prefixes</ a > </ li >
168
+ < li > < a href ="http://markdotto.com/2012/03/02/stop-the-cascade/ "> Stop the cascade</ a > </ li >
169
+ </ ul >
170
+ </ div >
171
+ < div class ="col ">
172
+ {% highlight css %}{% include css/selectors.css %}{% endhighlight %}
173
+ </ div >
174
+ </ div >
175
+
176
+ < div class ="section " id ="css-organization ">
177
+ < div class ="col ">
178
+ < h3 > 代码组织</ h3 >
179
+ < ul >
180
+ < li > 以组件为单位组织代码。</ li >
181
+ < li > 制定一个一致的注释层级结构。</ li >
182
+ < li > 使用一致的空白来分割代码块,这样做在查看大的文档时更有优势。</ li >
183
+ < li > 当使用多个 CSS 文件时,通过组件而不是页面来区分他们。页面会被重新排列,而组件移动就可以了。</ li >
184
+ </ ul >
185
+ </ div >
186
+ < div class ="col ">
187
+ {% highlight css %}{% include css/organization-comments.css %}{% endhighlight %}
188
+ </ div >
189
+ </ div >
190
+
191
+ < div class ="section " id ="css-editor-prefs ">
192
+ < div class ="col ">
193
+ < h3 > 编辑器配置</ h3 >
194
+ < p > 根据以下的设置来配置你的编辑器,来避免常见的代码不一致和丑陋的 diffs。</ p >
195
+ < ul >
196
+ < li > 使用四个空格的 soft-tabs。</ li >
197
+ < li > 在保存时删除尾部的空白字符。</ li >
198
+ < li > 在保存时删除尾部的空白字符。 < a href ="http://programmers.stackexchange.com/questions/121555/why-is-trailing-whitespace-a-big-deal " target ="_blank "> 为什么这么做?</ a > </ li >
199
+ < li > 设置文件编码为 UTF-8。</ li >
200
+ < li > 在文件结尾添加一个空白行。</ li >
201
+ < li > 在文件结尾添加一个空白行。< a href ="http://www.zhihu.com/question/20018991 " target ="_blank "> 为什么这么做?</ a > </ li >
202
+ </ ul >
203
+ < p > 参照文档,将这些设置应用到项目的 < code > .editorconfig</ code > 文件。 例如,< a href ="https://github.com/twbs/bootstrap/blob/master/.editorconfig "> Bootstrap 中的 < code > .editorconfig</ code > 文件</ a > 。 通过 < a href ="http://editorconfig.org "> 关于 EditorConfig</ a > 了解更多内容。</ p >
204
+ </ div >
205
+ </ div >
0 commit comments