11.浮动(float)

118 阅读7分钟

一.float属性

可以通过float属性让元素产生浮动效果,float的常用取值

  • none:不浮动,默认值
  • left:向左浮动
  • right:向右浮动

二. 浮动的规则

2.1 规则一:脱离标准流,朝着向左或向右方向移动,直到自己的边界紧贴着包含块(一般是父元素)或者其他浮动元素的边界为止

元素一旦浮动后

  • 脱离标准流
  • 朝着向左或向右方向移动,直到自己的边界紧贴着包含块(一般是父元素)或者其他浮动元素的边界为止

image-20210507164951319

<!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>浮动float</title>
  </head>
  <style>
    /* 
    float规则:浮动
      1.- 元素一旦浮动后
          - 脱离标准流
          - 朝着向左或向右方向移动,直到自己的边界紧贴着包含块(一般是父元素)或者其他浮动元素的边界为止
      2.定位元素会层叠在浮动元素上面
    */
    .content {
      height: 300px;
      background-color: pink;
    }

    a {
      background-color: red;
    }

    strong {
      float: left;
      background-color: yellowgreen;
    }

    span {
      float: left;
      background-color: green;
    }
  </style>

  <body>
    <div class="content">
      <a href="">a元素</a>
      <strong>strong元素</strong>
      <span>span元素</span>
    </div>
  </body>

</html>

2.2 规则二:浮动元素不能与行内级内容层叠,行内级内容将会被浮动元素推出

  • 浮动元素不能与行内级内容层叠,行内级内容将会被浮动元素推出
    • 比如行内级元素、inline-block元素、块级元素的文字内容

image-20210507171411521

image-20210507172131567

2.3 规则三:行内级元素、inline-block元素浮动后,其顶部将与所在行的顶部对齐

==行内级元素、inline-block元素浮动后,其顶部将与所在行的顶部对齐==

image-20210507183439612

image-20210507182051588

image-20210507182424038

image-20210507182827850

image-20210507183208767

<!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>浮动的规则三</title>
  </head>
  <style>
    /* 
    float规则:浮动
      1.- 元素一旦浮动后
          - 脱离标准流
          - 朝着向左或向右方向移动,直到自己的边界紧贴着包含块(一般是父元素)或者其他浮动元素的边界为止
      2.浮动元素不能与行内级内容层叠,行内级内容将会被浮动元素推出
          - 比如行内级元素、inline-block元素、块级元素的文字内容
      3.行内级元素、inline-block元素浮动后,其顶部将与所在行的顶部对齐    
    
     */
    .box {
      background-color: pink;
      /* overflow: hidden; */
      width: 400px;
    }

    .img1 {
      float: left;
    }

    .img2 {
      float: left;
    }

    .img3 {
      float: left;
    }
  </style>

  <body>
    <div class="box">
      5月4日晚,北京市广播电视局在微信公众号上发文,责令爱奇艺暂停《青春有你》第三季后续节目录制,
      要求爱奇艺认真核查并整改存在的问题。
      <img class="img1" src="../img/ysx.jpg" alt="" width="100">
      5日凌晨,爱奇艺《青春有你》官方微博回应此事,称“诚恳接受,坚决服从”,同时,
      《青春有你》第三季选手余景天所属公司星宇愔乐在微博发布退赛声明,称艺人余景天因个人身体原因,
      无法继续参与相关工作,决定退出目前的节目录制。

      5月6日夜间,爱奇艺发文道歉,称对于“倒奶视频”所造成的影响表达歉意,同时重申坚决反对一切形式的食品浪费。
      爱奇艺称,从发文即刻起,关闭《青春有你》第三季所有助力通道。
      我们真诚地道歉!

      我们听到了用户及媒体朋友批评的声音,对于此次“倒奶视频”所造成的影响,我们感到非常的内疚自责,在此,深深表达我们的歉意。同时,我们重申,坚决反对一切形式的食品浪费。
      <img class="img3" src="../img/ysx.jpg" alt="" width="100">
      我们已经并正在继续做深刻反省:作为一档综艺节目,首先必须要保证价值观导向正确,这样才能对得起大家的热爱。在节目制作和播出过程中,我们忽视了价值观导向和社会责任,忽视了节目应有的合理规则,忽视了节目缺陷可能产生的严重负面影响,我们为此负全部的责任。

      爱奇艺管理层及节目组深刻反省,将以最严格的标准、最有力的措施,保证节目的正确导向,为用户和社会奉献健康和优秀的作品。

      《青春有你3》节目整改措施如下:

      1、原定5月8日的成团之夜停止录制和直播,节目组继续慎重研究并调整节目规则。

      2、从即刻起,关闭《青春有你3》所有助力通道。
      <img class="img2" src="../img/ysx.jpg" alt="" width="100">

      3、对于已经购买商家“活动装产品”但未使用的用户,平台和商家共同协商,确保妥善解决,相关细则将在《青春有你3》的官方微博公布。

      我们继续认真努力,让未来的节目更健康,规则和流程更合理。一路走来,爱奇艺离不开社会和用户的关爱。未来,我们不会辜负社会和用户的期望,积极承担平台主体责任,创造价值观正确和健康的好内容,回报大家。

      再次,我们真挚道歉,也对所有关心和爱护爱奇艺的朋友,真诚地说一句:对不起!我们错了。我们继续深刻反思,努力通过更健康的作品,给社会带来更多的正能量。

      爱奇艺及《青春有你3》节目组
    </div>
  </body>

