详解 清除浮动 的多种方式(clearfix)

详解 清除浮动 的多种方式(clearfix)说明本文适合知道 HTML 与 CSS 基础知识的读者 或者想要了解清除浮动背后原理的读者 1 什么是浮动首先我们需要知道定位元素在页面中的位置就是定位 解决问题之前我们先来了解下几种定位方式 1 普通流定位 static 默认方式 普通流定位 又称为文档流定位 是页面元素的默认定位方式页面中的块级元素 按照从上到下的方式逐个排列页面中的行内元素 按照从左到右的方式逐个排列但是如

说明

本文适合知道HTML 与 CSS基础知识的读者,或者想要了解清除浮动背后原理的读者!

1.什么是浮动

首先我们需要知道定位
元素在页面中的位置就是定位,解决问题之前我们先来了解下几种定位方式
1、普通流定位 static(默认方式)
普通流定位,又称为文档流定位,是页面元素的默认定位方式
页面中的块级元素:按照从上到下的方式逐个排列
页面中的行内元素:按照从左到右的方式逐个排列
但是如何让多个块级元素在一行内显示?
这里就引出了浮动定位
2、浮动定位 float
float属性 取值为 left/right
这个属性原本不是用来布局的,而是用来做文字环绕的,但是后来人们发现做布局也不错,就一直这么用了,甚至有些时候都忘了用他做文字环绕
3、相对定位 relative
元素会相对于它原来的位置偏移某个距离,改变元素位置后,元素原本的空间依然会被保留
语法
属性:position
取值:relative
配合着 偏移属性(top/right/bottom/left)实现位置的改变
































4、绝对定位 absolute
如果元素被设置为绝对定位的话,将具备以下几个特征
1、脱离文档流-不占据页面空间
2、通过偏移属性固定元素位置
3、相对于 最近的已定位的祖先元素实现位置固定
4、如果没有已定位祖先元素,那么就相对于最初的包含块(body,html)去实现位置的固定
语法
属性:position
取值:absolute
配合着 偏移属性(top/right/bottom/left)实现位置的固定


















5、固定定位 fixed
将元素固定在页面的某个位置处,不会随着滚动条而发生位置移动
语法
属性:position
取值:fixed
配合着 偏移属性(top/right/bottom/left)实现位置的固定










2.浮动的效果

  • 浮动 之后会怎么样?
    1、浮动定位元素会被排除在文档流之外-脱离文档流(不占据页面空间),其余的元素要上前补位
    2、浮动元素会停靠在父元素的左边或右边,或停靠在其他已浮动元素的边缘上(元素只能在当前所在行浮动)
    3、浮动元素依然位于父元素之内
    4、浮动元素处理的问题-解决多个块级元素在一行内显示的问题
    注意
    1、一行内,显示不下所有的已浮动元素时,最后一个将换行
    2、元素一旦浮动起来之后,那么宽度将变成自适应(宽度由内容决定)
    3、元素一旦浮动起来之后,那么就将变成块级元素,尤其对行内元素,影响最大
    块级元素:允许修改尺寸
    行内元素:不允许修改尺寸
    4、文本,行内元素,行内块元素时采用环绕的方式来排列的,是不会被浮动元素压在底下的,会巧妙的避开浮动元素






















  • 浮动 之后会有什么样的影响?
    由于浮动元素会脱离文档流,所以导致不占据页面空间,所以会对父元素高度带来一定影响。如果一个元素中包含的元素全部是浮动元素,那么该元素高度将变成0(高度塌陷)

3.如何清除浮动

解决方案 及 原理分析

方案1
方案2
方案3
方案4
方案5
方案6

使用内容生成的方式清除浮动

.clearfix:after { content:""; display: block; clear:both; }
方案7
.cf:before,.cf:after { content:""; display:table; } .cf:after { clear:both; }

CSS2.1 表格模型中的元素,可能不会全部包含在除HTML之外的文档语言中。这时,那些“丢失”的元素会被模拟出来,从而使得表格模型能够正常工作。所有的表格元素将会自动在自身周围生成所需的匿名table对象,使其符合table/inline-table、table-row、table- cell的三层嵌套关系。

疑问
解释

BFC布局规则:
1、内部的Box会在垂直方向,按照从上到下的方式逐个排列。
2、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
3、每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
4、BFC的区域不会与float box重叠。
5、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6、计算BFC的高度时,浮动元素的高度也参与计算












触发BFC的条件
1、根元素
2、float 取值 none 以外的值
3、overflow 除了visible 以外的值(hidden,auto,scroll )
4、display (table-cell,table-caption,inline-block,flex,inline-flex)
5、position(absolute,fixed)










