《Web前端开发修炼之道》-读书笔记CSS部分

如何组织CSS-分层css

应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式;另外一部分是css框架,重点是如何对 css 进行组织。如何组织 css 能够有多种角度,例如按功能划分,或者按区块划分。这里讲一下 base.css + common.css + page.css 的组织方法。将网站内的全部样式,按照职能分红三大类:base、common、page,这三者是层叠结构。html

一、base 层-精简通用前端

位于三者的最底层,提供 css reset 功能和粒度最小的通用类——原子类。这一层会被全部页面引用,是页面样式所需依赖的最底层,不一样风格的网站可使用同一个 base 层,因此,应具备高度可移植性,力求精简和通用。该层相对稳定,基本不须要维护,能够简单地放在一个文件里,如 base.css。web

css reset 即一开始就将浏览器的默认样式所有去掉,就是经过从新定义标签的样式,“覆盖”掉浏览器提供的默认样式。能够将经常使用的标签显式地罗列出来,避免使用“*”,如来自于 YUI 的部分 css 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;}

通用原子类是一系列经常使用的基本类,包括:文字、定位、长度和边距,因为其原子性,除少数特殊类,大部分都只包含一句 css,如:.f12{font-size:12px;},因为其通用性,在保证命名有语义前提下,命名应尽可能简短,如 paddingtop20 能够写成 pt20。通用原子类里有几个类较特殊,特别说明一下:安全

1).fl 类和.fr 类:除了设置 float:left 和 float:right 以外,还应设置 display:inline,能够解决 IE6 的双外边距 Bug。 .fl{float:left;display:inline;} .fr{float:right;display:inline;} 2).bc 类:为使块级元素居中,还要设定宽度,能够把它和 .w100 等类同时使用,如: .bc{margin-left:auto;margin-right:auto;} .w100{width:100;} 3).clearfix 类:用于在父容器直接清除子元素浮动。 4).zoom 类:设置样式是 zoom:1,它是 IE 的专有属性,用以触发 hasLayout。

二、common 层-组件级,模块化,重用服务器

位于中间,提供组件级的 css 类。能够将页面内的元素拆分红一小块功能和样式相对独立的小“模块”,将大量重复地“模块”视为一个组件,放在 common 层里(“模块化”能够从样式和行为两个层面来考虑,与 common 层相关的是样式的模块化)。common 层至关于 MVC 模式中的 M(Model,模型),需尽量将内部实现封装。 
(web前端学习交流群:328058344 禁止闲聊,非喜勿进!)app

common 层是网站级的,不一样的网站有不一样的 common 层,同一个网站只有一个 common 层,能够放在一个文件里,也可按功能划分放在多个文件里。在团队合做中,common 层最好由一我的负责,统一管理。框架

三、page 层 
网站中非高度重用的模块,能够放在 page 层里。page 层位于最高层,提供页面级的样式。若是网站规模不过于庞大,能够将全部 page 层放在一个文件里,根据页面配上注释,分块书写,便于维护。page 层 css 文件应越简越好,能用 base 层和 common 层的 css 解决的,尽可能不要用到 page 层。模块化

避免滥用子标签

低权重原则。

能用组合,不用继承。

驼峰命名用于区别不一样单词,划线用于代表从属关系。

CSS sprite

  1. 技术是针对做为背景的图片,对与html文档设置的图片,不能合并到CSS Sprite大图,不然图片会影响页面可读性。

  2. 对于横向和纵向都平铺的图片,也不能使用CSS sprite;若是是横向平铺的,只能将全部横向平铺的图合并成一张大图,只能竖直排列,不能水平排列;若是是纵向平铺的,只能将全部纵向平铺的图合并成一张大图,只能水平排列,不能竖直排列。

  3. CSS sprite的图片定位可使用bg2css小工具快速定位background-positon坐标,有利于提升开发速度。

  4. 好处是减小HTTP请求数减轻服务器压力,缺点是下降开发效率、增长维护难度。CSS Sprite大图中每一个图片的维护改动都要谨慎,防止影响周围的图片。

网站是否使用CSS Sprite技术,主要取决于网站流量。

流量大的网站好处明显:减小HTTP请求数量,减轻服务器压力;(电商,微博,轻博,社区)

流量不大的网站代价很大:下降开发效率,增大维护难度(后台管理系统通常不适合使用)

CSS hack

1.IE条件注释法

该方法安全性、兼容行好,也是微软推荐的hack方法,可是不利于开发维护,须要维护多份css文件。好比涉及到针对不一样版本IE的css。

<!--[if IE]><![endif]--> 只在IE下有效 <!--[if IE 6]><![endif]--> 只在IE6有效 <!--[if gt IE 6]><![endif]--> 只在IE6以上版本有效 注意:结合lte(小于等于)、lt(小于)、gte(大于等于)、gt(大于)、!(非)关键字使用。

2.选择符前缀法

