精简CSS代码可以帮助减小样式文件的大小,使代码清晰,方便维护。

使用简写属性及默认值

.header {
margin-top: 10px;
margin-right: 20px;
margin-bottom: 30px;
margin-left: 40px;
} /* 可以使用简写属性 margin */
.header {
margin: 10px 20px 30px 40px; /* 4个值分别对应方向为 top right bottom left */
} /* ========== 我是分割线 ========== */ .nav-list {
font-style: italic;
font-variant: small-caps;
font-weight: bold;
font-size: 14px;
font-family: Georgia, Serif;
line-height: 24px;
} /* 可以使用简写属性 font */
.nav-list {
font: italic small-caps bold 14px/24px Georgia, Serif;
}

常用简写属性包括 animation、background、border、font、margin、padding、transition...

使用简写的 font 属性时如果不使用 icon 等关键字时至少要指定 font-sizefont-family 属性,并且 font-size 必须位于 font-family 之前,其他的属性(如font-weight,font-style,font-variant)如未指定将自动使用默认值,并且必须位于 font-size 之前,line-height 必须位于 font-size 之后,并且和 font-size 用 “/” 分隔

省略了部分简写属性值的时候,缺失的部分就会使用该属性的默认值,

div {
font: 14px Serif;
}
/* 相当于 */
div {
font: normal normal normal 14px/normal Serif; /* 1 */
} /**
* 1.此处缺失的 font-style/font-variant/font-weight/line-height
* 都会被解析为默认值 normal,该默认值甚至会覆盖继承的值
* 这和下面的分开申明是有区别的
* 下面代码的 font-style/font-variant/font-weight/line-height 并没有申明,
* 则会继承自父元素,也就是 inherit
*/
div {
font-family: Serif;
font-size: 14px;
}

如果对简写属性使用 !important,会将该简写属性下的所有子属性全部设置为重要。

可以指定不带颜色的边框实现变化效果

a {
border: 1px solid; /* 边框颜色默认和字体颜色一样 */
color: red;
} a:hover {
color: green; /* 字体颜色变化了,边框颜色也会跟着变化 */
}

过渡效果可以精简到只需要指定一个持续时间就可以了

transition: 0.4s;    /* transition-duration 不指定的话默认为 0s,那就没有效果了 */
/* 相当于 */
transition: all 0.4s ease 0s;

background-position 的默认值为 0% 0%,

background-position: 0% 0%;

在使用简写 background 属性的时候可以省略,如果只省略其中一个,那么省略掉的那一个会变成 50%/center,

background-position: 0%;

/* 相当于 */
background-position: 0% 50%;

有几个例外的简写属性省略了的部分并不会使用默认值,而是从已有的值复制(可以这么理解),

比如包括 border-color, border-style, border-width, border-radius, margin, padding...

这些属性的特点是一个属性通常有4个值分别对应4个不同的方向,

border-width: 1px; /* => */ border-width: 1px 1px 1px 1px; /* 复制3次 */
margin: 10px 20px; /* => */ margin: 10px 20px 10px 20px; /* 复制1次 */
padding: 10px 20px 30px; /* => */ padding: 10px 20px 30px 20px; /* 复制中间那个放在最后 */

还有就是有些用户代理(浏览器)样式表已经定义过的样式,同时在所有现代浏览器中都表现一致的话,没有必要再定义了,

div {
display: block; /* 根本没有意义 */
}

结论:有些属性如果你期望的值与默认值或者用户代理样式表指定的值是一致的,那么就可以省去不写,避免重复。

合理利用继承

通常情况下,指定了样式的元素的后代会自动继承某些样式属性,比如 color

.content h1,
.content div,
.content p,
.content ul,
.content li {
color: #666;
} /* 这样更简单 */
.content {
color: #666;
}

注意,有些元素会带有浏览器默认样式,比如 h1 的 font-size,该默认样式会覆盖掉继承值

