CSS的使用(四)——网页布局方式

网页的布局也就是如何对网页的元素进行排版。

一、标准流排版方式

我们所创建的元素默认的排版方式为标准流排版方式。也就是块级元素垂直排布,行内元素水平排布;同时也可以使用display对其排版方式进行修改,使用该方式两个元素之间有个缝隙。

display: inline-block;

二、浮动流排版方式(浮动布局)

若想在页面中脱离标准流,可以通过float浮动的方式,属性值为left向左向上浮动,right则向右向上浮动,采用该方式两个元素之间没有空隙。

float: left;

浮动,也就是漂浮起来。如果我们对第一个元素设置了float,但是没有对第二个设置,那么第一个元素就会漂浮起来,第二个元素就会被其覆盖。

        .div1{
            width: 200px;
            height: 200px;
            background-color: red;
            float: left;
        }
        .div2{
            width: 400px;
            height: 400px;
            background-color: yellow;
        }

相反的,如果我们只对第二个元素设置了float,由于第一个元素仍是块级元素自己占一行,因此第二个元素浮动在第一个元素下方,仍然是分两行的。(即如果浮动元素上边是⼀个没有浮动的块元素,则浮动元素不会超过块元素。)

2.1 浮动中的字围现象

简单来说,“字围现象”就是浮动的元素不会挡住未浮动的文字元素。同时,我们要注意,浮动流中没有居中对齐。

    <style>
        img{
            width: 80px;
            float: left;
        }
    </style>

    <!-- 图片 -->
    <img src="https://pics1.baidu.com/feed/1ad5ad6eddc451da9ddd508586207168d116329b.jpeg@f_auto?token=b68772755670d32a3313c2df0ff8ce7d" alt="">
    <!-- 文字描述 -->
    <p>第一章:程序员的浪漫,QQ的诞生
    1993年,马化腾从深圳大学毕业,怀揣着对计算机的热爱,踏入了互联网这片新兴领域。那时的他,或许还不知道自己即将开启一个怎样的时代。1998年,一个名为OICQ的即时通讯软件横空出世,这就是后来大名鼎鼎的QQ。据说,马化腾最初的动机很简单,就是想解决自己和朋友们之间的沟通问题。谁承想,这个“为了方便自己”的小工具,竟成了几代人的青春记忆,也让马化腾一跃成为了“社交魔术师”。
    第二章:“企鹅爸爸”的幽默日常</p>

2.2 高度塌陷现象

在⽂档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高。

    <style>
        .father{
            width: 500px;
            border: 5px solid red;
        }
        .son{
            width: 200px;
            height: 200px;
            background-color: blue;
        }
    </style>

    <div class="father">
        <div class="son"></div>
        <div class="son"></div>
        <div class="son"></div>
    </div>

但是当为子元素设置浮动以后,子元素会完全脱离文档流,此时将会导致子元素⽆法撑起父元素的高度,导致父元素的高度塌陷。

 float: left;

那么如何解决高度塌陷问题呢?

1.把父元素高度写死。

2.在子元素的最后加一个用作撑起父元素的空div。(不推荐,可能会引起结构混乱。)

        <!-- 撑起父元素的div -->
        <div style="clear: both;"></div>

clear属性取值有:right清除右浮动、left清除左浮动、both清除全部。

3.通过父元素的after伪类选择器,为其增加一个空元素。

        /* 解决父元素高度塌陷的方案 */
        .father::after{
            /* 空白元素 */
            content: '';
            /* 将空白元素切换为块级元素 */
            display: block;
            /* 清除浮动 */
            clear: both;
        }

4.使用BFC解决。(不推荐,当子元素比较多时,这种方式会出现滚动条。)

            /* 开启BFC解决 */
            overflow: auto;

格式化上下文(BFC),MDN对其的定义为:块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的⼀部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。简单来说,BFC是一个独立的布局环境,其内部元素布局与外部互不影响。

BFC布局规则:

1. 内部的Box会在垂直方向⼀个接着⼀个地放置。

2. Box垂直方向上的距离由margin决定。属于同⼀个BFC的两个相邻的Box的margin会发⽣重叠。

3. 每个盒子的左外边框紧挨着包含块的左边框,即使浮动元素也是如此。

4. BFC的区域不会与float box重叠。

5. BFC就是页面上的⼀个隔离的独⽴容器,容器里面的子元素不会影响到外⾯的元素,反之亦然。

6. 计算BFC的高度时,浮动子元素也参与计算。

哪些元素会生成BFC:

1.根元素

2.float属性不为none

3.position为absolute或fixed

4.display为inline-block table-cell table-caption flex inline-flex

