有关浮动

什么是浮动(float)?

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

浮动有三个属性:

float:left;
float:right
float:none

浮动的特性:

  1. 使元素脱离文档流。
  2. 提升层级半级(只覆盖主体不覆盖内容)。
  3. 会使不支持宽高的元素支持宽高。
  4. 如果没有设置宽度,浮动元素由内容去撑开宽度。
  5. 浮动元素什么时候停止。
  • 遇到父级元素的边框的时候会停止。
  • 遇到相同的浮动元素时会停止。

由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

什么是文档流?

摘自百度百科:
文档流是文档中可显示对象在排列时所占用的位置。比如网页的<div>它默认占用的宽度位置是一整行,<p>标签默认占用宽度也是一整行,因为<div>标签和<p>标签是块状对象。网页中大部分对象默认是占用文档流,也有一些对象是不占文档流的,比如表单中隐藏域。

浮动的使用

在最开始,设计浮动的效果并不是为了什么高大上的布局,仅仅是想解决文字环绕显示的问题。文字环绕就像是浮动的"本职工作"一样。但是,通过“审查元素”各大网站的主页我们可以发现,浮动这个属性目前已经大量的进行使用。

例如,将元素设置浮动了之后,inline元素就可支持宽高,感觉就像是一个自带定位属性的inline-block。通过对 IE 浏览器兼容性的学习笔者还发现,给元素设置浮动之后,给元素多设置一个属性display:inline还可以解决浮动的某些对低版本浏览器的兼容性问题(当然对于目前的前端开发来说已经很少去考虑对低版本浏览器的兼容了)。同时,浮动可以让 <li>这类block水平排列。浮动可以无需计算margin就可以很轻松让元素直接置于父元素的最右边。或者是在页面总体框架的布局上也可以使用浮动。

浮动的大量使用会产生很多相对应的影响,例如说我们给一个块元素中书写一个,内联元素,如果没给父元素设置宽高,正常情况下父元素是由子集元素去撑开它的高度,如果给子集元素设置浮动。就会造成父级元素的坍塌。毕竟,儿子已经上天了,老子由谁去撑起来呢?附上代码,有兴趣的同学可以试试,把注释去掉做一下对比。

HTML

<div class="father">
  <div class="child"></div>
</div>

CSS

.father{
  border:5px solid #000;
  background: pink;
}
.child{
  width: 300px;
  height: 300px;
  background: red;

  /*float: left;*/
}

浮动元素除了具有包容性,还具有破坏性,以为浮动使元素脱离了文档流,会使浮动元素不占据空间,造成了父元素的坍塌。或者影响其他的布局。当然有可能还会造成其他的影响。这里就要引入清除浮动。

注意:

在说清除浮动之前,先说一些使用浮动需要注意的事情。

  • 浮动元素不会超出父元素的content
  • 如果要同时对多个元素设置浮动,如果元素高度不一致,容易出现“卡住”的情况。
  • 同时设置多个元素向左或向右浮动,浮动顺序会依次显示,根据浮动的特性:
    left:1、2、3、4、...
    right:4、3、2、1、...
  • 浮动元素最好尽可能高的放置。
  • 内联元素与一个浮动元素重叠时,其边框、背景和内容都在该浮动元素“之上”显示。因为内联元素的宽高以及背景颜色都与内容大小有关,浮动元素无法浮动在内容之上。换句话说就是浮动元素无法浮在内联元素上,内联元素会被往左(或右)挤出去(内联块元素也一样)。

清除浮动

重点来了,在这强调一下,清除浮动很重要,很重要,很重要,重要的事情说三遍。作为一个前端开发者,浮动属性是使用最频繁的属性之一,而消除浮动所造成的影响,就必须将几种方法了然于胸。总结于下:

方法一:添加新的元素、应用clear

先说一下clear属性:

元素的某一侧不允许出现浮动元素。

可能的值

