Go to comments

清除浮动的七种方法

浮动的定义,

使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻的浮动元素停下来。


浮动(float)的特征(前三个特征跟 inline-block 一样)

1. 在一排显示

2. 支持宽高

3. 默认内容撑开宽度

4. 脱离文档流

5. 提升层级半层(不知道"半层"是什么意思)


示例,浮动的图文环绕效果

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文字环绕</title>
<style>
  div{
    width:250px;
  }
  img{
    width:120px;
    float:left;/* 浮动也上可以做到图文环绕,要想让文字跟图片在同一行显示,图片加上 float:left */
  }
  p{
    text-align:justify;
    font: 16px/1.5 "Microsoft Yahei";
  }
</style>
</head>
<body>

<div>
  <img src="http://www.ruyic.com/blog/uploads/image/201904/155591911913470.png"/>
  <p>原标题:神奇大片《东方风来》带你感受“奇妙进博会”新时代,全球共享未来。从何时起,这个熟悉的星球忽然变得陌生?</p>
</div>

</body>
</html>


相关样式

float:left; right | none | inherit

clear:left; right | both | inherit

clear:both; 在左右两侧不允许浮动元素,

任何的版本的 Internet Explorer(包括IE8)都不支持属性值 inherit


清除浮动的七种方法

浮动有一定的破坏性,浮动的特征中有一条是脱离文档流

1. 子元素.item 与他的父级 .box,没在一个文档流上了,层级就不一样了

2. 父级 .box 元素没有设置高度,他的高度应该由他的内容撑开

3. 一但内容与他的父级不在同一层的时候,父级就包不住了,就影响布局了,所有要清除浮动

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>浮动</title>
<style>
  .box{
    border:1px solid orange;
  }
  .item{
    height:150px;
    width:150px;
    background:yellow;
    float:left; /* 浮动 */
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
  </div>
</body>
</html>


1、加高度(问题扩展不好)

目的就是让父级包住子级,问题是扩展不好,如果项目是一个高度不固定,比如瀑布流,那么加高就不行了,扩展性不好

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>加高度</title>
<style>
  .box{
    border:1px solid orange;
    height:150px;
  }
  .item{
    height:150px;
    width:150px;
    background:yellow;
    float:left;
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
  </div>
</body>
</html>


2、给父级加浮动

这个方法的问题

1. 给每个父级都要加浮动,.box 的父级是 body,body 的父级是 html,给这些标签加浮动不合适

2. 页面中所有的元素都加浮动,margin 左右自动 auto 失效(float bad!)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>给父级加浮动</title>
<style>
  .box{
    border:1px solid orange;
    /*
    width:150px;
    margin:0 auto; 浮动影响影响居中
    */
    float:left;
  }
  .item{
    height:150px;
    width:150px;
    background:yellow;
    float:left; 
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
  </div>
</body>
</html>


3、inline-block 清除浮动方法

设置父级 display 属性为行块盒 inline-block,虽然也可以清除浮动,问题是导致 margin 左右 auto 失效不能居中显示

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>inline-block 清除浮动方法</title>
<style>
  .box{
    border:1px solid orange;
    display:inline-block; /* 清除浮动 */
    width: 160px;
    /* margin: 0 auto; 不能居中显示 */
  }
  .item{
    height:150px;
    width:150px;
    background:yellow;
    float:left;
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
  </div>
</body>
</html>


4、空标签清除浮动

这个方法的问题

1. 每一个需要清楚浮动得地方都需要放一个空标签

2. IE6 最小高度19px( 解决浮动后,ie6 下还有 2px 偏差 )

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>空标签清除浮动</title>
<style>
  .box{
    border:1px solid orange;
  }
  .item{
    height:150px;
    width:150px;
    background:yellow;
    float:left;
  }
  .clearfix{
    clear:both;
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
    <div class="clearfix"><!-- 清除浮动用的空标签 --></div>
  </div>
</body>
</html>


5、<br> 清除浮动

<br>标签下有一个clera属性  <br clera="all"> 

问题与空标签一样,只要有浮动的地方就要增加一个 <br clera="all"> 标签,不符合工作中,结构、样式、行为,三者分离的要求

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>br清除浮动</title>
<style>
  .box{
    border:1px solid orange;
  }
  .item{
    height:150px;
    width:150px;
    background:yellow;
    float:left;
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
    <br clear="all" />
  </div>
</body>
</html>


6、after伪类清浮动方法(主流方法)

 :after  伪类清除浮动方法(现在主流方法)

after 伪类,IE6~7下不兼容  :after{ } 

zoom 缩放,触发 IE下haslayout,使元素根据自身内容算计宽高,FF 不支持

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>after伪类清除浮动</title>
<style>
  .clearfix{
    *zoom:1; /* 兼容低版本IE */
  }
  .clearfix:after{
    content:"";
    display:block; /* br标签清除浮动都是块元素,这里也转成块 */
    clear:both;
  }
  .box{
    border:1px solid red;
  }
  .item{
    width:150px;
    height:150px;
    background:yellow;
    margin-right:20px;
    float:left;
  }
</style>
</head>
<body>
  <div class="box clearfix">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
  </div>
</body>
</html>


7、overflow: hidden 方法清除浮动

BFC意思是,块级元素格式上下文,

只要触发的 BFC/haslayout 这个区域就是独立的区域不受外界影响,

知道那些属性可以触发 BFC 或 haslayout,我们就可以解决很多问题。


BFC(block formatting context)标准浏览器下(IE6~7不算标准浏览器,IE8半标准浏览器), 在哪些情况下可以触发 BFC?
1. float 的值不为 none
2. overflow 的值不为 visible
3. display 的值为 table-cell, table-caption, inline-block 中任何一个
4. position 的值不为 relative 和 static
5. width | height | min-width | min-height:(!auto)

他们的值不是 aotu 的时候,haslayout IE浏览器
1. writing-mode:tb-rl
2. -ms-writing-mode:tb-rl
3. zoom:(!mormal)
    Ps:zoom的值,不是为正常就能触发 haslayout

voerflow: hidden  voerflow 是溢出都意思,他不仅清除能浮动也能触发BFC,很多地方能用到他(需要配合宽度,或者zoom属性兼容IE6 IE7)
overflow: scroll | auto | hidden
voerflow: hidden; 溢出隐藏(裁刀)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>overflow:hidden 清除浮动</title>
<style>
  .box{
    border:1px solid red;
    overflow:hidden;
    /* 给父级加上 */
  }
  .item{
    width:150px;
    height:150px;
    background:yellow;
    margin-right:20px;
    float:left;
  }
</style>
</head>
<body>
  <div class="box">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
</body>
</html>



Leave a comment 0 Comments.

Leave a Reply

换一张