</html>

2.4 理解前面的规则

image-20210507185743896

image-20210507190307185

image-20210507190932300

image-20210507190428178

image-20210507191132097

image-20210507191451902

<style>
    .box {
      /* height: 400px; */
      background-color: pink;
    }

    .div1 {
      width: 100px;
      height: 100px;
      background-color: purple;
      float: left;
    }

    .div2 {
      /* display: inline-block; */
      width: 200px;
      height: 200px;
      background-color: rgb(26, 128, 0);
      float: left;
    }
  </style>

  <body>
    <div class="box">
      <div class="div1">盒子1</div>
      <div class="div2">盒子2</div>
    </div>
  </body>

2.5 规则四:如果元素是向左(右)浮动,浮动元素的左(右)边界不能超出包含块的左(右)边界

如果元素是向左(右)浮动,浮动元素的左(右)边界不能超出包含块的左(右)边界

image-20210507192153316

image-20210507193352314

<style>
    /* 
    如果元素是向左(右)浮动,浮动元素的左(右)边界不能超出包含块的左(右)边界

    */
    .box {
      width: 400px;
      height: 400px;
      background-color: pink;
    }

    .box1 {
      width: 100px;
      height: 100px;
      background-color: red;
      float: right;
    }

    .box2 {
      width: 100px;
      height: 100px;
      background-color: blue;
      float: left;
    }
  </style>

  <body>
    <div class="box">
      <div class="box1">box1</div>
      <div class="box2">box2</div>
    </div>
  </body>

2.6 规则五:浮动元素之间不能层叠

浮动元素之间不能层叠

  • 如果一个元素浮动,另一个浮动元素已经在那个位置了,后浮动的元素将紧贴着前一个浮动元素(==左浮找左浮,右浮找右浮==)
  • 如果水平方向剩余的空间不够显示浮动元素,浮动元素将向下移动,直到有充足的空间为止

image-20210507194021054

image-20210507194009830

<!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>浮动的规则五</title>
  </head>
  <style>
    /* 
    规则四:如果元素是向左(右)浮动,浮动元素的左(右)边界不能超出包含块的左(右)边界
    规则五:浮动元素之间不能层叠

           - 如果一个元素浮动,另一个浮动元素已经在那个位置了,后浮动的元素将紧贴着前一个浮动元素
           (左浮找左浮,右浮找右浮)
           - 如果水平方向剩余的空间不够显示浮动元素,浮动元素将向下移动,直到有充足的空间为止

    */
    .box {
      width: 350px;
      height: 400px;
      background-color: pink;
    }

    .box1 {
      width: 100px;
      height: 100px;
      background-color: red;
      float: left;
    }

    .box2 {
      width: 100px;
      height: 100px;
      background-color: blue;
      float: left;
    }

    .box3 {
      width: 200px;
      height: 200px;
      background-color: yellowgreen;
      float: left;
    }
  </style>

  <body>
    <div class="box">
      <div class="box1">box1</div>
      <div class="box2">box2</div>
      <div class="box3">box3</div>
    </div>
  </body>

</html>

2.7 规则六:浮动元素的顶端不能超过包含块的顶端,也不能超过之前所有浮动元素的顶端

浮动元素的顶端不能超过包含块的顶端,也不能超过之前所有浮动元素的顶端

image-20210507194730951

image-20210507195234168

image-20210507195515850

