目录
Float的历史
Float引起的父元素高度塌陷BUG?
不,不是BUG
文字环绕效果的实现
清除浮动
clear:both的作用
撑开父元素空间的奥秘
总结
首页 web前端 html教程 寒假前端学习(8)--理解CSS浮动与清除浮动_html/css_WEB-ITnose

寒假前端学习(8)--理解CSS浮动与清除浮动_html/css_WEB-ITnose

Jun 21, 2016 am 08:57 AM

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

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

Float的历史

Float设计的初衷,是为了实现文字环绕效果。就像下图展示的一样(图片源于w3school):

嗯,就这么简单。

Float引起的父元素高度塌陷BUG?

在这儿,我们用一个例子来说明子元素设置浮动,从而引起父元素高度塌陷的问题。

首先写一个div,里面插入一张图片。

<div id="div">  <img  src="/static/imghw/default1.png"  data-src="./source/head.jpg"  class="lazy" alt="寒假前端学习(8)--理解CSS浮动与清除浮动_html/css_WEB-ITnose" ></div>
登录后复制

我们再给div设置一个border,为了让大家看的清楚。

CSS设置如下:

#div { border: 5px solid red; width: 600px;}
登录后复制

最后效果是这样的:

通过chrome控制台,可以看到此时div的高度为464px。

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

#div img{ float: left;}
登录后复制

再看网页,发现父元素已经塌陷了,之前的边框也消失不见了,成为一条线了。

此时再去控制台查看div的高度,高度为0px。

不,不是BUG

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

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

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

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

“浮动元素会脱离文档流。”
登录后复制

至于文档流是啥,我这儿就不介绍了。但浮动的元素脱离了文档流,所以是不计算高度的。

在此,我们加入一段话,看看div的高度。

从图中可以看出,div因为段落的加入,高度被撑开了。

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

文字环绕效果的实现

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

清除浮动

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

clear:both的作用

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

<div   style="max-width:90%"></div>
登录后复制

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

然后如果只是会用 clear:both ,又怎么能满足我的求知欲呢?相比与这行代码产生的作用,我更关心为什么这行代码能清除浮动。

对此,我继续翻阅文档。

在w3school中,clear的定义如下:

clear 属性规定元素的哪一侧不允许其他浮动元素。
登录后复制

当然,这样看,还是很难理解为什么clear能清除浮动并撑开父元素高度。那我们举个栗子!

当先声明一个元素A向左浮动时,由于脱离文档流,这个元素的右边就会空出一片空间,空间的长宽与浮动元素长宽相同。

然后我们再声明另外一个元素B,如果元素A右侧空出的空间内,还能放下元素B的话,那么元素B就会自动补上去。

下面我写一个demo,应该就很好理解了。

HTML部分如下:

<div id="div">  <div id="a">    <p>I'm divA</p> //此处用p  </div>  <div id="b">    <span>I'm divB</span> //用span,防止两个都是p,不能展现父元素塌陷效果。  </div></div>
登录后复制

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;}
登录后复制

效果图长这样:

从图上可以看到,元素B的一部分是在元素A空出的空间内的。并且I’m divB这句话在元素A的右侧。且父元素高度塌陷,父元素现在的高度就是元素B的高度。

那么如果元素A右侧空出的空间内,放不下元素B呢?

我们把元素B宽度调整为200px。

可以看出,元素B就自成一行了。

给元素B加入 clear:both 后,元素B将忽略左边浮动所产生的空间,不去补空缺。

如图所示,元素B会另起一行。而不是缩到浮动产生的空间内。

撑开父元素空间的奥秘

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

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

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

总结

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

  1. 设置元素A浮动,元素脱离文档流,不计算高度。父元素出现高度塌陷。
  2. 浮动元素A产生空白空间。空间长宽等于元素A的长宽。后面元素会自动补空缺。
  3. 给浮动元素之后的元素B设置 clear:both ,元素B将不去补空缺。
  4. 元素B不仅不补空缺,还会把元素A因浮动而产生的空白空间填充为实际空间。
  5. 实际空间被计算高度,父元素被撑开。

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

参考链接:

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

HTML容易为初学者学习吗? HTML容易为初学者学习吗? Apr 07, 2025 am 12:11 AM

HTML适合初学者学习,因为它简单易学且能快速看到成果。1)HTML的学习曲线平缓,易于上手。2)只需掌握基本标签即可开始创建网页。3)灵活性高,可与CSS和JavaScript结合使用。4)丰富的学习资源和现代工具支持学习过程。

HTML,CSS和JavaScript的角色:核心职责 HTML,CSS和JavaScript的角色:核心职责 Apr 08, 2025 pm 07:05 PM

HTML定义网页结构,CSS负责样式和布局,JavaScript赋予动态交互。三者在网页开发中各司其职,共同构建丰富多彩的网站。

HTML中起始标签的示例是什么? HTML中起始标签的示例是什么? Apr 06, 2025 am 12:04 AM

AnexampleOfAstartingTaginHtmlis,beginSaparagraph.startingTagSareEssentialInhtmlastheyInitiateEllements,defiteTheeTheErtypes,andarecrucialforsstructuringwebpages wepages webpages andConstructingthedom。

了解HTML,CSS和JavaScript:初学者指南 了解HTML,CSS和JavaScript:初学者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

Gitee Pages静态网站部署失败:单个文件404错误如何排查和解决? Gitee Pages静态网站部署失败:单个文件404错误如何排查和解决? Apr 04, 2025 pm 11:54 PM

GiteePages静态网站部署失败:404错误排查与解决在使用Gitee...

网页批注如何实现Y轴位置的自适应布局? 网页批注如何实现Y轴位置的自适应布局? Apr 04, 2025 pm 11:30 PM

网页批注功能的Y轴位置自适应算法本文将探讨如何实现类似Word文档的批注功能,特别是如何处理批注之间的间�...

如何用CSS3和JavaScript实现图片点击后周围图片散开并放大效果? 如何用CSS3和JavaScript实现图片点击后周围图片散开并放大效果? Apr 05, 2025 am 06:15 AM

实现图片点击后周围图片散开并放大效果许多网页设计中,需要实现一种交互效果:点击某张图片,使其周围的...

HTML,CSS和JavaScript:Web开发人员的基本工具 HTML,CSS和JavaScript:Web开发人员的基本工具 Apr 09, 2025 am 12:12 AM

HTML、CSS和JavaScript是Web开发的三大支柱。1.HTML定义网页结构,使用标签如、等。2.CSS控制网页样式,使用选择器和属性如color、font-size等。3.JavaScript实现动态效果和交互,通过事件监听和DOM操作。

See all articles