理解CSS中的浮动

浮动(float)是CSS中一个重要的定位及布局属性,float 属性可以接受以下几个值:

  • none :元素不浮动,默认值。
  • left :将元素浮动到容器左侧。
  • right:将元素浮动到容器右侧。
  • inherit:元素继承其父元素的浮动方向。

注意:浮动的元素会自动添加display: block

什么是浮动

要理解什么是浮动,可以参考传统的印刷设计。在传统印刷布局中,可以设置图片被文字环绕。如下所示:

传统印刷布局

在传统页面布局软件(例如MS Word)中,文本框可以设置是否要文字环绕。如果忽略文字环绕,图片会被认为脱离了文本流,这时文字会穿过图片,好像图片并不存在。

网页布局

在网页设计中,设置了浮动的元素就好像传统印刷布局中设置了文字环绕的图片。和绝对定位元素不同,浮动元素虽然脱离了正常的文档流,但并没有脱离文本流,意思是正常文档流中的块级元素会按照浮动元素不存在一样排列,但是文本并不会和浮动元素重叠。

与之相对,绝对定位元素完全脱离了页面的文档流和文本流,类似传统印刷中忽略文字环绕的情况。绝对定位的元素不会影响其他元素的位置也不会受其他元素的影响。下面是一个浮动前后对比的例子:

图 | 浮动前:

浮动前

图 | 浮动后:

浮动后

浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。

浮动布局

除了实现简单的文字环绕效果,浮动还能够用来做整个页面的布局,如下所示:

页面布局

除此之外,相对于绝对定位元素,使用浮动元素可以使布局更加灵活,例如下面这个使用浮动布局的名片,当照片尺寸发生变化时,右侧的文字会自适应重新布局,不影响整体显示效果:

浮动布局

然而如果使用绝对定位的照片,虽然初始的显示效果是相同的,但是当照片尺寸变化时,文字就可能被遮挡,显然这种布局的灵活性并不好,如下所示:

绝对定位布局

清除浮动

说到浮动就不能不提它的兄弟属性clearclear 属性指定:一个元素是紧挨着前面的浮动元素,还是必须移动到它们的下面。CSS属性既可以用于浮动元素,也可以用于非浮动元素。

当应用于非浮动元素时,它将元素的边框边界移动到所有相关浮动元素外边界的下方,这时候外边距塌陷不起作用。

当应用于浮动元素时,它将元素的外边界移动到所有相关浮动元素外边界的下方。这会影响后面浮动元素的布局,后面的浮动元素的位置无法高于它之前的元素。

图 | 清除浮动前

清除浮动前

上面这个例子中, sidebar浮动到了右侧,并且其长度小于正文容器。如果footer也设置了浮动,就可能出现如上图所示的情况。为了避免这种情况出现,需要用到清除浮动,使footer移动到所有浮动元素的下方。

图 | 清除浮动后

清除浮动后

这里为footer设置的是clear: bothclear属性有四个可能的参数,最常用的就是both,会清除两个方向的浮动。使用leftright可以清除相应方向上的浮动。none 是默认值,inherit表示该元素继承其父元素的clear属性的值。

容器的塌陷问题

使用浮动时遇到的一个很棘手的问题是浮动对容器的影响。如果容器内除了浮动元素外没有其他元素,那么它的高度就会塌陷为0。如果父元素背景透明的话,这种塌陷并不容易被觉察到,如下所示:

容器的塌陷

如果想避免容器的塌陷,可以将容器浮动(形成块级格式上下文),或者在浮动元素和容器尾部之间设置清除浮动,后者可以通过伪元素 :after实现:

#container:after {
 content: "";
 display: block;
 clear: both;
}

清除浮动的技巧

在一些复杂的情况下,需要一些特别的方法来清除浮动。

  • 使用空的DIV元素
    顾名思义,就是在需要清除浮动的位置放置一个空的div。
<div style="clear:both;"></div>
  • 设置overflow
    通过为父元素设置overflowautohidden可以使父元素将浮动元素包含在内,避免了浮动元素对之后元素的影响。这个方法的原理也是形成了块级格式上下文

  • 利用伪类:after
    利用伪类:after可以实现清除浮动的目的,只需要为容器添加一个类,如"clearfix",然后定义如下css样式:

.clearfix:after { 
    content: "";
    visibility: hidden;
    display: block;
    height: 0;
    clear: both
}

举个例子说明,例如以下一组色块:

图 | 清除浮动前

清除浮动前

如果想实现每一行一种颜色的效果,有两种策略:

  • 为每种颜色的四个色块外套一层div,然后为div设置 overflowautohidden,或像上面提到的利用伪类 :after

  • 在每种颜色的最后一个色块后面添加一个空的div,并为其设置 clear: both

最后的效果如下:

图 | 清除浮动后

清除浮动后

参考文献

[1] float
[2] clear
[3] CSS 浮动

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,703评论 1 92
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 927评论 0 2
  • CSS中的float属性简介 几乎所有会WEB前端开发的同学都知道CSS中有一个float属性用于实现HTML元素...
    欧阳大哥2013阅读 2,758评论 5 26
  • 浮动(float),一个利于布局又影响布局的属性,先看下w3c上的解释 A float is a box that...
    葱油浇蛋阅读 901评论 0 1
  • 摄于2017年2月19日,刚开学的时候,还记得在火车上认识了一个学姐,我搬着沉重的行李一步一步挪在火车车道里挪移,...
    乔帅阅读 444评论 0 1