IE6、IE7和FF的CSS布局兼容性问题

社区服务
高级搜索
猴岛论坛电脑百科IE6、IE7和FF的CSS布局兼容性问题
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
2个回复

[技术小组]IE6、IE7和FF的CSS布局兼容性问题

楼层直达
西小夏

ZxID:15629045

等级: 元老
配偶: 璃鱼浅析
一转眼2024了..

举报 只看楼主 使用道具 楼主   发表于: 2012-01-20 0
一、IE 6 、IE 7 、FF浏览器各自专用属性

1、所有浏览器 通用
height:100px;
2、IE6 专用
1)_height:100px;
2)*height:100px;
3、IE7 专用
*+height:100px;
4、IE7 FF 共用
height:100px !important;

包装器代码:
1)
<style>
#wrapper {
  width:100px !important; /* IE7 and FF*/
  width:100px; /* IE 6 */
}
</style>

2)
<style>
#wrapper { width:120px; }    FF
*html #wrapper { width:120px; }    IE 6
*+html #wrapper { width:120px; }    IE 7 (???)    注意顺序
</style>

二、万能 浮动元素float清除代码

<style>
.clearfix:after {
    content:".";
    display:block;
    heght:0px;
    clear:both;
    visibility:hidden;
}
.clearfix {
    display:inline-block;
}
.clearfix {
    display:block;
}

三、兼容问题

1、Div 设置padding 时,FF会width height 增加,而IE 则不会。—— !important解决。

1) ?为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下,然后为div指定一个类:
然后CSS这样设计:
#container{
    min-width: 600px;
    width:e-xpression(document.body.clientWidth < 600? “600px”: “auto” );
}
第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

2) IE 不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两 个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。比如要设置背景图片,这个宽度是比较重要 的。要解决这个问题,可以这样:
#box{
    width: 80px;
    height: 35px;
}
html>body #box{
    width: auto;
    height: auto;         //自适应
    min-width: 80px;
    min-height: 35px;
}

2、居中问题:

1)水平居中,margin:0 auto;但有局限性(?)。
    主要的样式定义如下:
body {TEXT-ALIGN: center;}
#center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; }

说明:首先在父级元素定义TEXT-ALIGN: center;这个的意思就是在父级元素内的内容居中;
A、对于IE这样设定就已经可以了。
B、但在mozilla中不能居中。解决办法就是在子元素定义时候设定时再加上“MARGIN-RIGHT: auto;MARGIN-LEFT: auto; ”
C、需要说明的是,如果你想用这个方法使整个页面要居中,建议不要套在一个DIV里(原因是:浏览速度的影响及SEO考虑),你可以依次拆出多个div,只要在每个拆出的div里定义MARGIN-RIGHT: auto;MARGIN-LEFT: auto; 就可以了。
2)垂直居中,行高,也有局限性(?)。

3、Box盒模型理解上相差 2px 的FF和IE,如何平衡(?)。盒模型不同解释:
#box{
    _width:600px;    //for ie6.0
    width:500px;    //for ff+ie6.0
}
#box{
    width:600px!important    //for ff
    width:600px;    //for ff+ie6.0
    width /**/:500px;    //for ie6.0-
}

4、Div设置浮动时margin 外边距加倍问题。

1)#box{ float:left; width:100px; margin:0 0 0 100px;
//这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略}

2) 清除浮动
.兼容box{
    display:table;
//将对象作为块元素级的表格显示
}
或者
.兼容box{
    clear:both;
}
或者加入:after(伪对象),设置在对象后发生的内容,通常和content配合使用,IE不支持此伪对象,非Ie 浏览器支持,所以并不影响到IE/WIN浏览器。这种的最麻烦的
……#box:after{
content: “.”;
display: block;
height: 0;
clear: both;
visibility: hidden;
}

3)DIV浮动IE文本产生3象素的bug
左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距.
#box{
    float:left;
    width:800px;
}
#left{
    float:left;
    width:50%;
}
#right{
    width:50%;
}
*html #left{
    margin-right:-3px;
