CSS浮动

浮动简介

基本概念

标准流:是元素排列的默认状态,块级元素从上到下排列,行内元素从左到右排列。

块元素:元素独占一行,默认宽度为父元素的100%,可以设置宽度和高度。

行内元素:元素在一行内排列直到排满了自动换行,不可以设置宽高,宽高由内容决定。

inline-block:在一行内显示并且可以设置宽高。

浮动是什么

浮动会使得元素脱离标准流,向左或向右”漂浮“起来,直到遇到父元素的边框或者一个浮动着的元素的边框为止。

脱离标准流的浮动元素怎么排列

它不再按照默认的状态排列,会向左或向右靠,直到找到父元素的边框或正在浮动的元素的边框。


浮动之前的排列


三个盒子都向左浮动的排列

可以看出,没有浮动之前,块元素在标准流中是独占一行从上往下排列的。而浮动之后,块元素就“漂浮”起来,直到找到父元素的边框或浮动着的元素的边框,就不再往左(右)靠。box1找到了父元素的边框,box2找到了正在浮动的box1边框,box3找到了box2的边框。

浮动会带来什么影响

浮动元素脱离标准流之后,排在它后面的元素不知道它的存在,所以在标准流中的普通元素会占据它的位置,发生重合。同理,包含它的父元素如果高度是自适应的(没有设置高度,由内容撑开),由于检测不到它,所以没有它的高度,会出现高度塌陷的现象。


元素重合

这里给box1添加的float:left的样式,box2和box3没有浮动。可以看到,灰色的box2不见了,是因为box1浮动后脱离了标准流,box2和box3仍在标准流中正常排列,它们看不到box1的存在,所以就占据了它的位置。


父元素高度塌陷

这里给box1,box2,box3都设置了左浮动,并取消了父元素的高度设置。浮动元素脱离标准流之后,包含它的父元素也看不到它了,当父元素的高度有里面的内容撑开时,父元素无法获得浮动元素的高度,就会出现高度塌陷,若父元素内所有元素都浮动起来,父元素就没有高度了。

那浮动有什么用

细心观察元素重合时的现象会发现,盒子里的文字并没有被浮动起来的元素挡住,如下图。

文字没有和浮动元素重合

利用这一特性,我们可以让文字环绕着它。

实际上浮动一开始是用来做文字环绕图片的,当我们给图片设置浮动,图片会脱离标准流,周围的文字就会挤向它,就围绕着图片排列了。为什么文字不会像其他元素一样占据它的位置发重合呢?浮动设计出来就是为了让文字环绕它而别的元素不能环绕它,浮动元素仍然会占据文本空间,因此文本元素可以检测到它,其他元素检测不到它。


浮动可以使元素具有inline-block的特性,使得块级元素可以在一行内排列,所以也会用来做布局。

怎么解决浮动带来的影响

首先我们要知道浮动元素会使得后面的元素挤向它,之前的不受影响。所以要在影响后面元素的浮动元素清除浮动,让后面的元素可以检测到它,不占据它的位置。还有,让父元素也可以检测到它,把它的高度值包含在内。这样,浮动既达到了目的又不影响后面的元素,皆大欢喜。

清除浮动

清除浮动之前,了解一下清除浮动的语法

clear:left

左侧抗浮动,只对自身元素有影响,清除元素左边的浮动。注意:不是让它不浮动,是让它的左边不允许有浮动元素。

还有right,both,none都同理就不一一说了。


清除浮动之前

此时,三个元素都设置了左浮动,box1贴着父元素的边框,box2贴着浮动元素box1的边框,box3贴着浮动元素box2的边框。


清除box1的左浮动

在box1的样式中清除左浮动后,由于它左边框没有任何浮动元素,所以不起作用。


清除了box2的左浮动

在box2的样式中清除左浮动后,由于box2左边框是具有浮动属性(不为none)的元素box1,box2不再允许左边有这样的元素,所以它会另起一行显示。


清除了box3的左浮动

box3同理。

清除浮动之后带来的好处

