CSS浮动详解及案例

一、简介

1.1 定位方式

在CSS中,有三种常用的方法对元素进行定位和布局:

  • normal flow:标准流、常规流、文档流
  • absolute position:绝对定位
  • float:浮动

其中,绝对定位和浮动都会让元素脱离标准流,以达到灵活布局的效果

1.2 浮动元素

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

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

1.3 层叠关系

  • 标准元素:标准流中的元素不存在层叠关系
  • 定位元素:定位元素会层叠在标准流元素上面
    • 定位元素间可以使用z-index设置优先级
    • 必须是定位元素,非static
  • 浮动元素:float为left或right
  • 标准元素 --> 浮动元素 --> 定位元素

二、浮动的规则

2.1 规则一

元素一旦浮动后

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

在这里插入图片描述

2.1.1示例
 <style>
  .box {
      height: 500px;
      background-color: green;
  }

span {
      background-color: hotpink;
  }

  strong
      background-color: khaki;
  }

  a {
      background-color: lightcoral;
  }
</style>

<body>
    <div class="box">
        我是box内容元素
        <span>我是span元素</span>
        <strong>我是strong元素</strong>
        <a href="">我是a标签</a>
    </div>
</body>

如代码所示,各元素都是标准流,显示如图:

在这里插入图片描述

当对strong元素开启浮动后:

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

效果如图:

在这里插入图片描述

此时strong标签已脱离标准流,按照上述规则,会按照left朝向找到自个应该所处位置

2.2 规则二

  • 浮动元素不能和行内级元素重叠,行内级内容会被浮动元素推出
    • 比如行内级元素、inline-block、块级元素
2.2.1 示例

代码如下:

<div class="box">
        <img src="../img/beauty-center-02.jpg" alt="">
        面对市场火热行情,不少人关心的是A股后市如何?是不是已经在牛市初期了?
          对此,国泰证券认为,当前A股的低估值补涨特征本质在于无风险利率的下行,促发的动力在于银行理财预期收益率降低,进一步强化资金追逐资产的现象。“由此看好后市,突破3300点,静待3500点。”
          “当前背景是全球流动性泛滥且近期看不到明显收紧,中国经济数据持续超预期,且市场可预期未来几个季度中国经济与企业盈利同比增速逐步上行,这是A股‘复苏牛’逻辑,这也是全面牛市逻辑。”安信证券陈果团队称。
          “经济恢复良好和增量资金共同推动股市上涨。”新时代证券首席经济学家潘向东告诉记者,前期消费、科技涨幅较高,已走出结构性行情,目前经济恢复良好,基建投资、房地产投资成为经济主要拉动力量,加上欧美经济重启,中国外需也有所回升,PPI增速触底回升,企业盈利改善可期,7月以来金融地产等周期板块快速上涨,呈现板块轮动迹象。
          “但在疫苗出来前,疫情对经济和市场都可能存在干扰,因此,这轮行情能否成为全面板块的牛市还不好说。”潘向东指出。
          粤开证券首席经济学家、研究院院长李奇霖认为,站在当前的时点,情绪大概率还能把市场向上“推一把”。看好我国资本市场在未来经济与金融转型中的长期投资价值。
          同样,星石投资首席研究官方磊也看好后续市场。他认为,在疫情冲击下,各个领域企业将深刻意识到有稳定供货能力的产业链最具价值,中国优质企业有望获得新的业务增量。这是股市后续行情的底气。
          不过,李奇霖也提醒,不同的投资者,投资风格和盈利方式不同,建议投资者根据个人投资风格和资金,理性投资。
</div>

未开启浮动,显示如图:

在这里插入图片描述

当对img标签开启浮动float:left后,显示为:

在这里插入图片描述

如图,形成图文环绕效果,显示也符合规则二。

2.3 规则三

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

2.3.1 示例

代码如下

<div class="box">
        面对市场火热行情,不少人关心的是A股后市如何?是不是已经在牛市初期了?
          对此,国泰证券认为,当前A股的低估值补涨特征本质在于无风险利率的下行,促发的动力在于银行理财预期收益率降低,进一步强化资金追逐资产的现象。“由此看好后市,突破3300点,静待3500点。”
        <img src="../img/beauty-center-02.jpg" alt="">
          “当前背景是全球流动性泛滥且近期看不到明显收紧,中国经济数据持续超预期,且市场可预期未来几个季度中国经济与企业盈利同比增速逐步上行,这是A股‘复苏牛’逻辑,这也是全面牛市逻辑。”安信证券陈果团队称。
          “经济恢复良好和增量资金共同推动股市上涨。”新时代证券首席经济学家潘向东告诉记者,前期消费、科技涨幅较高,已走出结构性行情,目前经济恢复良好,基建投资、房地产投资成为经济主要拉动力量,加上欧美经济重启,中国外需也有所回升,PPI增速触底回升,企业盈利改善可期,7月以来金融地产等周期板块快速上涨,呈现板块轮动迹象。
        <img src="../img/beauty-center-01.jpg" alt="">
          “但在疫苗出来前,疫情对经济和市场都可能存在干扰,因此,这轮行情能否成为全面板块的牛市还不好说。”潘向东指出。
          粤开证券首席经济学家、研究院院长李奇霖认为,站在当前的时点,情绪大概率还能把市场向上“推一把”。看好我国资本市场在未来经济与金融转型中的长期投资价值。
          同样,星石投资首席研究官方磊也看好后续市场。他认为,在疫情冲击下,各个领域企业将深刻意识到有稳定供货能力的产业链最具价值,中国优质企业有望获得新的业务增量。这是股市后续行情的底气。
          不过,李奇霖也提醒,不同的投资者,投资风格和盈利方式不同,建议投资者根据个人投资风格和资金,理性投资。
    </div>

