flex 布局

137 阅读4分钟

1.视口布局:meta

1.viewport:视口

2.width=device-width:视口宽度 = 设备宽度

3.initial-scale=1.0:缩放1倍(不缩放)

  <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">

2.百分比布局:流式布局

1.百分比布局, 也叫流式布局

2.效果: 宽度自适应,高度固定。

3.多倍图:

(1.市场上手机不会有1倍清晰度屏幕 2.各大it公司直接使用高清图3倍图或者2倍即可)

1.3倍图:3倍清晰屏幕(2倍清晰屏幕至多只能感受2倍清晰浪费了一点点流量去加载不能直接显示完毕的3倍图)

2.2倍图:3倍清晰屏幕只能感受到2倍清晰图片使用2倍

3.1倍图:1倍清晰屏幕

<!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>
<body>
    
    <!-- 前端需要解决的问题
    1.一套代码 可以识别当前屏幕的清晰度 自动加载对应清晰度的图片 


    美工 说 前端呀 我给你三张图片  1倍清晰 2倍清晰 3倍清晰 


    2 解决方案 很简单!!   srcset

        PC 端 1     1.jpg
        iphone SE 2   2.jpg
        iphone 12 pro 3  3.png 


     

    3目前前端主流看待多倍图解决方式
    1 市场上手机不会有1倍清晰度屏幕
    2各大it公司直接使用高清图3倍图或者2倍即可
    图片使用3倍->3倍清晰屏幕完美
    图片使用3倍 ->2倍清晰屏幕至多只能感受2倍清晰浪费了一点点流量去加载不能直接显示完毕的3倍图
    图片使用3倍->1倍清晰屏幕手机淘汰很少

    图片使用2倍->3倍清晰屏幕只能感受到2倍清晰图片使用2倍->2倍清晰屏幕完美
    图片使用2倍->1倍清晰屏幕


-->


    <!-- 2倍清晰度来访问你的网页  出问题 -->
    <img srcset="./01-3种图片/001.jpg 1x, ./01-3种图片/002.jpg 2x, ./01-3种图片/003.jpg 3x" />
</body>
</html>

4.flex布局/弹性布局:

1.是一种浏览器提倡的布局模型

2.布局网页更简单、灵活

3.避免浮动脱标的问题

5.Flex布局模型构成:

1.作用:

1.基于 Flex 精确灵活控制块级盒子的布局方式,避免浮动布局中脱离文档流现象发生。

2.Flex布局非常适合结构化布局

2.设置方式:

1.父元素添加 display: flex,子元素可以自动的挤压或拉伸

3.组成部分

1.弹性容器

2.弹性盒子

3.主轴

4.侧轴/交叉轴

6.主轴对齐方式:justify-content:(简写:jc)

1.flex-start:默认值, 起点开始依次排列(左对齐)

2.flex-end:终点开始依次排列(右对齐)

3.center:沿主轴居中排列(居中对齐)

4.space-around(sd):弹性盒子沿主轴均匀排列, 空白间距均分在弹性盒子两侧 (间隔存放-两侧空间小于中间)

5.space-between (sb):弹性盒子沿主轴均匀排列, 空白间距均分在相邻盒子之间(先两侧对齐,间隔存放)

6.space-evenly (sv):弹性盒子沿主轴均匀排列, 弹性盒子与容器之间间距相等 (绝对平均)

7.侧轴对齐方式:单行 多行

1.单行: align-items:

		1.center 居中

​ 2.flex-start 上对齐

​ 3.flex-end 下对齐

​ 4.stretch 默认值 弹性盒子沿着主轴线被拉伸至铺满容器

<!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>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .box {
            width: 500px;
            height: 500px;
            background-color: green;
            display: flex;

            /* 垂直对齐居中 */
            align-items: center;
            /* 侧轴对齐方式(垂直对齐):align-items
            1.center 居中
            2.flex-start  上对齐
            3.flex-end     下对齐
            4.stretch   默认值 弹性盒子沿着主轴线被拉伸至铺满容器
            
            */
        }
        span {
            width: 100px;
            height: 100px;
            background-color: red;

        }
    </style>
</head>
<body>
    <div class="box">
        <span></span>
        <span></span>
        <span></span>
        <span></span>
    </div>
</body>
</html>

