zoukankan      html  css  js  c++  java
  • 如何编写更好的CSS

    关于如何编写更高效更优雅的CSS代码,网上已经有很多文章了。

    但我还是在这里重新总结一下,算是对CSS的温习,也方便以后查找资料。

    下面开始正文。

    必不可少的reset.css

    不同的浏览器之间,对标签都有设置默认样式,所以需要重置这些影响布局统一性的样式。

    reset.css的代码, 可参考YUI的:http://developer.yahoo.com/yui/reset/

    如果是移动端的web开发,要清除浏览器默认的点击样式,还需加上:

    1 *, ::after, ::before{
    2     -webkit-tap-highlight-color: rgba(0,0,0,0);
    3     -moz-tap-highlight-color: rgba(0,0,0,0);
    4     -o-tap-highlight-color: rgba(0,0,0,0);
    5     -ms-tap-highlight-color: rgba(0,0,0,0);
    6     tap-highlight-color: rgba(0,0,0,0);
    7 }
     

    例如Chrome浏览器,有字体最小显示尺寸的设置,默认是12px。

    如果希望页面不受这个设置的限制,可以加上下面的代码:

    1 *, ::after, ::before{
    2     -webkit-text-size-adjust: none;
    3     -moz-text-size-adjust: none;
    4     -o-text-size-adjust: none;
    5     -ms-text-size-adjust: none;
    6     text-size-adjust: none;
    7 }
     
    PS:神奇的是,我刚才在Win7下的Chrome(27.0.1444.3 m)测试,居然失效了!而在手机上测试,则有效。

       Chrome升级到27之后的版本,text-size-adjust就已经失效了,无论在手机端还是电脑端。

    避免使用*(全局)选择器。

    我想理由大家都知道了吧?  这玩意很耗性能!

    这个时候你肯定想吐槽上面给出的两段css代码。丫的,明明用了*选择器!

    好吧,的确是用了。

    我个人的建议是:能不用就尽量避免不要用。

    因为,既然这个 全局选择器 被设计出来,肯定是有需要的场景。所以,需要用的时候还是要用,但不要滥用!

    其实,官方文档中貌似没有「全局选择器」这个叫法。

    英文是:Universal rules。

    直译:通用规则。

    我觉得这样比较难理解,所以称为「全局选择器」。 当然,Universal rules 不单单只有 * 号符。

    下面这些都是「全局选择器」:

    1 [hidden="true"] {} /* A universal rule */ 
    2 tree > [collapsed="true"] {} /* A universal rule */
    3 * {}       /* A universal rule */

    减少没必要的标签

    关于这点,很多有经验的前端工程师也时常会犯错。因为这是一个不算坑的坑 : 浏览器对CSS selectors的解释是「从右到左」的。

    1 .nav a { ... }

    也就是说,上面的代码,是先查找整个页面的a标签,再对 a 标签进行遍历,判断其祖先是否匹配 .nav 。

    a标签是这句css表达式的 关键选择器(key selector)

    《编写高效的 CSS》 中直接提到:“样式系统从 关键选择器 开始匹配规则,然后左移(查找规则选择器的任何祖先元素)。只要选择器的子树(substree)一直在检查,样式系统就会持续左移,直到和规则匹配,或者是因为不匹配而放弃。”

    所以,CSS选择器的层级(匹配规则)越少,解析速度就会越快

    看下面例子:

    1 .btn#search { ... }
    2 .cont ul li.item { ... }
    3 .cont ul li a { ... }

    上面的写法,不单单影响性能,还增加了代码量。

    理论上(实际还需考虑当前html的代码结构),可以优化为:

    1  /* id是唯一的 */
    2 #search { ... }
    3 /* 删掉多余的标签,class和id不要被标签名锁限制 */
    4 .cont .item { ... }
    5 /* 删掉多余的标签,避免层级过多影响性能,一般控制在3层级内。如有特殊需要,请用class替代 */
    6 .cont a { ... }

    利用选择器分组

    有人说:对于优秀的程序员,最大的动力是懒惰,因为他们厌倦所有重复性的工作。

    但大部分程序员,偷懒的时候,却用Ctrl+C & Ctrl+V 草草了事。

    例如写出下面的代码:

     1 .blackBtn {
     2     display: inline-block;
     3     font-size: 14px;
     4     border-radius: 5px;
     5     overflow: hidden;
     6     background-color: black;
     7 }
     8 .redBtn {
     9     display: inline-block;
    10     font-size: 14px;
    11     border-radius: 5px;
    12     overflow: hidden;
    13     background-color: red;
    14 }

    当然,上面的代码,我们可以整理为:

     1 .blackBtn, .redBtn {
     2     display: inline-block;
     3     font-size: 14px;
     4     border-radius: 5px;
     5     overflow: hidden;
     6 }
     7 .blackBtn {
     8     background-color: black;
     9 }
    10 .redBtn {
    11     background-color: red;
    12 }

    这样不单单节省了代码,修改起来也更方便。

    利用CSS的继承

    这个东西,写CSS无时无刻都会用到,但不少人会忽略了它的存在。

    1 .cont p {
    2     font-size: 16px;
    3     color: #333;
    4 }
    5 .cont b {
    6     font-size: 14px;
    7     font-weight: normal;
    8     color: #333;
    9 }

    可以优化为:

     1 .cont {
     2     color: #333;
     3 }
     4 .cont p {
     5     font-size: 16px;
     6 }
     7 .cont b {
     8     font-size: 14px;
     9     font-weight: normal;
    10 }

    CSS中可以被继承的属性:

    azimuth, border-collapse, border-spacing,
    caption-side, color, cursor, direction, elevation,
    empty-cells, font-family, font-size, font-style,
    font-variant, font-weight, font, letter-spacing,
    line-height, list-style-image, list-style-position,
    list-style-type, list-style, orphans, pitch-range,
    pitch, quotes, richness, speak-header, speaknumeral,
    speak-punctuation, speak, speechrate,
    stress, text-align, text-indent, texttransform,
    visibility, voice-family, volume, whitespace,
    widows, word-spacing
     
    多得有点吓人!但其实这些属性都不要刻意去记住,继承中用得最多的也就是字体属性。

    更详细的,可以看一下《CSS样式表继承详解》这篇文章。

    避免使用@import

    关于这点,最主要的问题是:影响了css文件的并行加载和加载顺序

    《高性能网站设计:不要使用@import》 中已经谈得十分详细了,我就不多说了。

    禁止使用CSS表达式

    以前十分流行用纯CSS的方式来兼容IE6不支持position: fixed这个问题,这其中就用到了CSS表达式。

    例如加上类似下面的代码,去兼容IE6。

    1 #fixed {
    2     /* other css */
    3     _position:absolute;
    4     _top:expression(document.documentElement.scrollTop+300); /* 兼容ie6*/ 
    5 }

    后来大家发现,这样做是大错特错的。还不如另外用JavaScript去兼容。

    因为,CSS表达式的计算频率高得惊人!移动一下鼠标都可达到10000次以上的计算量!

    所以,CSS表达式绝对是禁止使用的

    CSS代码的基本编写规范

    这个点我就不细谈了。

    但一些通用的规范大家还是要遵守,如良好的缩进和空格分隔

    这样有利于提高代码的可读性。

    代码压缩,更轻更快

    为了提高访问速度,gzip和代码压缩是少不了的。

    这里推荐两个在线的压缩工具吧:

    http://refresh-sf.com/yui/

    http://tool.css-js.com/

    本地的话,安装YUI Compressor即可。支持JS和CSS的压缩。

    最后

    说实话,CSS虽然貌似很“简单”。但要把它写好,也绝不是一件简单的事情。

    不少人还会强调一些「可简写」的CSS属性必须简写。 如:padding、font、background等。

    的确,简写可以让代码更加简洁,可减少代码量。但我个人觉得,CSS编码中,可读性和解耦也十分重要。

    所以,本文没谈到的地方还很多。仅仅对CSS编码优化的一些小技巧进行了总结。

    最后后

    玉伯不断强调:CSS 是一门感性的语言。

    对于这点,我不完全认同。

    我觉得CSS的感性,是指他可以通过各种各样的组合和方式,去实现想实现的效果。就像文字一样,我们可以用不同的句式去表达同样的意思。它并没有标准的答案,所谓的最佳实践方案,也仅仅是对于特定的场景。

     参考:

    https://developer.mozilla.org/zh-CN/docs/CSS/Writing_Efficient_CSS

    http://css-tricks.com/efficiently-rendering-css/

    http://www.qianduan.net/high-performance-web-site-do-not-use-import.html

    http://www.cnphp.info/css-style-inheritance.html

     本文作者:Maple Jan

     本文链接:http://www.cnblogs.com/maplejan/archive/2013/05/12/3074695.html

  • 相关阅读:
    Angular2 初识
    TypeScript 函数 (五)
    TypeScript 接口(三)
    TypeScript 基本类型(一)
    TypeScript 变量声明(二)
    Web API中的模型验证Model Validation
    DataContract 和 DataMember
    (推荐JsonConvert )序列化和反序列化Json
    9、DFA最小化,语法分析初步
    8.非确定的自动机NFA确定化为DFA
  • 原文地址:https://www.cnblogs.com/maplejan/p/3074695.html
Copyright © 2011-2022 走看看