[CSS]深入浅出float

2022-01-20 12:44:14 浏览数 (2)

float原本是用于“文字环绕元素”的效果,但是,平时我们经常在布局上用float属性。那么,使用float时,需要注意些什么呢?

1. float元素的表现
  • 与绝对定位不同,float并没有使元素脱离文档流。
  • 浮动元素在原文档流位置向左或向右移动,直到它的外边缘碰到包含框另一个浮动框的边框为止。
  • 文本和内联元素围绕浮动框排列。
  • 块元素无视浮动框,按文档流定位。
  • 包裹浮动框的父元素会忽略浮动框高度。

可见,有两点需要理解:一是浮动框本身如何浮动;二是,与浮动框毗邻的内联/块元素如何定位。

下面看几个例子:

Demo 1
代码语言:javascript复制
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>location</title>
    <style>
        #box1 {
            border: 5px solid blue;
        }

        #box2 {
            border: 3px solid green;
            background: lightgrey;
        }

        #box3 {
            float: right;
            border: 1px solid red;
            width: 100px;
            height: 100px;
        }
    </style>
</head>
<body>
<div id="box1">
    <div id="box2">
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
    </div>
    <div id="box3">
    </div>
</div>
</body>
</html>

效果图:

float1.png

分析: 浮动元素box3表现为脱离文档流,右浮动,浮动元素没有撑开父元素。

Demo 2

在Demo 1的基础上,交换box2和box3的位置。

代码语言:javascript复制
<div id="box1">
    <div id="box3">
    </div>
    <div id="box2">
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
    </div>
</div>

效果图:

float2.png

可见,与浮动元素毗邻的块元素会忽视浮动元素定位,但是,块元素中的文本围绕浮动元素排列。

2. 清除浮动属性 clear

clear可以用于清除浮动,既可用于浮动框,也可用于非浮动元素。

参考mozilla的定义:https://developer.mozilla.org/zh-CN/docs/Web/CSS/clear

  • 当应用于非浮动块时,它将非浮动块的边框边界移动到所有相关浮动元素外边界的下方。这个行为作用时会导致[margin collapsing]不起作用。
  • 当应用于浮动元素时,它将元素的外边界移动到所有相关的浮动元素外边界的下方。这会影响后面浮动元素的布局,后面的浮动元素的位置无法高于它之前的元素。

关键点在,应用了clear属性的元素,会移动到浮动元素的下方。

在Demo 2的基础上,做样式修改,将clear用在非浮动块上。

代码语言:javascript复制
#box2 {
  border: 3px solid green;
  background: lightgrey;
  clear: both;
}

clear1.png

下一步,我们创建多个浮动块,尝试将clear应用在浮动块上。

多个浮动块:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>location</title>
    <style>
        #box1 {
            border: 5px solid blue;
        }

        #box2 {
            border: 3px solid green;
            background: lightgrey;
        }

        #box3 {
            float: right;
            border: 2px solid red;
            width: 100px;
            height: 100px;
        }
        #box4 {
            float: left;
            border: 2px solid yellow;
            width: 120px;
            height: 120px;
        }
        #box5 {
            float: left;
            border: 2px solid purple;
            width: 150px;
            height: 150px;

        }
        #box6 {
            float: right;
            border: 2px solid brown;
            width: 110px;
            height: 110px;
        }
    </style>
</head>
<body>
<div id="box1">
    <div id="box3">
        box 3
    </div>
    <div id="box2">
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
        这是一段文本;这是一段文本;这是一段文本;这是一段文本;这是一段文本;
    </div>
    <div id="box4">box 4</div>
    <div id="box5">box 5</div>
    <div id="box6">box 6</div>
</div>
</body>
</html>

float3.png

在box 5上应用清除浮动,首先清除左浮动:clear: left;,这时,box 5移动到左浮动元素box 4的下面,在以float:left方式向左浮动。

代码语言:javascript复制
#box5 {
  float: left;
  border: 2px solid purple;
  width: 150px;
  height: 150px;
  clear: left; /*清除左浮动*/
}

clear float 1.png

如果在box 5清除右浮动:clear: right;,那么,它会移动到右浮动元素box 3的下面,再以float:left方式向左浮动。

代码语言:javascript复制
#box5 {
  float: left;
  border: 2px solid purple;
  width: 150px;
  height: 150px;
  clear: right; /*清除右浮动*/
}

clear float 2.png

3. 如何解决浮动导致的父元素高度塌陷?

由于浮动元素不会撑开父元素高度,所以视觉上造成父元素塌陷的效果。那么,有如下常见的解决方案:

代码语言:javascript复制
<div id="box" class="clear">
    <div id="child">a float box</div>
    <div id="blank"></div>
</div>

<style>
body {
    padding: 100px;
}

#box {
    border: 2px solid red;
}

#child {
    float: left;
    width: 100px;
    height: 100px;
    border: 2px solid green;
}
/*方法一*/
.clear {
    overflow: hidden;
}
/*方法二*/
.clear:after {
    display: block;
    content: '';
    clear: both;
}
/*方法二*/
#blank {
  clear: both;
}
</style>

0 人点赞