2.多行:align-content

  1. align-content: flex-start; 上对齐

  2. align-content: flex-end; 居中对齐

  3. align-content: center;下对齐

  4. 4.space-around(sd):弹性盒子沿侧轴均匀排列, 空白间距均分在弹性盒子两侧 (间隔存放-两侧空间小于中间)

  5. 5.space-between (sb):弹性盒子沿侧轴均匀排列, 空白间距均分在相邻盒子之间(先两侧对齐,间隔存放)

  6. 6.space-evenly (sv):弹性盒子沿侧轴均匀排列, 弹性盒子与容器之间间距相等 (绝对平均

<!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>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .box {
            width: 500px;
            height: 500px;
            background-color: green;
            display: flex;
            flex-wrap: wrap;
            
            align-content: flex-start;
            align-content: flex-end;
            align-content: center;
            align-content: space-between;
            align-content: space-around;
            align-content: space-evenly;
            /* 
4.space-around(sd):弹性盒子沿侧轴均匀排列, 空白间距均分在弹性盒子两侧 (间隔存放-两侧空间小于中间)

 5.space-between (sb):弹性盒子沿侧轴均匀排列, 空白间距均分在相邻盒子之间(先两侧对齐,间隔存放)

 6.space-evenly (sv):弹性盒子沿侧轴均匀排列, 弹性盒子与容器之间间距相等 (绝对平均) */
        }
        span {
            width: 100px;
            height: 100px;
            /* 如果不给子盒子设置高度  子盒子会默认平分父盒子高度 */
            background-color: red;

            align-self: center;
        }
    </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>

8.换行:flex-wrap

1.flex-wrap:warp 换行

2.flex-wrap:nowrap 不换行

3.注意:如果说设置了换行就不能使用 flex:1 均分属性

<!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>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .box {
            width: 500px;
            height: 500px;
            background-color: green;
            display: flex;
            flex-wrap: wrap;
            /* 默认情况下
            1.flex不会换行
            当子元素总宽度大于父元素宽度的时候  不会换行  只会压缩子元素的宽度
            2.设置 换行属性
            flex-wrap
             1.nowrap  不换行 */
             
        }
        span {
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </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>

9.flex子项

1.子项均分父项的宽(改变主轴方向:高)flex:1

1.如果不给子盒子设置高度 子盒子会默认平分父盒子高度

2.子项平分父项 1份宽度(改变主轴的方向下平分高度)

2.设置子项在侧轴的对齐方式:aline-self

1.flex-start

2.flex-end

3.center

3.子项:

1.主轴未改变

1.默认的宽度等于内容撑开

2.默认的高度 等于父项的高

3.flex:1 设置 子项的宽度

4.align-seft 设置 子项在侧轴上的对齐

2.主轴方向改变了 column

1.默认的高度 等于内容撑开

2.flex:1 设置 子项的高度

3.align-seft 设置 子项在侧轴上的对齐(水平)

4.默认的宽度等于父项的宽度

<!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>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .box {
            width: 500px;
            height: 500px;
            background-color: green;
            display: flex;
            
            /* 修改主轴方向:  flex-direction
            1.row 默认值 水平方向  从左到右   少用
            2.row-reverse  从右到左  少用
            3.column  从上到下  会用
            4.column-reverse  从下到上  少用  了解 */
            
            flex-direction: column-reverse;
            /* 当父项主轴发生改变
                子项由平分父项的宽度 改为平分父项的高度 */
            
            /* justify-content: center; */
            /* 理解:flex  是可以修改主轴方向的
             理解 :当主轴方向修改了之后
                 设置主轴对齐属性  效果也会跟着发生改变
                justify-content
                 align-items */
           

        }
        span {
            /* width: 100px; */
            height: 100px;
            /* 如果不给子盒子设置高度  子盒子会默认平分父盒子高度 */
            background-color: red;
            flex: 1;
            /* 子项平分父项 1份宽度(改变主轴的方向下平分高度) */
        }
        span:nth-child(3) {
            flex: 2;
            background-color: black;
            /* 第三盒子平分父项的  2份宽度(改变主轴的方向下平分高度) */
        }
    </style>
</head>
<body>
    <div class="box">
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>

    </div>
</body>
</html>

10.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>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        ul {
            width: 1000px;
            height: 700px;
            background-color: pink;
            display: flex;
            /* 转成 flex布局 */
            margin: 100px auto;
            flex-wrap: wrap;
            /* 换行 */
            list-style: none;
            /* 设置主轴对齐方式 */
            justify-content: space-around;
            /* 设置侧轴多行对齐方式 */
            align-content: space-around;

        }
        li {
            width: 22%;
            height: 44%;
            background-color: red;
            display: flex;
            flex-direction: column;
            /* 设置主轴方向:从上到下 */
            align-items: center;
            /* 侧轴对齐   水平对齐 */
            justify-content: space-evenly; 
            /* 设置主轴对齐方式 */

            padding: 70px 0;  
           }
        span {
            width: 50px;
            height: 50px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <ul>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
        <li>
            <span></span>
            <h6>食堂</h6>
            <p>干饭</p>
        </li>
     
     
    </ul>
</body>
</html>