(转)CSS浮动,你不知道的事

原文链接:http://www.cnblogs.com/zhujl/archive/2012/05/08/2489440.html

浮动到底做了什么?

浮动如何影响元素的盒模型?

浮动的元素和行内元素有何不同?

调整浮动元素的位置是通过什么规则进行的?

clear属性如何工作,它的目的又是什么?

浮动甚至能绊倒有经验的开发者,理解浮动能帮助你解决很多CSS问题。即使你认为已经知道了浮动的所有知识,我们足够深入的分析也许也能让你学到一些新东西。

什么是浮动?

CSS中的一些元素是块级元素,表示它们会自动另起一行。

举个例子,如果你创建了两个段落,每个段落都只有一个单词。这两个单词不会靠在一起,而是会各自占据一行。

另一些元素是行内元素,表示它们和前面的内容位于相同的一行。

举个例子,<a>可以出现在另一个元素中,比如<p>,这不会产生多余的空格或者出现换行。

欺骗这种布局模型的一种方式是使用浮动,浮动可以让一个元素移到它所在行的某一边,使得其他内容沿着该元素的边缘向下流。

一个典型的例子是你想要一张图片和一个段落并排出现,而不是一上一下排列。首先我们先来创建HTML:

<img src="http://lorempixum.com/200/200/" />
<p>Lorem ipsum...</p>

单独这段代码并不能实现我们想要的效果。<p>是一个块级元素,它会独占一行,所以图片和段落是一上一下展现的。 

通过让图片向右浮动可以改变这种行为,如下:

img {
    float: right;
    margin: 20px;
}

这样,图片就跑到右边去了,而段落则沿着图片的左边向下流式布局。

现在发生了一件有趣的事,当这张图片浮动后,其他的内容就会想办法尽可能的包围它。如果我们resize容器或者浏览器窗口,让它更窄,这段文本就会发生重排(reflow),这样它就永远不可能接触到图片。

盒模型如何工作

也许你已经对上面所讲的知识有了深刻的理解。但是,为了完全掌握浮动,你需要更加深刻的理解两个元素如何互相作用。举个例子,如果我们在段落和图片之间加一个边距会发生什么?

p {margin: 20px;}

但是呢,这么写并不会在图片和段落之间产生额外的空间。实际上,我们需要给图片加margin:

img {margin: 20px;}

也许你会问为什么呢?为什么增加<p>的margin不会增加图片和段落的间距呢?

原因是我们没有理解<p>的盒模型。

  
如果现在你对布局产生了一些疑虑,可以试着加一个或者两个border,看看会发生什么。下面给<p>加border:

p {
    border: solid 1px black;
}

如你所见,图片实际上位于<p>盒模型的内部!这就可以解释刚才的margin问题。我们加到<p>上的margin其实是作用于图片的右侧,这就是为什么它不能增加图片和段落之间的距离!

如果我们想改变这种行为,使得段落不会包围图片,我们应该让段落向左浮动,并设置一个宽度(如果不设置,<p>的宽度默认是100%,这样就不会和图片紧挨着了,因为如果段落很长,它会跑到下一行)。

img {
    float: right;
    margin: 20px;
}

p {
    float: left;
    width: 220px;
    margin: 20px;
}

疯狂的浮动规则

现在你知道什么是浮动了,并且知道浮动如何影响相关元素的盒模型。接下来要说的也许很多人都不了解:如何调整浮动元素的位置

web开发中很多人会给<li>使用浮动。下面来看一个例子:

<ul>
    <li><img src="http://placehold.it/100x100&text=1"/></li>
    <li><img src="http://placehold.it/100x150&text=2"/></li>
    <li><img src="http://placehold.it/100x100&text=3"/></li>
    <li><img src="http://placehold.it/100x100&text=4"/></li>
    <li><img src="http://placehold.it/100x100&text=5"/></li>
    <li><img src="http://placehold.it/100x150&text=6"/></li>
    <li><img src="http://placehold.it/100x100&text=7"/></li>
</ul>

所有<li>默认应该是垂直方向上排列的,这就表示<li>是块级元素。即使图片是行内元素,它也会被它的父级块级元素管理。为了解决这个问题,我们让<li>向左浮动。当一行内的多个<li>被浮动后,它们会产生类似行内元素的流式布局。然而,正如你即将看到的,它们有一些关键的不同。

