高性能的CSS

高性能的CSS:即代码文件加载更快,代码执行的速度更快,让页面尽快地展现在最终用户的面前。

1、使用高效地CSS选择器

     能被浏览器快速解析和匹配的CSS选择器就是高效地选择器。

     CSS选择器的匹配原理和我们习惯的匹配过程是相反的,它是从右到左进行匹配的。

     高效的选择器意味着浏览器匹配选择器时更快速,匹配查找次数更少。

     在定义选择器时,应该尽量让第一次匹配时的数量达到最少,并且让整体的匹配查找次数最少。

     CSS选择器定义的最佳实践:

      1)避免使用通配符:通配符使用*号表示,它用来匹配页面中所有的元素。它匹配的计算量非常大。

/*避免使用*/
* {
    font-size: 16px;
}

      2)避免使用标签选择器和单个属性选择器作为关键选择器:在一个选择符中,最右边的选择器是关键选择器。关键选择器决定着浏览器初始匹配的元素数量,它也是整个选择符整体匹配次数的最主要决定者。

/*避免使用*/
.references p.list div {
    font-style: italic;
}
.references p.list [data-link="red"] {
    color: #f00;
}

      3)不要在ID选择器前使用标签名:在ID选择器前添加标签名是多余的。

/*避免使用*/
div#page_index {
    color:#f00;
}
/*推荐使用*/
#page_index {
    color:#f00;

      4)尽量不要在选择符中定义过多的层级,最好不要超过三层:选择器的层级关系越深,浏览器顺着Dom数查找匹配选择器的次数就越多。

    一个CSS选择器性能测试的实验网站:CSS selectors Test:http://stevesouders.com/efws/css-selectors/tests.php。该网站用于测试各种CSS选择器的开销。

    也可以使用工具检测页面CSS选择器的效率,比如Chrome浏览器自带的开发工具。

    CSS样式还是以可维护性为主,提升性能为辅,要在保证CSS样式的可维护性前提下来编写高性能的CSS选择器。

2、CSS相关的图片处理

    1)不要设置图片的尺寸

        利用样式缩放图片会带来CPU的额外计算过程,增加了图片在浏览器中的渲染时间。因此,在制作图片时,尽量按照实际需求的尺寸制作。缩略图和实际的图片不要使用相同的图片。最佳的做法是针对原始图片,单独做一套缩略图。

    2)使用CSS“雪碧”图(CSS Sprite)技术

       CSS Sprite技术,一般翻译为CSS精灵,或者CSS“雪碧”图。它可将零散的背景图合并为一张大图,再利用CSS的background-position进行背景定位。

       CSS Sprite的优点:减少了网络请求的次数,提高了图片整体的加载速度;方便网站更换风格。

       CSS Sprite的缺点:开发过程烦琐、维护过程复杂、使用不当,则会导致性能问题:内存消耗(合并后的图片可能会很大)。

       使用CSS Sprite的一些最佳实践:

        (1)在项目后期应用CSS Sprite技术

        (2)合理组织“雪碧”图

                在“雪碧”图中,组织背景主要是按照模块和背景图的风格来划分。按照模块划分的优点是方便代码维护,而按照风格划分则是方便背景图的维护以及网站整体风格的更改。

        (3)控制“雪碧”图的尺寸和大小

               推荐长度和宽度相乘不要超过2500。“雪碧”图的大小不要超过200KB。

        (4)合理控制背景图单元之间的距离以及背景图的位置

               此原则的目的是为了防止当背景图尺寸比实际应用的元素尺寸小时,背景中出现其他无关的背景图。

         (5)借助工具

                “雪碧”图最大的缺点是维护困难,但是借助于合适的工具,可降低维护的困难程度。

                在线的CSS Sprite生成器:CSS Sprite Qenerator:http://spritegen.website-performance.org。用户通过上传一个包含多个背景图的压缩包,工具会自动生成由这些背景图组成的“雪碧”图。它允许用户设置背景图单元的水平和垂直偏移、指定透明度及背景色等。

               Sprite Cow:http://www.spritecow.com。用户上传已有的“雪碧”图,并使用鼠标操作选中某个背景图单元,工具就会自动生成对应的CSS代码。

               SpriteMe:www.spriteme.org。可通过分析网页,来产生“雪碧”图及对应的CSS代码。

