咱们应用CSS的能力应该分红两部分:一部分是CSS的API,重点是如何用CSS控制页面内元素的样式;另外一部分是CSS框架,重点是如何对CSS进行组织。css
推荐一种组织CSS的方法: base.css + common.css + page.css
html
base层:reset功能+通用类
common层:组件级别的CSS类
page层:页面级别CSS样式前端
模块化可让代码高度重用,显著提升开发效率。编程
咱们拿到设计稿的时候,首先能够从视觉上进行划分,样式和功能相对独立且稳定的一部分就能够视为模块。
这里介绍两个拆分模块技巧:服务器
模块与模块之间尽可能不要包含相同的部分,若是有相同的部分,应将他们提取出来,拆分红一个独立的模块。框架
模块应在保证尽量少的原则下,作到尽可能简单,以提升重用性。模块化
这里推荐一种在class前加入前缀的方式构建相似于命名空间的概念. 举个例子:post
<div class="box"> <div class="box-hd"></div> <div class="box-bd"></div> <div class="box-ft"></div> </div>
还需注意一点:css class的命名推荐使用英语,不要使用汉语拼音。字体
举个例子,有两个列表,列表条目1字体14px红色,列表条目2字体16px绿色:
方案一:网站
<ul class="number-list1 f14 red"> <li>1111</li> <li><2222/li> <li>3333</li> </ul> <ul class="number-list2 f16 green"> <li>1111</li> <li><2222/li> <li>3333</li> </ul>
而后分别为number-list1与number-list2设置样式
方案二 :
<ul class="number-list1 f14 red"> <li>1111</li> <li><2222/li> <li>3333</li> </ul> <ul class="number-list2 f16 green"> <li>1111</li> <li><2222/li> <li>3333</li> </ul>
而后,将样式分解为颗粒度小的class内,利用类组合达到效果。这就是多用组合少用继承的思想。
模块化写类的样式时,经常须要写margin样式。这个时候不建议给某个div同时设置margin-top, margin-bottom值。由于可能会带来上下margin重合的问题。
若是不肯定模块的上下margin特别稳定,最好不要将它写进模块的类里,而是使用类的组合,单独为上下margin挂上用于肯定边距的之类。
模块作好不要混用margin-top和margin-bottom,统一使用margin-top或margin-bottom。
复习一下CSS权重问题:
CSS的选择符是有权重的:id选择器的权重是100、class选择器的权重是十、标签选择器的权重是1;
当不一样选择符的样式设置有冲突时,会采用权重高的选择符设置的样式。
若是CSS选择符权重相同,那么样式会遵循就近原则,哪一个选择符最后定义,就采用哪一个。(就近原则指的是定义样式的前后,不是挂class名的前后)
咱们在设置样式时,适当使用子选择器,能够增长CSS的权重。例如:span .font{} 的样式会覆盖.font{}的样式。但CSS选择符的权重越高,样式越不容易覆盖。为了保证样式容易被覆盖,提升可维护性,CSS选择符需保证权重尽量低。
将网站的多张背景图合并到一张大图上,这即是CSS sprite.
CSS sprite出发点已经不只是“解决滑过状态时背景图片出现空白”的问题了,经过将多张图片合并成一张大图,会大大减小网页的HTTP请求数,减少服务器压力。这对于流量比较大的网站颇有价值。
CSS sprite只能合并用于背景的图片,对于<img src=“”>
设置的图片,是不能合并到css sprite大图中的。若是合并这些图片会影响页面的可读性。
对于横向和纵向都平铺的图片也不能使用CSS sprite.
这里扩展一个问题: 咱们在写页面时,对于图片,是使用img标签好呢?仍是使用background-img属性好呢?
如下对两者进行一个对比总结:
本质区别:img标签是html标签,background-img是CSS的一个样式;
加载方面:img标签是html结构的一部分,img 会在加载结构时进行加载,而background-img会在结构和内容加载完成后才开始加载;
SEO方面:搜索引擎会关注img标签的alt属性;这时若是使用了background-img则页面可读性比较差;另外,有些网站须要在禁用css状况下运行,此时比较重要的图片例如logo,就须要使用img标签而不是background-img.
在多数场景下,两者都能完成工做。好比hover切换图片,能够改变img的src属性,也能够改变background-img的url; 好比改变图片的位置,能够改变img元素的位置,也能够改变background-img的postion;
CSS sprite将多张图片合并为一张图片,经过控制background-position进行定位,这对于图片的位置精确程度要求很是高。定位完成后,大图中的每一个小图的坐标值不可轻易改动,这在必定程度上下降了可维护性。
所以,如何排列图片可以尽可能紧凑,同时保证不会影响扩展性,是CSS sprite技术最困难也是最具挑战性的地方。
以上,从分层组织CSS,模块化CSS,使用时注意低权重原则,以及巧用CSS雪碧图阐述了提升CSS代码质量的四个方面。更多方法还需在实践中积累。
[1].编写高质量代码-Web前端开发修炼之道 -- 曹刘阳.