CSS-浮动【看这一篇就够了】

22 篇文章 1 订阅
7 篇文章 0 订阅

目录

浮动布局

浮动是如何工作的

浮动的本质和要点

如何产生浮动

元素浮动的特性

1.元素添加浮动后,脱离文档流

2.如果父元素的宽度不够

3.浮动的顺序贴靠特性

4.元素浮动后,具有行内块级元素特性

5.浮动的元素会造成父元素高度塌陷

6.浮动对文字的影响

使用浮动实现网页布局

BFC规范 和 浏览器差异

创建BFC

BFC的其他作用

清除浮动

1.清除浮动方法1

2.清除浮动方法2

3.清除浮动方法3

4.清除浮动方法4

浮动布局

1.三列式布局,中间自适应

2.多行多列式布局

浮动布局

浮动是如何工作的

  • 把一个元素“浮动”起来,会改变该元素本身和正常布局流中跟随它的其他元素的行为
  • 这一元素会浮动到左侧右侧,并且从正常布局流中移除,这时候其他的周围内容就会在这个被设置浮动的元素周围环绕

简单理解:

当元素添加了浮动后,元素就会脱离文档流,按照指定方向(左右)发生移动,遇到父级边界或者相邻的浮动元素就会停下来,同时会影响到他后面元素的排版行为

  • 文档流:文档中可显示对象在排列时所占用的位置/空间(在页面中占位置)
  • 脱离文档流:元素相当于漂浮起来,不占据页面的位置

浮动的本质和要点

  • 浮动的本质功能:用来实现并排
  • 浮动使用要点:要浮动,并排的盒子都要设置浮动
  • 父盒子要有足够的宽度,否子盒子会掉下去
<style>
  .box {
    width: 600px;
    height: 200px;
    border: 1px solid #000;
  }

  /* 
        要点:要浮动,都浮动
        父盒子要有足够的宽度,否则子盒子会掉下去
    */
  .box .c1 {
    width: 200px;
    height: 200px;
    background-color: skyblue;
    float: left;
  }

  .box .c2 {
    width: 200px;
    height: 200px;
    background-color: gold;
    float: left;
  }

  .box .c3 {
    width: 200px;
    height: 200px;
    background-color: pink;
    float: left;
  }
</style>

<body>
  <h1>浮动</h1>

  <div class="box">
    <div class="c1">float: left;</div>
    <div class="c2">float: left;</div>
    <div class="c3">float: left;</div>
  </div>
</body>

效果:

如何产生浮动

给需要浮动的元素添加“float”属性,“float”属性对应的值如下:

描述
none默认值,元素不浮动
left元素向左浮动
right元素向右浮动
inherit规定从父元素继承float属性值(一般不用,了解即可)

元素浮动的特性

浮动共有七大特性

1.元素添加浮动后,脱离文档流

同时会影响其后面的元素,但不影响它前面的元素

<style>
  .box {
    width: 300px;
    height: 200px;
    border: 2px solid red;
  }
  .box1 {
    width: 100px;
    height: 50px;
    background-color: khaki;
  }
  .box2 {
    width: 200px;
    height: 50px;
    background-color: rgb(133, 206, 235, 0.5);
    /* 给元素添加左浮动 */
    /* float: left; */
  }
  .box3 {
    width: 100px;
    height: 100px;
    background-color: pink;
  }
</style>
<div class="box">
  <div class="box1">1</div>
  <div class="box2">2</div>
  <div class="box3">3</div>
</div>
正常布局流box2(蓝色盒子浮动后的效果)
正常布局流中,块级元素默认从上往下

蓝色div加了浮动后,相当于漂浮起来,不占据页面空间,这时候蓝色盒子后面的粉色盒子的位置就会发生改变,移动到上面来,就出现如图,蓝色的盒子相当于漂浮在红色盒子上面。

但黄色盒子不受任何影响

