【CSS】浮动

84 阅读3分钟

浮动是 CSS 中一种常用的布局技术,它可以使元素脱离文档流并且向左或向右移动,直到碰到包含框的边缘或其他浮动框为止。

1. 浮动出现的背景

浮动元素出现的主要背景是为了实现文字环绕图片效果,允许文本或其他元素环绕在其周围。

2. 浮动实现布局

两列布局:

<div class="container">
    <div class="left-column">左列</div>
    <div class="right-column">右列</div>
</div>
.left-column, .right-column {
    float: left;
    width: 50%;
}

3. 浮动的特征

  • 浮动元素脱离了文档流(标准流),不再占据父元素的空间。
  • 浮动元素会向左或向右移动(浮动元素在左右方向上会相互贴贴),直到碰到包含框的边缘或其他浮动框。
  • 宽度收缩。
<style>
    p {
        float: left;
        background: pink;
    }
</style>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipisici
    ng elit. Consectetur debitis dolores
    d laborum omnis totam vel?</p>
</body>

不加 float 宽度会占据整行。加入 float 宽度会收缩,然而可以加上 width 指定宽度。

4. 清除浮动

为了避免浮动元素对其他元素造成的影响,通常需要清除浮动。可以使用 clear 属性清除浮动。

清除浮动,实际上是清除浮动带来的副作用:

贴贴问题

<style>
    li {
        float: left;
    }
</style>
<body>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
</body>

image.png

清除浮动的常用方法:

1. 可以为父元素(比如这里的 ul)添加高度(并且高度需要比子元素高度大):

image.png

如果父元素高度比子元素小:

image.png

还是会出现问题。

2. clear 属性:不允许元素的那一边出现浮动。

image.png

<style>
    ul:nth-of-type(2) {
        clear: both;
    }
    li {
        float: left;
        height: 20px;
        background: pink;
        width: 100px;
    }
</style>
<body>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
</body>

image.png

但是这种方法会导致 margin 失效。

所以就出现了一些方法来解决这个问题:

3. 隔墙法(添加一个空的 div):

<style>
    .clearfix {
        clear: both;
    }
    ul:nth-of-type(2) {
        margin-top: 100px;
    }
    li {
        float: left;
        height: 20px;
        background: pink;
        width: 100px;
    }
</style>
<body>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
<div class="clearfix"></div>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
</body>

4. 然后出现了内墙法(div 放在里面):

<style>
    .clearfix {
        clear: both;
    }
    ul:nth-of-type(2) {
        margin-top: 100px;
    }
    li {
        float: left;
        height: 20px;
        background: pink;
        width: 100px;
    }
</style>
<body>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
    <div class="clearfix"></div>
</ul>

<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
</body>

5. overflow 属性:

overflow 本来是用于处理溢出内容的显示方式的。

当给父元素添加一个 overflow: hidden; 之后,父元素就会形成一个 BFC,一块独立的显示区域,通过这种方式清除浮动。

<style>
    li {
        float: left;
        height: 20px;
        background: pink;
        width: 100px;
    }
    ul {
        overflow: hidden;
    }
</style>
<body>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
</body>

6. 伪类(相当于为父元素添加一堵墙):

最常用:

<style>
    li {
        float: left;
        height: 20px;
        background: pink;
        width: 100px;
    }
    ul:nth-of-type(2) {
        margin-top: 100px;
    }
    ul:nth-of-type(1)::after {
        content: "";
        display: block;
        height: 0;
        clear: both;
        visibility: hidden;
    }
</style>
<body>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
<ul>
    <li>导航1</li>
    <li>导航2</li>
    <li>导航3</li>
</ul>
</body>

5. 浮动的现状

虽然浮动在过去被广泛用于实现多列布局和网页排版,但是随着 flexbox 和 grid 等新的布局技术的出现,浮动的使用已经逐渐减少。(可能只有文字环绕这样的效果才会使用浮动?)

现在更推荐使用 flexbox 或 grid 来实现复杂的布局,而将浮动保留用于特定的需求,例如图文混排或导航菜单的横向排列等。