举例详解BFC

<style> .top{ width:100px; height:100px; background:red; margin:50px; } .bottom{ width:100px; height:100px; background:blue; margin:20px; } 
  style> <body> <div> <div class="top">上 
  div> 
  div> <div class="bottom">下 
  div> 
  body>

BFC2
依据BFC布局规则第二条:

从上面的例子可以看出,虽然红色 和 蓝色 的 div 都有设置 margin ,但是最后两个div 之间的距离并不是 50 + 20,而是取了较大者 50。

<style> .top{ width:100px; height:100px; background:red; margin:50px; } .bottom{ width:100px; height:100px; background:blue; margin:20px; } .cf:before,.cf:after { content:""; display:table; } .cf:after { clear:both; }  
   style> <body> <div class="cf"> <div class="top"> 
   div>  
   div> <div class="bottom"> 
   div>  
   body>

这里写图片描述

<style> .top{ width:100px; height:100px; background:red; float:left; } .bottom{ width:200px; height:200px; background:blue; } 
  style> <body> <div class="top"> 
  div> <div class="bottom"> 
  div> 
  body>

BFC3
依据BFC布局规则第三条:

每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

我们可以看到,虽然有浮动的元素top,但是bottom的左边依然与包含块的左边相接触。

<style> .top{ width:100px; height:100px; background:red; float:left; } .bottom{ width:200px; height:200px; background:blue; overflow:hidden; } 
  style> <body> <div class="top"> 
  div> <div class="bottom"> 
  div> 
  body>

BFC4
依据BFC布局规则第四条:

BFC的区域不会与float box重叠。

看代码和效果图,可以看出,这次的代码比上面的代码多了一行overflow:hidden;用这行代码触发新的BFC后,由于这个新的BFC不会与浮动的top重叠,所以bottom的位置改变了

<style> p{ width:100px; height:100px; background:red; float:left; } div{ width:200px; border:1px solid blue; } 
  style> <body> <div> <p> 
  p> 
  div> 
  body>

这里写图片描述

计算BFC的高度时,浮动元素的高度也参与计算。

到此我们应该是解决了上面的所有疑问了。

总结

清除浮动的方式有很多种,但是实现的原理主要是靠clear属性,和触发新的BFC,通过详细的解释与比较,最后两种内容生成的方式是比较推荐使用的,如果需要考虑margin重叠的问题,就用方案7,不考虑就用方案6,如果大家还有什么巧妙的方式,可以留言,分享一下!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205258.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:25
下一篇 2026年3月19日 下午6:26


相关推荐

  • ntp校时服务器(NTP校时器)介绍

    ntp校时服务器(NTP校时器)介绍酷鲨科技作为一家时间同步领域科研公司 今天简单介绍一下 ntp 校时服务器 其实大部分人认为 ntp 校时服务器是不同于 NTP 网络时间同步服务器 其实不然 基本是同一种产品 只是叫法不同 ntp 校时服务器页可以称为 NTP 校时器 ntp 校时服务器主要作用 ntp 校时服务器主要还是帮助不同网络设备之间进行时间同步 然而 同步 概念在通信领域中频率的同步 或者网络中每个节点的时钟频率与相位的同步 并且在规定的标准误差之间 其实网站时间的同步并没有解决 ntp 校时服务器的功能也就是让网络中的每一个时钟节点 频率 每一个具

    2026年3月16日
    2
  • 将三维数组中的同名的键拆分成三维数组的每个数组中包括原来不同的二维数组的键…

    将三维数组中的同名的键拆分成三维数组的每个数组中包括原来不同的二维数组的键…

    2021年11月4日
    47
  • git使用具体介绍

    git使用具体介绍

    2021年12月5日
    52
  • [20161111]数据文件的第0块2.txt

    [20161111]数据文件的第0块2.txt

    2022年2月22日
    57
  • java异或运算符号_java异或运算符使用场景

    java异或运算符号_java异或运算符使用场景异或运算符“^”是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1.异或运算符可认为是无进位的二进制相加,如:6^7如6二进制为:00000110如7二进制为:00000111则6^7=1异或运算符性质(1)0^N=N;N^N=0(2)满足交换律及结合律简单的算法题(1)如果一个数组中只有一个数出现了奇数次,剩下的数都出现了偶数次,求这个出现了奇数次的数。publicstaticvoidgetData(int[]arr){int

    2022年10月5日
    4
  • idea Mac 破解2021激活码[免费获取]

    (idea Mac 破解2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
    92

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号