CSS float的使用和解决浮动带来的问题

2,808 阅读3分钟

float在css中经常用到,但是也会遇到许多问题。本文介绍float的特性,以及解决使用浮动时出现的元素遮盖和高度塌陷问题。

浮动是什么?

MDN对float的描述是: 指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。 该元素从网页的正常流动(文档流)中移除,但是仍然保持部分的流动性。

更通俗理解是: 没有浮动的情况下,网页中元素都在同一张纸上;设置浮动后,就多了一张透明的纸覆盖在上面, 具有浮动的元素移动到第二张纸上排列。第一张纸上的元素会占据脱离元素的位置,但他的内容会环绕于浮动元素。


语法

float: none | left | right ;
none:默认值,不浮动
left:元素向左浮动
right:元素向右浮动

示例:

float01.jpg

HTML:

/* 代码示例 */
<div class="container">
    <div class="left">left</div>
</div>
<div class="container">
    <div class="right">right</div>
</div>

CSS:

/* 代码示例 */
.left{
  float: left;
  background-color: blueviolet;
}

.right{
  float: right;
  background-color: yellow;
}

浮动的特点

  • 浮动的元素会脱离标准文档流
  • 浮动的元素会变成行内块级元素
  • 浮动的元素只能左右移动,不能上下
  • 浮动的元素之间不会重叠
  • 浮动的元素碰到父元素的边框或者浮动元素边框就会停止

一、脱离标准文档流

设置浮动后,后面的元素会占据浮动元素的位置,导致浮动的元素会遮挡住后面的元素,但是内容不会被遮挡,如图片、文字。

示例:

float02.jpg

HTML:

/* 代码示例 */
<div class="left">浮动盒子</div>
<p>这是一段不具有浮动属性的文本,这是一段不具有浮动属性的文本...</p>

CSS:

/* 代码示例 */
.left{
  height: 100px;
  width: 100px;
  text-align: center;
  line-height: 100px;

  /* 浮动 */
  float: left;
  background-color: rgba(137, 43, 226, 0.8);
}

p{
    border: 5px solid red;
}

二、浮动的元素变成行内块,在一行显示

块级元素(如div)设置浮动,将不再独占一行,没指定宽度的情况由内容撑开。
行内元素(如span)设置浮动后,变为可设置宽度。

示例:

float03.jpg

HTML:

/* 代码示例 */
<div class="block-box">
    <div class="left">div1</div>
    <div class="left">div2</div>
    <div class="left">div3</div>
</div>

<div class="inline-box">
    <span class="left">span1</span>
    <span class="left">span2</span>
    <span class="left">span3</span>
</div>

CSS:

/* 代码示例 */
.left{
    text-align: center;
    margin-left: 10px;
}
div.left{
  float: left;
  border: 3px solid rebeccapurple;
}
span.left{
    color: white;
    background-color: rebeccapurple;

    float: left;
    width: 100px; /* 行内元素可设置宽度 */
}

浮动带来的问题及解决方案

问题一:元素遮盖

float06.jpg

解决方案:给受影响的元素添加clear属性

clear:left | right | both;
left: 清除左浮动;
right: 清除右浮动;
both: 清除两边浮动;

示例:

float08.jpg

问题二:父元素高度塌陷

父元素在没有设置高度的情况下,子元素都为浮动元素时,父元素的高度为0。可通过清除浮动来解决这个问题。

示例:

float04.jpg

HTML:

/* 代码示例 */
<div class="box">
    <div>div1</div>
    <div>div2</div>
    <div>div3</div>
</div>

<div class="float-box">
    <div>div1</div>
    <div>div2</div>
    <div>div3</div>
</div>

CSS:

/* 代码示例 */
.box{
    margin-top: 100px;
    border: 3px solid rebeccapurple;
}
.box > div{   
    height: 100px;
    margin-bottom: 10px;
    background-color: rgba(102, 51, 153, 0.2);
}

.float-box{
    margin-top: 100px;
    border: 3px solid rebeccapurple;
}
.float-box > div{
    width: 100px;
    height: 100px;
    background-color: rgba(102, 51, 153, 0.2);
    margin-right: 10px;

    float: left;
}

解决方案:清除浮动

一、给父元素设置高度

这种方法的前提是必须先确定子元素的高度,再来计算父元素高度设置多少合适,一般不推荐使用。

示例:

float07.jpg 二、给父元素设置overflow:hidden;清除浮动

这种使用于不给父元素添加高度的情况,也是比较常用的清除浮动的方法。缺点是子元素的溢出部分会被隐藏。

示例:

float09.jpg

三、空div设置clear

在最后一个浮动盒子后面,新添加一个元素,然后设置clear属性。 这种情况下父元素不能设置高度,且给文档新增了太多标签,一般不推荐使用。

示例:

float10.jpg

四、伪元素::after

给父元素添加伪元素::after,content为空,设置为块级元素并且添加clear属性。

示例:

float11.jpg