Containing Floats 包含浮动_html/css_WEB-ITnose
原文: http://www.complexspiral.com/publications/containing-floats/
正因为浮动功能强大,而且很有用,所以常被用作布局的技巧工具。你可能看到过图1中的情形,这是仅由两个div元素实现的,每个div中有一个浮动的图片。
图1. 那是不正确的
这可能不是作者的意图,但是考虑到所使用的样式,这是正确的布局啊。我们是这样创建的:
div.item {border: 1px solid; padding: 5px;}div.item img {float: left; margin: 5px;}
以上是所有的样式。在图1中看到的结果是因为div元素没有“拉伸”以包含住其中的浮动图片。从另外的角度来看,出现这种情况是因为浮动元素“伸出”了div元素的底部。
这不是一个bug,也不是CSS的缺陷。事实上,许多作者大部分情况下想要这种伸出的行为。仅仅在图1中显示的例子不是他们想要的。
理解问题
那什么时候作者想要浮动伸出包含元素的效果时被认为是正确的呢?很简单:从历史上看最常见的使用浮动的情况是什么。考虑下图2和生成此效果的基本标记结构。
图2. 浮动图片,流动文本
( http://meyerweb.com/other/china/jul31.html穿越中国)
<p> ...text... <img class="picture lazy" src="/static/imghw/default1.png" data-src="jul31-03-sm.jpg" style="max-width:90%" border="0" alt="Containing Floats 包含浮动_html/css_WEB-ITnose" > ...text...</p><p> ...text...</p>
将流动的文本环绕在图片周围这种实践可追溯到很久以前。这就是从Netscape1.1开始将这种能力添加到Web的原因,也是CSS使用属性float使其成为可能的原因。但是再仔细看看图2。浮动图片伸出了包含它的元素。我们通过给段落添加边框可以看得更清楚,如图3所示。
图3.在段落上添加边框
所以现在我们知道了浮动元素伸出包含它们的元素为什么是重要的了。如果不伸出,图2将是图4的样子。
图4. 如果浮动元素扩展它们的父元素
这将是设计者不能够接受的。所以,为了保留Web设计的传统和作者的期望,CSS被设计成允许浮动元素伸出包含它们的元素的底部。虽然这对于一般的文本流是必须的,但主要问题出现在把浮动用于布局用途的时候。
清除解决方案
如果浮动被用在非表格布局中,那么需要某种方式让包含它们的元素拉伸以包含住它们。目前,需要一点结构性的hack。既然我们要在包含元素的底部放一个元素来清除以前浮动的底部,clear是我们的答案。我们仅需要在容器结束之前插入一个块级元素,并清除浮动。考虑:
<div class="item"> <img src="/static/imghw/default1.png" data-src="w6144.gif" class="lazy" alt="Containing Floats 包含浮动_html/css_WEB-ITnose" > Widget 6144 <br>$39.95 <hr></div><div class="item"> <img src="/static/imghw/default1.png" data-src="w6145.gif" class="lazy" alt="Containing Floats 包含浮动_html/css_WEB-ITnose" > Widget 6145 <br>$44.95 <hr></div>
现在我们将以下规则应用到前面的标记上,得到图5的效果。
div.item hr {display: block; clear: left; margin: -0.66em 0; visibility: hidden;}
图5 使用水平规则强制扩展
通过确保hr元素是块级的,又是正常流的一部分,而且清除了浮动,我们强制div“拉伸包含住”左浮动的图片。
负数的顶部和底部margin一般产生关闭hr占用的空间的效果。然而,这不是精度的,而且浏览器之间也不尽相同。水平规则的半神秘性使得很难确切预测将会出现什么状况。hr的有效高度可能是0,或者一个小正数,或者甚至是一个负数高度。
因此,在需要精确清除效果的情况下,作者可以使用div取代hr来创建清除效果。例如:
div.clearer {clear: left; line-height: 0; height: 0;}<div class="item"> <img src="/static/imghw/default1.png" data-src="w6144.gif" class="lazy" alt="Containing Floats 包含浮动_html/css_WEB-ITnose" > Widget 6144 <br>$39.95 <div class="clearer"> </div></div>
设置Float来修复Float
有一种方式可以避免过度使用到现在为止讨论过的结构性hack,虽然这些结构性hack有时候仍然是必要的。在大多数浏览器中,正如CSS2.1中所定义的,浮动元素会扩展以便包含任何从它遗传的浮动元素。所以在小产品例子中,我们可以移除“clearer”元素,使用这些风格替代:
div.item {float: left; border: 1px solid; padding: 5px; width: 60%;}div.item img {float: left; margin: 5px;}
注意我们浮动了图片和“item”div。通过设置div的宽度超高50%,我们确保div不会出现在同一行,而是垂直地堆积在一起。效果如图6。图6 使用浮动实现拉伸以包含住浮动元素。
就标记和风格而言,很明显这样管理起来更简单了。然而,到现在为止讨论过的hack仍然是有用的。假设你想在商品的下面放些建议文本。为了让文本不流到商品的右边,我们需要插入清除hack。这会引导我们创建如下标记,如图7所示。
<div class="item"> <img src="/static/imghw/default1.png" data-src="w6144.gif" class="lazy" alt="Containing Floats 包含浮动_html/css_WEB-ITnose" > Widget 6144 <br>$39.95</div><div class="item"> <img src="/static/imghw/default1.png" data-src="w6145.gif" class="lazy" alt="Containing Floats 包含浮动_html/css_WEB-ITnose" > Widget 6145 <br>$44.95</div> <div class="clearer"> </div> <p>Widgets are sold on an "as is" basis without warranty or guarantee.</p>
图7 浮动加hack实现想要的布局
起清除作用的div有效地将正常流推下来,强制任何后面的内容跟在被清除元素后面,因此跟在浮动div后面。
使用浮动包含浮动的潜在缺陷是依赖浏览器对多层嵌套的浮动元素的布局的一致解释。如果这些浮动元素是更复杂布局的一部分,情况变得更脆弱,该部件可能使用了浮动,定位或表格。这不是说这些布局不可能实现。然而,他们可能涉及大量的试验和错误,避免晦涩浮动和其他可能潜藏在渲染引擎内部的布局 bug。
<strong>总结</strong>
通过理解浮动和正常流之间的相互联系,理解清除可用来处理浮动周围的正常流,作者可以把浮动当作一个非常强大的布局工具。由于浮动最初不是用于布局,为了让它们达到预期有些hack可能是必要的。这可能涉及包含浮动的浮动元素,“清除”元素,或者两者的结合。
展望未来,已有各种提议要增强CSS,允许作者声明一个元素拉伸以包含住其中的任何浮动元素。很明显将这种能力添加到CSS是受欢迎的,但是截止到本文撰写时,还没有添加这种能力,对这种能力的支持可能还需要很长一段时间。源代码 http://files.cnblogs.com/jeffma/code.rar

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

HTML、CSS和jQuery:製作一個帶有浮動效果的按鈕,需要具體程式碼範例引言:如今,網頁設計已成為一種藝術形式,透過使用HTML、CSS和JavaScript等技術,我們能夠為頁面增加各種各樣的特效和互動效果。本文將簡要介紹如何用HTML、CSS和jQuery製作一個帶有浮動效果的按鈕,並提供具體的程式碼範例。一、HTML結構首先,我們需要在HTML檔中

清除浮動有什麼方法,需要具體程式碼範例在網頁佈局中,浮動是一種常用的佈局方法,可以讓元素脫離文件流,並相對其他元素進行定位。然而,使用浮動佈局時常常會遇到一個問題,就是父元素無法正確地包裹浮動元素,導致頁面產生佈局錯亂的情況。所以,我們需要採取措施來清除浮動,使得父元素能夠正確地包裹浮動元素。清除浮動的方法有多種,以下將介紹常用的幾種方法,並給出具體的程式碼範例

jQuery是一個著名的JavaScript函式庫,它提供了簡潔而強大的功能,用來簡化JavaScript程式設計。當將jQuery引入你的網頁專案時,你需要在HTML檔案中加入以下程式碼來引入必須的套件:我的網頁

如何使用JavaScript判斷一個字串是否包含特定字元?在JavaScript中,我們可以使用幾種方法來判斷一個字串是否包含特定字元。以下將介紹三種常用的方法,並給出對應的程式碼範例。方法一:使用indexOf()方法可以使用字串的indexOf()方法來判斷一個字串是否包含指定的字元。它會傳回特定字元在字串中第一次出現的位置索引,如

HTML版面技巧:如何使用position屬性進行浮動元素控制在網頁設計中,佈局是非常重要的一環。透過合理的版面可以讓網頁更加美觀易讀,提升使用者體驗。而在實作佈局過程中,浮動元素的控制是其中一個關鍵點。 HTML提供了position屬性,透過這個屬性我們可以實現對浮動元素的控制。本文將介紹如何使用position屬性進行浮動元素的佈局,並提供一些具體的程式碼

CSS浮動和清除浮動:掌握浮動和清除浮動的技巧,需要具體程式碼範例在網頁設計和開發中,CSS浮動(float)是常見的佈局技術之一。使用浮動可以將元素向左或向右移動,從而實現元素在頁面中的位置調整和排列。然而,浮動元素也會造成頁面一些問題,例如父元素高度塌陷等。因此,掌握浮動的使用和清除浮動的技巧非常重要。本文將重點放在CSS浮動和清除浮動的技巧,並提供具

CSS圖片屬性指南:outline和displayCSS是前端開發中不可或缺的一部分,其中圖片屬性也是不可或缺的。在這篇文章中,我們將重點介紹兩個關於圖像屬性的重要概念:outline和display。本文將詳細說明它們的定義、用法以及具體的程式碼範例。 outline屬性概述:outline屬性用於在元素周圍建立一個輪廓線,不佔據佈局空間。它是

CSS佈局屬性大全:display,position和floatCSS是用來控制網頁樣式的一種標記語言。在設計網頁佈局時,佈局屬性是非常重要的。 CSS提供了多種佈局屬性,其中最常用的是display,position和float。在本篇文章中,我們將詳細介紹這三種佈局屬性,並提供具體程式碼範例。 display屬性display屬性用來指定元