此时,未开启浮动,显示效果为:

在这里插入图片描述

当对img开启浮动:

img {
   float: left;
}

显示效果为:

在这里插入图片描述

该示例验证了规则三,开启浮动元素只会与所在行的顶部对齐,也就是说只会在同一行往左或右移动,而不会上下移动。

2.4 规则四

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

在这里插入图片描述

2.5 规则五

  • 浮动元素之间不能层叠

    • 如果一个元素浮动,另外一个浮动元素已经在那个位置了,后浮动的元素将紧贴着前一个浮动元素(左浮找左浮,右浮找右浮)

    在这里插入图片描述

  • 如果水平空间剩余的空间不够显示浮动元素,浮动元素将向下移动,直到有充足的空间为止

在这里插入图片描述

2.6规则六

  • 浮动元素的顶部不能超过包含块的顶端,也不能超过之前所有浮动元素的顶端
2.6.1 示例
<style>
    .box {
        height: 800px;
        width: 500px;
        background-color: red;
    }

    .inner1 {
        float: left;
        height: 200px;
        width: 100px;
        background-color: teal;
    }

    .inner2 {
        float: left;
        height: 200px;
        width: 450px;
        background-color: sandybrown;
    }

    .inner3 {
        float: left;
        height: 200px;
        width: 30px;
        background-color: seagreen;
    }
</style>

显示效果为:

在这里插入图片描述

2.7 小结

  • inner2进行左浮动/右浮动的时候,只会在当前自己行中浮动
<style>
    .box {
        height: 500px;
        background-color: red;
    }

    .inner1 {
        height: 100px;
        width: 100px;
        background-color: teal;
    }

    .inner2 {
        float: right;
        height: 200px;
        width: 300px;
        background-color: sandybrown;
    }
</style>

在这里插入图片描述

  • inner1进行左浮动时,inner2没有浮动时,排布如下:

在这里插入图片描述

  • inner1左浮动,inner2也左浮动,排布如下:

在这里插入图片描述

  • inner1有浮动,inner2没有浮动,但inner2中有文本,排布如下:

在这里插入图片描述

  • inner1和inner2都进行浮动,但父元素不设置高度,那么父元素的高度会消失(高度坍塌),排布如下:

在这里插入图片描述

三、浮动应用场景

  • 解决行内级元素、inline-block元素的水平间隙问题
  • 布局(eg. 京东)

四、浮动多余margin处理方案

4.1 问题

在网站中,经常会遇到如下布局:

在这里插入图片描述

通过开发者工具,可以看到整个.container宽度为990px,每个item宽度为190px,中间每个相隔为10px,通过计算,可以发现container宽度比item宽度+每个itemmargin-right要小,事实上,每行的最后一个item设置的margin-right是多余的,多的就是它!!!

<style>
      .container{
          width: 990px;
          height: 500px;
          background-color: red;
          
      }
      .section{
          float: left;
          width: 190px;
          height: 100px;
          margin-left: 10px;
          margin-top: 10px;
          background-color: seagreen;
      }
  </style>

在这里插入图片描述

行末尾元素没有显示出来,根据上面说的浮动规则,这种情况也可以解释的通,当一行无法放开浮动元素时,会自动换行,因为此处还有一个margin-right:10px,所以剩余空间宽度不够导致换行了。
那么该如何解决呢:

4.2 方案一:伪类选择器

通过nth-child属性,在每行的末尾把margin-right设置为0即可。

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

效果如图:

在这里插入图片描述

该方案缺点为:

  • 当个数不确定时,需要一直写class:section1-n,非常不灵活
  • nth-child存在兼容问题,在IE 6-8是不支持的,如图:

在这里插入图片描述

4.3 方案二:公式法

众所周知,块级元素的宽度计算为:

width of block = content-width(非auto) + margin-left + margin-right + padding-left + padding-right + border-width

