如果你一直从事程序相关的工作,比如说程序员,但是并没有深入研究过前端。可能你会和我有一样的困惑。html+css或者前几年比较流行的说法div+css,好像很简单,html不就是几个标签,css不就是几个渲染效果,为什么别人用得那么溜,为什么在我手里就这么不对,到处都是错位。
那么,你或许应该和我一起熟悉下以下这几个概念
什么叫做文档流? 将窗体自上而下分成一行行,并在每行中按从左至右的顺序排列元素,即为文档流。
有三种情况使得元素脱离文档流而存在,分别是浮动,绝对定位,固定定位。
没错,这就是文档流,就像写信一样,从左至右,自上而下,就这么简单,互联网一开始就是为了浏览这些文档。
但是,这样不利于排版,于是,早期的互联网专家们为了更方便的写出更直观的文档,他们制定了HTML并且规定了一些基本原则,比如,所有的元素分为三类:块级元素(block),内联元素(inline),可变元素(这个其实可以不算进去)。
每个非浮动块级元素都独占一行,浮动元素按规定负载行的一端。若当前行容不下,则另起新行浮动。
块元素(block element)
任何不适块级元素的课件元素都是内联元素。其表现的特性是行布局,这里的行布局就是说其表现形式始终以行进行。
内联元素(inline element)
可变元素为根据上下文语境决定该元素为块元素或者内联元素。 不用纠结这个概念,它就是块元素或者内联元素。
可变元素 + applet - java applet + button - 按钮 + del - 删除文本 + iframe - inline frame + ins - 插入的文本 + map - 图片区块(map) + object - object对象 + script - 客户端脚本
关于盒子模型(box model),必须要了解的就是IE模型和W3C模型的差异,这也是造成我们需要解决各浏览器兼容性的主要方面!下面这张图说明了这种差异性的本质。
其实也就是说,在w3c盒子模型中,width和height定义的仅仅是content的宽高,但在IE模型中定义的是包括border和padding在内的真正的盒子的宽高,很明显IE模型反而更为厚道一些,在w3c模型中,一个布局都已定义好的页面,若是想更改某个box的padding,你必须同时更改这个box的content的width和height,而在IE模型中你只需改变padding。这确实无疑是w3c的一个失误,不过它已在CSS3中有所修正。
另外,我之前没有注意到的一点是,原来各个盒子之间的margin并不是相加,而是看谁的大就用谁的。 可是有个问题我仍在疑惑,并没有实验取证: 嵌套的盒子模型之间,里面盒子的margin和外面盒子的padding是相加还是怎么个处理方式?
然后,就可以说到关于解决IE模型和W3C模型差异的方法,以下是我收集的各种方法,可供参考:
此处可参考博客园,虽然我它应该也是抄的,而且就是抄的百度词条的。
<!DOCTYPE html> <html> <head> <title>Css Hack</title> <style> #test { width:300px; height:300px; background-color:blue; /*firefox*/ background-color:red\9; /*all ie*/ background-color:yellow\0; /*ie8*/ +background-color:pink; /*ie7*/ _background-color:orange; /*ie6*/ } :root #test { background-color:purple\9; } /*ie9*/ @media all and (min-width:0px){ #test {background-color:black\0;} } /*opera*/ @media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} } /*chrome and safari*/ </style> </head> <body> <div id="wrapper-test"> <div id="test">test</div> </div> </body> </html>
我对CSS HACK也不是很了解,此处只是作为一个笔记留些示例笔记在此处。
在IE7还没出现之前,曾有过这样的处理方式,比如上面的#test 我们这样处理就可以解决在不同的浏览器实现不同效果。
#test{ background-color:blue !important;/*for firefox*/ background-color:red;/*for ie6*/ }
原理很简单,IE6不识别!important。
本来只有一个content层,比如#test,再外面加一个wrapper层,比如#wrapper-test div#wrapper-test用来实现padding,margin和border,不定义width和height div#test用来定义height和width,padding和margin,border都定义为0
#wrapper-test{ padding: 20px; margin: 20px; border: 1px solid red; } #test { margin:0; padding:0; border:none; height:100px; width:100px; background-color:blue; }
以上这一段在任何浏览器应该都有你期望的显示了!
在css3中,有一个属性box-sizing,它有两个可选值:content-box和border-box,选用后者,则会按IE模型处理盒子。所以你可以这样:
textarea { -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ -moz-box-sizing: border-box; /* Firefox, other Gecko */ box-sizing: border-box; /* Opera/IE 8+ */ }
在css3中,关于盒子的大小控制,排列,布局有很多有意思的新东西。
关于box model还有另外一个方面是需要注意的,我们初学者容易忽视的,width:auto的情况以及一些例外。
几种解决方案:
.clear{clear:both:height:0;overflow:hidden;} /*需要清除的地方加div.clear*/ .clearfix:after{content:".";display:block;height:0;clear:both;visibilty:hidden} .clearfix{*+height:1%;}; /*浮动元素的父元素添加class="clearfix"*/ .clearfix{overflow:auto;_height:1%;} .clearfix{overflow:hidden;_zoom:1;}
盒子模型大概是CSS最难搞定的地方了吧,网上的文档乱得一塌糊涂,哪位同学或者高人有介绍盒子模型的资料推荐么,中文英文都OK,网上的或者纸质书本也都OK。
其实混合使用,才会有最佳的解决方案,响应式布局将屏幕大小分为几个大块,380~720,760~1280,更大等等,流动布局确定某个block的大小,更好的将黄金分割率及三等分割原则用于设计,em用于一些LOGO或者ICO的大小指定,使得其不失去提醒的功能,固定布局则可用于留白等等,当然,这只是我的以为,具体设计还得积累经验。
即z-index,需要注意的是z-index仅仅在设置了position属性的元素上起左右,即设置了position为absolute,fixed或者relative,在static上不起作用。
几个原则: !important的用户样式>!important的作者样式>作者样式>用户样式>浏览器定义的样式 作者样式中:元素内定样式>内嵌样式表>导入样式表(@import)>外链样式表 用户样式即用户在浏览器里自己写配置文件定义的样式。
具体到每条规则遵循以下规则:
对于规则中的每个ID选择符,特殊性加0,1,0,0 对于规则中每个类选择符和属性选择符以及伪类,特殊性加0,0,1,0 对于规则中的每个元素名或者伪元素,特殊性加0,0,0,1 对于通配符,特殊性加0,0,0,0. 对于内联规则,特殊性加 1,0,0,0
比方说:
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> p{ color:red; } /*特殊性为0,0,0,1*/ div p{ color:blue; } /*特殊性为0,0,0,2*/ #test { color:yellow; } /*特殊性为0,1,0,0*/ </style> </head> <body> <div> <p class="test"></p> </div> </body> </html>
很容易理解,0,1,0,0>0,0,0,2>0,0,0,1,所以字体颜色为黄色。
另外,如果同等特殊性的规则你写两次的话,后面那个优先级大于前面那个。 比如
:active{color:Red;} :hover{color:Blue;} :visited{color:Purple;} :link{color:Green;}
传说是不会出现红色和蓝色的。 你最好这样写:
:link{color:Green;} :visited{color:Purple;} :hover{color:Blue;} :active{color:Red;}
不过,这个问题我倒从来没遇到过,也许现在浏览器智能了。
本人第一次发文,请轻拍!
投稿来源于:热血HACKER LOKI