前端web之flex布局

249 阅读3分钟

移动端

移动端特点

逻辑分辨率(可改):屏幕的宽度跟高度的单位是像素(PX);

设备分辨率(硬件不可改):屏幕中一共拥有的物理像素点的个数;

  1. 针对不同清晰度的设备,如何自动加载出对应清晰度的图片

答:srcset

1647505844031.png

1647507491663.png

    <img srcset="./images/1.jpg 1x, ./images/2.jpg 2x, ./images/3.png 3x" />
    后边的1x 2x 3x 指的是 1/2/3倍数清晰屏幕(逻辑分辨率跟设备分辨率倍数之比)

百分比布局

视口

按照web前端的发展,主要分为布局视口理想视口

  1. 布局视口特点:

    • html标签的大小是980px(当时的pc端版心都小于980px)
    • 页面上的元素都被缩放
  2. 理想视口:

        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    有这行代码就显示这个网页是理想视口 现在常用
    

移动端布局

移动端跟pc端布局区别:

1647510297072.png

1647510507199.png

flex布局

特点:

  1. 父级添加 display: flex;之后,称父级为父项,子级为子项;

  2. 具体变化:

    • 不在区分元素显示模式(块级元素、行内元素、行内块元素),都可以直接设置宽高等样式

    • 子项默认的宽度:由内容撑开

      ​ 默认的高度:等于父项的高度(原理是:侧轴的默认为拉伸)

    • 子项使用浮动没有效果;使用定位、外边距、transform有效

    • flex不会换行:默认情况下子项总宽度大于父项宽度时也不会换行,子项会压缩自身的宽度

1647511234787.png

语法:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>布局特点</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            display: flex;
            width: 600px;
            height: 600px;
            background-color: pink;
            margin: 200px auto;
        }

        span {
            /* 1.设置浮动无效 */
            /* float: right; */
            /* 2.定位有效
            position: absolute; */
            /* 3.margin有效
            margin-left: 200px; */
            /* 4.transform有效
            transform: translateX(100px); */
            top: 100px;
            left: 20px;
            width: 200px;
            height: 200px;
            background-color: aqua;
        }
    </style>
</head>

<body>
    <!-- div设置了flex后,称为父项,子级称为子项
    1.子级的宽度由自身撑开
    高度 等于父项的高度
    2.不在区分元素显示模式,都可以直接设置宽高等样式
    3.添加浮动没有效果
    使用定位,margin,transform 有效

    <div class="box">
        <span>1</span>
    </div>
     -->
    <div class="box">
        <!-- 默认情况下,子项总宽度大于 父项的宽度也不会换行!!! flex不会换行,只会压缩自身的宽度 -->
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span>
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span>
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span>
    </div>
</body>

</html>

1. 设置主轴对齐方式:

1647512963859.png

语法:

            /* 设置主轴对齐方式 */
            /* 1.盒子连在一起居中 */
            /* justify-content: center; */
            /* 2.子项之间出现间隔并对齐 */
            /* justify-content: space-between; */
            /* 3.两边的间隔宽于子项 */
            /* justify-content: space-around; */
            /* 4.间隔距离等同 */
            justify-content: space-evenly;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>布局特点</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            display: flex;
            width: 800px;
            height: 600px;
            background-color: pink;
            margin: 200px auto;

            /* 设置主轴对齐方式 */
            /* 1.盒子连在一起居中 */
            /* justify-content: center; */
            /* 2.子项之间出现间隔并对齐 */
            /* justify-content: space-between; */
            /* 3.两边的间隔宽于子项 */
            /* justify-content: space-around; */
            /* 4.间隔距离等同 */
            justify-content: space-evenly;
        }

        span {
            /* 1.设置浮动无效 */
            /* float: right; */
            /* 2.定位有效
            position: absolute; */
            /* 3.margin有效
            margin-left: 200px; */
            /* 4.transform有效
            transform: translateX(100px); */
            top: 100px;
            left: 20px;
            width: 200px;
            height: 200px;
            background-color: aqua;

        }
    </style>