根据计算公式,只需在sections包裹一层div,设置属性负margin,例如margin-left:-10px即可,代码如下:

<style>
    .container {
        width: 990px;
        height: 500px;
        background-color: red;
    }

    .wrap {
        margin-right: -10px;
    }

    .section {
        float: left;
        width: 190px;
        height: 100px;
        margin-right: 10px;
        margin-top: 10px;
        background-color: seagreen;
    }

    /* .section:nth-child(5n){
        margin-right: 0px;
    } */
</style>

效果为:

在这里插入图片描述

五、案例

5.1 仿京东频道广场

目标效果:

在这里插入图片描述

实现代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container {
            width: 990px;
            height: 306px;
            margin: 0 auto;
            background-color: red;
        }

        .wrap {
            margin-right: -10px;
            margin-bottom: 10px;
        }

        .item {
            float: left;
            width: 240px;
            margin-right: 10px;
        }

        .itema {
            height: 306px;
            background-color: saddlebrown;
        }

        .itemb {
            height: 148px;
            background-color: cyan;
        }

        .itemc {
            height: 148px;
            background-color: darkkhaki;
        }

        .item-last {
            margin-top: 10px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="wrap">
            <div class="item itema">

            </div>
            <div class="item itema">

            </div>
            <div class="item itemb">

            </div>
            <div class="item itemb ">

            </div>
            <div class="item itemc  item-last">

            </div>
            <div class="item itemc  item-last">

            </div>

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

</html>

效果为:

在这里插入图片描述

5.2 仿考拉运动户外分类

目标效果,如图:

在这里插入图片描述

实现代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        h2 {
            margin: 0;
            padding: 0;
        }

        a {
            text-decoration: none;
            color: #333333;
        }

        .container {
            height: 74px;
            width: 1100px;
            background-color: #f6f6f6;
            margin: 0 auto;
        }

        .header-left h2,
        .header-left .hot-list {
            float: left;
        }

        .header-right {
            float: right;
        }

        .header-right a {
            display: inline-block;
            color: #999999;
            margin-right: 18px;
            margin-top: 30px;
        }

        .header-right a:hover {
            text-decoration: underline;
        }

        .header-left h2 {
            margin-left: 15px;
            margin-top: 28px;
        }

        .header-left .hot-list {
            margin-left: 25px;
            margin-top: 36px;
        }

        .header-left .hot-list span {
            color: #999999;
        }

        .header-left .hot-list a {
            margin-left: 14px;
        }

        .hot {
            color: red;
        }

        .header-left .hot-list a:hover {
            text-decoration: underline;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="header-left">
            <h2>运动户外</h2>
            <div class="hot-list">
                <span>热搜词: </span>
                <a href="" class="hot">阿迪达斯</a>
                <a href="">耐克</a>
                <a href="" class="hot">斯凯奇</a>
                <a href="" class="hot">安德玛</a>
            </div>
        </div>
        <div class="header-right">
            <a href="">更多好货 > </a>
        </div>
    </div>
</body>

</html>

最终效果为:

在这里插入图片描述

5.3 仿考拉热卖品牌

该案例特点在broder的处理和设置上。

目标效果:
在这里插入图片描述

实现代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        ul {
            margin: 0;
            padding: 0;
            list-style: none;
            margin-right: -10px;
        }

        .brand {
            height: 217px;
            width: 1100px;
            margin: 0 auto;
            background-color: #f6f6f6;
            margin-top: 12px;
        }

        .brand ul li {
            float: left;
            height: 167px;
            width: 219px;
            background-color: white;
            border: 1px solid #e3e3e3;
            margin-right: -1px;
            text-align: center;
            line-height: 167px;
        }

        .brand ul li img {
            display: block;
            width: 120px;
            height: 120px;
            margin: 0 auto;
            margin-top: 23px;
        }

        .brand span {
            display: block;
            height: 49px;
            width: 1081px;
            font-size: 16px;
            line-height: 49px;
            padding-left: 18px;
            font-weight: bold;
            border: 1px solid #e3e3e3;
            margin-bottom: -1px;
            background-color: white;
        }
    </style>
</head>

<body>
    <div class="brand">
        <span>热卖品牌</span>
        <ul>
            <li>
                <a href="">
                    <img src="../img/luxury-hot-01.jpg" alt="">
                </a>
            </li>
            <li>
                <a href="">
                    <img src="../img/luxury-hot-02.jpg" alt="">
                </a>
            </li>
            <li>
                <a href="">
                    <img src="../img/luxury-hot-03.jpg" alt="">
                </a>
            </li>
            <li>
                <a href="">
                    <img src="../img/luxury-hot-04.jpg" alt="">
                </a>
            </li>
            <li>
                <a href="">
                    <img src="../img/luxury-hot-05.jpg" alt="">
                </a>
            </li>
        </ul>
    </div>
</body>

</html>

最终效果:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值