当前位置: 首页 > article >正文

css:浮动

网页的本质上就是摆放盒子,把盒子摆到相应的位置上

css提供了三种传统的布局方式:

普通流(标准流):标签按默认方式排列,最基本的布局方式

浮动

定位

实际开发中,一个网页基本包含了三种这种布局方式

浮动

按照默认的标签布局方式,div只能占一行,也就是说不能出现两个div在同一行的情况

但是我们学了行内块模式,可以把块转化为行内块

display: inline-block;

可以看见虽然在一行,但是块与块的距离没办法调整,实际开发中,我们对横向块分布的距离是要精确到像素的

使用标准流难以让我们的盒子按想要的位置摆放

但是浮动可以,浮动最典型的应用就算让多个块级元素在一行内排列显示

所以我们网页布局的第一准则:多个块级元素纵向排列用标准流,横向排列找浮动

float: left/right/none/inherit;

盒子浮动的规则是:

  • left - 元素浮动到其容器的左侧
  • right - 元素浮动在其容器的右侧
  • none - 元素不会浮动(将显示在文本中刚出现的位置)。默认值。
  • inherit - 元素继承其父级的 float 值

如果给两个图片都施加left浮动,就会黏在一起

如果对他们施加了圆角边框会这样

如果一个left一个right就会紧挨父容器的左/右

浮动最典型的特性:脱离了标准流的控制。浮动的盒子不再保留原先位置

当菠萝吹雪放在草草的上面的时候,对菠萝吹雪施加float会使菠萝吹雪上浮,菠萝吹雪有了z轴,下面的曹操就会向上移动,占据原来菠萝吹雪的位置,呈现的效果就是和菠萝吹雪叠起来了

但是当草草放在上面的时候,对菠萝吹雪施加浮动,菠萝吹雪是不会向上顶端对齐的,因为他已经脱离标准流了

也就是说并不是所有的浮动都会盖在标准流上面,当标准流还是标准流的时候,它自己独占一行,他后面的浮动不可以盖在它上面;浮动的盒子只会影响后面的标准流,不会影响前面的标准流

一般防止出现这种问题,如果一个盒子里有很多盒子,其中一个盒子浮动了,就应该让剩下的兄弟盒子一起浮动

元素顶部对齐

浮动的元素对齐都是顶端对齐:

按上沿对齐捏

浮动的元素具有行内块的特性

当我们对行内元素施加了浮动以后,这个盒子就具有行内块元素的特性

平常你对span施加宽和高是没有作用的

  .x span {
            margin-top: 100px;
            background-color: aquamarine;
            width: 200px;
            height: 100px;

        }

但是如果给他施加浮动:

  .x span {
            margin-top: 100px;
            background-color: aquamarine;
            width: 200px;
            height: 100px;
            float: left;
        }

有宽高了!

其他元素也是这样的,如果没有宽的值会继承父亲的宽,但是变成行内块元素以后,就是行内块元素的属性,宽就是内部文字的宽

浮动元素经常和标准流的父级搭配使用

如果我们想要这样的效果怎么做:

可以看到盒子并不像我们写的盒子一样在最左和最右对齐,也不能保证大盒子在中间对齐

但是我们可以把浮动的盒子放在标准流的盒子里,让浮动的盒子在父级内浮动,就可以出现这样的效果了:

 .xy {
            background-color: azure;
            width: 700px;
            /* height: 500px; */
            margin: 0 auto;
        }//把x和y包进同一个盒子里

这样就又可以在正中间,又可以保持和body边框的间距

做个小demo:

放小米官网做排版

妈呀真是de死我了死bug