</head>

<body>
    <!-- div设置了flex后,称为父项,子级称为子项
    1.子级的宽度由自身撑开
    高度 等于父项的高度
    2.不在区分元素显示模式,都可以直接设置宽高等样式
    3.添加浮动没有效果
    使用定位,margin,transform 有效

    <div class="box">
        <span>1</span>
    </div>
     -->
    <div class="box">
        <!-- 默认情况下,子项总宽度大于 父项的宽度也不会换行!!! flex不会换行,只会压缩自身的宽度 -->
        <span>1</span><span>2</span><span>3</span>
    </div>
</body>

</html>

2. 侧轴对齐方式 (单行跟多行)

单行对齐使用方式(align-items)

目标: 使用align-items调节元素在侧轴的对齐方式

修改侧轴对齐方式属性:

  • align-items(添加到父项)
  • align-self: 控制某个弹性盒子在侧轴的对齐方式(添加到子项)
实现居中布局

主轴:jcc

侧轴:aic

语法:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            /* 使用flex布局实现垂直居中更加方便 */
            display: flex;
            width: 600px;
            height: 600px;
            background-color: aqua;
            justify-content: center;
            align-items: center;
            margin-bottom: 100px;
        }

        span {
            width: 100px;
            height: 100px;
            background-color: pink;
        }

        .box1 {
            position: relative;
            /* display: flex; */
            width: 600px;
            height: 600px;
            background-color: aqua;
        }

        .box1 span {
            position: absolute;
            top: 50%;
            left: 50%;
            /* 原来的方式实现居中代码太多 */
            /* transform: translate(-50%, -50%); */
            margin-top: -50px;
            margin-left: -50px;
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div class="box">
        <span></span>
    </div>
    <div class="box1">
        <span></span>
    </div>
</body>

</html>
flex换行(flex-wrap: wrap)-侧轴多行对齐方式

1647566097861.png 默认情况下,子项的总宽度大于父项宽度,父项不会自动换行,只会压缩子项的宽度铺满一行。

1. 换行(flex-wrap: wrap;)

目标:使用flex-wrap: wrap 让flex布局进行换行

语法: flex-wrap: wrap;

效果图:但是换行不会紧贴着第一行(原因:出现多行(比如2行),flex自动分配高度(分为两份),只是因为设置了高度,所以默认的高度空在了那里)

  1. 效果图

1647568643494.png 2. 原理图

1647569237672.png

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            /* 使用flex布局实现垂直居中更加方便 */
            display: flex;
            width: 600px;
            height: 600px;
            background-color: aqua;
            /* justify-content: center;
            align-items: center;
            margin-bottom: 100px; */
            /* 换行 */
            /* flex-wrap: wrap; */
            flex-wrap: wrap;
        }

        span {
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div class="box">
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span>
    </div>
</body>

</html>
2. 侧轴多行对齐方式(align-content)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    .box {
        /* 使用flex布局实现垂直居中更加方便 */
        display: flex;
        width: 600px;
        height: 600px;
        background-color: aqua;
        margin: 100px auto;
        /* 换行 */
        flex-wrap: wrap;
        /* 多行 对齐方式: */
        /* 1.顶部对齐
        align-content: start; */
        /* 2.整体居中对齐
        align-content: center; */
        /* 3.底部对齐
        align-content: flex-end; */
        /* 4.侧轴多行对齐:中间宽度大于底部跟顶部
        align-content: space-around; */
        /* 5.侧轴多行对齐:子项之间存在间隔
        align-content: space-between; */
        /* 6.侧轴多行对齐:绝对平均分配间隔 */
        align-content: space-evenly;
    align-items: ;
    }

    span {
        width: 100px;
        height: 100px;
        background-color: pink;
    }
</style>

<body>
    <div class="box">
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span>
    </div>
</body>

</html>

3. 子项flex

1. flex:份数

目标: 使用flex属性修改弹性盒子伸缩比

  • 属性: flex : 值; (flex:数字)
  • 取值分类 : 数值(整数)

这个只占用父盒子剩余尺寸(去除其他盒子的占比空间)

若有多个盒子设置了“flex:数字”,则需将子项中的设置的所有份数加起来,用父项的剩余尺寸去除

语法:

 flex: 数字;

案例:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    .box {
        /* 使用flex布局实现垂直居中更加方便 */
        display: flex;
        width: 600px;
        height: 600px;
        background-color: aqua;
        margin: 100px auto;
        /* 换行 */
        flex-wrap: wrap;
        /* 多行 对齐方式: */
        /* 1.顶部对齐
        align-content: start; */
        /* 2.整体居中对齐
        align-content: center; */
        /* 3.底部对齐
        align-content: flex-end; */
        /* 4.侧轴多行对齐:中间宽度大于底部跟顶部
        align-content: space-around; */
        /* 5.侧轴多行对齐:子项之间存在间隔
        align-content: space-between; */
        /* 6.侧轴多行对齐:绝对平均分配间隔 */
        align-content: space-evenly;
    }

    span {
        width: 100px;
        height: 100px;
        background-color: pink;
    }
</style>

<body>
    <div class="box">
        <span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span>
    </div>
</body>

</html>
2. align-self 设置子项的属性

语法:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            display: flex;
            width: 600px;
            height: 600px;
            background-color: aqua;
        }

        span {
            width: 100px;
            height: 100px;
            background-color: pink;
        }

        span:nth-child(2) {
            background-color: yellow;
            align-self: center;
        }
    </style>