(如果大家明白word文档里的“图片漂浮在文字下方”这个功能就好理解很多)

2.如果父元素的宽度不够

子元素在放不下的情况下会换行显示

<style type="text/css">
  .main {
    width: 240px;
    height: 150px;
    background-color: khaki;
  }
  .box {
    width: 50px;
    height: 50px;
    background-color: skyblue;
    margin: 10px;
    float: left;
  }
</style>
<body>
  <div class="main">
    <div class="box">框1</div>
    <div class="box">框2</div>
    <div class="box">框3</div>
    <div class="box">框4</div>
  </div>
</body>

效果:

3.浮动的顺序贴靠特性

子盒子会按照顺序进行贴靠,如果没有足够空间,则会寻找在前一个兄弟元素

	<style>
		.box {
		  width: 300px;
		  height: 200px;
		  border: 1px solid #000;
		}
	  
		/* 
			  浮动的顺序贴靠特性:
	  
			  子盒子会按顺序进行贴靠,
			  如果没有足够空间,则会寻找在前一个兄弟元素
		  */
		.box .c1 {
		  width: 200px;
		  height: 100px;
		  background-color: orange;
		  float: left;
		}
	  
		.box .c2 {
		  width: 100px;
		  height: 50px;
		  background-color: skyblue;
		  float: left;
		}
	  
		.box .c3 {
		  width: 50px;
		  height: 50px;
		  background-color: tomato;
		  float: left;
		}
	  </style>
	  
	  <body>
		<h1>浮动的顺序贴靠特性</h1>
	  
		<div class="box">
		  <div class="c1"></div>
		  <div class="c2"></div>
		  <div class="c3"></div>
		</div>
	  </body>

具体表现:

c3盒子贴靠c2盒子,但是c2盒子后面已经没有空间,因此c3盒子往前寻找float盒子,找到c1盒子,c1盒子后面还有空间,于是贴靠在c1后面。

但如果所有前方盒子的后方都没有空间,则重起一行摆放

效果:

4.元素浮动后,具有行内块级元素特性

  • 浮动的元素不再区分块级元素、行内元素,已经脱离了标准文档流
  • 一律能够设置宽度和高度,即使它是“<span>”、“<a>”标签等等
<style>
  span {
    width: 100px;
    height: 30px;
    background-color: tomato;
    /* 
            只要设置了浮动的元素,不再区分块级元素和行内元素
            都能设置高度和宽度
        */
    float: left;
    margin-right: 10px;
    text-align: center;
    line-height: 30px;
    color: #fff;
  }
</style>

<body>
  <h1>浮动的元素一定能设置宽高</h1>

  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
</body>

效果:

5.浮动的元素会造成父元素高度塌陷

  • 当给子元素添加了浮动后,子元素相当于漂浮起来,不占据页面空间
  • 这样就造成了腹肌元素在没有设置高度时,高度塌陷问题

一个塌陷的例子

<style>
  .main {
    width: 200px;
    border: 2px solid red;
  }
  .box {
    width: 100px;
    height: 100px;
    background-color: pink;
    /* 添加浮动的前后对比 */
    float: left;
  }
</style>
<body>
  <div class="main">
    <div class="box"></div>
  </div>
</body>

效果:

box未设置浮动前效果box设置浮动后效果

6.浮动对文字的影响

  • 常见的图片文字环绕效果,其实现方式主要是将图片左浮动或有浮动
  • 浮动后其相邻的文字,就会环绕图片排列
  • 这与相邻的div盒子不同,浮动会漂浮在div盒子上,但是浮动不会漂浮在文字上
<style>
  .box {
    width: 200px;
    background-color: #ddd;
    padding: 10px;
  }
  .img {
    width: 80px;
    height: 80px;
    background-color: skyblue;
    float: left;
    margin: 10px;
  }
</style>
<body>
  <div class="box">
    <div class="img"></div>
    最初,引入float属性是为了能让 web
    开发人员实现简单的布局,包括在一列文本中浮动的图像,文字环绕在它的左边或右边
  </div>