<!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>
        * {
            margin: 0;
            padding: 0;
        }

        li {
            list-style: none;
        }

        .box {
            width: 1226px;
            height: 644px;
            background-color: beige;
            margin: 0px auto;
            overflow: hidden;
        }

        .box .left {
            width: 234px;
            height: 460px;
            background-color: rgba(105, 101, 101, .6);
            float: left;
        }

        .box .right {
            width: 992px;
            height: 460px;
            background-color: blueviolet;
            float: left;
            text-align: center;

        }

        .box .right .png1 {
            width: 992px;
            height: 460px;
            display: block;

        }

        .box .bottom {
            margin-top: 474px;
            background-color: cadetblue;
            width: 1226px;
            height: 170px;
            /* float: right */
        }

        .box .bottom .bottom-l {
            width: 234px;
            height: 170px;
            background-color: blue;
            float: left;

        }

        .box .bottom .bottom-r>div {
            width: 316px;
            height: 170px;
            background-color: gold;
            float: right;
            display: block;
            margin: 0px 10px 0px 0px;
        }

        .box .bottom .bottom-r>div img {
            width: 316px;
            height: 170px;
        }

        .box .bottom .bottom-r .last {
            margin-right: 0px;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="left">

        </div>
        <div class="right">
            <img src="027dedf7486746ca8b768923c28b76c5.png" alt="" class="png1">
        </div>
        <div class="bottom">
            <div class="bottom-l"> </div>
            <div class="bottom-r">
                <div class="last"><img src="1ac77590368ff636d0b4f6a988133f55.png" alt="耳机"></div>
                <div><img src="8dede2520f8dfff9c9b690af498cafe8.jpg" alt="电视"></div>
                <div><img src="6b67117bc92924fb2ff0e7ad2be86084.png" alt="手机"></div>
            </div>
        </div>
    </div>
</body>

</html>

妹写完,就是做了个分区,和浮动的练习

常见网页布局格式

使用标准流父级

对大盒子细分:

做的更细就是这种:

我们尝试布局一下,大概就是:

<!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>
        
        * {
            margin: 0;
            padding: 0;
       

        .top {
            height: 50px;
            background-color: grey;
            text-align: center;
        }

        .banner {
            width: 980px;
            height: 150px;
            background-color: grey;
            margin: 15px auto;
            text-align: center;
        }

        .box {
            width: 980px;
            height: 300px;
            margin: 0px auto;
            background-color: deeppink;
        }

        .box li {
            width: 233.75px;
            height: 300px;
            background-color: grey;
            float: left;
            margin-right: 15px;
            text-align: center;
        }

        .box .last {
            margin-right: 0px;
        }

        .footer {
            height: 200px;
            background-color: grey;
            margin-top: 15px;
            text-align: center;
        }
    </style>
</head>
<section></section>

<body>
    

    <div class="top">top</div>
    <div class="banner">banner</div>
    <div class="box">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li class="last"></li>
        </ul>
    </div>
    <div class="footer">fooer</div>
</body>

</html>

清除浮动

有时候你的页面的父盒子的大小其实不是固定的:在网页里打开不同的文章,盒子的长度和文章的长度相搭配

所以这种情况下我们是不能给父盒子高度的

但是如果不给父盒子高度,又想让子盒子在同一行,就要加浮动

而加了浮动会导致父盒子的高度变为0,下面的标准流再接上来,会影响布局

这时候我们就需要清除浮动

清除浮动的本质是清除浮动元素造成的影响,适用于没给具体高度的父盒子;清除浮动以后,父级会根据浮动的盒子自动检测高度,父级有了高度,就不会影响下面的标准流了

如何清除浮动:

额外标签法也称隔墙法,是w3c推荐的做法

父级添加overflow属性

父级添加after属性

父级添加双伪元素

第一种:额外标签法

在最后一个浮动的元素后面加一个额外的标签(一定要是块级元素,因为行内元素没有高),对这个标签施加clear:both;来控制父盒子的高度既能被撑开,也不会影响下面的标准流

 .extern {
            clear: both;

        }

添加新的子盒子,父盒子也会被自动加长:

优点:通俗易懂,书写方便

缺点:添加了许多无意义的标签,结构化差

第二种:给父元素添加overflow

.box {
            overflow: hidden;
            width: 980px;
            /* height: 300px; */
            margin: 0px auto;
            background-color: deeppink;
        }

效果也是一样的

之前我们用这个代码解决了父子元素的塌陷问题

缺点是无法显示溢出父盒子的部分

第三种:after伪元素法

给父盒子起一个类名clearfix,然后施加这个声明


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

        .clearfix {
            zoom: 1;
        }

大意是用css施加了一个元素堵在最后面,也是一个额外标签的作用

算是额外标签法的升级版,因为是用css写的,不是用结构写的,所以优于额外标签法

缺点:下面那段代码是需要照顾低版本浏览器的

双伪元素清除浮动

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

        .clearfix:after {
            clear: both;
        }

        .clearfix {
            *zoom: 1;
        }

和上面是一个作用,区别是在前面也堵了一个标签,更符合闭合浮动的概念

总结:为什么清除浮动?

父级没有高度

子盒子浮动

影响下面的标准流布局

rz命令我恨你


http://www.kler.cn/a/402248.html

相关文章:

  • 服务器上部署并启动 Go 语言框架 **GoZero** 的项目
  • C++ —— 剑斩旧我 破茧成蝶—C++11
  • macOS 的目录结构
  • 苹果ASA归因对接以及API接入
  • Linux高阶——1116—环形队列生产者消费者
  • 优选算法 - 4 ( 链表 哈希表 字符串 9000 字详解 )
  • 【Android】线程池的解析
  • 【西瓜书】机器学习的模型评估
  • Spark RDD 中的 repartition 和 coalesce 是两种常用的分区调整算子的异同点
  • MMaction2:常见问题解答
  • 【AI+教育】一些记录@2024.11.16
  • 从0开始学习机器学习--Day26--聚类算法
  • vxe-table 表格多选启用快捷选择功能,鼠标滑动范围选择功能
  • 【Java系列】优化spring boot项目的启动加载,减少启动时的资源耗费的几种方案
  • 【MySQL-3】表的约束
  • 接口文档判断返回 List 还是 Array
  • 《Django 5 By Example》阅读笔记:p165-p210
  • [JavaWeb]微头条项目
  • UE5开发记录-如何解决播放完开始动画Sequence然后再显示UI?
  • SpringBoot服务多环境配置