CSS中属性的书写顺序
传说中的Mozilla推荐
/* mozilla.org Base Styles * maintained by fantasai */ /* Suggested order: * display * list-style * position * float * clear * width * height * margin * padding * border * background * color * font * text-decoration * text-align * vertical-align * white-space * other text * content * */ ...
来源:http://www.mozilla.org/css/base/content.css
在怿飞’s Blog的这篇文章里,又将上面的属性分成了三组:显示属性、自身属性和文本属性。在回复里,inG补充这还和浏览器的解析过程有关:浏览器先对DOM定位,然后解析自身属性,接着再解析内部对象。(没找到相关的英文资料,有知情者还望告知)
在Mozilla官方,其实并没有推荐任何CSS书写顺序。很可能是某个开发者在阅读fantasai的这篇文章 mozilla.org Markup Reference 时,顺便对fantasai的CSS源文件产生了兴趣,因此才有了上面的发现。
字母排序
NETTUTS上时不时有些好文章,这不,前不久,Trevor Davis就分享了一篇:5 Ways to Instantly Write Better CSS. 这篇文章中,推荐CSS的属性按字母排序。
优点是:简单,任何人只要遵守,一看就明白。
缺点是:太简单,缺乏逻辑性。比如position, left, top等,这种紧关联的属性,如果都按字母排序,书写和维护起来都不方便。
Andy Ford推荐的排序
Andy Ford是HTML和CSS方面的专家,最近写了一篇文章:Order of the Day: CSS Properties. 文章推荐的CSS书写顺序为:
1. Display & Flow 2. Positioning 3. Dimensions 4. Margins, Padding, Borders, Outline 5. Typographic Styles 6. Backgrounds 7. Opacity, Cursors, Generated Content
例子:
el {
display: ;
visibility: ;
float: ;
clear: ;
position: ;
top: ;
right: ;
bottom: ;
left: ;
z-index: ;
width: ;
min-width: ;
max-width: ;
height: ;
min-height: ;
max-height: ;
overflow: ;
margin: ;
margin-top: ;
margin-right: ;
margin-bottom: ;
margin-left: ;
padding: ;
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;
border: ;
border-top: ;
border-right: ;
border-bottom: ;
border-left: ;
border-width: ;
border-top-width: ;
border-right-width: ;
border-bottom-width: ;
border-left-width: ;
border-style: ;
border-top-style: ;
border-right-style: ;
border-bottom-style: ;
border-left-style: ;
border-color: ;
border-top-color: ;
border-right-color: ;
border-bottom-color: ;
border-left-color: ;
outline: ;
list-style: ;
table-layout: ;
caption-side: ;
border-collapse: ;
border-spacing: ;
empty-cells: ;
font: ;
font-family: ;
font-size: ;
line-height: ;
font-weight: ;
text-align: ;
text-indent: ;
text-transform: ;
text-decoration: ;
letter-spacing: ;
word-spacing: ;
white-space: ;
vertical-align: ;
color: ;
background: ;
background-color: ;
background-image: ;
background-repeat: ;
background-position: ;
opacity: ;
cursor: ;
content: ;
quotes: ;
}
Andy的顺序大体上和fantasai推荐的顺序保持了一致,但细节上更具可操作性。
SitePoint上还有个很热烈的讨论贴:How do you order your properties within a declaration block?
我的想法
我喜欢fantasai和Andy的书写顺序,但fantasai的顺序中,“自身”属性有点含混不清,Andy的则太细,难以记住。我觉得可以借鉴CSS 2.1 Specification中对CSS属性的分类,将Andy的顺序稍微调整下:
- 影响文档流的属性(比如:display, position, float, clear, visibility, table-layout等)
- 自身盒模型的属性(比如:width, height, margin, padding, border等)
- 排版相关属性(比如:font, line-height, text-align, text-indent, vertical-align等等)
- 装饰性属性(比如:color, background, opacity, cursor等)
- 生成内容的属性(比如:content, list-style, quotes等)
事情永远没那么简单,比如下面这些困扰:
- 对于shorthand怎么处理?比如 border: 1px solid red; 其中border-width是和盒模型相关的,但border-color是装饰性的。如何组织呢?
- 考虑到换肤功能,是否应该将color, background, border-color等和颜色相关的都放一块?以方便以后修改。
- 对于hacks如何处理?单独放到css文件最后面,还是和hack的属性紧挨着好?
- 维护同事的css文件时,对于新增加或有修改的属性,如何注释?如何书写?
- 还有,考虑到CSS Sprite, 所有背景图的选择器都放在一起?不过这已经超出本文的话题了:CSS选择器内属性的顺序和组织。
- 更进一步的讨论是:CSS文件内的结构组织,以及多个CSS文件的组织。
任何解决方案都不能解决所有问题,但只要能解决常用的大部分问题,就已经是非常好的方案了。
期待你的建议。

