首页 > 其他分享 >Flex弹性布局

Flex弹性布局

时间:2023-10-27 21:31:56浏览次数:25  
标签:Flex flex align 布局 弹性 wrap 对齐 项目 属性


typora-root-url: assetis


Flex弹性布局

1、本章目标

  • 会使用flex(弹性布局)实现页面布局
  • 会使用容器属性
  • 会使用项目属性
  • 能解决flex布局中遇到的问题

2、为什么出现Flex弹性布局?

  • 布局的传统解决方案,基于盒子模型,依赖 display 属性 + position属性 + float属性。它对于有些特殊布局非常不方便,比如,垂直居中就不容易实现(现有技术满足不了开发需求)

3、flex发展历史

2009年W3C 提出概念,但是官方没有flex这个词。当时使用display:box;表示弹性布局

2011年浏览器厂商决定使用flexbox,来形容它的布局特点

2015年W3C正式将其修改为flexbox布局

2016年5月官方正式公布最新的稳定的flex布局规范标准,各大浏览器的支持越来越稳定

4、flex定义

  • Flex是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性
  • 作用
  • 它能够更加高效方便的控制元素的对齐、排列
  • 可以自动计算布局内元素的尺寸,无论这个元素的尺寸是固定的还是动态的
  • 控制元素在页面的布局方向
  • 按照不同于DOM所指定排序方式对屏幕上的元素重新排序

5、应用场景

使用在现代浏览器中,史前浏览器不支持 如 chorme4.0 有一定宽容度要求的设计中,因为弹性布局灵活性太高,很难100%还原设计稿,需要有一定的宽容度的设计稿

6、Flex基本概念

  • 采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”
  • 默认水平方向为主轴(main axis)
  • 默认垂直方向为交叉轴、侧轴(cross axis)
  • 项目默认沿主轴排列

7、Flex布局语法

  • 语法
    想让谁成为flex布局的容器,就在该元素上设置flex属性
  • 块级元素 display : flex; / display:-webkit-flex
  • 行内元素 display : inline-flex;
  • 添加前缀,即浏览器前缀
  • 设为 Flex 布局以后,flex item(项目)的float、clear和vertical-align属性将失效,定位不失效>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            width: 100%;
            height: 600px;
            background-color: skyblue;
            list-style: none;
            display: flex;
         
        }
        span{
            display: inline-block;
        }

        li{
            width: 150px;
            height: 70px;
            margin: 20px;
            background-color: rgb(228, 177, 10);
        }
    </style>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
    </ul>


</body>

</html>

8、容器上的属性 - 设置flex 属性的元素

容器属性

说明

flex-direction

决定主轴的方向(即项目的排列方向)

flex-wrap

定义如果在一条轴线排不下,如何换行

flex-flow

复合属性:是flex-direction和flex-wrap属性的简写形式

justify-content

定义项目在主轴上的对齐方式

align-items

定义项目在交叉轴、侧轴上如何对齐

align-content

定义多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用

flex-direction [决定主轴的方向]:
决定主轴的方向(即项目的排列方向)
flex-direction: row | row-reverse | column | column-reverse;
属性值含义:
row(默认)、row-reverse:主轴为水平方向,起点在左端、右端
column 、column-reverse:主轴为垂直方向,起点在上沿、下沿

特点:

可以自动计算布局内元素的尺寸,无论这个元素的尺寸是固定的还是动态的

即:不论项目尺寸是多少,在不设置换行的情况下,会默认把所有的项目放在一行显示

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="">
    <script src=""></script>

    <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
            height: 500px;
            background-color: skyblue;
            display: flex;
            /* flex-direction: row; 默认沿x轴左右排列 */
            /* flex-direction: row-reverse  沿x轴倒序排列; */
            /* flex-direction: column  沿y轴从上到下排列; */
            /* 沿y轴从下到上排列 */
            flex-direction: column-reverse ;
        }
        li{
            width: 200px;
            height: 100px;
            margin: 20px;
            background-color: red;
        }
        ul>li:nth-of-type(2n){
            background-color: rgb(178, 231, 31);
        }
    </style>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
    </ul>

