热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

理解CSS浮动与清除浮动

本文主要探讨两个问题:为什么CSS设置浮动会引起父元素塌陷为什么设置clear:both能清除浮动,并撑开父元素。起因CSS的浮动,算是我

本文主要探讨两个问题:

  1. 为什么CSS设置浮动会引起父元素塌陷

  2. 为什么设置clear:both能清除浮动,并撑开父元素。

起因

CSS的浮动,算是我在写网页时用的最多的属性之一。但要说我对浮动的了解程度的话,只能说“知其然而不知其所以然”。虽然很多人都说浮动会用就行,但是要想成为一个优秀的前端,对这些常用属性得知根知底。

恰巧在慕课网,张鑫旭老师开了《CSS深入理解之float浮动》这门课。链接在文末,有兴趣的可以听听,老师讲课风格很风趣……

Float的历史

Float设计的初衷,是为了实现文字环绕效果。就像下图展示的一样(图片源于w3school):
#div {border: 5px solid red;width: 600px;
}

最后效果是这样的:
未Float的效果图
通过chrome控制台,可以看到此时div的高度为464px。
div高度

接下来,我们给那张图片添加浮动效果。

#div img{float: left;
}

再看网页,发现父元素已经塌陷了,之前的边框也消失不见了,成为一条线了。
Float后的效果图
此时再去控制台查看div的高度,高度为0px。
div高度

不,不是BUG

很多人把这个现象称为浮动带来的BUG。但从一开始Float的用途来思考:

“Float设计的初衷,是为了实现文字环绕效果。”

那么,在那远古蛮荒的互联网时代,要如何实现文字环绕图片的效果呢?机智的程序员加入了Float属性,也引入了子元素浮动,父元素高度塌陷的特性。
看到这句话的时候,我思考了很久。因为无法理解父元素高度塌陷为何能让文字环绕图片。于是把视频来来回回看了十多遍,又手写了个demo,总算理解了。

总结来说,核心要点在于一句话:

“浮动元素会脱离文档流。”

至于文档流是啥,我这儿就不介绍了。但浮动的元素脱离了文档流,所以是不计算高度的。
在此,我们加入一段话,看看div的高度。
段落高度
从图中可以看出,div因为段落的加入,高度被撑开了。

所以子元素浮动引起父元素高度塌陷的原因如下:
因为没有预先设置div高度,所以div高度由其包含的子元素高度决定。而浮动脱离文档流,所以图片并不会被计算高度。此时的div中,相当于div中子元素高度为0,所以发生了父元素高度塌陷现象。

文字环绕效果的实现

那么,文字环绕效果是如何实现的?
其实讲起来也很简单,因为父元素高度塌陷,所以文字会按正常顺序排列,无视图片高度。而图片宽带又还在,所以实现了文字环绕效果。

清除浮动

介绍完浮动,自然要介绍清除浮动。在此,我们不具体的去探讨各种清除浮动的方式。而是去探讨,为何设置clear:both能清除浮动,并撑开父元素。

clear:both的作用

clear:both的作用,对各位来说可以算是耳熟能详了。至于clear的left,right等属性,我们这儿就不一一列举了。

在父元素内的底部,加入这一行代码。看图易知,父元素因为子元素设置浮动而高度塌陷的问题,已经被解决了。
加入clear: both后的效果

然后如果只是会用clear:both,又怎么能满足我的求知欲呢?相比与这行代码产生的作用,我更关心为什么这行代码能清除浮动。
对此,我继续翻阅文档。
在w3school中,clear的定义如下:

clear 属性规定元素的哪一侧不允许其他浮动元素。

当然,这样看,还是很难理解为什么clear能清除浮动并撑开父元素高度。那我们举个栗子!
当先声明一个元素A向左浮动时,由于脱离文档流,这个元素的右边就会空出一片空间,空间的长宽与浮动元素长宽相同。
然后我们再声明另外一个元素B,如果元素A右侧空出的空间内,还能放下元素B的话,那么元素B就会自动补上去。
下面我写一个demo,应该就很好理解了。
HTML部分如下:

I'm divA

//此处用p
I'm divB //用span,防止两个都是p,不能展现父元素塌陷效果。

CSS部分如下:

#div {border:5px solid red;width:400px;
}
#a {background:rgba(149, 149, 149, 0.42); // 为了方便演示,A的背景色设置成半透明。width:200px;float: left;
}
#b {background: #6EEBC1;width:300px;
}

效果图长这样:
demo效果