//这句是关键
}

HTML代码
<DIV id=box>
    <DIV id=left></DIV>
    <DIV id=right></DIV>
</DIV>

5、Ul 在FF浏览器存在默认值list-style 、padding。

6、高度自适应(高度不一致性问题),设置overflow:hidden。

1)高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或paddign 时。例:
<div id=”box”>
    <p>p对象中的内容</p>
</div>
CSS:
#box {background-color:#eee; }
#box p {
    margin-top: 20px;
    margin-bottom: 20px;
    text-align:center;
}
解决方法:在P对象上下各加2个空的div对象CSS代码:空DIV{height:0px;overflow:hidden;}或者为#box本身DIV加上border属性。

2)CSS标准化方式
.submit {
    float:left;
    width:36px;
    height:26px;
    margin-top:24px;
    margin-right:13px;
}
IE 6方式
submin {
*html .submit {
    margin-top:21px;
}
IE 7方式
*+html .submit {
    margin-top:21px;
}

7、 属性选择器
属性选择器——p[id]{}    div[id]{}
子选择器——#id p{}    #id div[id]{}
这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera起作用。
    属性选择器和子选择器还是有区别的,子选择器的范围从形式来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的.

8、IE捉迷藏问题
当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。
有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。
解决办法:对#layout(??)使用line-height属性 或者给#layout使用固定高和宽。页面结构尽量简单——对结构进行SEO优化。

9、去掉IE中的默认高度问题
A)<div style="height:2px;backgroup:red;overflow:hidden;"></div>
其中height:2px为所需要设定的高度,关键是overflow 是帮助咱们去掉默认高度的。
B)最小高度问题
块元素最小高度为10px,当高度定义小于10px时,仍为10px;
解决方法:为此块元素添加样式  overflow:hidden; 或让块元素的字体大小等于此块元素的高度。

10、图片产生的间隙
父元素直接包含<img>,这个图片下方会和父元素边缘产生间隙。
解绝方法:
1.在源代码中让</div>和<img>在同一行,因为那个间隙是由换行符产生的。
2.给<img>添加样式  display:block;

四、兼容性属性原理:

标准浏览器(IE FF 等浏览器) 公用
height:100px;
兼容 IE6专用
_height:100px;
兼容 IE6 IE7公用
*height:100px;
看看如何在一个样式里分别给一个属性定义IE6 IE7 FF专用的兼容,注意:顺序不能。
CSS代码(height:100px; *height:120px; _height:150px; )


下面我简单解释一下各浏览器怎样理解这三个属性:
1)在FF下,第2、3个属性FF不认识,所以它读的是 height:100px;
2)在IE7下,第三个属性IE7不认识,所以它读第1、2个属性,又因为第二个属性覆盖了第一个属性,所以IE7最终读出的是第2个属性 *height:120px;
3)在IE6下,三个属性IE6都认识,所以三个属性都可以读取,又因为第三个属性覆盖掉前2个属性,所以IE6最终读取的是第三个属性。

五、特有属性的使用情况:

1)屏蔽IE浏览器(也就是IE下不显示)
    *:lang(zh) select {font:12px !important;} /*FF,OP可见*/
    select:empty {font:12px !important;} /*safari可见*/
这里select是选择符,根据情况更换。第二句是MAC上safari浏览器独有的。
2)仅IE7识别
    *+html {…}
当面临需要只针对IE7做样式的时候就可以采用这个兼容。
3)IE6及IE6以下识别
    * html {…}
这个地方要特别注意很多地主都写了是IE6的兼容,其实IE5.x同样可以识别这个兼容。其它浏览器不识别。

4)    html/**/ >body select {……}
这句与上一句的作用相同。

5)仅IE6不识别
    select { display /*IE6不识别*/:none;}
这里主要是通过CSS注释分开一个属性与值,注释在冒号前。
6)仅IE6与IE5不识别
    select/**/ { display /*IE6,IE5不识别*/:none;}
这里与上面一句不同的是在选择符与花括号之间多了一个CSS注释。
7)仅IE5不识别
    select/*IE5不识别*/ { display:none;}