</body>

</html>
flex-wrap 定义如果在一条轴线排不下,如何换行:
默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义了如果一条轴线排不下,如何换行
flex-wrap: nowrap | wrap | wrap-reverse;
属性值含义
nowrap(默认):不换行
wrap:换行,第一行在上方
wrap-reverse:换行,第一行在下方

flex-wrap:wrap:

flex-wrap:wrap-reverse

flex-flow 主轴方向和换行属性复合写法:
是复合属性:是flex-direction和flex-wrap的简写形式,默认值为row nowrap
flex-flow: <flex-direction> || <flex-wrap>;
flex-flow: column wrap; //表示 主轴是x轴 换行排列
属性值:取两个属性的值即可 ,属性值中间用空格隔开

注意:

使用复合写法和分开的写法,要复合团队开发习惯

不能因为方便而失去了代码的可读性

justify-content: 设置主轴元素的排列
定义了项目在主轴上的对齐方式
justify-content: flex-start | flex-end | center | space-between | space-around;
属性值含义
flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
space-evenly:间距相等(均分)
ul{
            height: 500px;
            list-style: none;
            background-color: rgb(240, 126, 126);
            display: flex;
            justify-content: space-between;
        }
align-items: 设置侧轴元素的排列
定义项目在交叉轴上对齐方式
align-items: flex-start | flex-end | center | baseline | stretch;
属性值:具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下
flex-start:交叉轴的起点对齐
flex-end:交叉轴的终点对齐
center:交叉轴的中点对齐
baseline: 项目的第一行文字的下基线对齐
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度
align-content: 设置侧轴上的子元素的排列方式(多行)

设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。

定义了多根轴线时项目在交叉轴的对齐方式
align-content: flex-start | flex-end | center | space-between | space-around | stretch;

属性值

说明

flex-start

默认在侧轴的开始位置排列

flex-end

在侧轴的尾部开始排列

center

与侧轴的中间排列

space-between

与交叉轴两端对齐,轴线之间的间隔平均分布

space-around

每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。子项在侧轴平分剩余空间

stretch(默认值)

设置子项元素高度平分父元素高度,轴线占满整个交叉轴

//利用justify-content、align-items两个属性可以比较简单的解决传统布局中垂直居中对齐的难题
align-content和align-items区别:
  • align-items:适用于单行情况下,只有上对齐、下对齐、居中和拉伸
  • align-content: 适应于换行(多行)的情况下(单行情况下无效),可以设置上对齐、下对齐、居中、拉伸以及平均分配剩余空间等属性值。
  • 总结就是单行找align-items 多行找align-content

9、项目上的属性——子元素的属性

容器属性

说明

order

定义项目的排列顺序,数值越小排列越靠前,默认为0

flex-grow

定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大

flex-shrink

定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小

flex-basis

定义在分配多余空间之前,项目占据的主轴空间

flex

是复合属性,代表flex-grow, flex-shrink 和 flex-basis的简写

align-self

定义交叉轴上的对齐方式

order: 项目排列顺序
定义项目的排列顺序。数值越小,排列越靠前,默认为0
order: int;
属性值
必须为 0 或者 正整数
负数的话不起作用,会排列在首位,设置了order属性,会按照order属性的值大小排列
ul>li:nth-of-type(2){
            order: 1;
        }
flex-grow: 分配剩余空间
定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。主要作用是:分配剩余空间的
flex-grow: <number>;
属性值
不能为负数,虽然可以设置为正小数值,一般不这么用

对剩余空间进行分配,
比如:
第一个li flex-grow:1;
第二个li flex-grow:2;
第三个li flex-grow:3;

表示:剩余空间分了1+2+3  6份
第一个li 占1份
第二个li 占2份
第三个li 占3份
flex-shrink: 空间不足项目缩小
定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。主要作用是做缩小空间用的  0 没有空间也不缩小
flex-shrink: <number>;
属性值
负值对该属性无效