描述
left 在左侧不允许浮动元素。
right 在右侧不允许浮动元素。
both 在左右两侧均不允许浮动元素。
none 默认值。允许浮动元素出现在两侧。
inherit 规定应该从父元素继承 clear 属性的值。

遇到父元素高度的坍塌,可以在浮动元素后再添加一个新的元素,然后赋予它一个属性claer:both,这样就可以解决问题。但是注意,一定要新建一个元素,不能在浮动元素中添加clear属性。该属性只对元素周围的浮动元素造成影响,是不会消除自身的浮动的。

但是这样会添加无用的标签,使的 HTML 中会新增更多冗余代码。

方法二:伪元素

这是一个清除浮动相对比较好的方法之一,可以减少使用无意义的标签,使代码更加简洁。给予浮动元素添加一个伪元素:after。利用这个伪元素来清除浮动。不过这里要注意一点伪元素默认生成的代码是行内元素,而clear的对象必须是块级元素,否则不起作用,所以要设置display属性。代码如下:

.clearfix:after{
   content: " ";
   display: block;
   clear: both;
}

大部分情况下,比较推荐使用该方法去清除浮动。这也是在各大网站中最普遍的清除浮动的方法。

另外,在伪元素中设置display属性为table,也是一种比较推荐的方法。

方法三:overflow

惯例,先补一下overflow属性:

overflow 属性规定当内容溢出元素框时发生的事情。

可能的值

描述
visible 默认值。内容不会被修剪,会呈现在元素框之外。
hidden 内容会被修剪,并且其余内容是不可见的。
scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
inherit 规定应该从父元素继承 overflow 属性的值。

给浮动元素的父元素添加overflow:hidden可以清除浮动。

方法四:父容器设置浮动

儿子飘了,那老子也一起飘,那大家都一起飘,当然可以解除浮动带来的影响了。但是问题来了。儿子飘了是小事,怎么飘也飘不出五指山的范围,五指山飘了,那问题就大条了。会给之后的元素造成影响。而且这个也没有根本上解决浮动问题,所以极度不推荐该方法。

方法五:给父容器设置宽高

让父集自己撑起来,不需要子集元素去撑起父容器,这样就不会造成坍塌,但是也许会对布局带来不便,所以也不是特别推荐该方法。

方法六:给父级元素设置display:inlene-block

给父容器设置display:inline-block之后,容器就可以形成 BFC ,这样就会有独立的渲染空间,所以就算偶遇浮动元素也会把容器撑开。

BFC

简单科普一下什么是 BFC :

BFC ( Block formatting context ) 直译为"块级格式化上下文"。它是一个独立的渲染区域,只有 Block-level box 参与, 它规定了内部的 Block-level Box 如何布局,并且与这个区域外部毫不相干。

BFC 布局规则:

  • 内部的 Box 会在垂直方向,一个接一个地放置。
  • Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的margin会发生重叠。
  • 每个元素的 margin box 的左边, 与包含块 border box 的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC 的区域不会与 float box 重叠。
  • BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算 BFC 的高度时,浮动元素也参与计算。

触发 BFC 的条件:

属性
根元素
float 不为none
overflow 不为visible
display table-cell table-caption inline-block inline-flex flex
position absolute fixed

写在最后

笔者只是刚刚走上前端开发的初学者,目前还在学习中,最近正在学习 HTML+CSS 基础,学习过浮动之后就萌生了想将各项知识点总结一番的冲动。如有什么地方有遗漏或者有误,望指出。谢谢。

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 1.浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 浮动元素不在文档的普通流中,它可以...
    饥人谷_Young丶K阅读 420评论 0 0
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 929评论 0 2
  • 一,浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 浮动模型是一种可视化格式模型,浮动...
    DeeJay_Y阅读 856评论 0 4
  • 文章版权归饥人谷_Lyndon以及饥人谷所有。 1. 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分...
    HungerLyndon阅读 2,368评论 4 10