ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用。
"-"在本规范中并不表示连字符的含义。
她只表示两种含义:分类前缀分隔符、扩展分隔符,详见以下具体规则。
布局(grid)(.g-);模块(module)(.m-);元件(unit)(.u-);功能(function)(.f-);边距(edge)(.e-);皮肤(theme)(.t-);状态(status)(.s-)。
对以上的解释详情参见:分类方法中的“CSS内部的分类及其顺序”。
注:如果这七类不能满足你的需求,你可以另外定义一个或多个大类,但必须符合单个字母拼接"-"为前缀的命名规则,即 .x- 的格式。
通过使用后代选择器的方法,你不需要考虑他的命名是否已被使用,因为他只在当前模块或元件中生效,同样的样式名可以在不同的模块或元件中重复使用,互不干扰;在多人协作或者分模块协作的时候效果尤为明显!
后代选择器不需要完整表现结构树层级,尽量能短则短。
注:后代选择器不要在页面布局中使用,因为污染的可能性较大;
/* 这里的.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、.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等浏览器,那么你标识状态的方法也可以采取独立状态分类(.s-)方法:.u-btn.s-dis,.m-box.s-sel,然后像这样使用:class="u-btn s-dis"。
有时候模块内会有些类似的东西,如果你没有把它们做成元件和扩展,那么也可以使用后代选择器和扩展。
后代选择器:.m-login .btn {}。
后代选择器扩展:.m-login .btn-1 {},.m-login .btn-dis {}。
同样也可以采取独立状态分类(.s-)方法:.m-login .btn.s-dis {},然后像这样使用:class="btn s-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的形式来降低后代选择器的污染性。