<style>
    /* 
    规则四:如果元素是向左(右)浮动,浮动元素的左(右)边界不能超出包含块的左(右)边界
    规则五:浮动元素之间不能层叠

           - 如果一个元素浮动,另一个浮动元素已经在那个位置了,后浮动的元素将紧贴着前一个浮动元素
           (左浮找左浮,右浮找右浮)
           - 如果水平方向剩余的空间不够显示浮动元素,浮动元素将向下移动,直到有充足的空间为止
    规则六:浮动元素的顶端不能超过包含块的顶端,也不能超过之前所有浮动元素的顶端


    */
    .box {
      width: 350px;
      height: 700px;
      background-color: pink;
    }

    .box1 {
      width: 200px;
      height: 100px;
      background-color: red;
      float: left;
    }

    .box2 {
      width: 250px;
      height: 150px;
      background-color: blue;
      float: left;
    }

    .box3 {
      width: 50px;
      height: 400px;
      background-color: yellowgreen;
      float: left;
    }
  </style>

  <body>
    <div class="box">
      <div class="box1">box1</div>
      <div class="box2">box2</div>
      <div class="box3">box3</div>
    </div>
  </body>

三. 元素层叠的关系

定位元素会层叠在浮动元素上面

  • 标准元素:标准流中的元素不存在层叠
  • 定位元素:定位元素会层叠在标准元素上面
    • 定位元素之间可以用z-index调整
    • 前提:必须是定位元素-非static
  • 浮动元素:float:left/right

==从下向上的层叠顺序:标准元素->浮动元素->定位元素==

image-20210507165832234

四. 浮动练习

4.1 练习一:两列布局

4.1.1 margin-left不是相等的(京东)

image-20210508002328107

<!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>浮动练习一:浮动布局</title>
    <link rel="stylesheet" href="../css/reset.css">
  </head>
  <style>
    /* 
    这种没有将中间的间隔平分,而是靠两边的是5px,中间的是10px
    
     */
    body {
      background-color: #ccc;
    }

    .content {
      width: 1200px;
      height: 664px;
      /* background-color: pink; */
      margin: 0 auto;
    }

    .content>.wrap {}

    .item {
      width: 230px;
      height: 322px;
      background-color: #fff;
      margin: 0 5px 10px;
      float: left;
      text-align: center;
      line-height: 30px;
      font-size: 14px;
    }

    .item>img {
      width: 230px;
      margin-bottom: 5px;
    }

    .item>span {
      display: block;
      height: 30px;
      /* background-color: yellow; */
      margin-bottom: 5px;
    }
  </style>

  <body>

    <div class="content">
      <div class="wrap">
        <ul>
          <li class="item item1"><img src="../image/belle.png" alt=""><span>女鞋</span><span>¥100</span></li>
          <li class="item item2"><img src="../image/bra.png" alt=""><span>女凶</span><span>¥100</span></li>
          <li class="item item3"><img src="../image/phone.png" alt=""><span>手机</span><span>¥100</span></li>
          <li class="item item4"><img src="../image/unbrella.png" alt=""><span>雨伞</span><span>¥100</span></li>
          <li class="item item5"><img src="../image/cleaner.png" alt=""><span>吸层器</span><span>¥100</span></li>
          <li class="item item6"><img src="../image/t-shikt.png" alt=""><span>T恤</span><span>¥100</span></li>
          <li class="item item7"><img src="../image/buddy.png" alt=""><span>大佛</span><span>¥100</span></li>
          <li class="item item8"><img src="../image/belle.png" alt=""><span>女鞋</span><span>¥100</span></li>
          <li class="item item9"><img src="../image/wacther.png" alt=""><span>手表</span><span>¥100</span></li>
          <li class="item item10"><img src="../image/err.png" alt=""><span>耳机</span><span>¥100</span></li>
        </ul>
      </div>
    </div>
  </body>

</html>

4.2.2 等分练习:直接在每组最后的类设置margin-right:0

第一种平分方法:直接在每组最后的添加一个类,然后给每组最后一个类设置margin-right:0

image-20210508142040601

 <style>
    /* 
    第一种平分方法:直接在每组最后的添加一个类,然后给每组最后一个类设置margin-right:0
    
     */
    body {
      background-color: #ccc;
    }

    .content {
      width: 1200px;
      height: 664px;
      /* background-color: pink; */
      margin: 0 auto;
    }

    .content>.wrap {}

    .item {
      width: 230px;
      height: 322px;
      background-color: #fff;
      /* margin: 0 5px 10px; */
      margin-right: 12.5px;
      margin-bottom: 10px;
      float: left;
      text-align: center;
      line-height: 30px;
      font-size: 14px;
    }

    .item5 {
      margin-right: 0px;
    }

    .item10 {
      margin-right: 0;
    }

    .item:hover {
      transform: scale(1.1);
    }

    .item>img {
      width: 230px;
      margin-bottom: 5px;
    }

    .item>span {
      display: block;
      height: 30px;
      /* background-color: yellow; */
      margin-bottom: 5px;
    }
  </style>