常用可继承属性包括 color, font, text-align, text-indent...

也可以强制指定一个不能继承的属性实现继承效果,

div {
padding: inherit; /* 它自己继承了,但是它的后代依然是不能继承的 */
}

相对的,也可以强制指定一个应该继承的属性不继承,

div {
font-size: initial; /* 恢复为默认值 */
}

由于兼容的问题,这两个值并不是很常用。

结论:如果一个值可以通过继承得到,那就省去。

群组选择器

h1 {color: blue;}
h2 {color: blue;}
h3 {color: blue;}
h4 {color: blue;}
h5 {color: blue;}
h6 {color: blue;} /* 这样更简单 */
h1, h2, h3, h4, h5, h6 {color: blue;}

将具有很多相同样式的选择器群组在一起,可以有效地精简代码。比如这里定义了两个不相关的东西,

.badge {
background-color: orange;
border-raidus: 5px;
color: #fff;
font-size: 13px;
} 中间还有很多其它样式 .label {
background-color: orange;
border-raidus: 5px;
color: #fff;
font-size: 12px;
}

对比发现两者有很多相同的样式,把相同的样式群组后,

.badge,
.label {
background-color: orange;
border-raidus: 5px;
color: #fff;
} 中间还有很多其它样式 .badge {
/* 只看这里的话看不出来该类还有其它样式 */
font-size: 13px;
} 中间还有很多其它样式 .label {
/* 只看这里的话看不出来该类还有其它样式 */
font-size: 12px;
}

这样造成同一个组件的样式散落在各处,维护会变得困难,使用 CSS 预处理器可以有效解决这个问题,比如 Sass 的 %占位符语法,几乎就是为群组选择器量身打造的,

%label {
background-color: orange;
border-raidus: 5px;
color: #fff;
} 中间还有很多其它样式 .badge {
/* 在这里可以清晰地看出来该类还有其它样式 */
@extend %label;
font-size: 13px;
} 中间还有很多其它样式 .label {
/* 在这里也可以清晰地看出来该类还有其它样式 */
@extend %label;
font-size: 12px;
}

群组选择器的时候需要注意不要将有浏览器兼容性的选择器群组在一起,会造成不能识别而忽略整个规则集,以下代码就不能群组在一起,

input::-webkit-input-placeholder {
color: #999;
} input::-moz-placeholder {
color: #999;
opacity: 1;
} input:-ms-input-placeholder {
color: #999;
}

十六进制RGB颜色值

如果每两位都相等,则可以简写

color: #ff3300;

/* 可以简化为,其代表的颜色是一样的 */
color: #f30;

使用较短的具体数值代替较长的关键字

h2 {
font-weight: 700;
} p {
font-weight: 400;
} /* 相当于 */
h2 {
font-weight: bold;
} p {
font-weight: normal;
}

数字 400 等价于 normal,而 700 等价于 bold。

简化背景图片路径

背景图片路径可能会是这样,

background-image: url("../../images/bg.gif");

背景图片和CSS文件分这么开起什么作用呢?两者本来就是密切相关的,所以应该把背景图片文件夹和CSS文件放在同一目录下,那路径就会变成这样

background-image: url("images/bg.gif");

简单多了,甚至图片文件夹根本没必要命名为复数形式,如果路径中没有空格或者一些特殊符号,引号也可以去掉,

background-image: url(img/bg.gif);

再进一步,用一个字母来命名图片文件夹,

background-image: url(i/bg.gif);

虽然文件夹的名字已经没有什么语义了,但是,通常在这个目录下常用的也就两个文件夹而已,一个图片文件夹,一个字体文件夹,还有可能会有一个放置其它文件的文件夹,对于背景图片相对较多的情况来说这种方式可以减少相当可观的代码字节量。

可以在 Sass 中把路径保存为一个变量以方便任意切换,

