CSS命名实践
前面的话
每次写HTML结构涉及到CSS命名时,都要挣扎一番。关于CSS命名的规范,市面上有不少,如OOCSS、SMACSS、BEM和MVCSS等。在这里面最火的应该算BEM了。本文将详细介绍CSS命名
主流命名
【BEM】
说起CSS命名,当然要提到BEM。BEM的意思就是B模块(block)、E元素(element)、M修饰符(modifier)。模块和子元素之间用两个下划线分隔,子元素和修饰符之间用两个中划线分隔
关于子元素E,有两种写法。一种是按照层级嵌套来写,如block-ele1-son-inner
,但是这样写会导致命名过长;另一种是扁平化,一个模块B下的所有子元素,无论相互层级如何,都直接连接B,如block-inner
,但是这样就无法表示层级关系,命名时也可能会出现冲突
BEM的命名是很好的,不然也不能成为最流行的命名方法。但是,BEM对子元素的命名,无论是层级长命名还是扁平化短命名,都有缺陷
【NEC】
相较于BEM以模块B为顶级元素,子元素类名中包含继承关系的命名,网易的NEC规范使用后代选择器方式
NEC将元素分为了5类:布局(grid)(.g-);模块(module)(.m-);元件(unit)(.u-);功能(function)(.f-);皮肤(skin)(.s-);状态(.z-)。而后代选择器不需要完整表现结构树层级,尽量能短则短
- .m-list{margin:;padding:;}
- .m-list .itm{margin:1px;padding:1px;}
- .m-list .cnt{margin-left:100px;}
个人认为,网易对于元素分类的做法很好。关于一些全局可复用的功能性的模块进行区分,结构更为清晰。但是,对于使用后代选择器的方式,个人不太认同。当嵌套层级较深时,命名冲突依旧是一个问题
【JD】
京东的命名规则采用表示层级嵌套关系的长命名。当子孙模块超过4级或以上的时候,考虑在祖先模块内具有识辨性的独立缩写作为新的子孙模块
- <div class="modulename">
- <div class="modulename_cover"></div>
- <div class="modulename_info">
- <div class="modulename_info_user">
- <div class="modulename_info_user_img">
- <img src="" alt="">
- <!-- 这个时候 miui 为 modulename_info_user_img 首字母缩写-->
- <div class="miui_tit"></div>
- <div class="miui_txt"></div>
- ...
- </div>
- </div>
- <div class="modulename_info_list"></div>
- </div>
- </div>
京东这种因子元素名字过长而采用首字母缩写的做法非常赞,至今市面上没有其他更好的解决长命名的方案
命名方式
【后代选择器还是类名】
关于CSS命名,最大的争论就是使用后代选择器还是使用类名。以下例所示
- <ul class="list">
- <li class="list-item"></li>
- <li class="list-item"></li>
- <li class="list-item"></li>
- </ul>
- <ul class="list">
- <li class="item"></li>
- <li class="item"></li>
- <li class="item"></li>
- </ul>
- <ul class="list">
- <li></li>
- <li></li>
- <li></li>
- </ul>
如果采用第一种长类名的方式,为<li>元素设置样式,只需如下设置即可
- .list-item{}
如果采用第二种短类名的方式,则为<li>元素设置样式,需如下设置
- .list .item{}
如果采用第三种后代选择器的方式,则为<li>元素设置样式,需如下设置
- .list li{}
如果从简易角度来看,第三种后代选择器的方式最简单,无需花时间去给子元素起名,且在sass中书写很容易
- .list{
- li{}
- }
但是,它有一个很严重的问题,就是如果HTML结构层级较深,往往出现选择器层级过长,如.list li span a{}
而且,因为后代选择器强烈地依赖HTML结构,为了避免因为少写一层结构,导致选择器特殊性降低,样式无法生效的情况,也不得不这样写
一个不得不提的问题是,CSS选择器的解析顺序是从右到左。而使用后代选择器.list li{},浏览器需要遍历出所有的li,再找出.list下的li,效率是最低的
因此,个人认为第三种后代选择器的方式并不是好选择
下面介绍第二种短类名的方式
1、选择器解析效率比第三种方式好,毕竟.item比li的范围小很多
2、短类名.list .item同样存在依赖HTML结构的情况,很可能出现选择器层级过长
3、使用较简易,在sass中书写容易,且起名也较简单
4、由于给li增加了类名,于是增加了HTML文件大小
最后介绍第三种长类名的方式
这种方式的选择器效率最高,因为.list-item这个类型页面中只出现一次,可类比于id选择器的解析速度
由于使用长类名的方式,可以完全不使用后代选择器,则无需考虑选择器特殊性较低,样式无法生效的情况,也不会出现选择器层级过长,因为它仅有一级
但是,相应地,它最大的缺点是类名较长,大大地增加了HTML文件大小。于是,可借鉴京东,当子孙模块超过3级时,采用首字母缩写,并将缩写后首字母大写的做法,在如将.list-item-link-title缩写为.Lil-title
最终,选择可缩写的长类名作为CSS命名的主要方式
【分隔符】
一般地,classname分隔符有3种,中划线-,下划线_,以及首字母大写,以分隔list和item为例
- //中划线
- list-item
- //下划线
- list_item
- //首字母大写
- listItem
1、中划线
中划线可以用来表示层级关系
- <div class="box">
- <ul class="box-list">
- <li class="box-list-item"></li>
- <li class="box-list-item"></li>
- <li class="box-list-item"></li>
- </ul>
- </div>
2、下划线
下划线可以用来表示不同的状态
- <div class="box">
- <button class="box-btn box-btn_default" type="button"></button>
- <button class="box-btn" type="button"></button>
- </div>
3、首字母大写
首字母大写可以用来表示因为样式的需要,而不得不增加的HTML结构。一般地,如果在外层增加结构,可以增加Wrap,在内层增加结构,可以增加Inner,且不影响原先的classname的命名
- <div class="boxWrap">
- <section class="box">
- <h2 class="box-title"></h2>
- <p class="box-content"></p>
- </section>
- </div>
【组件】
通过上面的长命名方式和分隔符的使用,解决了基础结构的命名。但是,在页面中,很可能出现一些组件的应用,这些组件可以复用到页面的多个位置。这时,再使用上面的方式就不太合适
于是,可以以m-为前缀,来表示这是一个组件
- <div class="box">
- <button class="m-btn m-btn_error" type="button"></button>
- <button class="m-btn" type="button"></button>
- </div>
命名推荐
有了合适的命名方式,还需要语义化命名,且有不影响语义的情况下,可以简写
【布局】
- 文档 doc
- 头部 header(hd)
- 主体 body
- 尾部 footer(ft)
- 主栏 main
- 侧栏 side
- 容器 box/container
【通用部件】
- 列表 list
- 列表项 item
- 表格 table
- 表单 form
- 链接 link
- 标题 caption/heading/title
- 菜单 menu
- 集合 group
- 条 bar
- 内容 content
- 结果 result
【组件】
- 按钮 button(btn)
- 字体 icon
- 下拉菜单 dropdown
- 工具栏 toolbar
- 分页 page
- 缩略图 thumbnail
- 警告框 alert
- 进度条 progress
- 导航条 navbar
- 导航 nav
- 子导航 subnav
- 面包屑 breadcrumb(crumb)
- 标签 label
- 徽章 badge
- 巨幕 jumbotron
- 面板 panel
- 洼地 well
- 标签页 tab
- 提示框 tooltip
- 弹出框 popover
- 轮播图 carousel
- 手风琴 collapse
- 定位浮标 affix
【语义化小部件】
- 品牌 brand
- 标志 logo
- 额外部件 addon
- 版权 copyright
- 注册 regist(reg)
- 登录 login
- 搜索 search
- 热点 hot
- 帮助 help
- 信息 info
- 提示 tips
- 开关 toggle
- 新闻 news
- 广告 advertise(ad)
- 排行 top
- 下载 download
【功能部件】
- 左浮动 fl
- 右浮动 fr
- 清浮动 clear
【状态】
- 前一个 previous
- 后一个 next
- 当前的 current
- 显示的 show
- 隐藏的 hide
- 打开的 open
- 关闭的 close
- 选中的 selected
- 有效的 active
- 默认的 default
- 反转的 toggle
- 禁用的 disabled
- 危险的 danger
- 主要的 primary
- 成功的 success
- 提醒的 info
- 警告的 warning
- 出错的 error
- 大型的 lg
- 小型的 sm
- 超小的 xs
实践
- <header class="hd">
- <nav class="hd-navbar m-navbar m-varbar_primary">
- <div class="hd-navbar-tel">联系方式:400-888-8888</div>
- <ul class="hd-navbar-nav">
- <li class="Hnn-itm m-btn m-btn_info"><a href="#">登录</a></li>
- <li class="Hnn-itm m-btn"><a href="#">快速注册</a></li>
- <li class="Hnn-itm m-btn"><a href="#">关于</a></li>
- <li class="Hnn-itm m-btn"><a href="#">帮助</a></li>
- </ul>
- </nav>
- ...
- </header>
【幻灯片】
- <div class="carousel">
- <div class="carousel-banner">
- <a class="carousel-banner-item Cbi_slide1 Cbi_active" href="#"></a>
- <a class="carousel-banner-item Cbi_slide2" href="#"></a>
- <a class="carousel-banner-item Cbi_slide3" href="#"></a>
- <a class="carousel-banner-item Cbi_slide4" href="#"></a>
- </div>
- <a class="carousel-control carousel-control_prev" href="javascript:;"><</a>
- <a class="carousel-control carousel-control_next" href="javascript:;">></a>
- <div class="carousel-indicators">
- <span class="carousel-indicators-item Cii_active"></span>
- <span class="carousel-indicators-item"></span>
- <span class="carousel-indicators-item"></span>
- <span class="carousel-indicators-item"></span>
- </div>
- </div>
关于CSS命名,并没有最佳实践之说,根据项目的复杂程序进行合适的命名才是可取的
欢迎交流
CSS命名实践的更多相关文章
- (转)面向属性的CSS命名
原文链接:戳这里 自从开始做前端开发以来,我发现在开发页面的时候,总是有一个问题十分影响自己的开发效率,这个问题就是css的命名,主要是指css类选择器的命名.这个问题主要体现在:第一,有的内容你压根 ...
- 面向属性的CSS命名
自从开始做前端开发以来,我发现在开发页面的时候,总是有一个问题十分影响自己的开发效率,这个问题就是css的命名,主要是指css类选择器的命名.这个问题主要体现在:第一,有的内容你压根想不出用什么名字来 ...
- [css] 【转载】 精简高效的CSS命名准则/方法
原文链接:http://www.zhangxinxu.com/wordpress/2010/09/%E7%B2%BE%E7%AE%80%E9%AB%98%E6%95%88%E7%9A%84css%E5 ...
- CSS命名规范
DIV+CSS规范命名大全集合 前端人员必看CSS命名规范 整理: 文件名必须由小写字母.数字.中划线组成 ).所有的命名最好都小写,一律采用小写加中划线的方式,不允许使用大写字母或 _2).属性的值 ...
- 精简高效的css命名准则
对于css,为了避免样式冲突,我们总会赋予相当特殊的命名,或是在选择符上添加html标记,或是使用层级.我们为避免在冲突上做文章,就会把代码的命名变得复杂化. 如果css的重用性越高,相比就越高效.如 ...
- html,css命名规范 (转)
HTML+CSS命名规范总结 1.HTML部分 1.1添加必须的utf-8的字符集,并且使用HTML5的简洁 方式: <meta charset="utf-8"> 1. ...
- Div+CSS命名规范
注意事项:1.命名遵循驼峰式 2.尽量用中文 3.不加中杠和下划线 4.尽量不缩写,除非一看就明白的单词 头:header 标志:logo 友情链接:friendlink 内容:c ...
- CSS命名
CSS命名规范 CSS样式命名整理 页面结构 容器: container/wrap 整体宽度:wrapper 页头:header 内容:content 页面主体:main 页尾:footer 导航:n ...
- 常用的css命名规则:
关于团队合作的css命名规范 常用的css命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制 ...
随机推荐
- Rxjava observeOn()和subscribeOn()初探
Rxjava这么强大的类库怎么可能没有多线程切换呢? 其中observeOn()与subscribeOn()就是实现这样的作用的.本文主要讲解observeOn()与subscribeOn()的用法, ...
- FreeMarker标签
目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity ...
- python-广度优先搜索
广度优先搜索 下面我们来来BFS算法策略: 比如:我们要从双子峰---->金门大桥,最短路径如何? 我们利用广度优先搜索来一步步求解,注意广度优先搜索在于的关键在于"广",也 ...
- 线程(java课堂笔记)
1.两种方式的差异 2.线程的生命周期 3.线程控制(线程的方法) 4.线程同步 5.线程同步锁 一. 两种方式的差异 A extends Thread :简单 不能再继承其他类了(Java单继承)同 ...
- CoreML试水--图片识别
今年的WWDC上,关于人工智能方面Apple开放了CoreML工具包. 今天就趁着时间还早果断的尝试了一下到底有多容易. import UIKit import CoreML import Visio ...
- cpp(第十四章)
1.类的静态成员变量.静态常整型(static const int)变量可以直接在类声明中初始化,静态常变量(static const )需要在类定义文件中初始化, 常变量(const )则在构造函数 ...
- sqlmap详细使用 [精简]
1. 基础用法: 一下./sqlmap.py 在kali和backtrack中使用sqlmap的时候,直接用:sqlmap ./sqlmap.py -u “注入地址” -v 1 –dbs // 列 ...
- Nginx实用教程(二):配置文件入门
Nginx配置文件结构 nginx配置文件由指令(directive)组成,指令分为两种形式,简单指令和区块指令. 一条简单指令由指令名.参数和结尾的分号(;)组成,例如: listen backlo ...
- sed的用法
1.什么是sed sed命令是一个流线式.非交互式编辑器,可以实现在vi等编辑器中一样的编辑效果. 2.sed的工作原理 模式空间(pattern space) sed一次处理一行文本(或输入), ...
- 高性能队列Disruptor系列3--Disruptor的简单使用(译)
简单用法 下面以一个简单的例子来看看Disruptor的用法:生产者发送一个long型的消息,消费者接收消息并打印出来. 首先,我们定义一个Event: public class LongEvent ...