美文网首页我爱编程
精简的css命名规则=-没有限制才能发挥出最大的潜能。

精简的css命名规则=-没有限制才能发挥出最大的潜能。

作者: love2013 | 来源:发表于2016-07-28 15:18 被阅读389次

    CSS选择器是用于定位文档中的元素所在以便设定相应的样式,常见的选择器包括:基础选择器、组合选择器、属性选择器、伪类选择器和伪元素等。
    而优先级则是CSS样式在浏览器中被解析的先后顺序

    css选择器:

    什么是选择器:用于定位文档中的元素所在以便设定相应的样式的,意义是对文档设计样式时进行精确地定位

    CSS优先级(Specificity):是指浏览器通过此标准来判断某一属性与那一元素

    优先级的计算

    W3C中对优先级计算有以下规则,首先优先级的大小用a,b,c,d四个位数决定,优先级依次递减,如果元素有内联样式,a位为1,b位为ID选择器的数量,c位为属性选择器与类选择器的数量,d位为元素选择器与伪类选择器的数量,通配选择器的a位计0

    1.CSS命名规范的意义
    这里所说i的命名规范有两层含义,一是命名含义与元素相关,二是命名内容要精简,具体例子如下:

    命名含义与元素相关


    精简的命名规则

    从我对命名规范的理解,可以演绎出命名规范的意义所在:

    富有含义的命名规定对于开发者来说,更容易读懂
    精简的命名规范能够提高代码的整洁度和用户体验
    精简的含义不仅仅包括命名的简洁性,还包括浏览器对页面的渲染速度,即良好的命名规范可以提高页面渲染速度
    良好的命名规则会在精确性和复用性上权衡

    .imageplus-append-lu-img-txt{overflow:hidden;margin:10px 0;font-family:Microsoft YaHei;line-height:normal}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item{float:left;position:relative;height:90px;width:125px;box-sizing:border-box}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item .imageplus-append-img-txt-ad-item-img img{height:100%;width:100%}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item .imageplus-append-img-txt-ad-item-desc{position:absolute;bottom:0;left:0;width:100%;height:18px;line-height:18px;font-size:14px;text-align:center;color:#fff;background-color:#000;background-color:rgba(0,0,0,0.6);text-decoration:none}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item .imageplus-append-img-txt-ad-item-desc span{color:#fff} .imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item:hover .imageplus-append-img-txt-ad-item-img{border:2px solid #f60;*height:86px;*width:121px}.imageplus-append-close-btn{display:none}.imageplus-baidu-logo{position:absolute;bottom:0;right:0;z-index:9999;background:url(http://ecma.bdimg.com/public03/imageplus/logo.png) no-repeat;background-position:0 -17px;width:16px;height:16px}.imageplus-ad-logo{position:absolute;left:0;bottom:0;overflow:hidden;z-index:12;background:url(http://ecma.bdimg.com/public03/imageplus/logo.png) no-repeat;background-position:0 0;width:34px;height:16px}.imageplus-append{float:none;margin:0;padding:0;border:0;overflow:hidden;position:static;display:block;visibility:visible;text-align:left;background:transparent;-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;text-indent:0;display:inline-block} .imageplus-append div{float:none;margin:0;padding:0;border:0;overflow:hidden;position:static;display:block;visibility:visible;text-align:left;background:transparent;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Microsoft YaHei;line-height:normal}.imageplus-append a,.imageplus-append img,.imageplus-append span{float:none;margin:0;padding:0;border:0;overflow:visible;position:static;display:inline;visibility:visible;text-align:left;background:transparent;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Microsoft YaHei;line-height:normal}

    3.CSS命名优化案例

    案例1下面的CSS命名极其冗长,导致光是选择器就占用不少存储空间

    使用以下的排版方式会更加美观和精简一些,虽然仍会显得有些长,但是在可接受范围内。

    案例2<div id="test">
      <ul class="test"></ul>
    </div>
    现在要给这里的ul标签一个样式,比如说padding-left:25px;那么下面四种写法哪个渲染速度最快?#test .test{}, ul.test{},#test ul{} 以及.test{}。无疑,.test{}渲染速度最快,《高性能网站进阶指南》一书曾提到CSS的渲染方式是“从右往左”渲染的,就拿#test ul{}举例,先渲染页面上所有的ul标签,再去寻找id为test的元素,而.text{}则是直接匹配到class="text"所在的元素。

    、面向属性的命名方法

    我们习惯在CSS命名的时候掺杂语义,这样可以让代码更易懂。例如淘宝首页“免费注册”按钮上的class名称:help-guest-regist

    上面的class命名语义就很明显,独眼龙看告示——一目了然,”help-guest-regist”就是”帮助-顾客-注册”,很nice,很人性化的命名。作为在单一的首页上使用,我是很难挑出什么毛病来的。

    但是,从道家“无”的哲学思想来看,语义其实是对自身的一种束缚,越是语义强烈的命名越是没有重用性(尤其是内容语义的)。举个实际点的例子,例如人人网的右侧边栏的标题

    如何命名才能让CSS发挥最大的重用性潜力呢?答案就是“面向属性的命名”。

    比很多同行都用过这样的命名方式,只是不够系统,不够大胆、彻底,多浅尝辄止,比如像是开心网,还有时光网的CSS代码的前面一部分样式命名:

    .imageplus-append-lu-img-txt{overflow:hidden;margin:10px 0;font-family:Microsoft YaHei;line-height:normal}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item{float:left;position:relative;height:90px;width:125px;box-sizing:border-box}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item .imageplus-append-img-txt-ad-item-img img{height:100%;width:100%}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item .imageplus-append-img-txt-ad-item-desc{position:absolute;bottom:0;left:0;width:100%;height:18px;line-height:18px;font-size:14px;text-align:center;color:#fff;background-color:#000;background-color:rgba(0,0,0,0.6);text-decoration:none}.imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item .imageplus-append-img-txt-ad-item-desc span{color:#fff} .imageplus-append-lu-img-txt .imageplus-append-content .imageplus-append-img-txt-ad-item:hover .imageplus-append-img-txt-ad-item-img{border:2px solid #f60;*height:86px;*width:121px}.imageplus-append-close-btn{display:none}.imageplus-baidu-logo{position:absolute;bottom:0;right:0;z-index:9999;background:url(http://ecma.bdimg.com/public03/imageplus/logo.png) no-repeat;background-position:0 -17px;width:16px;height:16px}.imageplus-ad-logo{position:absolute;left:0;bottom:0;overflow:hidden;z-index:12;background:url(http://ecma.bdimg.com/public03/imageplus/logo.png) no-repeat;background-position:0 0;width:34px;height:16px}.imageplus-append{float:none;margin:0;padding:0;border:0;overflow:hidden;position:static;display:block;visibility:visible;text-align:left;background:transparent;-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;text-indent:0;display:inline-block} .imageplus-append div{float:none;margin:0;padding:0;border:0;overflow:hidden;position:static;display:block;visibility:visible;text-align:left;background:transparent;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Microsoft YaHei;line-height:normal}.imageplus-append a,.imageplus-append img,.imageplus-append span{float:none;margin:0;padding:0;border:0;overflow:visible;position:static;display:inline;visibility:visible;text-align:left;background:transparent;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Microsoft YaHei;line-height:normal}

    就拿上面人人网的标题样式举例,人人网的做法是:

    .side-item-header{padding:0 0 8px; text-align:right;}
    

    要是我,我会对其进行分离。在实际项目时,text-align:right;这个属性早就在CSS通用样式库里面了,而padding:0 0 8px;则会以padding-bottom:8px;的形式放在网站通用样式库里了(详细请参见我的“我是如何对网站CSS进行架构的”一文)。最后,CSS命名与样式会如下:

    .tr{text-align:right;} .pb8{padding-bottom:8px;}

    四、精简高效CSS命名之“三无原则”

    此“三无原则”就是:无ID无层级无标签

    CSS命名就应该最简单、最直接,直捣黄龙。没有HTML标签,没有层级,这些通通滚蛋,不要。为什么不要,有三大原因:
    1. 限制重用
    我们会使用层级(#test .test),会使用标签(ul.test),可能是习惯(没多想),或是为了避免冲突。但是,我跟你说,从今以后,这种写法让他见鬼去吧(如果不是为了改变CSS优先级的话)。正如开篇论述的哲学观点,你限制越多,越抑制了CSS的重用性。例如#test .test{}这种写法,里面的CSS重用性多大,完全限死在了id为test的元素下,哪有重用性可言;又如ul.test,我勒个去,这个ul标签十有八九就是装饰用的,往这儿一放,同样CSS样式的div标签可以用吗?哭爹喊娘,眼泪汪汪也不管用啊。所以,相信我,层级啊,标签啊什么的,通通见鬼去吧。要知道,层级啊,标签啊作用是什么,是用来提高CSS优先级,把那个字母长的让人发毛的”!important”干掉的。

    2. CSS文件大小
    这瓜子虽小,吃多了也是可以填饱肚子的。所以,你的CSS名称不要像老太太的裹脚布一样,搞得又臭又长,如下图所示的人人网那个冗长的CSS命名吧:

    你看名称的字节数已经比属性还大了,要是这些名称都在15字符以内,乖乖,这个CSS文件可以小个1~2K绝对没有问题的。你看下图这样子的命名,这样子的CSS排版是不是更舒服,更简洁。

    3. 降低了渲染效率
    来个例子考考大家(以后我面试别人可能就会考这题),HTML如下:

    <div id="test">
        <ul class="test"></ul>
    </div>
    

    现在要给这里的ul标签一个样式,比如说padding-left:25px;那么下面四种写法哪个渲染速度最快?
    #test .test{}, ul.test{},#test ul{} 以及.test{}。

    如果单纯的ul与.test PK,我还真拿不定谁的渲染速度更快些。但是,一旦牵扯到层级与标签,我100%确定,.test这种最直接的命名方式渲染效率是最高的。要知道,CSS渲染元素和使用JavaScript获取页面元素那是完全不一样的。如果是使用JavaScript获取DOM元素,则#test ul{}速度是最快的,先id获取,再tag获取,这些可都是JavaScript内置的方法。但是,CSS的渲染方式则是属于外太空系的了,《高性能网站进阶指南》一书曾提到CSS的渲染方式是“从右往左”渲染的,就拿#test ul{}举例,先渲染页面上所有的ul标签,再去寻找id为test的元素,所以,出现#test div{}这种写法的人都是傻×的,页面先渲染id为test的元素?非也!先渲染页面上所有的div,再去寻找其老爸有没有id为test的元素。由于这种渲染差异最大就200~300毫秒(补充:这里的差异不是说单纯一个样式的差异,而是这些写法泛滥的页面的全部渲染,其渲染差异数据可以参见“翻译-不同CSS技术及其CSS性能”一文),我们人一般是感觉不到的。所以,长久以来,也都不以为然。但是,我是绝对容不下这种写法的,还有,要是让我看到类似于ul#test{}这样子的命名,不好意思,面试肯定过不了。

    所以,CSS命名,只要出现了层级,出现了标签,就是一次额外的渲染,层级越多,渲染的开销也就越大,这就是为什么一些前辈的文章会建议要尽量避免过深的层级。这也是为什么要“无层级”,“无标签”。

    对于原则第一条“无ID”,其实与性能没有多大关系,只是一般ID都与JavaScript有奸情,如果再牵扯到CSS样式,如此复杂的三角关系,日后不好处理啊。

    五、“三无原则”遗留之样式冲突问题

    正如上面讲的,层级,标签可以避免样式冲突,虽然“面向属性的命名”不存在冲突问题,但是,页面上很多样式是无法分离使用“面向属性的命名”的,此时,一不能有


    级,二不能有标签,如果避免冲突呢?

    http://www.zhangxinxu.com/wordpress/2010/09/%E7%B2%BE%E7%AE%80%E9%AB%98%E6%95%88%E7%9A%84css%E5%91%BD%E5%90%8D%E5%87%86%E5%88%99%E6%96%B9%E6%B3%95/首先,规范。项目组所有人的命名方法,习惯都要统一。其次,也是实际的做法,同一内容,使用同一前缀。就如上面的那张图片所示,所有class同一使用od前缀,这样,就绝不会与其他页面的CSS产生冲突了。

    相关文章

      网友评论

        本文标题:精简的css命名规则=-没有限制才能发挥出最大的潜能。

        本文链接:https://www.haomeiwen.com/subject/neyajttx.html