《Web前端开发修炼之道》-读书笔记CSS部分
如何组织CSS-分层
应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式;另一部分是css框架,重点是如何对 css 进行组织。如何组织 css 可以有多种角度,例如按功能划分,或者按区块划分。这里讲一下 base.css + common.css + page.css 的组织方法。将网站内的所有样式,按照职能分成三大类:base、common、page,这三者是层叠结构。
1、base 层-精简通用
位于三者的最底层,提供 css reset 功能和粒度最小的通用类——原子类。这一层会被所有页面引用,是页面样式所需依赖的最底层,不同风格的网站可以使用同一个 base 层,所以,应具有高度可移植性,力求精简和通用。该层相对稳定,基本不需要维护,可以简单地放在一个文件里,如 base.css。
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。
2、common 层-组件级,模块化,重用
位于中间,提供组件级的 css 类。可以将页面内的元素拆分成一小块功能和样式相对独立的小“模块”,将大量重复地“模块”视为一个组件,放在 common 层里(“模块化”可以从样式和行为两个层面来考虑,与 common 层相关的是样式的模块化)。common 层相当于 MVC 模式中的 M(Model,模型),需尽可能将内部实现封装。
(web前端学习交流群:328058344 禁止闲聊,非喜勿进!)
common 层是网站级的,不同的网站有不同的 common 层,同一个网站只有一个 common 层,可以放在一个文件里,也可按功能划分放在多个文件里。在团队合作中,common 层最好由一个人负责,统一管理。
3、page 层
网站中非高度重用的模块,可以放在 page 层里。page 层位于最高层,提供页面级的样式。如果网站规模不过于庞大,可以将所有 page 层放在一个文件里,根据页面配上注释,分块书写,便于维护。page 层 css 文件应越简越好,能用 base 层和 common 层的 css 解决的,尽量不要用到 page 层。
避免滥用子标签
低权重原则。
能用组合,不用继承。
驼峰命名用于区别不同单词,划线用于表明从属关系。
CSS sprite
技术是针对作为背景的图片,对与html文档设置的图片,不能合并到CSS Sprite大图,否则图片会影响页面可读性。
对于横向和纵向都平铺的图片,也不能使用CSS sprite;如果是横向平铺的,只能将所有横向平铺的图合并成一张大图,只能竖直排列,不能水平排列;如果是纵向平铺的,只能将所有纵向平铺的图合并成一张大图,只能水平排列,不能竖直排列。
CSS sprite的图片定位可以使用bg2css小工具快速定位background-positon坐标,有利于提高开发速度。
好处是减少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~h6、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三种。
IE6、IE7支持但不完全支持display:inline-block属性,但IE8+和FF等标准浏览器支持。
display:inline-block,行内的块级元素,它拥有块级元素的特点,可以设置长宽,可以设置margin和padding值,但它却不是独占一行,它的宽度并不占满父元素,而是和行内元素一样,可以和其他行内元素排在同一里。它集块级元素和行内元素的特点于一身,是个非常有用的display类型(web前端学习交流群:328058344 禁止闲聊,非喜勿进!)
让IE6、IE7支持display:inline-block
利用hasLayout可以再不支持display:inline-blcok的IE6和IE7下模拟出display:inline-block的效果,实现IE6、IE7、IE8+和Firefox都兼容的display:inline-block的应用。但是也有一些问题需要特别注意:
- 在IE6、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.
- 两个结论: 1、IE6/7不识别inline-block,只是触发了layout,表现跟inline-block块元素表现一样。2、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 的效果?
有两种方法:
1、先使用 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的布局为内联布局(不产生换行)。
2、直接让块元素设置为内联对象呈递(设置属性 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)。
《Web前端开发修炼之道》-读书笔记CSS部分的更多相关文章
- 《编写高质量代码:Web 前端开发修炼之道》 笔记与读后感
编写高质量代码:Web 前端开发修炼之道/曹刘阳著. —北京:机械工业出版社,2010.5 第一版 涉及到的知识点: 1. CSS Sprites 在国内很多人叫css精灵,是一种网页图片应用处理方式 ...
- 读《编写高质量代码-Web前端开发修炼之道》笔记
第一章 1.Web标准由一系列标准组合而成,核心理念是将网页的结构,样式和行为分离,所以分为三大部分:结构标准,样式标准和行为标准.结构标准包括XML标准,XHTML标准,HTML标准:样式标准指CS ...
- 『编写高质量代码Web前端开发修炼手册』读书笔记--高质量的CSS
1.怪异模式和DTD 标准模式:浏览器根据规范表现页面 怪异模式:模拟老浏览器行为防止老站点无法工作(为了兼容老式浏览器的代码),如果漏写DTD(Document Type Definition文档定 ...
- 《编写高质量代码--Web前端开发修炼之道》读书笔记
前言 这两周参加公司的新项目,采用封闭式开发(项目成员在会议室里开发),晚上加班到很晚,所以没时间和精力写原创博客了,今天就分享下这篇<编写高质量代码--Web前端开发修炼之道>读书笔记吧 ...
- [读书笔记] Web 前端开发修炼之道
原创地址:http://www.cnblogs.com/bnbqian/p/3735565.html 转载请注明出处 今天我们要读的书是Web 前端开发修炼之道 第1章 从网站重构说起 1.1 糟糕的 ...
- 编写高质量代码:Web前端开发修炼之道(一)
最近老大给我们买来一些技术方面的书籍,其实很少搬着一本书好好的完整的看完过,每每看电子档的,也是打游击式的看看这章,瞅瞅那章,在那5本书中挑了一本比较单薄的<编写高质量代码web前端开发修炼之道 ...
- 《编写高质量代码-Web前端开发修改之道》笔记--第一章 从网站重构说起
本章内容: 糟糕的页面实现,头疼的维护工作 Web标准--结构.样式和行为的分离 前端的现状 打造高品质的前端代码,提高代码的可维护性--精简.重用.有序 糟糕的页面实现,头疼的维护工作 工作中最大的 ...
- 《编写高质量代码-Web前端开发修改之道》笔记--第二章 团队合作
本章内容: 揭秘前端开发工程师 欲精一行,必先通十行 增加代码的可读性--注释 提高重用性--公共组件和私有组件的维护 冗余和精简的矛盾--选择集中还是选择分散 磨刀不误砍柴工--前期的构思很重要 制 ...
- 【读书笔记】读《编写高质量代码—Web前端开发修炼之道》 - JavaScript原型继承与面向对象
JavaScript是基于原型的语言,通过new实例化出来的对象,其属性和行为来自于两部分,一部分来自于构造函数,另一部分是来自于原型.构造函数中定义的属性和行为的优先级比原型中定义的属性和优先级高, ...
随机推荐
- jmeter测试HTTP请求
HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GE ...
- Java对象大小:size和retained size
最近看到网上很多文章讲如何计算java对象的大小(size),很多观点不敢苟同. 这是其中一篇比较靠前的文章,写的也比较全面: http://blog.csdn.net/iter_zc/article ...
- js 倒计时(服务器时间同步)
首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差.有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的. 方案1:每次倒计时去服务端请求时间 // ...
- shell脚本获取文件中key/value的小方法
方法有N种,awk.sad.grep.cut... 以上几种方式不写了,就写两个不太常用到的. 废话少说,直接上代码: cat a.txt aa.gif=aaaa.gif bb.gif=bbbb.gi ...
- 1.在CentOS 6.4安装python3
CentOS安装Python3.X 1.系统环境说明 [root@Python ~]# uname -r 2.6.32-431.el6.i686 [root@Python ~]# uname -m i ...
- 第4章 同步控制 Synchronization ----事件(Event Objects)
Win32 中最具弹性的同步机制就属 events 对象了.Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态.这两种状态全由程序来控制,不会成为 Wait...() 函数的副作 ...
- Rundeck部署和基本使用
rundeck 介绍 Rundeck 是一款能在数据中心或云环境中的日常业务中使程序自动化的开源软件.Rundeck 提供了大量功能,可以减轻耗时繁重的体力劳动.团队可以相互协作,分享如何过程自动化, ...
- Ubuntu16.04.1安装JDK1.8.0
今天在安装Zookeeper的时候需要安装JDK,对于.Neter来说还是有点陌生,下面我就把安装JDK的步骤记录一下,分享给大家. 一.下载JDK安装包:http://www.oracle.com/ ...
- MMORPG战斗系统随笔(三)、AI系统简介
在设计一款游戏的时候,如果我们是玩家,是希望自己能够操作角色畅玩游戏的.在一款MMORPG游戏中,大部分的实际游戏角色,是需要玩家来操作的,通过在游戏大世界相互完成游戏中的任务等等来体验游戏.在大世界 ...
- ASP.NET没有魔法——目录
ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序 ASP.NET没有魔法——为什么使用ASP.NET ASP.NET没有魔法——第一个ASP.NET应用<MyBlog&g ...