5.overflow不为visible

作用:

解决高度塌陷问题,以及两栏、三栏的自适应布局。

三、定位流排版方式(定位布局)

浮动定位常用于界面的框架搭建,而定位布局常用于细节的刻画。

3.1 静态定位

所有元素默认的定位方式即为静态定位,默认文档流。

        .div1{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .div2{
            width: 200px;
            height: 200px;
            background-color: rgb(0, 255, 0);
        }
        .div3{
            width: 200px;
            height: 200px;
            background-color: blue;
        }

    <div class="div1"></div>
    <div class="div2"></div>
    <div class="div3"></div>

3.2 相对定位

相对定位relative是以自己为基准点进行各个方向(top right bottom left)的偏移,是不脱离标准流的,会区分块级、行内元素。在使用过程中,不论偏移到任何位置,任然会占用标准流的位置。

        .div2{
            width: 200px;
            height: 200px;
            background-color: rgb(0, 255, 0);
            /* 相对定位 */
            position: relative;
            /* 通过top right bottom left来设置当前位置 */
            left: 200px;
            top: 200px;
        }

3.3 绝对定位

绝对定位absolute是以浏览器的左上角为基准点进行偏移,是脱离标准流的。如果祖先元素在定位流(任何定位布局均可)中,子元素设置绝对定位时是以祖先元素的左上角为基准点进行偏移的,同时会忽略祖先元素设置的padding值。上面的情况我们称作“子绝父相”,我们常用这种方式进行布局的细节刻画。

        .div2{
            width: 300px;
            height: 300px;
            border: 1px solid;
            /* 父-相对定位 */
            position: relative;
        }
        .div2 .son{
            width: 100px;
            height: 100px;
            background-color: rgb(0, 255, 0);
            /* 子-绝对定位 */
            position: absolute;
            /* 水平方向居中 */
            left: 50%;
            margin-left: -50px;
            /* 垂直方向居中 */
            top: 50%;
            margin-top: -50px;
        }

    <div class="div2">
        <div class="son"></div>
    </div>

3.4 固定定位

固定定位fixed也是以页面左上角为基准点偏移,是脱离标准流的,和前面的背景关联方式很像。我们常见的用途为“回到顶部”按钮。

        .toTop{
            text-align: center;
            width: 70px;
            line-height: 70px;
            border: 1px solid;
            /* 固定定位 */
            position: fixed;
            bottom: 40px;
            right: 40px;
        }

    <div class="toTop">
        <a href="#">回到顶部</a>
    </div>

3.5 粘滞定位

粘滞定位sticky表现为当元素在容器中被滚动超过指定的偏移值时,元素在容器内固定在指定位置。如下,设置了top: 20px,那么在sticky元素到达距离相对定位的元素顶部20px的位置时固定,不再向上。

        /* 父容器样式 */
        .container{
            width: 1000px;
            height: 4000px;
            margin: 0 auto;
        }
        /* 对所有的div子元素进行样式设置 */
        .container div{
            width: 1000px;
            height: 500px;
        }
        /* 隔行变色 */
        .container div:nth-child(odd){
            background-color: yellow;
        }
        .container div:nth-child(even){
            background-color: red;
        }
        /* 左侧侧边栏 */
        .container .left{
            width: 100px;
            height: 400px;
            background-color: blue;
            float: left;
            margin-left: -150px;
            /* 粘滞定位 */
            position: sticky;
            top: 20px;
        }
        /* 右侧侧边栏 */
        .container .right{
            width: 100px;
            height: 400px;
            background-color: blue;
            float: right;
            margin-right: -150px;
            /* 粘滞定位 */
            position: sticky;
            top: 20px;
        }


    <div class="container">
        <div></div>
        <!-- 左边侧边栏 -->
        <aside class="left"></aside>
        <!-- 右边侧边栏 -->
        <aside class="right"></aside>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

z-index

专门用于控制定位流元素的覆盖关系的一个属性,默认值为0,其数值越大显示越靠上。我们在网页开发时一般不使用,容易造成混乱。

四、弹性布局(flex)

采用flex布局的元素,称为flex弹性容器。只要在父元素中声明display: flex;,则父元素即为父容器,该父容器的所有子元素均为弹性元素。弹性元素也可以再次声明为容器,因此⼀个元素既可以是弹性容器也可以是弹性元素。

每个弹性容器都有两根轴:主轴和交叉轴,两轴之间成90度关系。但是轴向可以发生变化,因此,水平的轴不一定是主轴。

flex布局是⼀种⼀维布局模型,一次只能处理一行或一列元素,即flex布局大多作用于主轴,交叉轴只是被动变化。如果子元素的宽高超过了父元素的大小,flex布局会将子元素进行压缩,因此一般不会超出父元素。

4.1 容器属性

容器属性就是加在父容器的属性。

flex-direction:用于修改主轴轴向。属性值有:row横向排列(默认)、row-reverse横向顺序倒转、column纵向排列、column-reverse纵向顺序倒转。

flex-wrap:用于控制子元素换行。属性值有:nowrap不换行(默认)、wrap换行、wrap-reverse反向换行(就是第一行变为最后一行)。

flex-flow:以上两种属性的简写方式。

justify-content:改变主轴(根据flex-direction的值判断是主轴还是交叉轴)的对齐方式。属性值有:flex-start左对齐(默认)、flex-end右对齐、center居中对齐、space-between元素和元素之间的空隙平分、space-around元素和元素之间的空隙是元素和父容器之间空隙的二倍、space-evenly元素和元素之间以及元素和父容器之间空隙平分。

align-items:改变交叉轴的对齐方式。属性值有:stretch如果没写子元素的高度则在容器中铺满(默认)、flex-start顶部对齐、flex-end底部对齐、center居中对齐、baseline根据第一行文字基线对齐。

<!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>
        /* 父元素样式 */
        .father{
            width: 500px;
            height: 500px;
            border: 1px solid;
            margin: 20px auto;
            /* 开启flex布局 */
            display: flex;
            /* 主轴方向 */
            /* flex-direction: row; */
            /* 控制子元素是否换行 */
            /* flex-wrap: nowrap; */
            /* 简写格式 */
            flex-flow: row wrap;
            /* 主轴方向上的对齐方式 */
            justify-content: space-evenly;
            /* 交叉轴方向上的对齐方式 */
            align-items: center;
        }
        /* 子元素样式 */
        .div1,.div2,.div3{
            width: 100px;
            height: 100px;
            text-align: center;
            color: white;
            font-size: 28px;
        }
        .div1{
            background-color: blue;
        }
        .div2{
            background-color: red ;
        }
        .div3{
            background-color: green;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="div1">item1</div>
        <div class="div2">item2</div>
        <div class="div3">item3</div>
    </div>
</body>
</html>

align-content:改变多行元素在交叉轴方向的对齐方式,如果项目只有一行不会生效,需设置 flex-wrap:wrap;才生效。属性值有:stretch自动适应高度(默认)、flex-start顶部对齐、flex-end底部对齐、center居中对齐、space-between行元素和行元素之间的空隙平分、space-around行元素和行元素的间隙是行元素与父容器间隙的两倍、space-evenly行元素和行元素之间以及行元素和父容器之间空隙平分。

            /* 简写格式 */
            flex-flow: row wrap;
            /* 交叉轴方向上的多行对齐方式 */
            align-content: space-evenly;

4.2 元素属性

元素属性就是加载子元素上的属性。

flex-grow:用于控制元素在空间有剩余时是否放大,默认值为0不放大。假设默认三个元素中前两个是0,最后的一个元素是1,最后的元素占满剩余所有空间。(会覆盖width)

        .div2{
            background-color: red ;
            /* 放大div2 */
            flex-grow: 2;
        }

flex-shrink:用于控制元素在空间不足时是否缩小,默认值为1,即空间不足时一起等比缩小。如果某一个元素设置为0,则在空间不足时也不缩小。(会覆盖width)

        .div3{
            background-color: green;
            /* div3不缩小 */
            flex-shrink: 0;
        }

flex-basis:用于控制元素的宽度,默认值为auto,也就是默认宽度或者设置的width。(会覆盖width)

        .div1{
            background-color: blue;
            /* 宽度改为200px */
            flex-basis: 200px;
        }

flex:以上三个属性的简写方式。常用flex:1;也就是放大,其余为默认值;none为不放大不缩小;auto为等分放大缩小。

        .div1{
            background-color: blue;
            /* 有空隙时放大 */
            flex: 1;
        }

order:用于改变元素排列顺序,默认值为0,值越大越靠后。

        .div1{
            background-color: blue;
            /* 排列顺序 */
            order: 5;
        }

align-self:用于让个别元素在交叉轴向有与众不同的自己的对齐方式。属性值有:auto与其他相同(默认)、flex-start单独顶部对齐、flex-end单独底部对齐、center单独居中对齐、baseline单独第一行字基线对齐、stretch在容器中铺满。

        .div2{
            background-color: red ;
            /* div2单独底部对齐 */
            align-self: flex-end;
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小羊...

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

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

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

打赏作者

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

抵扣说明:

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

余额充值