3、减少CSS的代码量

    1)定义简洁的CSS规则:主要是指合并相关规则和定义简洁的属性值。

    2)合并相关CSS规则

         CSS中的某些样式是由多个规则组成的,比如字体样式。

p.reader-title {
                font-family: Georgia,serif;
                font-size: 12px;
                font-style: italic;
                font-weight: bold;
                line-height: 30px;
            }
/*推荐使用,合并后的样式*/
            p.reader-title {
                font:italic bold 12px/30px Georgia,serif;
            }

       类似的样式还有background、border、margin、padding、text、list-style、transform、transition、animation等。

     3)定义简洁的属性值

        有些属性值可以使用更简洁的方式来展现,比如颜色和尺寸。

p.reader-title {
                color: #ff33ff;
                font-size: 0.8em;
                padding:0em;
}
/*推荐使用,简洁的属性值*/
            p.reader-title {
                color: #f3f;
                font-size: .8em;
                padding: 0;
            }

     4)合并相同的定义

         在CSS代码中,定义的规则会有相同的部分。可以合并这些相同的样式定义,达到代码重用和缩减代码的目的。

.library-title {
                text-align: center;
                font-weight: 700;
                overflow: hidden;
                text-overflow: ellipsis;
                color: #fff;
                font-size: 1.2em;
                line-height: 2em;
            }
.search-title {
                text-align: center;
                font-weight: 700;
                overflow: hidden;
                text-overflow: ellipsis;
                color: #fff;
                font-size: 1.4em;
                line-height: 2.5em;
            }
/*推荐使用,合并后的样式代码*/
            .library-title, .search-title {
                text-align: center;
                font-weight: 700;
                overflow: hidden;
                text-overflow: ellipsis;
                color: #fff;
            }
            .library-title {
                font-size: 1.2em;
                line-height: 2em;
            }
            .search-title {
                font-size: 1.4em;
                line-height: 2.5em;
            }

          在CSS中,有些属性是可以继承的,比如color、font、line-height、list-style、text-align、text-index、text-transform等。如果某个父元素的多个子元素上设置了相同的可继承的属性定义,则可以把相同的定义合并,且设置在父元素上。

     5)删除无效的定义

         无效的定义包括无效的规则及无效的样式属性。

         无效的规则一般是在开发过程中引入的,从直观上是无法判断某个规则是否已经失效。可以使用工具来进行查找,比如,用Chrome浏览器自带的开发工具就可以查找CSS代码中无效样式。

         无效的样式属性指的是设置的样式并没有起作用。比如设置内边距为负值,以及一些因手误引起的属性值拼写错误。同样,使用Chrome浏览器自带的开发工具就可以检测无效的属性定义。

/*无效的样式属性*/
            .invalid-css {
                padding-top: -20px;
                border: 1px soild #ddd;  /*solid*/
            }

4、其他CSS高性能实践

   1)避免使用@import:有开发者详细分析了使用@import的缺点:http://www.stevesouders.com/blog/2009/04/09/dont-use-import。

   2)避免使用IE浏览器独有的样式:图片滤镜和CSS表达式

         图片滤镜的使用会在图片加载时阻塞浏览器的加载和渲染,并会增加额外的内存开销。

.image-title {
                filter: opacity(30%);
             }

           CSS表达式的作用是动态设置CSS属性。使用CSS表达式不只是有兼容问题,还有性能问题。例如,在浏览器大小改变、窗口滚动时,会使得浏览器频繁计算,性能损耗极大。

<!--使用CSS表达式的例子-->
<div id="oDiv"
         style="background-color: #cfcfcf;position: absolute;
         left: expression(document.body.clientWidth/2-oDiv.offsetWidth/2);
         top: expression(document.body.clientHight/2-oDiv.offsetHight/2)">
         Example DIV
</div>

 

posted @ 2017-10-18 21:43  新功夫涂鸦  阅读(243)  评论(0编辑  收藏  举报