`
liuyu405
  • 浏览: 5272 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

IE双倍浮动边界问题

    博客分类:
  • css
阅读更多
IE双倍浮动边界Bug

原址:http://www.positioniseverything.net/explorer/doubled-margin.html

译文:PorkFat

什么发生故障?

一段无错的代码把一个居左浮动(float:left)的元素放置进一个容器盒(box),并在浮动元素上使用了左边界(margin-left)来令它和容器的左边产生一段距离。看起来相当的简单,对吗?但直至它被在IE/Win中浏览为止,在浏览器中居左浮动元素的边界长度被神秘地翻了一倍!

情况应该如何?

下面的图释展示了一个简单的div(茶色的盒子)包含着一个居左浮动的div(绿色的盒子)。浮动元素有一个100px的左边界,使容器盒与它的左边缘之间产生了一个100px的间隙。到现在为止,一直都还不错。

IE双倍浮动边界问题 - 扬子 - 扬子

.floatbox {

float: left;

width: 150px;

height: 150px;

margin: 5px 0 5px 100px;

/*This last value applies the 100px left margin */

}

陈旧的IE“双倍占据”

原样的相同代码被在IE/Win中浏览时以些微不同的方式显示,下面的图释展示了IE/Win在布局上所做的。

IE双倍浮动边界问题 - 扬子 - 扬子

这为什么会发生?别问这种傻问题!这就是IE,记得吗?符合标准只是理想的状况,不指望实现,这个简单的事实正验证了。

重点

这个Bug仅当浮动边界和浮动元素的方向相同时出现在浮动元素和容器盒的内边缘之间,在这之后的任意有着相似边界的浮动元素不会呈现双倍边界。只有特定的浮动行的第一个浮动元素会遭遇这个Bug。像居左的情况一样,双倍边界同样神秘地显示在居右的相同方式。

最后,修复办法!

直到现在(04年1月)这个Bug一直被认为是无法修复的,通常用来替代错误的边界的控制方法如:一个不可视浮动元素的左边距,连同一个内嵌的盒子一起,可视的盒子装在不可视浮动元素里;或者使用技巧仅对IE/Win设定边界的1/2值。这办法生效了,但是是混乱的而且搞糟了干净的源代码。不过现在全部结束了。

Steve Clason发现了一个修复办法,描述在他的Guest Demo里,修复了双倍边界和围绕文字缩进Bug。这是一个经典的IE的Bug修复办法,使用一个属性来修复影响不相关属性的Bug。

现在如何来做?

研究它,简单地将{display: inline;}设置给浮动元素就是全部所需做的!是的,听起来太简单了,不是吗?不过这是真的,仅仅一个display的"inline"声明已经能够胜任了。

熟悉规则的人知道浮动元素自动设置为"block"元素,而不管他们之前是什么。就如Steve从W3C里指出:

9.5.1 Positioning the float: the 'float' property

"This property specifies whether a box should float to the left, right, or not at all. It may be set for elements that generate boxes that are not absolutely positioned. The values of this property have the following meanings:

left

The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the 'clear' property). The 'display' is ignored, unless it has the value 'none'.

right

Same as 'left', but content flows on the left side of the box, starting at the top.

none

The box is not floated. "

这说明浮动元素上的{display: inline;}会被忽略,事实上所有的浏览器没有呈现任何改变,包括IE。但是,它不知何故让IE停止将浮动元素的边界翻倍。因而,这个修复办法可以被直接应用,而没有任何繁琐的隐藏方法。如果将来的一款浏览器决定对这个修复办法抱恙,只要把这个修复装入IE独用的Tan Hack里,细节如同IE Three Pixel Text-Jog Demo。

下面是两个使用了前面相同代码的生动演示,第一个照常显示了IE的Bug,下一个对浮动元素使用了"inline"修复。

IE双倍浮动边界问题 - 扬子 - 扬子

IE双倍浮动边界问题 - 扬子 - 扬子

.floatbox {

float: left;

width: 150px;

height: 150px;

margin: 5px 0 5px 100px;

display: inline;

}

篇外话

你可能注意到这个Bug修复的想法在Steve的演示页底部复制,你看到,在一开始 Steve注意到IE的文本缩进Bug并找到了"inline"来修复它。他引起了我(Big John)的注意,因为这是一个冷门的Bug和修复方法,我于是请Steve为PIE详细描述了"Guest Demo"。在准备演示的期间,Steve发现这个办法同样修复了双倍边界Bug,一个更为普遍的难题。Steve是个忙人,他让我写这篇"有深度的"演示页利用这个方法将Bug本身解释得更全面。

起初我开展Guest Demo难题是为了鼓励别人来关注各式各样的CSS显示难题(并为我避免如此多的艰巨工作)。

好!按照计划进行顺利。勇往直前,Steve! :-)
分享到:
评论

相关推荐

    IE浮动边界BUG延伸探讨

    ### IE浮动边界BUG延伸探讨详解 #### 一、引言 在前端开发中,尤其是在处理老版本Internet Explorer浏览器兼容性问题时,经常会遇到各种各样的布局难题。其中一个典型的例子就是IE浮动边界BUG及其延伸现象。本文将...

    IE兼容性总结

    `时,在IE8中元素出现了浮动问题。 - **解决方法**:可以通过减小宽度值来避免这个问题,例如使用`width: 98%;`并适当减小实际宽度值,以防止在IE8中出现异常浮动。 3. **元素ID #linklist中的空白问题** - **...

    IE6兼容性问题及IE6常见bug详细汇总

    2. **IE6的margin双倍问题** 当块元素、左右浮动并且设置了margin时,IE6会出现margin值加倍的现象。 解决方法:可以将浮动元素的display属性设置为inline,使其不再作为块元素处理,从而消除多余的margin。 3. *...

    前端处理浏览器兼容问题

    **问题**:在IE6中,设置了浮动和外边距的元素会出现双倍边距的现象。 **解决方法**:通过将元素设置为`display:inline`来避免这一问题。 ```css div { float: left; width: 100px; margin: 0 100px; display:...

    绝对定位的元素在ie6下不显示隐藏了的有效解决方法

    IE6将浮动元素的宽度与包含块的边界进行比较,而其他现代浏览器则使用包含块的content区域进行比较。因此,当浮动元素的宽度达到或超过父容器内容区域的宽度时,绝对定位元素就会被“挤出”屏幕。 为了解决这个问题...

    标准布局常见问题及解决办法

    6. **IE6双倍边距bug**:在IE6中,当浮动元素(如`float:left`)设置左(或右)外边距时,可能会出现双倍边距的问题。为解决这个问题,可以在浮动元素上添加`display:inline`,这可以使浏览器正确解析外边距。 了解...

    Css复习题 (2).pdf

    - 双倍浮动边界问题。 - 图片间隙问题。 - 项目符号隐藏问题。 - 多余字符问题。 10. **CSS布局模型**: - Flow Model(流动模型):元素按照文档流顺序排列。 - Float Model(浮动模型):元素浮动以实现多...

    web前端面试题2.doc

    当浮动元素使用`margin`时,IE6会出现双倍边距问题。通过添加`display:inline`可以使元素表现为内联元素,从而解决这个问题。 以上是针对前端面试中常见的一些技术点的详细解释,涵盖了网页布局、样式控制、交互...

    Css复习题.docx

    - 双倍浮动边界Bug、图片间隙Bug、项目符号隐藏Bug、多余字符Bug都是Firefox特有的CSS问题。 10. CSS布局模型: - Flow Model:元素按正常的文档流排列。 - Float Model:元素浮动以创建多列布局。 - Layer ...

    网页设计师面试题(有答案)借鉴.pdf

    5. **IE6的margin双倍边距bug**: 当元素浮动(如`float:left`)时,IE6会错误地将外边距计算为两倍。解决方法是在元素上添加`display:inline`,使其表现为内联元素,避免边距重叠问题。 6. **使用`ul`和`li`创建...

    CSS外边距合并代码

    如果设这边距的这个元素同时设置了浮 动,那么浮动的这个方向如果有margin值的话,那么在ie6里面的实际距离是设置值的双倍。要解决这个问题不复杂,只要给这个元素加个 display:inline属性即可,但不建议这么

Global site tag (gtag.js) - Google Analytics