CSS面试常考题:清除浮动

前言

在讲解如何清除浮动之前,我们首先得对浮动有一定的了解,下面由我给大家简单介绍一下CSS三大布局之一:浮动

浮动

什么是浮动?

"浮动" 是一种CSS属性,用于将元素从正常文档流中移动,并使其相对于包含元素进行定位。通常,浮动用于创建多列布局或使文本环绕图像等效果。

我们都知道,两个div会显示在不同的两行,原因是因为div是块级元素,默认占据一整行。如下

xml 复制代码
<body>
  <div class="item1">1</div>
  <div class="item2">2</div>
</body>
xml 复制代码
<style>
    .item1{
      width: 100px;
      height: 100px;
      background: red;
    }
    .item2{
      width: 100px;
      height: 100px;
      background: blue;
    }
  </style>

而当我们给第一个盒子加上浮动,上图会变成如下:

css 复制代码
    .item1{
      width: 100px;
      height: 100px;
      background: red;
      float:left;
    }

第一个盒子浮动,脱离文本流,通俗来说就是飘起来了,类比打饭排队,前面一个人走了,后面的人就会补上去,所以第二个盒子此时在第一个盒子"下方",被第一个盒子盖住了。而文字之所以没有移动,正是因为浮动会带来的另一个属性--文字环绕。 当我们再给第二个盒子加上浮动会发生什么变化呢?他们是否会排在一行呢?

css 复制代码
    .item2{
      width: 100px;
      height: 100px;
      background: red;
      float:left;
    }

正如我们所料,当两个盒子都浮动时,他们排在了同一行。这就是浮动的另一个属性--浮动元素通常会尽量排在一行(浮动可以让块级元素同行显示),在后面我们要重点讲的清除浮动可以使他们不在同一行。

为什么要学习如何清除浮动呢?

学习清除浮动是因为在使用 CSS 浮动属性布局时,会出现一些常见的问题,如元素不按预期排列、父容器高度塌陷等。清除浮动是一种解决这些问题的技术,其重要性体现在以下方面:

  1. 解决高度坍塌问题:当子元素浮动时,父容器的高度可能不会根据浮动子元素的高度自动调整,导致父容器高度塌陷。这会导致布局问题和视觉缺陷。通过清除浮动,可以确保父容器的高度能够适应浮动子元素的高度。
  2. 防止浮动元素覆盖:如果没有正确清除浮动,浮动元素可能会覆盖在页面中的其他元素之上,导致重叠和错位的问题。清除浮动可以防止这种情况发生。
  3. 维护页面布局一致性:清除浮动有助于确保页面在不同浏览器和设备上的一致性。它可以帮助你控制元素的布局,使页面在各种情况下都能正确呈现。
  4. 提高可维护性:通过采用一致的清除浮动技术,你可以更容易维护和修改网页布局,而无需担心浮动引发的问题。
  5. 支持响应式设计:在响应式网页设计中,清除浮动也起到了关键作用,可以帮助确保页面在不同屏幕尺寸和设备上正确呈现。

下面我们将重点讲解如何清除浮动,浮动在面试中一般不会考,因为他本身太过于简单了,而清除浮动却是面试中的常考题,让我们一起去看看如何清除浮动吧。

清除浮动

清除浮动有五种常用的方式,其中最后一种在我们的日常生活中使用的最多。

  1. 给父容器设置高度。
  2. 在最后一个浮动元素后面添加新的元素,在新元素上做清除浮动。
  3. 在容器的伪元素after上做清除浮动。
  4. 在下方被浮动影响的容器上做清除浮动。
  5. BFC容器

下面我将通过案例来分析五种清除浮动的方法。

未清除浮动前源代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    ul li{
      list-style: none;
      width: 200px;
      height: 100px;
      float: left;
    }

    li:nth-child(1){
      background: red;
    }
    li:nth-child(2){
      background: blue;
    }
    li:nth-child(3){
      background: green;
    }
    .text{
      width: 150px;
      height: 200px;
      background: rgb(113, 66, 195);
    }
  </style>
</head>
<body>
  <div class="container">
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
    </ul>
    <div class="text">
      Hello World!
    </div>
  </div>
</body>
</html>

效果图:

上述代码将会带了浮动所造成的问题,由于ul里面的三个li都设置了浮动,导致其父容器的高度发生坍塌。

原本高度为200px的text容器直接被ul盖住了,这显然并不是我们想要的效果,我们想要的是text容器在ul的下方,下面来介绍五种方法解决这个问题。