从上面的例子可以看出,元素清除浮动后,不允许左边或右边有浮动元素的存在,所以它不会越过浮动元素的边框,占据浮动元素的位置,就不会发生重合了。clear清除浮动的目的已经达到了,它只是让自己的左边或右边没有浮动的元素。但我们会发现,父元素仍然是高度塌陷的,清除浮动之后父元素仍然无法检测到它的高度。因为clear仅仅是让它自身的左边或右边不存在浮动元素而已。那我们怎么让父元素把浮动起来的元素包含在内容中撑起父元素的高度呢?

如何解决父元素的高度塌陷问题

让浮动的元素继续浮动而不去清除最后一个浮动让它掉下来被父元素发现然后包含进去。这时我们就需要有其他元素充当这个角色(被父元素检测到包含进去计算高度)

具体做法

1.在父元素末尾添加一个空的块级元素,也就是浮动元素的兄弟元素,父元素就知道里面有内容了,会给这个空元素留位置。实际上这个空元素的高度是零呀,父元素即使要给它留位置也只能留0个单位值,相当于没有。那这个空元素有什么作用呢?给空元素添加清除浮动试试。


空元素清除浮动后

现在,父元素检测到高度了。这是因为,空元素就和我们上面清除的浮动一样,它不允许左边或右边存在浮动元素,因此它会另起一行显示,如果它有高度或内容的话,就会像下面一样,设置了黑色的背景颜色以及2px的高度。我们当然不希望它显示出来,所以它的内容是空的也没有任何样式,只是帮我们清除浮动而已。这时候,父元素就可以知道内容的高度了,这样,父元素的高度就被撑起来了。


空元素的位置

2.使用css3的after伪元素清除浮动(该伪元素是在元素内容最末尾默认嵌套的一个元素),原理和第一种方法相同。

其中,要在伪元素添加内容设置的样式才生效。设置高度是因为设置的内容会撑开一定的高度,父元素会包含这个高度。把内容设置成不可见的否则影响美观。设置成块元素因为要把父元素的所有内容包含进去,这样才会有高度,否则行内元素无法包含浮动元素,父元素就不能计算实际内容的高度了。准备工作做好之后,就可以像第一种方法那样清除浮动了。


样式代码展示


把样式应用到塌陷的父元素中

把样式单独声明出来而不直接在父元素内设置样式是因为也许整个页面还有多处需要解决高塌陷的问题,到时候直接添加类属性就可以了。

3.在包含浮动元素的父元素中添加overflow属性隐藏(只要不是visible)起来。

严格来说它并没有清除浮动,而是触发了块格式化上下文(BFC),简单来说这里BFC会创建一个隔离的区域,把浮动的子元素也包含进去,不会受外界的影响同时也不会影响外界。所以父元素得到了浮动元素的高度,就不会出现高度塌陷的问题。但是,如果父元素所包含的元素中,有不浮动的普通元素,它仍然会挤向正在浮动的元素并且发生重合。这就可以看出来,BFC并没有清除浮动。实际上元素重合和父元素塌陷是两个问题所在。

这里做个小结

以上的三种方法中,方法一和方法二实际上原理相同,都是在父元素的最后一个元素清除浮动,这个元素告知父元素里面还有内容需要显示相应的高度,至于高度是多少是由清除浮动元素的最后占位决定。方法三是让父元素包含浮动元素,从而把浮动元素及其它元素的高度计算进去,并没有去清除浮动。

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

推荐阅读更多精彩内容

  • 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 特征: 浮动元素会脱离正常的文档流,元...
    饥人谷_哈噜噜阅读 868评论 0 0
  • 文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流就是浏览器在页面上摆放HTML元素所用的方法。浏览器从...
    coolheadedY阅读 561评论 0 0
  • 这几天有空,学习了CSS浮动和定位,和大家分享几个问题,希望对学习CSS浮动和定位的同学有所帮助。 一、文档流的概...
    betterwlf阅读 10,026评论 13 45
  • 文章版权归饥人谷_Lyndon以及饥人谷所有。 1. 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分...
    HungerLyndon阅读 2,376评论 4 10
  • 1.浮动 浮动元素的特征: 浮动元素的框可以向左或者向右移动,直到它的外边缘碰到父元素包含框或者另一个浮动元素的边...
    好奇男孩阅读 258评论 0 1