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

一直以来我们都很熟悉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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

CSS基础(六):浮动深入

在标准流中,一个块级元素在水平方向会自动伸展,直到包含它的元素边界;而在竖直方向和兄弟元素依次排列,不能并排。使用浮动方式后,块级元素的表现就会不同。简单的说...

441
来自专栏前端说吧

两列布局——但只用右浮动

2705
来自专栏前端杂货铺

关于BFC不会被浮动元素遮盖的一些解释

简介 在清除浮动一文中提到BFC不会被浮动元素遮盖,并没有详细探究表现行为。规范中指出,在同一个BFC内,作为子元素的BFC的border-box不应该覆盖同...

3469
来自专栏Android先生

Android开发人员一次搞懂前端BFC原理

BFC全称是Block Formatting Context,即块格式化上下文。它是CSS2.1规范定义的,关于CSS渲染定位的一个概念。

792
来自专栏Java后端技术

带你熟悉CSS浮动

  浮动:顾名思义先浮后动,浮动的对象会先漂浮起来,离开自己原来的位置(也就是所谓的脱离文档流),后动的意思是,它的后面的元素会向它原来的位置动起来。

762
来自专栏Scott_Mr 个人专栏

ReactiveCocoa(一)

873
来自专栏前端萌媛的成长之路

BFC

1424
来自专栏前端黑板报

何为BFC?

何为BFC? BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,内部不会影响外部布局,反之亦然,每个BFC都遵守...

1918
来自专栏前端儿

谈谈CSS的浮动问题

浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框则停留。

571
来自专栏冰霜之地

ReactiveCocoa 中 RACSignal 冷信号和热信号底层实现分析

关于ReactiveCocoa v2.5中冷信号和热信号的文章中,最著名的就是美团的臧成威老师写的3篇冷热信号的文章:

904

扫码关注云+社区