CSS浮动简介

环境

  • 操作系统:Ubuntu 20.04
  • 开发工具:VSCode 1.67.2
  • 浏览器:Firefox 100.0.2

背景

CSS常见有三种布局方式:

  • 标准流
  • 浮动
  • 定位

本文主要介绍浮动。

先来简单看一下标准流。标准流是基本的布局方式,说白了就是标签按照其默认方式排列。

  • 块元素:独占一行
  • 行内元素和行内块元素:一行可以有多个

要想打破默认的布局方式,一种办法是 display: block | inline | inline-block ,但是用浮动更加灵活方便。

浮动关键字: float: none | left | right

例1:左浮动

        div {
            float: left;
            width: 200px;
            height: 200px;
            background-color: blue;
        }
........
    <div>1</div>
    <div>2</div>
    <div>3</div>

效果如下:

在这里插入图片描述

div 是块级元素,默认会独占一行,现在加了浮动,三个 div 就处于同一行了(并排靠左)。

注意,这三个盒子之间没有空隙,如果不用浮动而用 display: inline-block ,则也能使得这三个盒子处于同一行,但是盒子之间会有空隙。

注意,如果把浏览器宽度缩小,以至于三个盒子在一行排不开,则会自动转行。

例2:左右浮动

        .left,
        .right {
            float: left;
            width: 200px;
            height: 200px;
            background-color: blue;
        }

        .right {
            float: right;
        }
........
    <div class="left">Left</div>
    <div class="right">Right</div>

效果如下:

在这里插入图片描述

例3:浮动的盒子不再保留原位置

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

        .box2 {
            width: 150px;
            height: 150px;
            background-color: black;
        }
........
    <div class="box1"></div>
    <div class="box2"></div>

效果如下:

在这里插入图片描述

可见,box1因为浮动,不再保留原位置,所以box2处于原先box1的位置。

注意,box1是浮动的,所以处于上层,也就是说,浮动盒子会覆盖标准流盒子。

例4:浮动盒子具有行内块元素的特点

浮动的盒子具有行内块元素的特点:比如一行内可以有多个元素,可以设置宽高,默认宽度为内容所占宽度,等等。

        span {
            float: left;
            width: 200px;
            height: 200px;
            background-color: blue;
        }

        div {
            float: right;
            height: 100px;
            background-color: blue;
        }
........
    <span>span1</span>
    <span>span2</span>
    <div>div1</div>

效果如下:

在这里插入图片描述

  • span 本来是行内元素,因为浮动,就可以设置宽高。
  • div 本来是块元素,不设置宽度的话,默认为其父元素的宽度,因为浮动,变成了默认为其内容所占的宽度了。

例5:浮动盒子只影响其后面的标准流

        div {
            width: 200px;
            height: 100px;
            background-color: blue;
        }

        .flt {
            float: left;
            width: 150px;
            height: 80px;
            background-color: green;
        }
........
    <div>div1</div>
    <div class="flt">div2</div>
    <div>div3</div>
    <div class="flt">div4</div>

效果如下:

在这里插入图片描述

本例中, dev2dev4 是浮动盒子。

  • 因为 dev1 是标准盒子,所以 dev2 会在它下面。
  • 因为 dev2 浮动,所以 dev3 也挨着 dev1 的下面。
  • 因为 dev3 是标准盒子,所以 dev4 会在它下面。

本例中,浮动盒子的高度小于标准盒子高度,如果把浮动盒子的高度增大为 120px ,效果如下:

在这里插入图片描述

注意本例中的 div4 ,它既受 div2 影响,也受 div3 影响。上例中因为 div2 高度小于 div3 ,所以 div4 不受 div2 影响。

注:可以打开浏览器的 Web Developer Tools ,选中 div2 或者 div4 ,然后直接修改其css的值:

在这里插入图片描述

清除浮动

浮动元素经常和标准流的父元素搭配。先用父元素确定位置和宽度,然后在里面采用浮动来排列子元素。现在问题来了,子元素的数量和高度可能会变化,那么该如何确定父元素的高度呢?

如果给父元素的高度设置一个定值,肯定不太好。但如果不设置高度,那也不行(默认是0)。这种情况下,解决办法是根据浮动的子元素自动确定父元素的高度,也就是清除浮动。

清除浮动有以下几种方法:

  • overflow 属性
  • after 伪元素
  • 双伪元素
  • 额外标签法

注:额外标签法是W3C推荐做法,但是因为要改变结构(平白添加网页标签),所以不太常用。

添加 overflow 属性

关键字: overflow: hidden | auto | scroll

        .box {
            overflow: hidden;
            width: 800px;
            border: 1px solid blue;
            margin: 0 auto;
        }

        .child {
            float: left;
            width: 200px;
            height: 100px;
            background-color: blue;
        }
........
    <div class="box">
        <div class="child">1</div>
        <div class="child">2</div>
        <div class="child">3</div>
        <div class="child">4</div>
        <div class="child">5</div>
    </div>
    <p></p>
    <div>end</div>

效果如下:

在这里插入图片描述
注意: overflow 属性设置要加在父盒子上,其值可设置为 hiddenautoscroll

添加 :after 伪元素

关键字:

        .clearfix:after {
            content: "";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }

        .clearfix {
            /* for IE6 & 7 */
            *zoom: 1;
        }

将其添加在父盒子上即可。

        .box {
            width: 800px;
            border: 1px solid blue;
            margin: 0 auto;
        }

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

        .clearfix:after {
            content: "";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }

        .clearfix {
            /* for IE6 & 7 */
            *zoom: 1;
        }
........
    <div class="box clearfix">
        <div class="child">1</div>
        <div class="child">2</div>
        <div class="child">3</div>
        <div class="child">4</div>
        <div class="child">5</div>
    </div>
    <p></p>
    <div>end</div>

效果如下:

在这里插入图片描述
注意 <div class="box clearfix"> 的写法。

添加双伪元素

关键字:

        .clearfix:before,
        .clearfix:after {
            content: "";
            display: table;
        }

        .clearfix:after {
            clear: both;
        }

        .clearfix {
            *zoom: 1;
        }

将其添加在父盒子上即可。

        .box {
            width: 800px;
            border: 1px solid blue;
            margin: 0 auto;
        }

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

        .clearfix:before,
        .clearfix:after {
            content: "";
            display: table;
        }

        .clearfix:after {
            clear: both;
        }

        .clearfix {
            *zoom: 1;
        }
........
    <div class="box clearfix">
        <div class="child">1</div>
        <div class="child">2</div>
        <div class="child">3</div>
        <div class="child">4</div>
        <div class="child">5</div>
    </div>
    <p></p>
    <div>end</div>

效果如下:

在这里插入图片描述
注意 <div class="box clearfix"> 的写法。

额外标签法

关键字: clear: both | left | right (一般只用 both

        .box {
            width: 800px;
            border: 1px solid blue;
            margin: 0 auto;
        }

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

        .clear {
            clear: both;
        }
........
    <div class="box">
        <div class="child">1</div>
        <div class="child">2</div>
        <div class="child">3</div>
        <div class="child">4</div>
        <div class="child">5</div>
        <div class="clear"></div>
    </div>
    <p></p>
    <div>end</div>

效果如下:

在这里插入图片描述
<div class="clear"></div> 是额外添加的空标签,纯粹是为了清除浮动。

注意:该标签必须是块元素。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值