1、float介绍css
float元素也称为浮动元素,设置了float属性的元素会根据属性值向左或向右浮动。浮动元素会从普通文档流中脱离,但浮动元素影响的不只是本身,它会影响周围的元素对齐进行环绕。简单来讲,就是让block元素无视float元素,让inline元素让流水同样围绕着float元素来实现浮动布局。 文字环绕图片是float典型的应用场景,以下所示:html
html代码布局
<img class="float" src="image/HC5450_15-IMS-zh_CN.jpg" /> <p class="around">华夏之大,有造物之工师,兼创器之良匠,留下传世之美。有些器物,不只仅须要玻璃罩的保护,更须要心手合一的把玩。摩挲盘桓,实为栖心之境。古而近雅,追求老器物毫不是一味的泥古,而是追求心里的安定,古物经历过期间,消除了火气,更显得雍穆沉静。不入古境,不解其情,若入古境,自得况味,这即是时间的艺术。</p>
css代码flex
.float{ float:left; width:100px; height: auto; margin: 10px; } .around{ width:300px; color:#fff; background: #009F95; padding: 10px; }
由上图能够看出,img元素设置了float:left以后会脱离文档流而居于左侧存在。而p元素无视img元素的存在,从窗口的左上角开始流入,可是p元素中的文字意识到img元素的存在而环绕图片流入。而且img元素是漂浮在p元素的上层。url
2、float元素特性spa
1.块级框code
无论一个元素是行内元素仍是块级元素,若是被设置了浮动,那浮动元素会生成一个块级框,能够设置它的width和height,所以float经常用于制做横向配列的菜单,能够设置大小而且横向排列。orm
(1)先来看一个块级元素的例子:htm
html代码对象
<div class="div1"> <img src="image/pic1.png" /> </div> <div class="div2"> <img src="image/pic2.png" /> </div>
css代码
.div1{ padding: 10px; border: 3px solid black; } .div2 { float: left; padding:10px; border: 3px solid red; }
默认状况下,div元素的宽是100%,一旦让该div浮动起来,马上会像inline元素同样产生包裹性,宽度会跟随内容自适应。
(2)接着看下行内元素的例子:
html代码
<div class="box"> <span class="menu">首页</span> <span class="menu">消息</span> <span class="menu">朋友</span> <span class="menu">个人</span> </div>
css代码
.box{ width: 500px; background: pink; height: 200px; } .menu{ width: 100px; float: left; margin: 10px; padding: 10px; background: #eee; text-align: center; }
由上图可见,当span设置float属性后,能够指定width,height值。 同时能够发现,当多个元素指定为float且同时为left/right时,元素是紧挨着排列,行内宽度不够时再换行排列。
2.高度崩塌
html代码
<div class="div1"> <img src="image/pic1.png" /> </div> <div class="div2"> <img src="image/pic2.png" /> </div>
css代码
.div1{ padding: 10px; border: 3px solid black; } .div2 { border: 3px solid red; } .div2 img{ float: left; padding:10px; }
将float属性设置给div2内部的img元素,能够看出div2的高度并无img元素被撑起来,所以又叫高度崩塌。
缘由:将img元素设置为浮动元素,因此脱离文档流。所以div2中认为没有元素,因此产生了高度崩塌。具体怎么解决高度崩塌,后面再介绍。
3、clear属性
clear属性的做用是清除浮动。
clear : none | left | right | both; none : 默认值。容许两边均可以有浮动对象 left : 不容许左边有浮动对象 right : 不容许右边有浮动对象 both : 不容许有浮动对象
html代码
<div class="bg1"></div> <div class="bg2"></div>
css代码
.bg1{ width:200px; height: 200px; border: 3px solid black; background: url(image/pic2.png); float: left; } .bg2{ width:500px; height: 300px; border: 3px solid red; background: url(image/pic1.png); }
如上图所示,因为bg1是浮动元素,因此bg2在bg1底层铺展。
若是想要让bg2换行排列,居于bg1底端下方(以下图),这个时候就要用到clear属性了。
css代码中,只须要在bg2中加入 clear:left 便可
.bg1{ width:200px; height: 200px; border: 3px solid black; background: url(image/pic2.png); float: left; } .bg2{ width:500px; height: 300px; border: 3px solid red; background: url(image/pic1.png); clear: left; }
对于CSS的清除浮动(clear),必定要牢记:这个规则只能影响使用清除的元素自己,不能影响其余元素。
以上图例子说明。bg1和bg2都设置了float:left。若是在bg1样式中添加样式clear:right,来迫使bg2下移,则没有任何效果。由于这个清除浮动是在bg1中调用的,她只能影响bg1,不能影响到bg2。
要想要bg2下移,就必须在bg2的样式中使用浮动 clear:left。用来指定bg2元素左边不容许出现浮动元素。
4、BFC
1.BFC的介绍
定义:
一些元素,如float元素,如position为absolute,block为inline-block,table-cell或table-caption的元素,以及overflow属性不为visible的元素,它们将会创建一个新的块级格式化上下文(Block Formatting Context),也就是咱们所说的BFC。
造成
BFC也是HTML中的一个盒子(看不见而已),只有知足至少下列条件之一才能造成BFC:
① float属性不为none.
② position属性不为static和relative.
③ display属性为下列之一:table-cell,table-caption,inline-block, flex,inline-flex.
④ overflow属性不为visible.
布局规则
① 内部的Box会在垂直方向,一个接一个地放置。
② Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
③ BFC的区域不会与float box重叠。
④ BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。
⑤ 计算BFC的高度时,浮动元素也参与计算。
二、BFC的做用
(1)容纳浮动元素
就是解决上面遇到的高度崩塌问题。
只须要将div2的css代码改动一下,增长一个BFC来容纳浮动元素。
.div1{ padding: 10px; border: 3px solid black; } .div2 { overflow:hidden; border: 3px solid red; } .div2 img{ float: left; padding:10px; }
除此以外,解决高度崩塌问题,还有以下解决方法:
增长一个清除浮动的子元素
html代码
<div class="div1"> <img src="image/pic1.png" /> </div> <div class="div2"> <img src="image/pic2.png" /> <div style="clear:both"></div> </div>
(2)阻止文本换行
大多数状况(若没有特殊设置),如Figure1,文本将会环绕浮动元素,但有时候这并非咱们指望的。咱们期待的是Figure2如图:
想达到图二的效果,只须要将右边文字区域变成一个BFC便可。
css代码以下:
.float{ float:left; width:100px; height: auto; margin: 10px; } .around{ width:300px; color:#fff; background: #009F95; padding: 10px; overflow: hidden; }
(3)消除Margin Collapse (外边距坍塌)
在正常状况下,在一个容器内的全部box将会由上至下依次垂直排列,即咱们所说的一个元素占一行,并切垂直相邻的距离(即margin)是由各自的margin决定的,而不是两个margin的叠加。
让咱们看一个例子:
HTML代码:
<div class="container"> <p>list 1</p> <p>list 2</p> <p>list 3</p> </div>
css代码:
.container { width: 300px; background-color: black; overflow: hidden; } p { background-color: white; margin: 20px 0; text-align: center; }
理想状况下,咱们会认为p标签之间的margin应该是它们的和(20px*2=40px),但实际上倒是20px.这实际上是collapsing margins(外边距坍塌)。其中flex布局不存在collapsing margins,水平方向上也不存在collapsing margins。
利用BFC能消除collapsing margins。紧记只有当元素在同一个BFC中时,垂直方向上的margin才会clollpase。若是它们属于不一样的BFC,则不会有margin collapse。所以咱们能够再创建一个BFC去阻止margin collpase的发生。
因此为了让他们的margins变成40px,咱们只须要用div,创建一个BFC,令p元素处于不一样BFC便可。
html代码:
<div class="container"> <p>list 1</p> <p>list 2</p> <div class="newBFC"> <p>list 3</p> </div> </div>
css代码:
.container { width: 300px; background-color: black; overflow: hidden; } p { background-color: white; margin: 20px 0; text-align: center; } .newBFC { overflow: hidden; }