4.2.3 等分练习:nth-child( 5n)

image-20210508142603576

<style>
    /* 
    第一种平分方法:直接在每组最后的添加一个类,然后给每组最后一个类设置margin-right:0
    第二种平分方法:nth-child(5n)
     */
    body {
      background-color: #ccc;
    }

    .content {
      width: 1200px;
      height: 664px;
      /* background-color: pink; */
      margin: 0 auto;
    }

    .content>.wrap {}

    .item {
      width: 230px;
      height: 322px;
      background-color: #fff;
      /* margin: 0 5px 10px; */
      margin-right: 12.5px;
      margin-bottom: 10px;
      float: left;
      text-align: center;
      line-height: 30px;
      font-size: 14px;
    }

    .item:nth-child(5n) {
      margin-right: 0px;
    }


    .item:hover {
      transform: scale(1.1);
    }

    .item>img {
      width: 230px;
      margin-bottom: 5px;
    }

    .item>span {
      display: block;
      height: 30px;
      /* background-color: yellow; */
      margin-bottom: 5px;
    }
  </style>

4.2.4 等分练习:margin-right设置负数

==container固定宽度->wrap不设宽度+margin-right负值->很多item==

image-20210508144234258

<style>
    /* 
    第一种平分方法:直接在每组最后的添加一个类,然后给每组最后一个类设置margin-right:0
    第二种平分方法:nth-child(5n)
    第三种平分方法:给里面的wrap的margin-right设置为负
     */
    body {
      background-color: #ccc;
    }

    .content {
      width: 1200px;
      height: 664px;
      background-color: pink;
      margin: 0 auto;
    }

    .content>.wrap {
      /* 
      最重要
       */
      margin-right: -12.5px;
    }

    .item {
      width: 230px;
      height: 322px;
      background-color: #fff;
      margin-right: 12.5px;
      margin-bottom: 10px;
      float: left;
      text-align: center;
      line-height: 30px;
      font-size: 14px;
    }


    .item:hover {
      transform: scale(1.1);
    }

    .item>img {
      width: 230px;
      margin-bottom: 5px;
    }

    .item>span {
      display: block;
      height: 30px;
      /* background-color: yellow; */
      margin-bottom: 5px;
    }
  </style>

  <body>

    <div class="content">
      <div class="wrap">
        <ul>
          <li class="item"><img src="../image/belle.png" alt=""><span>女鞋</span><span>¥100</span></li>
          <li class="item"><img src="../image/bra.png" alt=""><span>女凶</span><span>¥100</span></li>
          <li class="item"><img src="../image/phone.png" alt=""><span>手机</span><span>¥100</span></li>
          <li class="item"><img src="../image/unbrella.png" alt=""><span>雨伞</span><span>¥100</span></li>
          <li class="item"><img src="../image/cleaner.png" alt=""><span>吸层器</span><span>¥100</span></li>
          <li class="item"><img src="../image/t-shikt.png" alt=""><span>T恤</span><span>¥100</span></li>
          <li class="item"><img src="../image/buddy.png" alt=""><span>大佛</span><span>¥100</span></li>
          <li class="item"><img src="../image/belle.png" alt=""><span>女鞋</span><span>¥100</span></li>
          <li class="item"><img src="../image/wacther.png" alt=""><span>手表</span><span>¥100</span></li>
          <li class="item"><img src="../image/err.png" alt=""><span>耳机</span><span>¥100</span></li>
        </ul>
      </div>
    </div>
  </body>

4.2 float练习二:解决border重合

image-20210508164626566

image-20210508164816165

<!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>float练习二:让border线重合</title>
  </head>
  <style>
    .container {
      width: 1100px;
      height: 218px;
      /* background-color: pink; */
      margin: 0 auto;
    }

    h3 {
      /* line-height: 30px; */
    }

    ul {
      list-style-type: none;
      padding: 0;
      margin: 0;
      /* 
      让所有的浮动元素都能排在一行,margin-right:-10px
       */
      margin-right: -10px;
    }

    ul>li {
      width: 220px;
      height: 167px;
      /* background-color: red; */
      float: left;
      border: 1px solid #ccc;
      text-align: center;
      margin-right: -1px;
    }

    ul>li>img {
      margin-top: 20px;
    }
  </style>

  <body>
    <div class="container">
      <h3>热卖品牌</h2>
        <ul>
          <li><img src="../image/nike.jpg" alt=""></li>
          <li><img src="../image/under.jpg" alt=""></li>
          <li><img src="../image/adidas.jpg" alt=""></li>
          <li><img src="../image/s.jpg" alt=""></li>
          <li><img src="../image/newbalance.jpg" alt=""></li>
        </ul>
    </div>
  </body>

