CSS 浮动的作用以及高度塌陷的解决方案BFC

  前言

  浮动属性是css样式中非常重要的属性,网页的导航条和左右导航栏等都靠浮动属性来完成。浮动属性不仅能让文字拥有环绕效果,同时,其浮动特性在一些布局中还起到了至关重要的作用。

  一、float浮动是什么?

  浮动是什么?

  在正常div布局中,每个div块元素都占据完整的一行,因此下一个div元素会出现在上一个div元素的下一行,整个布局是由上到下依次排列的。

  浮动则打破了这样的排布。浮动属性会让本该从上到下排列的元素漂浮在更上一层,像气球一样浮在靠左或靠右的位置。

  


  二、浮动属性的使用

  1.使用方法

  在样式中加入float属性,其中值为left为向左浮动,值为right为向右浮动,值为none为不浮动,其中none为缺省值。

扫描二维码关注公众号,回复: 12853379 查看本文章

  


  我是box1

  我是box2

  我是box3

  2.特点

  ① 块元素变为行内元素

  


  图中box1、box3向左浮动,box2向右浮动。box3虽然在box2之后展示,但box3的位置明显和box2在同一行且浮动方向未受顺序影响。div块元素本独占一行,浮动属性的特点使其变为行内元素。

  ③ 使行内元素拥有宽度和高度

  


  这是三个行内元素,在有宽高定义的情况下,其宽高由内容决定,而非宽高定义决定。

  .box1 {

  display: inline;

  width: 100px;

  height: 100px;

  background-color: #bdf;

  /* float: left; */

  }

  .box2 {

  display: inline;

  width: 90px;

  height: 90px;

  background-color: orange;

  /* float: left; */

  }

  .box3 {

  display: inline;

  width: 80px;

  height: 80px;

  background-color: green;

  /* float: left; */

  增添浮动样式后其仍为行内元素,并且拥有了宽度与高度。(浮动属性在不设置宽高时仍由内容撑开)

  


  ③ 脱离文档流

  


  这是一个父元素一个子元素,其中父元素未设置高度,被子元素撑起。

  将子元素增加浮动属性后。

  


  可以很明显地发现子元素跳出了父元素范围,没有撑起父元素。浮动属性会使元素脱离文档流,引起父元素的高度塌陷。

  三、高度塌陷的解决方案——BFC

  子元素脱离父元素文档流会导致父元素高度塌陷,这对页面布局带来了非常严重的影响。而BFC(Block formatting context)则有效解决了高度塌陷问题。

  元素开启BFC后,将会有以下特征:

  父元素的垂直外边距不会和子元素重叠

  开启BFC的元素不会被浮动元素覆盖

  开启BFC的元素可以包含浮动的子元素

  1. 开启BFC方式

  ① 元素设置浮动属性(不建议)

  


  .outer {

  border: orange solid 10px;

  float: left;

  /*在这里设置了浮动属性*/

  }

  .inner {

  width: 90px;

  height: 90px;

  background-color: #bdf;

  float: left;

  缺点:新增加float元素,会有新的浮动问题。且父元素div块元素独占一行的性质消失,可能会使父元素后的元素上移,无法从根本解决问题。

  ② 父元素设置宽高(不建议)

  


  .outer {

  width: 100px;

  height: 100px;

  /*设置固定高度100px,宽度100px*/

  border: orange solid 10px;

  }

  .inner {

  width: 90px;

  height: 90px;

  background-color: #bdf;

  float: left;

  缺点:父元素有固定宽高后失去高度自适应功能,不够灵活。

  ③ 在子元素后增加空div

  


  优点:容器溢出不会被裁剪,支持所有浏览器。

  缺点:有空div,增加代码冗余。

  ④ 元素overflow设置为hidden或其他非visible值

  


  .outer {

  overflow: hidden;

  /*溢出裁剪,IE6及以下用auto*/

  border: orange solid 10px;

  }

  .inner {

  width: 90px;

  height: 90px;

  background-color: #bdf;

  float: left;

  }

  优点:简单。

  缺点:不能和position定位配合使用,超出的尺寸会被裁剪。

  ⑤ 元素display设置为inline-block(不建议)

  


  .outer {

  display: inline-block;

  border: orange solid 10px;

  }

  .inner {

  width: 90px;

  height: 90px;

  background-color: #bdf;

  float: left;

  }

  缺点:父元素div块元素独占一行的性质消失,可能会使父元素后的元素上移,无法从根本解决问题。

  ⑥ 父元素后加伪元素(建议)

  大连妇科医院 http://xmobile.bhbyby.com/


  .outer {

  display: inline-block;

  border: orange solid 10px;

  }

  .outer:after{

  content: "";

  height: 0;

  overflow: hidden;

  /*兼容IE浏览器*/

  clear: both;

  /*消除左右浮动影响*/

  display: block;

  /*本为行内元素,转变为块元素撑起父元素*/

  visibility: hidden;

  }

  .inner {

  width: 90px;

  height: 90px;

  background-color: #bdf;

  float: left;

  }

  优点:简单且无代码冗余。

  ⑦ 元素position设置为absolute

  


  .outer {

  position: absolute;

  /*或fixed*/

  border: orange solid 10px;

  }

  .inner {

  width: 90px;

  height: 90px;

  background-color: #bdf;

  float: left;

  }

  缺点:父元素div块元素独占一行的性质消失,可能会使父元素后的元素上移,无法从根本解决问题。且此父元素的父元素可能会受到其绝对定位的影响。

猜你喜欢

转载自blog.51cto.com/14503791/2668460