February 20th, 2009 on 11:27
按字母排序最好了….
February 20th, 2009 on 11:42
做了很多wp theme,现在倾向于把颜色信息放一起。其实我都是把布局中会发生变化的东西一起堆在前面,例如颜色。其实这是偷懒,为了下一个theme能直接套用,不用改很多。
February 20th, 2009 on 11:54
严谨的态度,赞,看了,也豁然开朗!
February 20th, 2009 on 12:04
我平时的工作就是按字母来排序,只有碰到 position时,不按顺序写,直接 在 position 后加上右下左属性(把它们就当成一个字母p…) 这样的话不管谁来改我的CSS,都能很方便!
February 20th, 2009 on 12:07
ie developer bar 和 firebug 显示的属性都是按字母来排序的。
传说 mozilla 那套规范,用过很久但是没有深究它的出处,按那个顺序来写看起来也很有道理。更多的是为了同事之间统一一个规范,之前公司是把每条样式写成一行,如果没有一个固定顺序,看起代码来会很挫。
个人觉得应该把关于 display & flow 的东东放在自身属性之后,先描述好自己再去寻找定位哈,所谓先成家后立业是也。
从前比较搓的时候,写 css 会分成3块 layout typo skin(也是翻看某老外的作品借鉴来的)
February 20th, 2009 on 12:15
在一个团队里有一个统一的标准比较好
February 20th, 2009 on 13:35
考虑换肤的话我一般会把所有颜色背景的相关的专门写个CSS文件
February 20th, 2009 on 15:29
因为我的习惯是书写的时候一行一个属性,到正式上传到站点后会改成单行的
所以将修改频率大的放前面比较合适。
February 20th, 2009 on 18:58
养成的一个书写习惯,基本上和你的想法差不多.
1.位置和布局 position,float.
2.外形以及尺寸.display,width,height;
3.内部元素样式,主要定义内部元素样式,如line-height,color,text-align.
4.扩展性的,如clear,或者hack规则.
5.在符合以上规则的情况下,数值在前,描述性属性值在后,数值中10进制在前,16进制在后.
对于提到的例子中border的混合值,处理方法按照第一个值 也就是 border-width作为十进制数值处理.
对于color,background-color一般来说的都是十六进制色值,所以大部分情况下是在一起的,如果碰到opacity,按照直观的优先级应该是放在color和background-color之后的.opacity和cursor相似点在于对内容几乎不会产生影响.
觉得这个可能和团队协同效能的影响会比较大,所以团队合作应该是有一个规范的.
February 20th, 2009 on 21:51
这种顺序,结构细节。一进团队就要进行说明,解析。这样好让一个公司不同工作人出来的产品竟然保持一致性,不然百花齐花,不方便以后别人接你的活~那样十分不习惯~
February 20th, 2009 on 23:31
我们是写在一行的,基本跟你的写法差不多,但是修改频率比较大的一些放到了开始或者结束,比如background、border和overflow一般都是在最后三位,为了考虑维护方便
盒模型到排版属性的过度已经习惯了height紧跟line-height,平时做垂直居中还是比较多的
每个团队都有不同的写法,建立适合自己团队的规范比较好,至少修改同事的代码会省不少时间
February 23rd, 2009 on 11:28
用JS写了个CSS属性顺序格式化工具,有兴趣可以去看看。
February 23rd, 2009 on 13:51
个人有书写习惯的
但是在团队流程中
规范起来比较好
要不就乱了
February 24th, 2009 on 9:20
分享下我的样式书写顺序,跟你最后调整的顺序有点类似。
http://www.cssforest.org/blog/index.php?id=38
把显示属性放在最前,主要也是考虑如果display为none后,下面的属性应该也就不会被执行了,如果样式渲染引擎出于性能考虑的话。
February 24th, 2009 on 22:13
自己还没有一套固定的书写顺序~~
惭愧啊~~
February 28th, 2009 on 23:11
我的是把浮动的放最前面,然后放颜色背景字体等等,内部按从属排序,感觉还是比较清晰好找的。。
March 10th, 2009 on 14:46
我的顺序.
如果需要display的我先display.
其次是width和height.
然后再考虑盒子放在哪.
之后再考虑内部内容和其他操作.
我的思路,以盒为本.
March 10th, 2009 on 14:50
对了.
留言内容的comment-body为什么不左浮动呢,我感觉这样可能会舒服一点.
April 30th, 2009 on 16:26
真有这回事。。。。
June 4th, 2009 on 10:43
我觉得不管怎么排序,按字母顺序排可能是最傻的。现在还是按照自己的逻辑来,先想起什么来先写什么,当然,这样别人看起来可能会不习惯,所以,有时候还是会,把width,position之类的放前面,margin,padding,font,text然后是background。诶,没太注意。
September 8th, 2009 on 9:57
顺序没有什么对错之分,只有是否合理,遵守一个顺序是好的,总比没有好。
December 5th, 2009 on 14:56
恩,与 “Andy Ford” 差不多的顺序
只不过,我一直把 margin 放在 width 前面 ,总是感觉 margin 有点定位的意思
January 19th, 2010 on 14:38
Mozilla的和我的思路一样,有个科学的好习惯是很好的,不单纯是技术的问题,是做事的态度。
April 8th, 2010 on 23:12
一般我是按字母排序的,这样子浏览器少了一个去对CSS属性排序。不过也是发现,按字母排序,有一些不好维护。 如果有换肤的,就建立专门整理一个存放skin的css文件,其他的放在position里。
对于hack呢,坚持尽可能少用到hack。我不知道国内的CSS文件有没有去验证?我是另建一个hack的CSS文件,一可以减少主要的css文件大小,二浏览器没必要加载的,就可以不用去加载无用的东西。
哈 哈,不过这样子又涉及到优化页面:减少http的请求次数。
不同情况寻找不同方式,力致寻找找到最优的解决方案。
June 11th, 2010 on 15:59
真的太专业了,谢谢分享。
leave a reply