命名规则
- 使用类选择器,放弃ID选择器
-
ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用。
JS经常使用ID选择器,避免跟前端开发混合
- 统一连字符:"-"连字符
-
她只表示两种含义:分类前缀分隔符、扩展分隔符。
- 分类的命名方法:使用单个字母+"-"为前缀
-
这里的分类比如是:布局(.g-)、按钮(.b-)、图标(.i-)、模块(.m-)、皮肤(.s-)等等
注:分类的后代选择器不得以"单字母"命名,避免被污染。
- 后代选择器命名
-
- 约定不以单个字母+"-"为前缀且长度大于等于2的类选择器为后代选择器。
如:.item为m-list模块里的每一个项,.text为m-list模块里的文本部分
.m-list .item{}
.m-list .text{} - 一个语义化的标签也可以是后代选择器,比如:.m-list li{};
通过使用后代选择器的方法,你不需要考虑他的命名是否已被使用,因为他只在当前模块或元件中生效,同样的样式名可以在不同的模块或元件中重复使用,互不干扰;在多人协作或者分模块协作的时候效果尤为明显!
后代选择器不需要完整表现结构树层级,尽量能短则短。
注:后代选择器不要在页面布局中使用,因为污染的可能性较大;
- 约定不以单个字母+"-"为前缀且长度大于等于2的类选择器为后代选择器。
- 相同语义的不同类命名
-
方法:直接加数字或字母区分即可(如:.m-list、.m-list2、.m-list3等,都是列表模块,但是是完全不一样的模块)。
- 模块和元件的扩展类的命名方法
-
方法:+“-”+数字或字母(如:.m-list的扩展类为.m-list-1、.m-list-2等)。
补充:基类自身可以独立使用(如:class="m-list"即可),扩展类必须基于基类使用(如:class="m-list m-list-2")。
如果你的扩展类是表示不同状态,那么你可以这样命名:u-btn-dis,u-btn-hov等等,然后像这样使用:class="u-btn u-btn-dis"。
- 模块和元件的后代选择器的扩展类
-
有时候模块内会有些类似的东西,如果你没有把它们做成元件和扩展,那么也可以使用后代选择器和扩展。
后代选择器:.m-login .btn{}。
后代选择器扩展:.m-login .btn-1{},.m-login .btn-dis{}。
注:此方法用于类选择器,直接使用标签做为选择器的则不需要使用此命名方法。
注:为防止后代选择器的扩展类和大类命名规范冲突,后代选择器不允许使用单个字母。
比如:.m-list .a{}是不允许的,因为当这个.a需要扩展的时候就会变成.a-bb,这样就和大类的命名规范冲突。
- 分组选择器有时可以代替扩展方法
- 防止污染和被污染
-
当模块或元件之间互相嵌套,且使用了相同的标签选择器或其他后代选择器,那么里面的选择器就会被外面相同的选择器所影响。
所以,如果你的模块或元件可能嵌套或被嵌套于其他模块或元件,那么要慎用标签选择器,必要时采用类选择器,并注意命名方式,可以采用.m-layer .layerxxx、.m-list2 .list2xxx的形式来降低后代选择器的污染性。