如flex-shrink:3; 表示在空间不足的情况下,其他元素缩小1,该元素缩小3份
flex-basis: 放大缩小比例前生效的宽高 类似我们设置的宽高
在flex-grow  和flex-shinrk属性起作用以前,定义每一个flex项目的默认大小,它的默认值为auto,即项目的本来大小。类似于width
flex-basis: auto || <length>;
属性值
length: 我们平常用的一些属性值,如 px、%、 rem等
flex:放大缩小默认值复合写法
是一个复合属性,代表flex-grow, flex-shrink 和 flex-basis的简写,后两个属性可选,默认值为0 1 auto
flex: auto | <'flex-grow'> [ <'flex-shrink'>  <'flex-basis'> ];
属性值
两个快捷值
flex:auto;代表 (1 1 auto)
flex:none;代表 (0 0 auto)
flex:1 存在剩余空间,就放大
align-self: 单个项目侧轴的属性
交叉轴上的对齐方式,允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性
align-self: auto | flex-start | flex-end | center | baseline | stretch;
属性值
默认值为auto,表示继承父元素的align-items属性
可能取6个值,除了auto,其他都与align-items属性完全一致

如:让其中一个项目填充整个侧轴:

ul>li:nth-of-type(1){
            margin: 10px ;
            height: auto;
            align-self: stretch;

        }

10、flex布局注意点

  • flex-direction的改变,一些依赖于主轴定义的属性也跟着改变
  • justify-content
  • align-content
  • align-items
  • 容器转为flex布局之后,项目不受float的影响
  • flex-wrap的默认是nowrap,我们需要设置才会自动换行

11、学员操作—制作《京东app底部》

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>京东app底部</title>
    <link rel="stylesheet" href="">
    <script src=""></script>

    <style>
        *{
            margin: 0;
            padding: 0;
        }
        footer{
            width: 100%;
            position: absolute;
            bottom: 0;
            display: flex;
            flex-direction: row;
            justify-content: space-between;
        }
        footer>a{
            flex: 1;//只要有剩余空间  就放大
        }

        img{
            width: 100%;
        }
    </style>
</head>

<body>
    <footer>
        <a href="#">
            <img src="./image/icon-home-active.png" alt="">
        </a>

        <a href="#">
            <img src="./image/icon-find.png" alt="">
        </a>

        <a href="#">
            <img src="./image/icon-cart.png" alt="">
        </a>

        <a href="#">
            <img src="./image/icon-catergry.png" alt="">
        </a>

        <a href="#">
            <img src="./image/icon-me.png" alt="">
        </a>

        

    </footer>

</body>

</html>
学员操作—左图右文字效果
学员操作—多列布局
学员操作-三栏布局
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>三栏布局</title>
    <link rel="stylesheet" href="">
    <script src=""></script>

    <style>
        *{
            margin: 0;
            padding: 0;
        }
        html,body{
            height: 100%;
            display: flex;
            flex-direction: column;
        }
        header,footer{
            width: 100%;
            height: 50px;
            background-color: rgb(253,69,0);
        }
        footer{
            background-color: rgb(146,237,144);
        }

        /* 中间部分弹性布局自动填充剩余部分 */
        main{
            flex: 1;
            display: flex;
        }

        .main_l{
            flex-grow:1 ;
            background-color: rgb(254,215,0);
        }
        .main_c{
            flex-grow: 3;
            background-color: rgb(254,165,0);
        }
        .main_r{
            flex-grow: 1;
            background-color: rgb(135,206,234);
        }


    </style>
</head>

<body>
    <header></header>
    <main>
        <div class="main_l"></div>
        <div class="main_c"></div>
        <div class="main_r"></div>
    </main>
    <footer></footer>


</body>

</html>

标签:Flex,flex,align,布局,弹性,wrap,对齐,项目,属性
From: https://blog.51cto.com/u_13937224/8062730

相关文章

  • Qt之堆栈布局(QStackedLayout)
    一、QStackedLayout概述QStackedLayout是Qt中的一个布局管理器,用于管理多个子窗口或页面的堆叠显示。它允许你在一个固定区域内显示多个子窗口,但每次只显示其中一个子窗口,其他子窗口被堆叠在后面。与QStackedWidget类似,但QStackedLayout是一个布局管理器,可以与其他布局管......
  • JAVA SWING之JFrame和JPanel布局
    初学JAVA的时候学习过SWING,每次写程序就直接复制Jframe和Jpanel设置,再调一下大小(不知道有没有人跟我一样),到现在也不清楚它们有什么关系,才回顾学习。Swing虽然是很老的技术了,但也有很多工具是Swing写的例如JetBrains系列,最常用的IDEA。开发一下小工具还是不错的。掌握整体布局后,再......
  • 网格布局grid
    起因昨天面试的时候,出了一道面试题,模拟面试公司的列表的元素宽度伸缩变化,根据屏幕大小的不同,一行上放置最多的元素,元素宽度不固定,间距固定,可换行,靠左对齐,当时猜出来用flex➕js监听resize来实现,最后发现媒体查询结合grid即可实现,所以今天的重头戏就是grid定义grid是一种布局......
  • flex 常用布局
    一、背景由于本人对样式很是头疼,一些常用的样式用就百度,所以整理下常用的样式.二、实现flex一个靠左一个靠右一个靠左一个靠右<body><div><!--父盒子--><divclass="father_box"><!--第一个盒子--><div>我是最左边的内容</div><!......
  • ECI (Elastic Container Instance) 弹性容器实例
    弹性容器实例ECI(ElasticContainerInstance)是阿里云在云原生时代为用户提供的基础计算服务,是阿里云云原生时代下的云计算基础设施。ECI改变了以往计算服务以整台机器作为交付形态的传统,通过结合容器技术与无服务器(Serverless)技术为用户提供了一款安全便捷的Serverless......
  • css---等宽瀑布流布局制作
    瀑布流布局效果如下图:当前项目需求,如下图:商品展示,需要按接口返回的顺序展示,依次从左至右,从上至下。  方案1:CSS3column属性(实现的布局顺序为先从上到下,再从左至右,所以这种方式仅适用于数据固定不变的情况,对于滚动加载更多等可动态添加数据的情况就并不适用了。)关键思......
  • 从零用VitePress搭建博客教程(4) – 如何自定义首页布局和主题样式修改?
    接上一节:从零用VitePress搭建博客教程(3)-VitePress页脚、标题logo、最后更新时间等相关细节配置六、首页样式修改有时候觉得自带的样式不好看,想自定义,首先我们在docs/.vitePress新建一个theme文件夹,用来存放自定义布局和主题修改的相关文件,如下所示theme下再新建custom.css......
  • Flex 布局项目实战,好像没那么难!
    在上篇文章别再用float布局了,flex才是未来!中,我们聊到Flex布局才是目前主流的布局方式。在文章最后,我们还贴了一个案例,并且还浅浅地讲解了一下。有些小伙伴说,这讲解得太粗了,要是能够再深入讲解一下,顺便把代码分享分享就好了。那么,今天我们就继续来扒一扒这个项目的布局实现。......
  • 【虹科干货】如何构建弹性、高可用的微服务?
    基于微服务的应用程序可实现战略性数字转型和云迁移计划,对于开发团队来说,这种架构十分重要。那么,如何来构建弹性、高可用的微服务呢?RedisEnterprise给出了一个完美的方案。文况速览:什么是微服务架构?为什么微服务很重要?RedisEnterprise:微服务的完美方案微服务架构的设计模式适合微......
  • flex and bison usage in mysql
    queryparsinginmysqlmysqlsourcecodeversion:8.0.34(fromMYSQL_VERSIONfile)Thisanarticlefromquestionstounderstandings.whichfiledoesmysqlusetodefinesqlgrammar?sql/sql_yacc.yywhatisthenameyyparsereplacedwithinmysql?Sear......