li {
    float: left;
    margin: 4px;
}

现在,如果所有图片的高度相同,就会产生下面的效果。

但是,我们的图片高度不是一样的,一些是100px,另一些是150px。这就引起了一些严重的问题!

当我第一次看到这个效果,我蛋疼了。为什么图片4跑到右边去了?它不是应该尽可能的向左浮动么?如果我们放弃浮动而使用display:inline,结果会大不一样。

li {
    display: inline;
}

这个例子中,图片默认是垂直居底(bottom)对齐。这和我们之前的例子不同,为了解决对齐问题,我们添加一行CSS。

img {
    vertical-align: top;
}

由此可知,使用display:inline 可以更容易猜到<li>的排列结果。当水平方向没有多余的空间时,下个元素就会另起一行。

浮动为什么不能实现这种效果呢?

CSS规范对于浮动行为概括了9个规则。但问题是,只有规范的作者和那些无聊的人才能理解这些规则。下面摘录了其中一个规则:

“If the current box is left-floating, and there are any left-floating boxes generated by elements earlier in the source document, then for each such earlier box, either the left outer edge of the current box must be to the right of the right outer edge of the earlier box, or its top must be lower than the bottom of the earlier box. Analogous rules hold for right-floating boxes.”

对于这些规则,也许你比我理解的更深,但说实话,这些规则让我非常蛋疼。为了简化它,Josh Johnson给出了他的9条规则(注:我觉得这位仁兄的9条规则依然很啰嗦,我再给精简一下):

1. 浮动元素的活动区域

  仅限于它的父容器元素,不会超出父容器

2. 浮动元素的位置

  水平方向:尽可能居左或居右,如果它前面还有浮动元素,会跟在它后面,如果超出该行就会换行

  垂直方向:尽可能的居顶

关于水平方向的位置,需要注意以下几点:

1) 向左浮动的元素不会出现在向右浮动的元素的右侧

关于垂直方向的位置,需要注意以下几点:

1) 浮动元素不会比容器的顶部还高

2) 浮动元素不会比前一个块级元素或浮动元素更高

3) 浮动元素不会比前一个行内元素更高

在布局时,垂直方向的规则比水平方向的优先级更高

总的来说就是,浮动元素会移到左侧或右侧。除非该元素前面还有一个浮动元素,这时它就会紧挨着前面的元素。

真正让人迷惑的是:浮动元素会尽可能的居顶,并且垂直定位规则比水平浮动规则的优先级更高。

在前面的例子中,图片2撑高了该行的高度,所以在放完图片3后,仍然有足够的垂直空间放置图片4。

记住,当你有一个浮动元素(不位于尾行)时,它后面的浮动元素占用的垂直空间必须大于或等于它才会触发换行

浮动顺序

举个例子,我们有6张图片的一个列表。

<ul>
    <li><img src="http://placehold.it/100x100&text=1"/></li>
    <li><img src="http://placehold.it/100x100&text=2"/></li>
    <li><img src="http://placehold.it/100x100&text=3"/></li>
    <li><img src="http://placehold.it/100x100&text=4"/></li>
    <li><img src="http://placehold.it/100x100&text=5"/></li>
    <li><img src="http://placehold.it/100x100&text=6"/></li>
</ul>

如果我们向左浮动图片,它们就会按照原来的顺序排列。但如果向右浮动呢?

可以发现,第一张图片占据了最右的位置。类似的,换行后,第四张图也占据了最右的位置。这就是为什么你很少看到导航栏的列表项会向右浮动的原因。

清除浮动

使用浮动可以方便的实现一些布局,比如创建n栏内容。但是呢,一旦使用浮动就会影响文档正常的流式布局。比如,刚才那个例子中,我们想在列表下方加上一个段落。

这个结果也许不是你想要的。这里的解决方法是使用 clear 属性,它的作用是清除该元素某侧的浮动。比如,我们对第二个列表项使用clear:left

ul li:nth-child(2) {
    clear: left;
}

