关注前端开发微信微信号web007007

DIV+CSS建站对浏览器的兼容性问题和注意事项

作者 管理员 发布时间 2012-06-07 13:20 文章分类 DIV&CSS 文章评论 抢沙发 阅读次数

使用DIV+CSS构架好处不少,但也确实存在一些问题,现在让网页设计师最头疼的事莫过于DIV+CSS对浏览器的兼容性了,可能你用惯了IE6,做出来的东西没感觉到有多大异常,但是把同样的东西放到IE7里去看的话,就会发现很多问题,如果放到火狐浏览器里去看,结果更不尽人意。

一个页面从制作的开始就决定了他要使用的浏览器解析css模式,浏览器模式的不同,就造成了各个浏览器对页面显示的差异。浏览器解析css有两种模式,quirks mode和strict mode,目前正在使用的浏览器这两种模式都支持,在doctype声明中, 没有使用DTD声明或者使用HTML4以下(不包括HTML4)的DTD声明时,基本所有的浏览器都是使用quirks mode呈现,其他的则使用strict mode解析。

这两种模式最大的不同就是提现在对盒模式的解释上。什么是盒模式?这是针对块级元素说的,这里简单说一下,说白了就是把块级元素想像成一个装东西的盒子,而margin,padding,border,width这些css属性构成了盒模式(盒子模型)。而区别就是产生在width属性上。

在strict mode中:
width是内容宽度 ,也就是说,元素真正的宽度 = margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right;

在quirks mode中:
width则是元素的实际宽度 ,内容宽度 = width – (margin-left + margin-right + padding-left + padding-right + border-left-width + border-right-width)

其他要注意的事项:
·内联元素 ,例如<a>、<span>等,定义上下边界不会影响到行高(line-height),内联元素距离上一行元素的距离由行高决定,而不是填充或边界。 注2. 内联元素(display: inline) 内联元素不需要在新行内显示,而且也不强迫其后的元素换行,如a、em、span等都为内联元素。内联元素可以为任何其他元素的子元素。
·浮动元素(无论左或者右浮动)边界不压缩 ,且若浮动元素不声明宽度,则其宽度趋向于0,即压缩到其内容能承受的最小宽度。
·如果盒中没有内容,则即使定义了宽度和高度都为100%,实际上只占0% ,因此不会被显示,此点在采取层布局的时候需特别注意。
·边界值可为负,其显示效果各浏览器可能不相同 。
·填充值不可为负 。
·边框默认的样式(border-style)为不显示(none)

下面来说说IE6,IE7及FF火狐浏览器的区别和兼容方法:
1. IE7与IE6相比, 有多达200多处改进, 但它们都是在Strict Mode下实现的, 即在页首声明DocType为XHTML Transitional, XHTML Strict等. 而在Quirks Mode下, IE7和IE6别无二致。所以为了更好的兼容,尽量声明DocType,采用Strict Mode进行制作。
2. IE7支持Alpha通道的PNG图片, 但是这些Alpha通道图片在IE6下还是不能正常显示的,所以还是尽量使用透明GIF图片。
3. IE7盒子模型改变了:盒子对于”overflow”使用了”visible”默认值,所以对于子元素尺寸大于父元素尺寸时, IE7会和Firefox一样将子元素露出于父元素之外显示, 而不是像IE6那样把父元素撑大了包含子元素.把页面设置成”overflow:visible”即可。
4. 设置为float的div在ie下设置的margin会加倍。这是一个ie6存在的bug。解决方案是在这个div里面加上”display:inline”。
5. IE和火狐对’width’定义的不同:
Firefox中:容器占的宽度=内容宽度+padding宽度+border宽度;
IE中:内容宽度=您定义的容器宽度(Internet Explorer ‘width’)-padding宽度-border宽度
(Internet Explorer ‘width’则是指整个容器的宽度,包括内容,padding ,border)

6. css布局的居中问题:FF火狐里设置margin-left, margin-right 为 auto 时已经居中, IE则设置body {TEXT-ALIGN: center;} 才行
7. FF火狐设置padding后, div会增加height和width, 但IE不会, 故需要用 !important 多设一个height和width
8. 在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;}
9. ul标签在FF火狐中默认是有padding值的,而在IE中只有margin有值所以先定义ul{margin:0;padding:0;}
10.终结解决方法:
(1)!important:FF火狐和IE7对于”!important”会自动优先解析,IE6则忽略,可用!important为FF火狐和IE7单独设置样式,不影响IE6的显示,值得注意的是,一定要将xxxx !important 这句放置在另一句之上。
示例:div{margin:30px!important;margin:15px;} //在FF火狐和IE7中margin:30px,在IE6中margin:15px;
(2)由于FF火狐和IE7都支持”!important”,而二者之间也存在差异,所以有时也会出现一些小问题,针对IE7可以使用使用”*+html”,
示例:#example { color: #333; } /* FF火狐下字体颜色显示为#333 */
* html #example { color: #666; } /* IE6下字体颜色显示为#666 */
*+html #example { color: #999; } /* IE7下字体颜色显示为#999 */

其他注意事项:

1. float的div一定要闭合,即清除浮动
示例:(其中floatA、floatB的属性已经设置为float:left;)

<div>
<div id="floatA"></div>
<div id="floatB"></div>
<div id="NOTfloatC"></div>
</div>

这里的NOTfloatC并不希望继续平移,而是希望往下排。这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
所以得在<div id=”floatB”></div>后边加清除浮动<div></div>
定义如下.clear{clear:both;}

2. 注意margin加倍的问题
现在DIV+CSS布局里用的最多的要数margin和padding了(为了兼容性都尽量少用),设置为float浮动后的div在ie下设置的margin会加倍,所以要在这个div里面加上display:inline;
示例:<div id=”FloatA”></div>
相应的css为

#FloatA{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/
}

说了这么多,归根结底还是CSS的解释问题,所以在以后制作DIV+CSS页面时要遵循W3C标准,声明doctype,让浏览器按strict mode模式解析CSS,时刻注意IE6、IE7及火狐浏览器的差异,就会避免很多兼容性问题,做出更好的作品来。

本文固定链接: http://www.web92.net/348.html | WEB前端开发

该日志由 于2012年06月07日发表在 DIV&CSS 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: DIV+CSS建站对浏览器的兼容性问题和注意事项 | WEB前端开发
关键字: