第六届字节跳动青训营 CSS布局技巧 实践记录 | 青训营

71 阅读4分钟

笔者在学习CSS布局后,汇总CSS布局技巧,分析他们的应用场景,并动手实践操作,并记录为此篇文章

标准流:元素的标准(默认)排布规则,例如:块级元素独占一行、行内元素一行可以多个

浮动布局

使块级元素同行显示(最初的目的是图文混排)

属性名:float:left/right(左对齐/右对齐)

特点:顶对齐;具有行内块显示模式的特点;脱标(不占用标准流的位置,可能出现与标准流重合的情况);父级宽度不够时,浮动的子级会换行

应用场景:图片浮动、左右结构布局、多列布局

实践:产品区域布局

image.png

实现代码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>title</title>

    <style>

*{

        padding: 0;

        margin: 0;

       }

       li{

        list-style:none;

       }

       .product{

        margin: 50px auto;

        width: 1226px;

        height: 628px;

        background-color: white;

       }

       .left{

        float: left;

        width: 234px;

        height: 628px;

        background-color: skyblue;

       

       }

       .right{

        width: 978px;

        height: 628px;

        background-color: white;

        float: right;

       }

       .right li{

        float: left;

        margin-right: 14px;

        margin-bottom: 14px;

        width: 234px;

        height: 300px;

        background-color: skyblue;

       }

       .right li:nth-child(4n){

        margin: 0;

       }

    </style>

 

</head>

<body>

    <div class="product">

        <div class="left"></div>

        <div class="right">

            <ul>

                <li></li>

                <li></li>

                <li></li>

                <li></li>

                <li></li>

                <li></li>

                <li></li>

                <li></li>

            </ul>

        </div>

    </div>

</body>

</html>

 

实现结果:

image.png

清除浮动

原因 :由于浮动脱标,当父级没有设置height时,子级浮动无法撑开父级高度(可能导致父级没有高度)

做法

1.额外标签法:在父级内容的最后添加一个块级元素,设置属性clear:both

2.单伪元素法:在父级内容的最后添加一个块级伪元素,设置属性clear:both

3.双伪元素法:

.cleafix::before,

       .cleafix::after{

        content: "";

        display: table;

       }

       .cleafix::after{

        clear: both;

       }

4.overflow:为父级添加overflow:hidden

Flex布局

也叫弹性布局,浏览器倡导的布局模型,适合结构化布局,提供了强大的空间分步和对齐能力;不会产生脱标,布局页面更简单灵活

给父级元素添加属性:display:flex

子元素可以自动挤压或拉伸

组成部分:弹性容器;弹性盒子;主轴(默认在水平方向);侧轴/交叉轴(默认在垂直方向)  

弹性盒子沿着主轴排列

默认情况下,主轴方向尺寸由内容决定,侧轴方向尺寸拉伸

主轴对齐方式:justify-content:center(居中)/space-between(空白分配给盒子之间间距)/space-around(空白分配给盒子两侧)/space-evenly(盒子与容器之间间距相等)  

侧轴对齐方式:align-items(所有盒子)/align-self(某个盒子)

属性值:stretch(拉伸,前提是盒子侧轴方向无尺寸)/center(居中)

修改主轴方向:flex-direction:column(主轴变为垂直方向,侧轴变为水平方向)

(主轴)弹性伸缩比flex:整数(表示盒子占用父级剩余尺寸的份数)

换行属性flex-wrap:wrap/nowrap(不换行,默认,自动挤压或拉伸)

行对齐方式align-content:center(居中)/space-between(空白分配给行之间间距)/space-around(空白分配给行两侧/space-evenly(行与容器之间间距相等)

应用场景:骰子布局、网格布局、百分比布局、圣杯布局、输入框布局、悬挂式布局等

实践:解决方案布局

实现代码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>解决方案布局</title>

    <style>

*{

        margin: 0;

        padding: 0;

        box-sizing: border-box;

       

       }

       li{

        list-style: none;

       }

       .solution{

        width: 1400px;

        height: 600px;

        margin: 100px auto;

        border: 1px solid #dddddd;

        border-radius: 10px;

       

       }

       .solution ul{

        padding: 50px;

        height: 600px;

        display: flex;

        flex-wrap: wrap;

        justify-content: space-between;

        align-content: space-between;

       }

       .solution ul li{

        display: flex;

       

        height: 200px;

        width: 500px;

       }

       .solution .pic{

        margin-right: 15px;

       }

       .solution .text h4{

        line-height: 40px;

        font-size: 20px;

        font-weight: 400;

        color: #333;

       }

       .solution .text p{

        font-size: 14px;

        color: #666;

       }

    </style>

 

</head>

<body>

    <div class="solution">

        <ul>

            <li>

                <div class="pic">

                    <img src="./images/档案管理.png" alt="转存失败,建议直接上传图片文件">

                </div>

                <div class="text">

                    <h4>解决方案</h4>

                    <p>解决方案内容</p>

                </div>

            </li>

            <li>

                <div class="pic">

                    <img src="./images/档案管理.png" alt="转存失败,建议直接上传图片文件">

                </div>

                <div class="text">

                    <h4>解决方案</h4>

                    <p>解决方案内容</p>

                </div>

            </li>

            <li>

                <div class="pic">

                    <img src="./images/档案管理.png" alt="转存失败,建议直接上传图片文件">

                </div>

                <div class="text">

                    <h4>解决方案</h4>

                    <p>解决方案内容</p>

                </div>

            </li>

            <li>

                <div class="pic">

                    <img src="./images/档案管理.png" alt="转存失败,建议直接上传图片文件">

                </div>

                <div class="text">

                    <h4>解决方案</h4>

                    <p>解决方案内容</p>

                </div>

            </li>

           

        </ul>

    </div>

</body>

</html>

实现效果:

image.png

定位布局

灵活地改变盒子在页面中的位置(将两个标签重合)

相对定位

相对原来的位置移动;不脱标,占位;不改变标签显示模式

position: relative

边偏移属性:top/left:100px

绝对定位

脱标,不占位;显示模式改变,宽高生效(行内块)

使用场景:子级绝对定位,父级相对定位;

参照物:在祖先元素中逐级寻找已定位的元素作为参照,若没找到,则以浏览器页面为参照

应用场景:轮播图;标签重合场景;定位居中(登录页面)

 

固定定位

页面滚动时元素位置不改变

position: fixed

top:0

以浏览器为参照改变位置

脱标,不占位

显示模式改变,行内块

应用场景:顶部搜索栏;侧边导航栏

定位标签重叠问题

默认情况:标签书写顺序靠后的在上面

解决:z-index属性,属性值为整数,整数越大越靠上

实践:图片与文字重叠(文字作为图片的标题或介绍)

实现代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title></title>

    <style>

 

div{

        width: 200px;

        position: relative;

        background-color: skyblue;

       }

       p{

        position: absolute;

        top: 0;

        right: 0;

       }

    </style>

 

</head>

<body>

    <div>

        <img src="./images/档案管理.png" alt="转存失败,建议直接上传图片文件">

        <p>档案管理</p>

    </div>

</body>

</html>

实现效果

image.png