这段代码告诉浏览器第二项的顶部必须比它前面的浮动元素的底部更低。如果所有列表项是向右浮动的,则需要使用clear: right

加上段落文本再看

很明显这依然不是我们想要的效果,解决方法是给段落使用clear,这会使得段落出现在浮动元素的下方而不是与它们相邻。

p {
    clear: both;
}

其实这里我们只需要清除左侧的浮动即可,但是当一个开发者为了确保清除了所有浮动,clear:both是很常用的一种方法。

浮动的问题和clearfix

当一个元素只包含浮动元素时,该容器元素会出现高度重叠(和高度为0的效果一样,即高度的顶边和底边重叠)。为了演示这个现象,我们还是使用刚才的例子,只是给列表加一个背景色。

ul {
    background: gray;
}

  

如果列表项没有浮动,可以看到整个列表都是灰色的,而列表项则是从上到下排列。

现在我们浮动所有列表项,这时<ul>只包含浮动的元素,所以它的高度重叠了,新手肯定会好奇背景色到底哪去了.

解决这个问题有好几种方法,最简单的一种是直接给容器元素设置高度。

ul {
    height: 300px;
}

这样背景色又回来了。但是,这种方法常常不能让我们满意,因为当我们需要容器的高度和内容自适应时,这种方法完全无效。如果我们再加上三个列表项,这个高度又不够了。

召唤clearfix

现在该轮到clearfix登场了,它通过clear属性解决了高度重叠的问题。

我们常常会创建一个空元素(通常是div),它和浮动元素同级,然后给它设置class为“clearfix”。回到CSS,我们加上这样一行样式:

.clearfix {
    clear: both;
}

这样就解决了高度的问题。

说下原理:我们知道当元素只包含浮动元素时,高度发生重叠(效果和高度为0一样),这时该元素有了一个子元素,即使它是个空元素,但它没有浮动,而且还清除了所有浮动,所以这个空元素会出现在所有元素的下方,从而撑起了容器的高度,于是height:auto恢复正常了。

这种方法的缺点是,HTML中多了一个额外的元素,不符合语义化的思想。

新的解决方法是使用 overflow 属性,如果你设值为hidden 或 auto,也可以解决高度重叠的问题。

ul {
    overflow: auto;
}

这种方法更简单也更优雅,但是还有个问题要说下,如果容器元素必须设置为overflow: visible,你又该怎么办呢?

方法是首先使用 :before 和 :after 在元素内创建一些不浮动的东西,但实际上你并不希望出现任何多余的东西,所以我们设置一个空字符串,但是要设置display:table,这样就创建了一个匿名单元格(是不是想起了<td></td>?),最后使用老办法,清除浮动。

为了兼容老版本的IE,使用它特有的zoom:1清除浮动。

/* For modern browsers */
.cf:before,
.cf:after {
    content:"";
    display:table;
}

.cf:after {
    clear:both;
}

/* For IE 6/7 (trigger hasLayout) */
.cf {
    zoom:1;
}

  

  

http://designshack.net/articles/css/everything-you-never-knew-about-css-floats/

时间: 2024-11-06 03:41:54

(转)CSS浮动,你不知道的事的相关文章

CSS之浮动那些事

1.清除浮动 下面是两种常用的方式,而这两招也够用了(不用千招会,只需一招精). 1.结尾处加空div标签 clear:both <style type="text/css"> .left{float:left;} .right{float:right;} /*清除浮动代码*/ .clearfloat{clear:both} </style> <div> <div class="left">Left</div&g

你不知道的事-建站始末1【准备篇】

阅读目录 建站四部曲: 你不知道的事-建站始末1[准备篇] 你不知道的事-建站始末2[框架篇] 你不知道的事-建站始末3[实现篇] 你不知道的事-建站始末4[总结篇] 本篇目录: 写在前面 为什么要建站? 建站计划 前端总结 知识点总结 域名和服务器 关于开源 未完待续 本篇内容会有些长,希望各位看官可以认真的阅读下去,我相信肯定会有收获. 写在前面 蝴蝶眨几次眼睛,才学会飞行,夜空洒满了星星,但几颗会落地. --你不知道的事 蝴蝶眨眼睛?星星会落地?当然很多人会认为这是无稽之谈,但是有些人却认