</html>

五. 浮动存在的问题

  • 由于浮动元素脱离了标准流,变成了脱标元素,所以不再向父元素汇报高度
  • 父元素计算总高度时,就不会计算浮动子元素的高度,导致了高度坍塌的问题
  • 解决父元素高度坍塌问题的过程,一般叫做清浮动(清理浮动、清除浮动)
  • 清浮动的目的是
    • 让父元素计算总高度的时候,把浮动子元素的高度算进去

image-20210508165505825

六.清除浮动

  • 给父元素设置固定高度

    • 扩展性不好(不推荐)
  • 在父元素最后增加一个空的块级子元素,并且让它设置clear: both

    • 会增加很多无意义的空标签,维护麻烦
    • 违反了结构与样式分离的原则(不推荐)
    • image-20210508170036212
  • 在父元素最后增加一个br标签:<br clear="all">

    • 会增加很多无意义的空标签,维护麻烦
    • 违反了结构与样式分离的原则(不推荐)
    • image-20210508170140094
  • 给父元素增加::after伪元素

    • 纯CSS样式解决,结构与样式分离(推荐)
    • image-20210508171804009
    <!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>清除浮动</title>
      </head>
      <style>
        /* 
        一.浮动导致的问题
          - 由于浮动元素脱离了标准流,变成了脱标元素,所以不再向父元素汇报高度
          - 父元素计算总高度时,就不会计算浮动子元素的高度,导致了高度坍塌的问题
          - 解决父元素高度坍塌问题的过程,一般叫做清浮动(清理浮动、清除浮动)
          - 清浮动的目的是
            - 让父元素计算总高度的时候,把浮动子元素的高度算进去
        二.解决浮动的办法
          1.给固定高度
          2.clear:both/left/right
          3.<br clear="all">    
         */
        .container {
          width: 1100px;
          /* height: 218px; */
          background-color: pink;
          margin: 0 auto;
        }
    
        h3 {
          /* line-height: 30px; */
        }
    
        ul {
          list-style-type: none;
          padding: 0;
          margin: 0;
          /* 
          让所有的浮动元素都能排在一行,margin-right:-10px
           */
          margin-right: -10px;
        }
    
        ul>li {
          width: 220px;
          height: 167px;
          /* background-color: red; */
          float: left;
          border: 1px solid #ccc;
          text-align: center;
          margin-right: -1px;
        }
    
        ul>li>img {
          margin-top: 20px;
        }
    
        /* 
        清除浮动最优写法:伪元素放进类里
         */
        .clear-fix::after {
          content: '';
          clear: both;
          display: block
        }
      </style>
    
      <body>
        <div class="container clear-fix">
          <h3>热卖品牌</h2>
            <ul>
              <li><img src="../image/nike.jpg" alt=""></li>
              <li><img src="../image/under.jpg" alt=""></li>
              <li><img src="../image/adidas.jpg" alt=""></li>
              <li><img src="../image/s.jpg" alt=""></li>
              <li><img src="../image/newbalance.jpg" alt=""></li>
            </ul>
        </div>
        <!-- <div style="clear:both"></div> -->
        <!-- <br clear="all"> -->
        <p>
          美国的纽交所,终究还是坚持要中国三大电信运营商在该所的存托股票退市。
    
          中国移动、中国电信、中国联通三大运营商都有在港股上市,美股上市的股份比例非常低。纽交所要求这几家中国企业退市的行为,打压的象征意义更大。在此背景下,中国电信更是向A股递交了上市申请。
        </p>
      </body>
    
    </html>
    

6.1 clear

  1. clear的常用取值

    1. left:要求元素的顶部低于之前生成的所有左浮动元素的底部
    2. right:要求元素的顶部低于之前生成的所有右浮动元素的底部
    3. both:要求元素的顶部低于之前生成的所有浮动元素的底部
    4. none:默认值,无特殊要求
  2. 一般就只用在非浮动元素上,可以让非浮动元素与浮动元素不层叠

七.定位方案对比

定位方案应用场景
normal flow(标准流)垂直布局
absolute positioning(绝对定位)层叠布局
float(浮动)水平布局