转自 : 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
分享到:
相关推荐
BFC概念: 块级格式化上下文,是一个独立的...BFC元素也可以用来清除浮动带来的影响,因为如果不清除,子元素浮动则会造成父元素高度塌陷,必然会影响后面元素的布局和定位,这显然有违BFC元素的子元素不会影响外部
HTML-bfc初探
计算BFC的高度时,浮动元素也参与计算。 BFC的区域不会与float box重叠。 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。...
BFC详细介绍BFC详细介绍
BFC网站数据采集器当前版本(Beta 3)属于测试版本,基本的功能已经实现,但是程序还存在问题,许多附加功能还没有完全完成,发布这个版本的目的只是为了测试程序已完成功能中存在的BUG和收集新的思路与功能。...
计算BFC⾼度时可持续⼦元素浮动也参与计算 如何创建BFC MDN web文档现在可以创建BFC的⽅法有以下⼏种 根元素或包含根元素的元素 浮动元素(元素的float不是none) 绝对定位元素(元素的位置为绝对或固定) ⾏内块...
关于BFC的介绍与使用 这篇文章是我对BFC的理解及总结 带你们了解bfc的布局规则,使用方法,触发条件等内容,理解简单。
在解决高度塌陷的问题的时候,通过BFC的触发条件之一触发BFC后,在计算BFC的高度的时候,浮动元素就可以参与计算了。 BFC(Block Formatting Contexts)即块级格式化上下文,首先得是块元素,其次具备触发条件之一的才...
该文档涉及诱发BFC的原因及处理方案.
这是一个类似论坛转贴工具的小程序,可以将剪贴板中的HTML代码转换为论坛支持的UBB代码。 由于现在流行的转贴工具都是基于浏览器的,转换... <br> 转换模块升级时可直接用BFC采集器中的EnginLib.dll文件覆盖。
BFC采集器不需要你进行例行的采集任务,只要你设置好需要的网站信息,BFC会在后台全自动帮你采集,自动查询网站内容更新,自动保持与资源网站的内容同步。完全不需要你的参与。 完善的元素机制使你可以轻而易举...
一、常见定位方案 在讲 BFC 之前,我们先来了解一下常见的...在浮动布局中,元素首先按照普通流的位置出现,然后根据浮动的方向尽可能的向左边或右边偏移,其效果与印刷排版中的文本环绕相似。 绝对定位 (absolute po
影响外面的元素(里面怎么布局都不会影响外部),BFC任然属于文档中的普通流 2.BFC的生成: 知道了BFC怎么触发BFC 满足以下条件之一都可以触发BFC,变身为BFC 根元素 float属性不为none position不为
html开发中遇到的高度塌陷 浮动 定位产生的问题, 以及使用bfc/清除伪元素清除浮动的方式
Quick BFC 是一款奇妙的工具,它可以把批处理文件(.bat、.cmd 格式) 转换为真正的可执行程序 (.exe格式),它可以毫无限制地运行于 Win95/98/ME/2000/2003/XP 下。对于转换出来的程序,你可以自定义程序的图标以及...
官方给出的BFC解释是这样的,浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的块级...
1. bfc的元素不会和float元素相重叠, 2. bfc子元素即使是float也会参与高度计算 2. position的值不是static或者relativ
程序中我没有加入替换测试功能,集成了几个我用过的表达式(可通过修改RegexLib.xml文件进行添加或删除),具体的用一下程序就知道了。 比较遗憾的是我暂时无法取得正则表达式出现语法错误的位置,以后有...
这是一个可以对选中的图片文件添加水印的小程序,操作非常简单,但功能还是比较强大的,批量处理图片的速度也非常快。同时具备强大的字体特效处理功能。
这种办法主要通过 overflow 触发 BFC,而 BFC 不会重叠浮动元素。由于设置 overflow:hidden 并不会触发 IE6-浏览器的 haslayout 属性,所以需要设置 zoom:1 来兼容 IE6-浏览器。具体代码如下: <!DOCTYPE html> &...