第一种:给父容器设置高度

在style标签内加上:

css 复制代码
ul{
    height:100px;
}

效果如下:

第二种:在最后一个浮动元素后面添加新的元素,在新元素上做清除浮动

1.在最后一个li标签后面加上:

css 复制代码
<div class="clear"></div>

2.在style标签内加上:

arduino 复制代码
.clear{
    clear: left;
}

清除后效果如下:

第三种:在容器的伪元素after上做清除浮动

利用伪元素after清除浮动,并单独写一个.clear类,要给哪个标签清除浮动就给其父容器加上这个类名。代码如下:

css 复制代码
// 在style标签内加上
.clear::after{
      content: '';
      clear: both;
      display: block;
}

// 并给ul添加这个类
<ul class="clear">
      <li>1</li>
      <li>2</li>
      <li>3</li>
</ul>

五种方法的运行效果都一样,这里就不再展示出来了。

第四种:在下方被浮动影响的容器上做清除浮动

这种方法很不地道,因为自己造成的浮动交给别人来解决,总是不合适的吧,哈哈哈。具体解决措施:在被li浮动影响的.text容器上做清除浮动。

css 复制代码
.text{
      width: 150px;
      height: 200px;
      background: rgb(113, 66, 195);
      /* 三个li自己不努力,那text只能自己努力清除浮动了 哈哈哈 */
      /* 但不推荐 不符合人类逻辑思维 自己的浮动应该自己清除 */
      clear: both;
}

第五种:BFC容器(Block Formatting Context 块级格式化上下文(最常用的)

  • 为什么这种方法是最常用的呢?
    1. 简单易用:只需为父容器添加一个CSS属性,不需要额外的HTML元素或伪元素。
    2. 兼容性良好:这种方法在大多数现代浏览器中都能正常工作。
    3. 能够解决浮动引起的高度坍塌问题,确保父容器能够包含浮动元素。

虽然其他方法如添加空的清除浮动元素或使用伪元素也有效,但使用 overflow 属性通常更为常见和便捷,特别是在需要解决常见的浮动问题时。

下面简单介绍一下BFC:

何为BFC容器?

BFC 是块级格式化上下文(Block Formatting Context)的缩写,是一个在 HTML 和 CSS 中用来控制和规定块级元素如何布局的概念。BFC 定义了块级元素在文档流中如何摆放和相互影响的规则。每个 BFC 包含一组块级盒子,它们在垂直方向上一个接一个地排列,相互之间不会重叠。

BFC容器特点:

  1. BFC容器在计算高度时,会将浮动元素的高度也计算在内
  2. 解决内外margin重叠问题

哪些属性可以创建BFC ?

  1. float:left || right;
  2. position: absolute || fixed
  3. display:inline-block; (创建BFC,也不会使元素脱离文本流)
  4. display:table-cell.... 大部分属性都可以
  5. overflow:hidden(超出则隐藏) || auto(超出则自适应) || overly(超出则覆盖) || scroll(超出则滚动)

介绍完了BFC容器的特性,虽然BFC与浮动元素的交互方式有关,但不是所有BFC容器都被用来清除浮动。BFC是一种用于规定元素如何在文档中布局和定位的规范,它的主要作用是控制盒模型,其中包括浮动元素的交互方式。BFC主要用于解决浮动元素可能引发的问题,但它本身不是用来清除浮动的方法。我们一般只用其中的部分属性来实现浮动的清除。如下:

  • 在上述代码中的container容器中加上以下属性:
css 复制代码
/*第一种: */
.container{
    overflow:hidden; /* 或 overflow: auto; */
}

/*第二种: */
/*这会使`<ul>`表现得像内联元素,同时也会使其成为一个BFC。*/
ul {
   display: inline-block;
   vertical-align: top; /* 可选,将 .text 顶部与 ul 顶部对齐,不对齐的话会有间隔 */
}

留言

如果以上内容对你有些许帮助,还请劳烦给博主送一个小心心♥(ˆ◡ˆԅ),有错误欢迎指出哦。

本人Gitee仓库链接(也要♥(ˆ◡ˆԅ)):codeSpace: 记录coding中的点点滴滴 (gitee.com)

相关推荐
Lee川3 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i5 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有6 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有6 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫7 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫7 小时前
Handler基本概念
面试
Wect7 小时前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼8 小时前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼8 小时前
Next.js 企业级落地
前端·javascript·面试
掘金安东尼8 小时前
React 性能优化完全指南 2026
前端·javascript·面试