notes icon indicating copy to clipboard operation
notes copied to clipboard

CSS清除浮动无效 or CSS clear both not working

Open lanlin opened this issue 6 years ago • 0 comments

背景

你明明已经使用了 clear:both 但是错位问题还是存在。

明确概念

  1. 清除浮动是清除掉 “当前元素” “前面” 的 “兄弟级浮动元素” 对 “当前元素” 的影响。

  2. clear 属性只是在 block 元素是起作用,如果你把 clear:both 用在一个 inline-block 或 inline 元素上,clear:both 是不会起任何作用的。

说明

<div class="A1">class A1</div>
<div class="A2">class A2</div>
<div class="B">
    <div class="B1">class B1</div>
    <div class="B2">class B2</div>
</div>
<div class="C">class C</div>
.A1 { float:left; }
.A2 { float: right; }

.B { clear: both; }
.B1, .B2, C { float: left; }

当前元素,指带有 clear 属性的元素,如例子中的 .B 与 .B:after。

比如 .B 元素的 clear 清除的不是它的子元素(.B1, .B2)的浮动。 而是清除排在他前面的同级元素(.A1, .A2)的浮动。

因此,.B 的 clear 对排在后面的同级元素 (.C)也是没有效果的。

情形一,消除内部浮动的影响

如果一个元素里的内部子元素都是浮动元素,那它的高度会是0。

如果想要它的高度实现自适应,那我们需要清除它的子元素的浮动。

我们可以采用一种叫做 clearfix 的方法,就是 clear 一个不浮动的 ::after 伪元素。

以说明中的 .B 元素为例

# 第一种写法
.B::after { 
  content: "";
  display: block; 
  clear: both;
}

# 第二种写法
.B::after {
  clear:both;
  content:".";
  display:block;
  height:0;
  line-height:0;
  visibility:hidden;
}

特别说明:

::before::after 的作用是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含 content 属性指定内容的行内元素

所以,上面的写法只能清除 .B 子元素的浮动,并不会清除 .B 本身的浮动。

image

情形二,消除外部浮动的影响

要消除外部浮动对当前元素的影响,直接对当前元素使用 clear:both 吧。

简单解释就是,为了避免前面的兄弟影响到我,我给自己加了一个 clear:both 的 buff

image

情形三,用 BFC 进行强制隔离

BFC (Block formatting context) 直译为 "块级格式化上下文"

具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。

简单来说,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。

这算是一个加强版的 情形一,不仅对浮动清除起作用,对其他很多可能对外部造成影响的也能起作用。简单、粗暴,就像是屏蔽效果一样。

image

创建 BFC 的方法

  1. 根元素或包含根元素的元素

  2. 浮动元素(元素的 float 不是 none)

  3. 绝对定位元素(元素的 position 为 absolute 或 fixed)

  4. 行内块元素(元素的 display 为 inline-block)

  5. 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)

  6. 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)

  7. 匿名表格单元格元素(元素的 display为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table)

  8. overflow 值不为 visible 的块元素

  9. display 值为 flow-root 的元素

  10. contain 值为 layout、content或 strict 的元素

  11. 弹性元素(display为 flex 或 inline-flex元素的直接子元素)

  12. 网格元素(display为 grid 或 inline-grid 元素的直接子元素)

  13. 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)

  14. column-span 为 all 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中

参考文章

image

https://developer.mozilla.org/zh-CN/docs/Web/CSS/clear https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context https://segmentfault.com/a/1190000014554601

lanlin avatar May 27 '19 13:05 lanlin