</body>

效果:

使用浮动实现网页布局

  • 垂直显示的盒子,不要设置浮动,只有并排显示的盒子才要设置浮动
  • 每一个盒子都是独立存在,每个盒子又是一个小天地,内部可以继续使用浮动

BFC规范 和 浏览器差异

  • BFC(Box Formatting Context,块级格式上下文) 是页面上的一个隔离的独立容器
  • 容器里的子元素不会影响到外面的元素,分之亦然

如:一个盒子不设置height,当内容子元素都浮动时,无法撑起自身

原因是:“这个盒子没有形成BFC

创建BFC

  • 方法1:float的值不是none
  • 方法2:position的值不是static或者relative
  • 方法3:display的值是“inline-block”、“flex”、“inline-flex”
  • 方法4:使用“overflow:hidden;
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>创建BFC</title>
    <style>
      .box {
        width: 500px;
        border: 5px solid red;
        /* 
            方法1:float的值不是none 
            该方法可以实现效果,但没有意义,不可能随意给盒子设置浮动
        */
        /* float: left; */

        /* 
            方法2:position的值不是static或者relative 
            该方法可以实现效果,但不靠谱
        */
        /* position: absolute; */

        /* 
            方法3:display的值是 inline-block、flex 或 inline-flex 
            该方法可以实现效果,但,没有意义,可能随便改变盒子的为行内块,获取其他的
        */
        /* display: inline-block; */
        /* display: flex; */
        /* display: inline-flex; */

        /* 
            方法4:overflow:hidden;
            该方法可以实现效果,但是,不能满足所有的场景
        */
        /* overflow: hidden; */
      }
      .box .c1 {
        width: 200px;
        height: 200px;
        background-color: orange;
        float: left;
      }
      .box .c2 {
        width: 200px;
        height: 200px;
        background-color: skyblue;
        float: left;
      }
    </style>
  </head>
  <body>
    <h1>创建BFC</h1>
    <p>
      BFC (Box Formatting Context
      ,块级格式上下文)是页面上的一个隔离的独立容器
    </p>

    <div class="box">
      <div class="c1"></div>
      <div class="c2"></div>
    </div>
  </body>
</html>

BFC的其他作用

  • BFC可以取消盒子margin塌陷
  • BFC可以阻止元素被浮动元素覆盖
<style>
  p {
    width: 200px;
    height: 200px;
    background-color: orange;
    /* 垂直方向上下margin会重合 距离依然是:50 */
    margin: 50px;
  }

  /* 
    BFC作用一:可以取消盒子margin塌陷
    添加overflow:hidden; 创建BFC
  */
  div {
    overflow: hidden;
  }

  /* 
    BFC作用二:可以阻止元素被浮动元素覆盖
    没有实际意义,实际开发不会这么用,只具有理论意义,要明白
    需要并排显示的盒子,要么都浮动,要么都不写,以下的写法是不合法规范的
  */
  .box1 {
    width: 300px;
    height: 300px;
    background-color: skyblue;
    float: left;
  }

  .box2 {
    width: 200px;
    height: 200px;
    background-color: tomato;
    /* float: left; */
    overflow: hidden;
  }
</style>

<body>
  <div>
    <p></p>
  </div>

  <div>
    <p></p>
  </div>

  <section class="box1"></section>
  <section class="box2"></section>
</body>

清除浮动

清除浮动:浮动一定要封闭到一个盒子中,否则就会对页面后续元素产生影响

清除浮动的方法一共有四种

1.清除浮动方法1

  • 让内部有浮动的父盒子形成BFC,它就能关住内部的浮动
  • 此时,最好的方法就是”overflow:hidden;“属性
