分类方法
CSS文件的分类和引用顺序
通常,一个项目我们只引用一个CSS
,但是对于较大的项目,我们需要把CSS
文件进行分类。
我们按照CSS
的性质和用途,将CSS
文件分成“公共型样式”、“特殊型样式”、“皮肤型样式”,并以此顺序引用(按需求决定是否添加版本号)。
1.公共型样式:包括了以下几个部分:“标签的重置和设置默认值”、“统一调用背景图和清除浮动或其他需统一处理的长样式”、“网站通用布局”、“通用模块和其扩展”、“元件和其扩展”、“功能类样式”、“皮肤类样式”。
2.特殊型样式:当某个栏目或页面的样式与网站整体差异较大或者维护率较高时,可以独立引用一个样式:“特殊的布局、模块和元件及扩展”、“特殊的功能、颜色和背景”,也可以是某个大型控件或模块的独立样式。
3.皮肤型样式:如果产品需要换肤功能,那么我们需要将颜色、背景等抽离出来放在这里。
<link href="assets/css/public.css" />
<link href="assets/css/home.css" />
<link href="assets/css/skin.css" />
CSS内部的分类及其顺序
1.重置(reset
)和默认(base
)(tags
):消除默认样式和浏览器差异,并设置部分标签的初始样式,以减少后面的重复劳动,你可以根据你的网站需求设置。
2.统一处理:建议在这个位置统一调用背景图(这里指多个布局或模块或元件共用的图)和清除浮动(这里指通用性较高的布局、模块、元件内的清除)等统一设置处理的样式。
3.布局(grid
)(.g-
):将页面分割为几个大块,通常有头部、主体、主栏、侧栏、尾部等。
4.模块(module
)(.m-
):通常是一个语义化的可以重复使用的较大的整体,比如导航、登录、注册、各种列表、评论、搜索等。
5.元件(unit
)(.u-
):通常是一个不可再分的较为小巧的个体,通常被重复用于各种模块中,比如按钮、输入框、loading、图标等。
6.功能(function
)(.f-
):为方便一些常用样式的使用,我们将这些使用率较高的样式剥离出来,按需使用,通常这些选择器具有固定样式表现,比如清除浮动等,不可滥用。
7.皮肤(skin
)(.s-
):如果你需要把皮肤型的样式抽离出来,通常为文字色、背景色(图)、边框色等,非换肤型网站通常只提取文字色,非换肤型网站不可滥用此类。
8.状态(.z-
):为状态类样式加入前缀,统一标识,方便识别,她只能组合使用或作为后代出现(.u-ipt.z-dis{},.m-list li.z-sel{}
),具体详见命名规则的扩展相关项。
功能类和皮肤类样式为表现化的样式,请不要滥用。以上顺序可以按需求适当调整。
命名规则
使用类选择器,放弃ID选择器
ID
在一个页面中的唯一性导致了如果以ID
为选择器来写CSS
,就无法重用。
NEC特殊字符:”-“连字符
“-
“在本规范中并不表示连字符的含义。
她只表示两种含义:分类前缀分隔符、扩展分隔符,详见以下具体规则。
分类的命名方法:使用单个字母+”-“为前缀
布局(grid
)(.g-
);模块(module
)(.m-
);元件(unit
)(.u-
);功能(function
)(.f-
);皮肤(skin
)(.s-
);状态(.z-
)。
- 在你样式中的选择器总是要以上面前五类开头,然后在里面使用后代选择器。
- 如果这五类不能满足你的需求,你可以另外定义一个或多个大类,但必须符合单个字母加”
-
“为前缀的命名规则,即.x-
的格式。- 特殊:
.j-
将被专用于JS
获取节点,请勿使用.j-
定义样式。
后代选择器命名
- 约定不以单个字母加”
-
“为前缀且长度大于等于2的类选择器为后代选择器,如:.item
为m-list
模块里的每一个项,.text
为m-list
模块里的文本部分:.m-list .item{}.m-list .text{}
。 - 一个语义化的标签也可以是后代选择器,比如:
.m-list li{}
。 - 不允许单个字母的类选择器出现,原因详见下面的“模块和元件的后代选择器的扩展类”。
通过使用后代选择器的方法,你不需要考虑他的命名是否已被使用,因为他只在当前模块或元件中生效,同样的样式名可以在不同的模块或元件中重复使用,互不干扰;在多人协作或者分模块协作的时候效果尤为明显!
后代选择器不需要完整表现结构树层级,尽量能短则短。
后代选择器不要在页面布局中使用,因为污染的可能性较大;
/* 这里的.itm和.cnt只在.m-list中有效 */
.m-list{margin: 0; padding: 0;}
.m-list .itm{margin: 1px; padding: 1px;}
.m-list .cnt{margin-left: 100px;}
/* 这里的.cnt和.num只在.m-page中有效 */
.m-page{height: 20px;}
.m-page .cnt{text-align: center;}
.m-page .num{border: 1px solid #ddd;}
命名应简约而不失语义
/* 反对:表现化的或没有语义的命名 */
.m-abc .green2{}
.g-left2{}
/* 推荐:使用有语义的简短的命名 */
.m-list .wrap2{}
.g-side2{}
相同语义的不同类命名
方法:直接加数字或字母区分即可(如:.m-list
、.m-list2
、.m-list3
等,都是列表模块,但是是完全不一样的模块)。
其他举例:.f-fw0
、.f-fw1
、.s-fc0
、.s-fc1
、.m-logo2
、.m-logo3
、u-btn
、u-btn2
等等。
模块和元件的扩展类的命名方法
当A、B、C、…它们类型相同且外形相似区别不大,那么就以它们中出现率最高的做成基类,其他做成基类的扩展。
方法:+“-
”+数字或字母(如:.m-list
的扩展类为.m-list-1
、.m-list-2
等)。
补充:基类自身可以独立使用(如:class="m-list"
即可),扩展类必须基于基类使用(如:class="m-list m-list-2"
)。
如果你的扩展类是表示不同状态,那么你可以这样命名:u-btn-dis
,u-btn-hov
,m-box-sel
,m-box-hov
等等,然后像这样使用:class="u-btn u-btn-dis"
。
如果你的网站可以不兼容IE6
等浏览器,那么你标识状态的方法也可以采取独立状态分类(.z-
)方法:.u-btn.z-dis,.m-box.z-sel
,然后像这样使用:class="u-btn z-dis"
。
模块和元件的后代选择器的扩展类
有时候模块内会有些类似的东西,如果你没有把它们做成元件和扩展,那么也可以使用后代选择器和扩展。
后代选择器:.m-login .btn{}
。
后代选择器扩展:.m-login .btn-1{}
,.m-login .btn-dis{}
。
同样也可以采取独立状态分类(.z-
)方法:.m-login .btn.z-dis{}
,然后像这样使用:class="btn z-dis"
。
注:此方法用于类选择器,直接使用标签做为选择器的则不需要使用此命名方法。
注:为防止后代选择器的扩展类和大类命名规范冲突,后代选择器不允许使用单个字母。
比如:.m-list .a{}
是不允许的,因为当这个.a
需要扩展的时候就会变成.a-bb
,这样就和大类的命名规范冲突。
分组选择器有时可以代替扩展方法
有时候虽然两个同类型的模块很相似,但是你希望他们之间不要有依赖关系,也就是说你不希望使用扩展的方法,那么你可以通过合并选择器来设置共性的样式。
使用本方法的前提是:相同类型、功能和外观都相似,写在同一片代码区域方便维护。
/* 两个元件共性的样式 */
.u-tip1,.u-tip2{}
.u-tip1 .itm,.u-tip2 .itm{}
/* 在分别是两个元件各自的样式 */
/* tip1 */
.u-tip1{}
.u-tip1 .itm{}
/* tip2 */
.u-tip2{}
.u-tip2 .itm{}
防止污染和被污染
当模块或元件之间互相嵌套,且使用了相同的标签选择器或其他后代选择器,那么里面的选择器就会被外面相同的选择器所影响。
所以,如果你的模块或元件可能嵌套或被嵌套于其他模块或元件,那么要慎用标签选择器,必要时采用类选择器,并注意命名方式,可以采用.m-layer .layerxxx
、.m-list2 .list2xxx
的形式来降低后代选择器的污染性。
代码格式
选择器、属性和值都使用小写
在xhtml
标准中规定了所有标签、属性和值都小写,CSS
也是如此。
单行写完一个选择器定义
便于选择器的寻找和阅读,也便于插入新选择器和编辑,便于模块等的识别。去除多余空格,使代码紧凑减少换行。
如果有嵌套定义,可以采取内部单行的形式。
/* 单行定义一个选择器 */
.m-list li,.m-list h3{width: 100px; padding: 10px; border: 1px solid #ddd;}
/* 这是一个有嵌套定义的选择器 */
@media all and (max-width: 600px){
.m-class1 .itm{height: 17px; line-height: 17px; font-size: 12px;}
.m-class2 .itm{width: 100px; overflow: hidden;}
}
@-webkit-keyframes showitm{
0%{height: 0; opacity: 0;}
100%{height: 100px; opacity: 1;}
}
最后一个值也以分号结尾
通常在大括号结束前的值可以省略分号,但是这样做会对修改、添加和维护工作带来不必要的失误和麻烦。
省略值为0时的单位
为节省不必要的字节同时也使阅读方便,我们将0px
、0em
、0%
等值缩写为0
。
.m-box{margin: 0 10px; background-position: 50% 0;}
使用单引号
省略url
引用中的引号,其他需要引号的地方使用单引号。
.m-box{background: url(bg.png);}
.m-box:after{content: '.';}
使用16进制表示颜色值
除非你需要透明度而使用rgba
,否则都使用#f0f0f0
这样的表示方法,并尽量缩写。
.m-box{color: #f00; background: rgba(0,0,0,0.5);}
根据属性的重要性按顺序书写
只遵循横向顺序即可,先显示定位布局类属性,后盒模型等自身属性,最后是文本类及修饰类属性。
显示属性 | 自身属性 | 文本属性和其他修饰 |
---|---|---|
display | width | font |
visibility | height | text-align |
position | margin | text-decoration |
float | padding | vertical-align |
clear | border | white-space |
list-style | overflow | color |
top | min-width | background |
.m-box{position: relative; width: 600px; margin: 0 auto 10px; text-align: center; color: #000;}
如果属性间存在关联性,则不要隔开写。
/* 这里的height和line-height有关联性 */
.m-box{position: relative; height: 20px; line-height: 20px; padding: 5px; color: #000;}
私有在前,标准在后
先写带有浏览器私有标志的,后写W3C
标准的。
.m-box{-webkit-box-shadow: 0 0 0 #000; -moz-box-shadow: 0 0 0 #000; box-shadow: 0 0 0 #000;}
注释格式
对选择器的注释统一写在被注释对象的上一行,对属性及值的注释写于分号后。
注释内容两端需空格,已确保即使在编码错误的情况下也可以正确解析样式。
在必要的情况下,可以使用块状注释,块状注释保持统一的缩进对齐。
原则上每个系列的样式都需要有一个注释,言简意赅的表明名称、用途、注意事项等。
/* 块状注释文字
* 块状注释文字
* 块状注释文字
*/
.m-list{width: 500px;}
.m-list li{height: 20px; line-height: 20px;/* 这里是对line-height的一个注释 */ overflow: hidden;}
.m-list li a{color: #333;}
/* 单行注释文字 */
.m-list li em{color: #666;}
原则上不允许使用Hack
很多不兼容问题可以通过改变方法和思路来解决,并非一定需要Hack
,根据经验你完全可以绕过某些兼容问题。
一种合理的结构和合理的样式,是极少会碰到兼容问题的。
由于浏览器自身缺陷,我们无法避开的时候,可以允许使用适当的Hack
。
统一Hack方法
统一使用“*
”和“_
”分别对IE7和6进行Hack
。如下代码所示:
/* IE7会显示灰色#888,IE6会显示白色#fff,其他浏览器显示黑色#000 */
.m-list{color: #000; *color: #888; _color: #fff;}
建议并适当缩写值
“建议并适当”是因为缩写总是会包含一系列的值,而有时候我们并不希望设置某一值,反而造成了麻烦,那么这时候你可以不缩写,而是分开写。
当然,在一切可以缩写的情况下,请务必缩写,它最大的好处就是节省了字节,便于维护,并使阅读更加一目了然。
选择器顺序
请综合考虑以下顺序依据:
- 从大到小(以选择器的范围为准)
- 从低到高(以等级上的高低为准)
- 从先到后(以结构上的先后为准)
- 从父到子(以结构上的嵌套为准)
以下仅为简单示范:
/* 从大到小 */
.m-list p{margin: 0; padding: 0;}
.m-list p.part{margin: 1px; padding: 1px;}
/* 从低到高 */
.m-logo a{color: #f00;}
.m-logo a:hover{color: #fff;}
/* 从先到后 */
.g-hd{height: 60px;}
.g-bd{height: 60px;}
.g-ft{height: 60px;}
/* 从父到子 */
.m-list{width: 300px;}
.m-list .itm{float: left;}
选择器等级
a = 行内样式style。
b = ID选择器的数量。
c = 类、伪类和属性选择器的数量。
d = 类型选择器和伪元素选择器的数量。
选择器 | 等级(a,b,c,d) |
---|---|
style=”” | 1,0,0,0 |
#wrapper #content {} | 0,2,0,0 |
#content .dateposted {} | 0,1,1,0 |
div#content {} | 0,1,0,1 |
#content p {} | 0,1,0,1 |
#content {} | 0,1,0,0 |
p.comment .dateposted {} | 0,0,2,1 |
div.comment p {} | 0,0,1,2 |
.comment p {} | 0,0,1,1 |
p.comment {} | 0,0,1,1 |
.comment {} | 0,0,1,0 |
div p {} | 0,0,0,2 |
p {} | 0,0,0,1 |