`
北极的。鱼
  • 浏览: 159076 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

webkit中BFC元素临近浮动元素时的边距bug

 
阅读更多

转自 : http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html

 

一直以来我们都很熟悉IE的“浮动边距加倍”的bug,并且绝大多数重构人员都已经很擅长在需要浮动时就直接绕过他。其实以webkit为核心的浏览器,包括但不限于Safari和Chrome,也有一个关于浮动和边距的bug,同样会造成布局错误。我在最近三个月的前一个月连续遭遇了两次这个bug,后两个月虽然避免了再次出现,但是直到现在才把这个bug彻底弄清楚。

 

触发这个bug的条件是:

  • 在一个非浮动元素上应用overflow,且其值不为visible(这将形成一个Block Formatting Context元素)。
  • 这个BFC元素拥有一个浮动的兄弟元素。
  • 在这个BFC元素上应用与其兄弟元素浮动方向相同的margin。
  • 这个BFC元素没有指定宽度值(或者指定width:auto)

当满足触发条件时,该BFC元素的另一侧的边距将不再受css控制(在webkit核心浏览器下),而是由你所指定的与浮动元素相同的边距决定,即使你在css中明确指定另一侧的边距为0或任意值也没用。具体来说,可以分为两种情况:

  • 当BFC与浮动方向相同的边距小于或等于浮动元素占据的总宽度(width+margin+padding+border)时,BFC另一侧的边距等于所设定方向上的边距(下图前两种情况);
  • 当BFC与浮动方向相同的边距大于浮动元素占据的总宽度时,BFC另一侧的边距等于浮动元素占据的总宽度(下图第三种情况)。


  • 第一种情况:main的左边距为50px,小于sider的总宽度100px,于是它右侧自动出现了50px的边距(等于margin-left);
  • 第二种情况:main的左边距为100px,等于sider的总宽度100px,于是它右侧自动出现了100px的边距(等于margin-left);
  • 第三种情况:main的左边距为150px,大于sider的总宽度100px,于是它右侧自动出现了100px的边距(等于sider总宽度);

以上截图来自这个demo页面 ,你可以用Safari或者Chrome自己打开查看具体情况。

要解决这个bug,只要让前面所说的四个条件任意一个不满足即可。例如:去除BFC元素上的overflow(但是很多时候我们需要这个overflow);或者给BFC指定宽度(但是这样就失去了main自适应宽度的优势)。

最佳做法,当overflow和margin都必不可少的时候,把BFC的margin-left改成浮动元素的margin-right。

  • 大小: 6.3 KB
分享到:
评论

相关推荐

    HTML-bfc初探

    理解BFC可以帮助我们更好地控制网页的布局,解决浮动元素引起的问题,以及实现更精确的定位。 1. **什么是BFC**: BFC是一个独立的渲染区域,每个元素都会创建自己的BFC,内部的元素会按照一定的规则进行排列,...

    bfc的详细介绍以及大总结

    在这个例子中,非浮动元素将会正确地排布在浮动元素之后,而不是被浮动元素所影响。 #### 四、BFC的使用场景 1. **解决高度塌陷问题**:通过创建BFC,可以确保容器的高度能够正确地包含内部浮动元素的高度,从而...

    诱发BFC的原因及处理方案

    3. **阻止元素被浮动元素覆盖**:未设置浮动或BFC的元素可能会被浮动元素覆盖。创建BFC可以防止这种情况,使元素能够正确地与浮动元素布局。 总结来说,理解并掌握BFC的概念对于优化CSS布局、解决浮动元素带来的...

    什么是BFC? CSS 使用伪元素清除浮动的方法

    BFC概念:  块级格式化上下文,是一个独立的...BFC元素也可以用来清除浮动带来的影响,因为如果不清除,子元素浮动则会造成父元素高度塌陷,必然会影响后面元素的布局和定位,这显然有违BFC元素的子元素不会影响外部

    Web-前端html+css从入门到精通 133. BFC规范(下).zip

    4. **隔离作用域**:BFC能够隔离内外边距、浮动元素的影响,使得元素之间的布局相互独立,避免互相干扰。 5. **布局定位**:BFC对于页面的定位具有重要意义,特别是在复杂的布局设计中,如响应式布局、瀑布流布局等...

    BFC的布局规则.docx

    在处理浮动元素导致的父元素高度塌陷问题时,可以通过创建BFC来恢复父元素的高度,例如通过设置`overflow: hidden;`。这样,父元素会包含其内部所有浮动元素的高度,避免了高度丢失的现象。 理解BFC布局规则有助于...

    Web-前端html+css从入门到精通 132. BFC规范(上).zip

    5. 计算BFC的高度时,会包含其内部浮动元素的高度。 BFC的应用场景广泛,例如: - 解决内部元素与浮动元素重叠的问题:可以通过设置父元素的overflow为hidden来创建BFC,使父元素包裹住内部的浮动元素。 - 创建多列...

    前端大厂最新面试题-BFC.docx

    5. **浮动子元素高度计算**:在计算BFC的高度时,浮动的子元素也会被纳入考虑范围。 BFC的触发条件有多种,包括但不限于: - **根元素**:HTML元素天然就是一个BFC。 - **浮动元素**:当元素的`float`属性设置为`...

    前端基础——文档流与BFC

    掌握BFC,开发者可以更好地控制元素的布局和定位,例如通过创建BFC解决清除浮动问题,或者利用BFC实现自适应布局。在实际开发中,我们经常会用到`display: flex`或`display: grid`来创建BFC,因为它们不仅创建了BFC...

    文档流html开发中遇到的高度塌陷 浮动 定位产生的问题,.pptx

    创建BFC的一个简单方法是将所有浮动元素放入一个容器`<div>`中,并给这个容器设置`overflow:hidden`或`display:flow-root`,这将使其内部形成一个新的BFC,从而避免高度塌陷问题。 另一种解决浮动导致的高度塌陷的...

    个人练习+笔记.zip

    - 当一个父元素内的所有子元素都浮动时,如果不设置高度,父元素的高度可能会塌陷,因为其内容区域不包含浮动元素。 - 解决浮动塌陷的方法有多种,如使用`clearfix`类,或者设置父元素的`overflow`为`hidden`,也...

    前端面试汇总1

    边距重叠是CSS布局中常见的问题,比如父子元素边距重叠、相邻兄弟元素边距合并等。解决这类问题通常需要理解BFC(Block Formatting Contexts)和IFC(Inline Formatting Contexts)。BFC是一个独立的渲染区域,可以...

    10分钟理解CSS BFC原理及其应用

    2. **包含浮动元素(Clearing Floats)**:BFC可以包含其内部的浮动元素,防止因浮动元素导致的父元素高度塌陷。当父元素触发BFC(如设置`overflow: hidden`),它会自动扩展以包裹所有浮动的子元素。 3. **防止...

    CSS 清除浮动与BFC的方法

    计算BFC的高度时,浮动元素也参与计算。 BFC的区域不会与float box重叠。 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。...

    CSS教程:彻底弄懂闭合浮动元素

    在CSS布局中,浮动元素(float)是一种常见的布局方式,常用于创建多列布局或实现文字环绕图片的效果。然而,浮动元素会导致一个普遍的问题,即所谓的"浮动元素引起的父元素塌陷"。当子元素浮动后,它们不再占据原来...

    css_bug与解决方法

    在CSS布局中,当一个容器包含浮动元素时,容器的高度可能不会自动扩展以包含所有子元素,这就是所谓的容器不扩展问题。示例代码中,`#divGroup`作为父容器,包含两个子元素`#a`和`#b`,都设置了`float:left`。正常...

    Quick BFC bat生成exe工具

    3. **Quick BFC工作原理**:Quick BFC工具通过读取.bat文件中的命令,将其转换为可执行代码,并封装在一个.exe文件中。这个过程中,它会将所有依赖的外部文件(如其他脚本、DLL等)一并打包,确保.exe文件在没有原始...

    2022HTML与CSS面试题.docx

    BFC的特点包括:margin重叠、计算高度包含浮动元素、不影响外部元素、内部元素垂直排列以及不会与浮动元素重叠。形成BFC的条件有:元素浮动非none、绝对或固定定位、overflow非visible、display为flex或inline-block...

    IE6和IE7中行内元素后的浮动元素被折行的问题解决

    在示例代码中,`<a>`标签添加了`float:left`样式,并且整个`<li>`元素使用了`.fix`类,通过`*zoom:1`和`:after`伪元素创建了一个BFC(块格式化上下文),以清除浮动,防止父元素高度塌陷。这样,两个元素都会浮动,...

Global site tag (gtag.js) - Google Analytics