目錄
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,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

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

HTML中起始標籤的示例是什麼? HTML中起始標籤的示例是什麼? Apr 06, 2025 am 12:04 AM

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

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文檔的批註功能,特別是如何處理批註之間的間�...

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操作。

如何用CSS3和JavaScript實現圖片點擊後周圍圖片散開並放大效果? 如何用CSS3和JavaScript實現圖片點擊後周圍圖片散開並放大效果? Apr 05, 2025 am 06:15 AM

實現圖片點擊後周圍圖片散開並放大效果許多網頁設計中,需要實現一種交互效果:點擊某張圖片,使其周圍的...

See all articles