这一句是在上一句中去掉了属性区的注释。只有IE5不识别

8)盒模型解决方法
    selct {width:IE5.x宽度; voice-family :""}""; voice-family:inherit; width:正确宽度;}
盒模型的清除方法不是通过!important来处理的。这点要明确。

清除浮动
select:after {content:"."; display:block; height:0; clear:both; visibility:hidden;}
在Firefox中,当子级都为浮动(?)时,那么父级的高度就无法完全的包住整个子级,那么这时用这个清除浮动的兼容来对父级做一次定义,那么就可以解决这个问题 。

9)截字省略号
select { -o-text-overflow:ellipsis; text-overflow:ellipsis; white-space:nowrapoverflow:hidden; }
这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾,很好的一个技术。只是目前Firefox并不支持。
10)只有Opera识别
    @media all and (min-width: 0px){ select {……} }
针对Opera浏览器做单独的设定。

以上都是“用来解决局部的兼容性问题”,建议遵循正确的标签嵌套(div ul li 嵌套结构关系),这样可以减少你使用兼容的频率,不要进入理解误区,并不是一个页面就需要很多的兼容来保持多浏览器兼容)。

如果希望把兼容性的内容也分离出来,不妨试一下下面的几种过滤器。这些过滤器有的是写在 CSS中通过过滤器导入特别的样式,也有的是写在HTML中的通过条件来链接或是导入需要的补丁样式。个人觉得用条件注释调用相应兼容是比较完美的多浏览器兼容的解决办法。把需要兼容的地方单独放到一个文件里面,当浏览器版本符合的时 候就可以调用那个被兼容的样式,这样不仅使用起来非常方便,而且对于制作这个CSS本身来讲,可以更严格的观察到是否有必要使用兼容,很多情况下,当我本 人写CSS如果把全部代码包括兼容都写到一个 CSS文件的时候的时候会很随意,想怎么兼容就怎么兼容,而你独立出来写的时候,你就会不自觉的考虑是否有必要兼容,是先兼容 CSS?还是先把主CSS里面的东西调整到尽可能的不需要兼容?当你仅用很少的兼容就让很多浏览器很乖很听话的时候,你是不是很有成就感呢?

六、遵循上面的嵌套方式:
<div><ul><li></li></ul>< /div> 然后在CSS 里面告诉 ul {Margin:0pxadding: 0px;list-style:none;},其中list-style:none是不让<li>标记的最前方显示圆点或者数字等目录类型的 标记,因为IE和Firefox显示出来默认效果有些不一样。因此这样不需要做任何手脚,你的IE6、和IE7、Firefox显示出来的东西(外距,间 距,高度,宽度)就几乎没什么区别了,也许细心的你会在某一个时刻发现一、两个象素的差别,但那已经很完美了,不需要你通过调整大片的CSS来控制它们的 显示了,你愿意,你可以仅仅兼容一两个地方,而且通常这种兼容可以适应各种地方,不需要你重复在不同的地方调试不同的兼容方式–减轻你的烦。你可以 ul.class1, ul.class2, ul.class3 {xxx:xxxx}的方式方便的整理出你要兼容的地方,而统一兼容。尝试一下吧,再也不要乱嵌套了,虽然在Div+CSS的方式下你几乎可以想怎么嵌套 就怎么嵌套,但是按照上面的规律你将轻松很多,从而事半功倍!
生活就像蒲公英,看似自由却身不由己๑
西小夏

ZxID:15629045

等级: 元老
配偶: 璃鱼浅析
一转眼2024了..

举报 只看该作者 沙发   发表于: 2012-01-20 0
大家一起学习……
生活就像蒲公英,看似自由却身不由己๑
忆海三千梦沧澜

ZxID:15934394

等级: 元帅
 你心里我永不及他

举报 只看该作者 板凳   发表于: 2012-01-20 0
我不用IE,哈哈哈。。
世界上最灿烂的不是阳光,而是心动女生的微笑。
« 返回列表
发帖 回复