$bg-path: "../images" !default;
...
background-image: url(#{bg-path}/bg.gif);

去掉 0 值的单位

margin: 0px;

/* 为0的值带不带单位都是0 */
margin: 0;

Firefox暂时不支持去掉为0的时间值的单位,也就是说

transition: color 0.5s linear 0; /* 当前 Firefox(28.0) 会忽略这条属性 */

与其这样,不如干脆就不指定这类值,通常情况下默认的值就是 0秒

transition: color 0.5s linear; /* 完事 */

去掉浮点数两端的0

div {
background-color: rgba(0,0,0,0.3);
opacity: 0.9
}

对于不透明度,去掉小数点前面的0也可以很好的理解,因为它不会大于1

div {
background-color: rgba(0,0,0,.3);
opacity: .9;
}

不过对于其它可能大于1的浮点值来说,也许会让其他人以为你是忘记了小数点前面的数,

transition: all .5s;

去掉ID选择器前面的限定符

ID本来就是唯一的,在前面加上元素限定和祖先元素通常情况下都是没有意义的,

.container div#box { }

/* 精简后 */
#box { }

下面的内容多多少少有点喜新厌旧的意思了

去掉老旧浏览器兼容代码

body {
text-align: center;
} .container {
margin: 0 auto;
text-align: left;
width: 960px;
} /* 上面的代码是为了实现怪异模式下的 IE 以及 IE5.x 的块元素居中效果 */
.container {
margin: 0 auto;
width: 960px;
}

请始终使用标准模式,如今IE6/7/8 都要面临淘汰了。

去掉多余的浏览器前缀

还在你的CSS代码中写一大堆浏览器厂商前缀吗?那你就out了!

.header {
-webkit-border-radius: 5px;
-moz-border-radius: 5px; /* 1 */
-ms-border-radius: 5px; /* 2 */
-o-border-radius: 5px; /* 3 */
border-radius: 5px;
} /**
* 1.新版本的 Firefox 已经不再支持 -moz-border-radius 属性,
* 同时,从 Firefox 4.0 就开始支持标准的 border-radius 写法了。
* 2.IE 9+ 支持标准的 border-radius 写法,IE 8 及更低版本什么写法都不支持。
* 3.Opera 10.50+ 支持标准的 border-radius 写法
* 换芯后的 Opera 同时还支持 -webkit-border-radius 写法
*/
.header {
-webkit-border-radius: 5px;
border-radius: 5px;
}
/* 更进一步 */
.header {
border-radius: 5px; /* 4 */
} /**
* 4.另外 Android 2.1+, iOS 4.0+, Safari 5+ 均支持标准 border-radius 写法
*/

可以使用 Sass 定义一个 Mixin 来完成这件事情,

@mixin border-radius($radius) {
-webkit-border-radius: $radius;
border-radius: $radius;
} .header {
@include border-radius(5px);
}

用 Less 同样,

.border-radius(@radius) {
-webkit-border-radius: @radius;
border-radius: @radius;
} .header {
.border-radius(5px);
}

将常用的 CSS3 属性全部封装成 Mixin,既可以减少代码量,也可以很好地控制哪些浏览器前缀应该去掉,而哪些应该保留,当某个前缀不再需要的时候可以很轻松地删掉,更多资料请参考 http://css3please.com/,在这里你可以更清楚地看到某个属性需要哪些浏览器厂商前缀,也可以参考使用以下项目,都有很成熟的 Mixins 供使用,

Sass 相关

Less 相关

还有,就是压缩代码了!关于代码压缩的内容,就不在这里说了!

参考资料:

  • http://www.w3school.com.cn/css/index.asp
  • http://caniuse.com/
  • http://css3please.com/
  • Smashing CSS: Professional Techniques for Modern Layout, by Eric A. Meyer
  • Pro CSS for High Traffic Websites, by Antony Kennedy & Inayaili de león

精简CSS代码的更多相关文章

  1. Web前端开发最佳实践(9):CSS代码太太乱,重复代码太多?你需要精简CSS代码

    前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ...

  2. 精简CSS代码,提高代码的可读性和加载速度

    前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ...

  3. CSS代码原则

    css的团队合作规则以及怎样写出高性能的css代码. 一.使用Reset但并非全局Reset 同浏览器元素的默认属性有所不同,使用Reset可重置浏览器元素的一些默认属性,以达到浏览器的兼容.但需要注 ...

  4. 教你如何写出高效整洁的 css 代码——css优化(转载)

    css 写起来并不难,但在大型项目中,就变得难以管理,特别是不同的人在 css 书写风格上稍有不同,团队上就更加难以沟通,为此总结了一些如何实现高效整洁的 css 代码原则. css 优化的原则 1. ...

  5. 高效整洁CSS代码原则 (下)

    6. 适当的代码注释 代码注释可以让别人更容易读懂你的代码,且合理的组织代码注释,可使得结构更加清晰.你可以选择做的样式表的开始添加目录: /*---------------------------- ...

  6. 使用gulp-uncss精简css,去除冗余代码

    写html页面的时候,多修改几次就会出现很多无用的css代码,下面使用gulp-uncss来精简css文件,去掉没用的css代码 1.首先找个目录创建一个gulp项目在命令行输入:npm init   ...

  7. CSS代码重构与优化之路

    作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...

  8. CSS代码重构

    CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高 ...

  9. 【转】编写更好的CSS代码

    原文转自:http://blog.jobbole.com/55067/ 编写好的CSS代码,有助提升页面的渲染速度.本质上,引擎需要解析的CSS规则越少,性能越好.MDN上将CSS选择符归类成四个主要 ...

随机推荐

  1. ios下Safari无法触发click事件的处理

    ios下的Safari真是傲娇啊,坑好多. 首先上代码 <!DOCTYPE html> <html> <head> <title>122</tit ...

  2. ISO给UIImageView增加点击事件

    自己做了一个九宫格,里面的图标都是由多张图片重叠构成,然后包装成一个button来使用: 遇到的问题是如何给这个“button”增加点击事件? 解决思路1:网友提示在该“button”上增加一个真正的 ...

  3. ActionBarSherlock SlidingMenu整合,解决SlidingMenu example的getSupportActionBar()方法不能用问题

    今天下载了SlidingMenu来研究,发现里面那个自带的example不能使用,总是提示BaseActivity 里面找不到getSupportActionBar()方法,到Github上面一查果然 ...

  4. ruby -- 基础学习(八)中文字符串截取的函数

    学习来源:http://www.codesky.net/article/200910/166595.html truncate(text, length = 30, truncate_string = ...

  5. 通过python切换hosts文件

    做开发或测试时常需要切换hosts ,如果hosts比较多,那么频繁的打开hosts文件对地址加注释(#),再把去掉注释是个繁琐的事情. 当然,SwitchHosts 已经可以帮我们方便的解决了这个繁 ...

  6. mysql按汉语拼音首字母排序

      如果数据表table的某字段name的字符编码是utf8_general_ci :   SELECT *  FROM `table` ORDER BY convert(name USING gbk ...

  7. 将form表单元素转为实体对象 或集合 -ASP.NET C#

    简介: 做WEBFROM开发的同学都知道后台接收参数非常麻烦 虽然MVC中可以将表单直接转为集实,但不支持表单转为 LIST<T>这种集合 单个对象的用法: 表单: <input n ...

  8. Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)

    是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模 ...

  9. fpmmm(mpm)监控mysql模块安装

    zabbix mpm监控mysql是一个蛮不错的监控模块,不过最近官网已经不叫mpm了,而是叫fpmmm,理由为: fpmmm is the successor of mpm. mpm was ren ...

  10. Linux文件打包压缩、解压缩、备份命令使用方法(转载)

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar.可 ...