</head>

<body>
    <div class="box"><span>1</span><span>2</span><span>3</span><span>4</span></div>
</body>

</html>

修改主轴方向(flex-direction)

语法::

            <style>
		   /* 1.主轴方向:从左到右 (默认方向)
            flex-direction: row; */
            /* 2.主轴方向:从右到左(反方向) */
            flex-direction: row-reverse;
            /* 3.主轴方向:列 从上到下 (比较常用) */
            /* flex-direction: column; */
            /* 4.主轴方向:从下到上 */
            flex-direction: column-reverse;
            </style> 

当修改了主轴的方向时,原本默认的设置属性也会发生改变:

    <style>           
		   /* 1.主轴方向:从左到右 (默认方向)
            flex-direction: row; */
            /* 2.主轴方向:从右到左(反方向) */
            flex-direction: row-reverse;
            /* 3.主轴方向:列 从上到下 (比较常用) */
            /* flex-direction: column; */
            /* 4.主轴方向:从下到上 */
            flex-direction: column-reverse;
    </style> 

拓展

1.文字实现居中对齐

flex总结

<body>
    <!-- flex总结
    给父盒子添加ds,会出现如下的默认情况:
    1.默认子项可以直接设置宽高,且子项的默认宽度有内容撑开,默认高度等于父项高度。
    2.float 无效,外边距,定位以及转换有效;
    3.默认不换行,当子项的总宽度大于父项时,子项会自动压缩自身的宽度。

    父项
    设置主轴的方向:fd
    默认方向为rows 可修改为rows-reserve, column  column-reserve 
    设置主轴的对齐方式(6种)
    1.start 左对齐
    2.end 右对齐
    3.center 居中对齐
    4。jcsb 只有子项之间有间隔
    5. jcsa中间的宽度大于两侧
    6.jcse 绝对平均间隔

    设置侧轴的对齐方式
    一 单行侧轴:alight-items
    end start center
    二 多行侧轴
    1.需要先换行fw
    2. 对齐方式有6种:alight-content
      1-3 start end center
      4. acsb 侧轴盒子之间有间隔
      5. acsa 上下间距小于中间
      5.acse 侧轴间隔绝对平均

      子项:
      1.子项占父项宽度的比例:flex:数值
      2.子项在侧轴上的对齐方式:alight-self
    -->
</body>