<style>
  * {
    margin: 0;
    padding: 0;
  }

  div {
    /* 
        清除浮动方法1:
        让内部有浮动的父盒子形成BFC,它就能关闭住内部的浮动
        此时,最好的方法就是 overflow: hidden; 属性
      */
    overflow: hidden;
    margin-bottom: 10px;
  }

  p {
    width: 100px;
    height: 100px;
    background-color: orange;
    margin-right: 10px;
    float: left;
  }
</style>

<body>
  <div>
    <p></p>
    <p></p>
  </div>

  <div>
    <p></p>
    <p></p>
  </div>
</body>

效果:

2.清除浮动方法2

  • 给后面的父盒子设置“clear:both;”属性
  • clear表示清除浮动对自己的影响,both表示左右浮动都清除

(该方法不推荐)

3.清除浮动方法3

  • 使用”::after“伪元素 给盒子添加最后一个子元素
  • 并且给“::after”设置“clear:both

强烈推荐使用,最佳实践

<style>
  * {
    margin: 0;
    padding: 0;
  }

  div {
    border: 2px solid red;
    margin-bottom: 20px;
  }

  /* 
      添加伪元素
      ::after 匹配选中的元素的最后一个子元素
    */
  .clearfix::after {
    content: "";
    clear: both;
    /* 转为块级元素 */
    display: block;
  }

  p {
    width: 100px;
    height: 100px;
    background-color: orange;
    margin-right: 10px;
    float: left;
  }
</style>

<body>
  <div class="clearfix">
    <p></p>
    <p></p>
  </div>

  <div class="clearfix">
    <p></p>
    <p></p>
  </div>
</body>

4.清除浮动方法4

  • 在两个父盒子之间“隔墙”个一个携带“clear:both”的盒子

(不推荐)

<style>
  * {
    margin: 0;
    padding: 0;
  }

  div {
    border: 2px solid red;
  }

  p {
    width: 100px;
    height: 100px;
    background-color: orange;
    margin-right: 10px;
    float: left;
  }

  /* 
      清除浮动方法4:
      在两个父盒子之间 "隔墙" 隔一个携带 `clear: both;`的盒子
    */
  .cl {
    clear: both;
  }

  .h20 {
    height: 20px;
  }
</style>

<body>
  <div>
    <p></p>
    <p></p>
  </div>

  <!-- 在两个父盒子之间 "隔墙" 隔一个携带 `clear: both;`的盒子 -->
  <div class="cl h20"></div>

  <div>
    <p></p>
    <p></p>
  </div>
</body>

浮动布局

1.三列式布局,中间自适应

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>布局</title>
	<style>
		body {
		  margin: 0;
		}
		.box {
		  width: 100%;
		  background-color: khaki;
		  padding: 10px;
		  box-sizing: border-box;
		}
		.box .left {
		  width: 150px;
		  height: 200px;
		  background-color: skyblue;
		  float: left;
		}
		.box .middle {
		  background-color: aquamarine;
		  height: 200px;
		  margin: 0px 160px;
		}
		.box .right {
		  width: 150px;
		  height: 200px;
		  background-color: pink;
		  float: right;
		}
		/*清除浮动*/
		.clearfix::after {
		  display: block;
		  content: "";
		  clear: both;
		}
	  </style>
	  <body>
		<div class="box clearfix">
		  <div class="left">左</div>
		  <div class="right">中</div>
		  <div class="middle">中</div>
		</div>
	  </body>
</html>

效果:

2.多行多列式布局

<style>
  .container {
    width: 800px;
    background-color: skyblue;
    margin: 0px auto;
    padding: 5px;
  }
  .item {
    width: 190px;
    height: 200px;
    background-color: khaki;
    float: left;
    margin: 5px;
  }
  /*清除浮动*/
  .clearfix::after {
    display: block;
    content: "";
    clear: both;
  }
</style>
<body>
  <div class="container clearfix">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
    <div class="item">7</div>
    <div class="item">8</div>
  </div>
</body>

效果:

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是洋洋a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值