如何组织CSS
三层结构:base+common+page
分层目的:减少代码量;便于多人开发和维护1.base层
最底层,一般设置文件为只读,与具体的UI无关,提供:
- reset功能。因为浏览器对元素的默认样式不同,使用reset可以覆盖掉浏览器的默认样式,使浏览器的起点尽量一致。
- 粒度最小的通用原子类,避免重复写某些样式,减少代码量。
推荐代码:
/*CSS reset*/body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {margin:0;padding:0;}table {border-collapse:collapse;border-spacing:0;}fieldset,img {border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul {list-style:none}caption,th {text-align:left}h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:normal}q:before,q:after {content:''}abbr,acronym { border:0} /*文字排版*/.f12{font-size:12px}.f13{font-size:13px}.f14{font-size:14px}.f16{font-size:16px}.f20{font-size:20px}.fb{font-weight:bold}.fn{font-weight:normal}.t2{text-indent:2em}.lh150{line-height:150%}.lh180{line-height:180%}.lh200{line-height:200%}.unl{text-decoration:underline;}.no_unl{text-decoration:none;} /*定位*/.tl{text-align:left}.tc{text-align:center}.tr{text-align:right}.bc{margin-left:auto;margin-right:auto;}.fl{float:left;display:inline}.fr{float:right;display:inline}.cb{clear:both}.cl{clear:left}.cr{clear:right}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.clearfix{display:inline-block}* html .clearfix{height:1%}.clearfix{display:block}.vm{vertical-align:middle} .pr{position:relative}.pa{position:absolute}.abs-right{position:absolute;right:0}.zoom{zoom:1} .hidden{visibility:hidden} .none{display:none} /*长度高度*/.w10{width:10px}.w20{width:20px}.w30{width:30px}.w40{width:40px}.w50{width:50px}.w60{width:60px}.w70{width:70px}.w90{width:90px}.w100{width:100px}.w200{width:200px}.w250{width:250px}.w300{width:300px}.w400{width:400px}.w500{width:500px}.w600{width:600px}.w700{width:700px}.w800{width:800px}.w{width:100%}.h50{height:50px}.h80{height:80px}.h100{height:100px}.h200{height:200px}.h{height:100%} /*边距*/.m10{margin:10px}.m15{margin:15px}.m30{margin:30px}.mt5{margin-top:5px}.mt10{margin-top:10px}.mt15{margin-top:15px}.mt20{margin-top:20px}.mt30{margin-top:30px}.mt50{margin-top:50px}.mt100{margin-top:100px}.mb5{margin-bottom:5px}.mb10{margin-bottom:10px}.mb15{margin-bottom:15px}.mb20{margin-bottom:20px}.mb30{margin-bottom:30px}.mb50{margin-bottom:50px}.mb100{margin-bottom:100px}.ml5{margin-left:5px}.ml10{margin-left:10px}.ml15{margin-left:15px}.ml20{margin-left:20px}.ml30{margin-left:30px}.ml50{margin-left:50px}.ml100{margin-left:100px}.mr5{margin-right:5px}.mr10{margin-right:10px}.mr15{margin-right:15px}.mr20{margin-right:20px}.mr30{margin-right:30px}.mr50{margin-right:50px}.mr100{margin-right:100px}.p10{padding:10px;}.p15{padding:15px;}.p30{padding:30px;}.pt5{padding-top:5px}.pt10{padding-top:10px}.pt15{padding-top:15px}.pt20{padding-top:20px}.pt30{padding-top:30px}.pt50{padding-top:50px}.pb5{padding-bottom:5px} .pb10{padding-bottom:10px}.pb15{padding-bottom:15px}.pb20{padding-bottom:20px}.pb30{padding-bottom:30px}.pb50{padding-bottom:50px}.pb100{padding-bottom:100px}.pl5{padding-left:5px}.pl10{padding-left:10px}.pl15{padding-left:15px}.pl20{padding-left:20px}.pl30{padding-left:30px}.pl50{padding-left:50px}.pl100{padding-left:100px}.pr5{padding-right:5px}.pr10{padding-right:10px}.pr15{padding-right:15px}.pr20{padding-right:20px}.pr30{padding-right:30px}.pr50{padding-right:50px}.pr100{padding-right:100px}
这样写有很好好处,比如我要实现:一个向左浮动,长宽都是50的div,只需要这样写:
不用再去样式表里挨个定义了,提高了开发效率,也提高了代码可读性。
再比如我想把这个div抱在一个父级div中且闭合浮动,只需要给父级div加一个class就OK并且兼容IE:2.common层
提供组件级的CSS类。我们将网页内的元素拆成一个个相对独立的小模块,其中有些模块会大量重复,把大量重复的模块抽取出来放到common.css
3.page层
提供页面层架的CSS类。高度重用的模块放到了common层,那剩下的非高度重用的模块就放到page层。注意page层还是应该越精简越好,能用common层和base层解决的就不要用page层解决。
模块化CSS
两条原则:
- 模块与模块之间尽量不要包含相同的部分,如果包含相同的部分,则把相同的部分提取出来,形成一个新的模块。
- 模块应在保证数量尽可能少的情况下,做到尽可能简单,提高重用性。
模块的功能越简单,弹性越高,重用性越高,但是会造成模块的数量增加,维护难度增加,应该在”数量少“和“功能简单”之间找到平衡点。
CSS命名
命名最好体现从属关系,推荐大小写和划线混用,大小写区分单词,下划线表明从属,比如下面的列表
- 8月
- 9月
- 10月
多人合作的时候,给没人分配一个ID可以避免命名冲突
多用组合,少用继承
将一个复杂的类分成简单的类,类之间没有继承关系,通过这些类的组合实现需要的功能,这样代码的体积,扩展的弹性都要更好。
处理上下margin
由于上下margin会重叠,因此最好统一使用margin-top或者margin-bottom来避免margin重合。
避免滥用子选择器
使用子选择器会增加CSS选择符的权重,为了保证样式容易被覆盖,提高可维护性,CSS选择器的权重尽可能低。如果选择符的权重过高,可能会造成样式的覆盖。少用子选择器就要多添加class。
CSS常见问题
1.尽量用class,少用id
原因:
- id选择器的权重高,样式不容易被覆盖。
- id在网页中只能出现一次,不容易扩展。
2.CSS hack
hack原理:
由于不同的浏览器和浏览器各版本对CSS的支持及解析结果不一样,以及CSS优先级对浏览器展现效果的影响,我们可以据此针对不同的浏览器情景来应用不同的CSS。除非迫不得已,否则尽量不用CSS hack
- IE条件注释
- 选择符前缀
- 样式属性前缀
relative,absolute,float
绝对定位和浮动都会让元素脱离正常的文档流,不同的是,绝对定位会使元素浮起来,也就是z-index>0,但是浮动仍然让元素在z-index=0层。