从图上可以看到,元素B的一部分是在元素A空出的空间内的。并且I'm divB这句话在元素A的右侧。且父元素高度塌陷,父元素现在的高度就是元素B的高度。
那么如果元素A右侧空出的空间内,放不下元素B呢?
我们把元素B宽度调整为200px。

放不下时的效果
可以看出,元素B就自成一行了。

给元素B加入clear:both后,元素B将忽略左边浮动所产生的空间,不去补空缺。
元素B设置clear:both后
如图所示,元素B会另起一行。而不是缩到浮动产生的空间内。

撑开父元素空间的奥秘

在w3school中,clear的定义中还有这么一句话:

“在 CSS2.1 中,会在设置清除浮动的元素上外边距之上增加清除空间,而外边距本身并不改变。”

也就是说,因为浮动而产生的空白空间,会被填充为实际存在的空间。。那么,自然就能撑开父元素。

总结

总结下来,浮动与清除浮动的顺序关系如下:

  1. 设置元素A浮动,元素脱离文档流,不计算高度。父元素出现高度塌陷。

  2. 浮动元素A产生空白空间。空间长宽等于元素A的长宽。后面元素会自动补空缺。

  3. 给浮动元素之后的元素B设置clear:both,元素B将不去补空缺。

  4. 元素B不仅不补空缺,还会把元素A因浮动而产生的空白空间填充为实际空间。

  5. 实际空间被计算高度,父元素被撑开。

这么一番走下来,花了很多时间去思考,去写demo。但对CSS浮动的理解也加深了。浮动为何引起父元素塌陷和清除浮动为何能撑开父元素这两个问题,一直是我的盲点。所以这次寒假,集中了两天时间去攻克它(除夕和正月初一,大过年的写代码,感觉有点怪但效率却出奇的高……)。

参考链接:

《CSS深入理解之float浮动》-- 张鑫旭(也是课程地址)
CSS clear 属性
clear:both 为什么不起作用?--知乎,田雅文的回答

前端路漫漫,且行且歌。
最后附上本人博客地址和原文链接,希望能与各位多多交流。

Lxxyx的前端乐园
原文链接:寒假前端学习(8)——理解CSS浮动与清除浮动




推荐阅读
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 本文探讨了在网站编辑器中使用JavaScript实现优酷视频播放器自适应宽度的方法。尽管尝试过多种CSS解决方案,但都存在一定的局限性,因此最终决定采用JavaScript来动态调整视频播放器的尺寸。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • [附源码]计算机毕业设计JAVAjsp医药管理信息系统
    [附源码]计算机毕业设计JAVAjsp医药管理信息系统项目运行环境配置:Jdk1.8Tomcat7.0MysqlHBuilderX(Webstor ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • 如何为U盘或移动硬盘设置个性化图标?
    购买的新希捷移动硬盘自带了一个独特图标,非常个性化。许多品牌的移动硬盘和U盘都有类似的定制图标功能。本文将指导您如何为您的存储设备添加独一无二的图标。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 过去我习惯使用百度空间来记录个人的生活琐事,但随着需求的增长,我发现它的功能略显不足,特别是在代码分享和图片管理方面存在诸多不便。因此,我决定寻找一个更适合技术分享的平台,最终选择了博客园。 ... [详细]
  • 最适合初学者的编程语言
    本文探讨了适合编程新手的最佳语言选择,包括Python、JavaScript等易于上手且功能强大的语言,以及如何通过有效的学习方法提高编程技能。 ... [详细]
  • 体育游戏开发商望尘科技冲刺港股IPO:国内增长放缓,海外扩张成关键
    体育游戏开发商望尘科技近期向港交所提交了IPO申请,显示其在国内市场增长放缓的背景下,正积极寻求通过海外扩张来提升自身竞争力。 ... [详细]
  • Ubuntu系统下的GIF动画录制解决方案
    在撰写文章或教程时,GIF动态图能够有效地传达信息。对于Windows用户而言,ScreenToGif是一款非常实用的工具。而在Ubuntu系统中,用户同样拥有多种选择来创建GIF动画,本文将重点介绍两款录屏工具——Byzanz和Peek。 ... [详细]
  • 本文将指导您如何在网吧电脑上轻松录制绝地求生游戏中的精彩片段,让您的游戏经历更加丰富多彩。 ... [详细]
  • Adobe Flash Player:功能与历史回顾
    本文详细介绍了Adobe Flash Player的功能及其在互联网发展史上的重要角色,同时探讨了其停止支持的原因及后续影响。 ... [详细]
author-avatar
2012-随意_544
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有