“*html” 前缀只对IE6生效 "*+html"前缀只对IE7生效 .test{width:80px;} /*IE 6 7 8*/ *html .test{width:70px;} /*IE6*/ *+html .test{width:60px;} /*IE7*/ 缺点:不能保证IE9,10不识别*html,*+html,有向后兼容风险。 

3.样式属性前缀法:

如“_”只在IE6下生效,“*”在IE6和IE7下生效。一样有向后兼容隐患。

.test{width:80px;*width:70px;_width:60px;}

可用于内联样式:<div style="width:80px;*width:70px;_width:60px;"></div> 因为IE条件注释法不利于开发维护,实际中经常使用的hack方法经常是后二者。 

display:inline-block 和 hasLayout

块级元素、行内元素

块级元素会独占一行,默认宽度自动填满其父元素宽度,能够设置width、height、margin、padding属性;

行内元素一行排满才会换行,宽度随元素内容多少变化,设置width、height属性无效,只有水平方向的margin、padding边距有效果。

常见的块级元素有div、p、table、fieldset、form、ul、ol、dl、h1~h六、hr、pre、address、blockquote、center、dir、menu、noframes、noscript。

常见内联元素有input span strong em a abbr acronym br img select textarea等等。

能够经过修改display属性值转行块元素和行内元素。

display的值除了block和inline,还有其余值,例如list-item、teble-cell等,但由于IE6和IE7浏览器支持的display类型不多,因此为兼容IE,真正能用的display类型只有block、inline和none三种。

IE六、IE7支持但不彻底支持display:inline-block属性,但IE8+和FF等标准浏览器支持。

display:inline-block,行内的块级元素,它拥有块级元素的特色,能够设置长宽,能够设置margin和padding值,但它却不是独占一行,它的宽度并不占满父元素,而是和行内元素同样,能够和其余行内元素排在同一里。它集块级元素和行内元素的特色于一身,是个很是有用的display类型(web前端学习交流群:328058344 禁止闲聊,非喜勿进!)

让IE六、IE7支持display:inline-block

利用hasLayout能够再不支持display:inline-blcok的IE6和IE7下模拟出display:inline-block的效果,实现IE六、IE七、IE8+和Firefox都兼容的display:inline-block的应用。可是也有一些问题须要特别注意:

  • 在IE六、IE7中不识别display:inline-block属性,但使用inline-block属性在IE下会触发layout,从而使内联元素拥有了display:inline-block属性的表症。
  • 在IE5.5中开始支持 inline-block 。你可使用 inline-block 使对象得到布局而无需指定确切的高( height )和宽( width )。
  • IE6/IE7的inline-block属性只对原生默认的内联元素(span, a, em……)有效,对于块级元素(div,p,ul……)无效。 In IE 6 and 7 inline-block works only on elements that have a natural display: inline.IE doesn’t apply the value inline-block for the CSS display property on HTML elements that default to block level.
  • 两个结论: 一、IE6/7不识别inline-block,只是触发了layout,表现跟inline-block块元素表现同样。二、IE6/7不彻底支持inline-block,只对内联元素有效。
  • 看官方的说法,确证对inline-block的认识。The following table shows Cascading Style Sheets (CSS) properties and corresponding values that, if set, cause an element to have layout. 
    下表列出一些CSS属性及其值,如下属性一旦设置,将触发元素的layout:
CSS propertyValue

display inline-block height any value float left or right position absolute width any value -ms-writing-modetb-rl zoom any value
  • 延伸问题:IE下块元素如何实现 display:inline-block 的效果? 
    有两种方法:

一、先使用 display:inline-block 属性触发块元素,而后再定义 display:inline,让块元素呈递为内联对象(两个display 要前后放在两个 CSS 声明中才有效果,这是 IE 的一个经典 bug ,若是先定义了 display:inline-block,而后再将 display 设回 inline 或 block,layout 不会消失)。代码以下:

div {display:inline-block;} div {display:inline;}

说明:在IE下,display: inline-block只是触发了元素的layout。好比将display: inline-block给到div上,只能保证这个div拥有块元素的特征(能够设置宽度,高度等),可是仍是行布局(产生换行)。接下来要设置display: inline,更改这个div的布局为内联布局(不产生换行)。

二、直接让块元素设置为内联对象呈递(设置属性 display:inline),而后触发块元素的 layout(可以使用zoom:1 等)。代码以下:

div {display:inline; zoom:1;}

hasLayout

hasLayout设计的初衷是用于辅助块级元素的盒子模型的,它是用于块级元素的。若是用于行内元素,会引起一些特殊效果。(结合上面红色字体理解)

设置宽高属性width、height值均可以触发hasLayout,可是有时候带来反作用,如今经常使用zoom:1;来触发,极少数很是复杂的css设置状况zoom无效的时候,须要借助更为强大的“position:relative”来触发hasLayout。

haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分。在InternetExplorer中,一个元素要么本身对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。为了调节这两个不一样的概念,渲染引擎采用了 hasLayout 的属性,属性值能够为true或false。当一个元素的 hasLayout属性值为true时,咱们说这个元素有一个布局(layout)。

相关文章
相关标签/搜索