CSS那点事

1. CSS文件必须使用UTF-8编码: 2. CSS代码必须小写: 3. 常量值不能加引号,除非值中含有空格.如:color:"red"是错误的,应把引号去掉:font-family:"Century Gothic"; 如果名字中含有空格则必须加引号: 4. background-img:url("img.jpg"); URL中如果有空格则必须加引号,否则不必须: 5. 每一行都必须以分号结束: 6. 注释为/*...*/ 7. 添加了!imp

CSS浮动的3个特性(高手绕行)

1.  浮动元素会脱离正常的文档流,按照其外边距指定的位置相对于它的上一个块级元素(或父元素)显示: 代码示例: 1 <!DOCTYPE HTML > 2 <html> 3 <head> 4 <meta charset='utf-8'/> 5 <title>浮动元素的性质</title> 6 <style type="text/css"> 7 *{ 8 margin:0; 9 padding:0; 10

css浮动(folat),清除浮动(clear)

css浮动(float) float是css样式,用于设置标签的居左浮动和居右浮动,浮动后的元素不属于html文档流,需要用清除浮动把文档拽回到文档流中 浮动值: left:向左浮动 right:向右浮动 html文档流:自窗体自上而下分成一行一行,并在没行中从左到右的顺序排放元素. 通过例子来解释浮动 1.页面上有两个块元素,每个块元素独占一行 2.我们希望他们能并排显示,这是就可以使用float,我们先给红色的div加float:left,发现两个是在一行了,但是他们重叠在了一起. 3.这是

css浮动和清除浮动

浮动存在的原因 在word排版中,文本可以环绕图片.在css中,想要实现文字环绕的效果,只能借助于float,没有其他的替代方式.在实际中,文档的布局经常会使用浮动. float属性 float属性,默认为none,也就是标准流通常的情况.如果将float的属性的值设置为left或right,元素就会向其父元素的左侧或右侧紧靠. inherit表示从父元素继承float属性的值. clear属性 clear 属性定义了元素的哪边上不允许出现浮动元素.在 CSS1 和 CSS2 中,这是通过自动为

验分享:CSS浮动(float,clear)通俗讲解

经验分享:CSS浮动(float,clear)通俗讲解 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多,小菜没有精力从头到尾讲一遍,只能有针对性的讲解. 如果读者理解CSS盒子模型,但对于浮动不理解,那么这篇文章可以帮助你. 小菜水平有限,本文仅仅是入门教程,不当之处请谅解! 本文以div元素布局为例. 教程开始: 首先要知道,div是块级元素

string.Format之你不知道的事

1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0.20) 默认格式化小数点后面保留两位小数,如果需要保留一位或者更多,可以指定位数 string.Format("{0:C1}",23.15) 结果为:¥23.2 (截取会自动四舍五入) 格式化多个Object实例 string.Format("市场价:{0:C},优惠价{1:C

关于算法,那些你不知道的事

关于算法,那些你不知道的事 1.算法,不止于刷题 提到算法,不管是科班出身还是半路出家的程序员可能都会说上几句,算法谁没学过谁不知道啊?对于走工业界路线而非学术路线的同学来说,算法学习的最大作用也许是找工作-- 毕竟工作后,绝大多数时候都用各种成熟的类库,少有自己实现高级数据结构和算法的时候.但刚结束一学期修的算法课,上得我还真跟没学过算法似的,让我大开眼界,虽然每次课上我都听的不是很懂,但每节都期盼着老师又能带来什么新奇的东西.一点点发现,原来竟然还有这么多很有用却从来没学习过甚至没听过的算法

Css3之基础-8 Css 浮动(定位,浮动定位)

一.CSS 定位概述 定位概述 - 定位: 定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置 - 普通流定位 - 浮动定位 - 相对定位 - 绝对定位 普通流定位 - 页面中的块级元素框从上到下一个接一个地排列 - 每一个块级元素都会出现在一个新行中(比如<p>元素.<div>元素) - 元素框之间的垂直距离是由框的垂直外边距计算出来的 - 内联元素将在一行中从左到右排列水平布置 - 不需要从新行开始 - 可以使用水平内边距.边框和外边