分享
 
 
 

错误的盒式模型和一个解决办法

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

下面这幅图是我的Blog页面使用Mozilla浏览的时候的情况。

一塌糊涂吧,左边的导航栏覆盖住了右边的内容浏览区,还有一幅图片(我用来做Border背景),漂浮在错误的位置上。

为什么会出现这样的问题呢?原因是IE浏览器对CSS Box model的理解和Mozilla的理解不一样,Mozilla按照W3C推荐的CSS标准来创建CSS Box model,IE浏览器对Box model有一个错误的理解,IE浏览器的Box model让成千上万的网页设计师、开发人员们学习了,并且一直错误的运用着(原来我也是其中一员)

著名的网页设计大师Zeldman在他的著作《Designing with Web Standards》用了一章重点的阐明了这个问题。

一个网页中,W3C的CSS中推荐使用一个盒来存放网页元素,一个标准的CSS定义的网页就是不同的盒子排列、嵌套组成的。

一个盒子的组成如下图:

css使用width和height来定义内容(content)区的宽度和高度

使用padding-top、padding-bottom、padding-left、padding-right定义填充(padding)区的上下左右的值。

使用border-top、border-bottom、border-left、border-right定义边界(border)的上下左右宽度。

使用margin-top、margin-bottom、margin-left、margin-right定义页边空白(margin)的上下左右的值。

但是IE浏览器却把width、height理解成为

width = 内容区宽度 + border-left + border-right + padding-left+ padding-right

height = 内容高度 + border-top + border-bottom + padding-top + padding-bottom

哈哈,你也是这么理解的吧,很多人都是这么认为的,或许是w3c在对width的定义的时候没有考虑过这个词的将引起的歧义。

jessey的这个网页有比较详细的文章。

http://jessey.net/simon/articles/003.html

当border和padding为0的时候这个box model工作正常,但是如果你定义了border和padding的话,正确理解box model的浏览器将会和不能正确理解box model发生冲突。

在我的blog中,左边导航是一个div#leftmenu,右边的是div#main,我对div#leftmenu的border和pandding做了定义,它只对IE做了解释,因此Mozilla就不能够按照你的想法识别。

这个错误的box model理解直到IE6才被纠正过来,但是IE6为了保持向下兼容,并不是对所有网页都采用正确的box model计算方法。只有你的网页中加上完整的DOCTYPE的声明的时候,它才能够按照正确的方法建立box model。

为了使IE浏览器能够正确的使用CSS Box model,tantek提供了一个Box Model Hack方法,它能解决IE4/5.x错误Box model,《Designing with Web Standards》中也介绍过这个方法。

你可以通过http://www.tantek.com/CSS/Examples/boxmodelhack.html访问到它。

它的方式是这样的,给一个div指定了下面的css声明

div.content{

width:400px;

voice-family:"\"}\"";

voice-family:inherit;

width:300px;

}

最后一个width的值是正确的css box的width,而第一个width是提供给IE4/5.x使用的css box宽度,因为IE4/5.x不能够识别中间两个声明,因此后面的所有定义就被放弃了。

IE6也能够识别voice-family,但它能够正确的理解Box model,所以使用这种方法可以保证这些浏览器按照正确的Box model进行计算。

在我打算使用它来解决IE的box model问题的时候,我发现我使用IE浏览器并不能按照我的想法工作。我找到了原因所在,因为我的IE6浏览器,还是采用了错误的Box model计算方式,因为要按照正确的Box model计算,网页必须加上严格的DOCTYPE的声明。

csdn所使用的这个.text blog系统产生的网页确实加上了DOCTYPE的声明,但是这个声明是残缺的。

它缺少对URI的描述,因此迫使IE6依旧采用向下兼容的错误Box model计算方式。

这是一个不完整的DOCTYPE声明,如果你打算采用CSS Box model解决Box model问题,即使你的IE版本是6.0的也将使用错误的Box model。

今天我终于找到了一个办法,能够代替Box Model Hack方法,并且对IE6同样起作用。在介绍这种方法之前,首先看看我的blog的结构的css定义。

Blog左边的导航是一个大的Div#leftmenu,右边是Div#main,两个Div的CSS声明定义如下:

#leftmenu {

BORDER-TOP-WIDTH: 0px;

BORDER-BOTTOM-WIDTH: 0px;

BORDER-LEFT-WIDTH: 0px;

BORDER-RIGHT: #645d64 35px solid;

PADDING-TOP: 60px;

PADDING-RIGHT: 4px;

PADDING-BOTTOM: 30px;

PADDING-LEFT: 4px;

width:200px;

}

#main {

PADDING-RIGHT: 10px;

PADDING-LEFT: 10px;

PADDING-BOTTOM: 10px;

PADDING-TOP: 10px;

MARGIN-LEFT: 200px;

}

/*上面两个ID选择器的定义中有些不必要的属性我去掉了*/

我把#left的定义改为

#leftmenu {

BORDER-TOP-WIDTH: 0px;

BORDER-BOTTOM-WIDTH: 0px;

BORDER-LEFT-WIDTH: 0px;

BORDER-RIGHT: #645d64 35px solid;

PADDING-TOP: 60px;

PADDING-RIGHT: 4px;

PADDING-BOTTOM: 30px;

PADDING-LEFT: 4px;

width:157px;

width:expression('200px');

}

expression这个样式定义是IE5之后都可以阅读的属性,但是只能为IE所识别,它能够动态执行一段脚本运算。识别标准box model的浏览器只能使用前面一个width定义,而ie浏览器使用了后面的width来创建box model。

现在它工作正常了。

如果你打算深入了解Box model和css,下面的资源对你有帮助。

参考资源:

1、完整的盒式模型的描述请参考W3C的CSS2和CSS3《Box model》

http://www.w3.org/TR/REC-CSS2/box.html

http://www.w3.org/TR/css3-box/

2、tantek提供的《Box Model Hack》,它提供了解决IE5.x错误Box model的解决方法

http://www.tantek.com/CSS/Examples/boxmodelhack.html

3、jessey的网站上有IE Box model和正确的Box model对比

http://jessey.net/simon/articles/003.html

4、hedong的网站上有关于CSS Box model的简单介绍《CSS2.0的box模型》

http://hedong.3322.org/newblog/archives/000063.html

5、W3C的css规范

《css1规范》 http://www.w3.org/TR/CSS1

《css21规范》 http://www.w3.org/TR/CSS21/

《css3规范》 http://www.w3.org/Style/CSS/current-work

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有