CSS3-弹性布局

弹性布局(伸缩布局)

  • 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现
  • flex 意为弹性盒子模型,用来为盒状模型提供最大的灵活性。任何一个容器(标签元素)都可以指定为flex布局。最好带上-webkit-前缀
  • 用法:
用法: display:flex 或 display:inline-flex 或 display:-webkit-flex
  • 采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex子项目(flex item),简称”项目”
    flex容器盒子模型
  • 容器默认存在两根轴
    • 水平的主轴(main axis)和垂直的交叉轴(cross axis)
    • 主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end
    • 交叉轴(纵轴)的开始位置叫做cross start,结束位置叫做cross end
    • item项目默认沿主轴从左往右排列
    • 单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size
  • 当给一个盒子设置了display:flex之后,这个盒子就有了主轴和交叉轴的概念。 主轴:Flex容器的主轴主要用来配置Flex项目,默认是水平方向 交叉轴:与主轴垂直的轴称作交叉轴,默认是垂直方向的 方向:默认主轴从左向右 ,默认交叉轴从上到下

给容器设置的样式

flex-direction

flex-diretion主要是用来调整主轴的方向的,默认是水平方向

  • flex-direction: row | row-reverse | column | column-reverse
  • row(默认值):主轴为水平方向,起点在左端
  • row-reverse:主轴为水平方向,起点在右端
  • column:主轴为垂直方向,起点在上沿
  • column-reverse:主轴为垂直方向,起点在下沿
    在这里插入图片描述

justify-content

justify-content属性定义了子项目在主轴上的对齐方式。(假设主轴为从左到右)

  • justify-content: flex-start | flex-end | center | space-between | space-around
  • 具体对齐方式与轴的方向有关。下面假设主轴为从左到右
    • aflex-start(默认值):左对齐
      在这里插入图片描述
    • flex-end:右对齐
      在这里插入图片描述
    • center: 居中
      在这里插入图片描述
    • space-between:两端对齐,项目之间的间隔都相等
      在这里插入图片描述
    • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
      在这里插入图片描述

flex-wrap

flex-wrap属性 默认情况下,子项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,如果一条轴线排不下,如何换行

  • flex-wrap: nowrap | wrap | wrap-reverse;
  • nowrap(默认):不换行
    在这里插入图片描述
  • wrap:换行,第一行在上方
    在这里插入图片描述
  • wrap-reverse:换行,第一行在下方
    在这里插入图片描述

align-items

align-items 属性定义子项目在交叉轴上如何对齐。(假设交叉轴从上到下)

  • align-items: flex-start | flex-end | center | baseline | stretch;
  • 具体的对齐方式与交叉轴的方向有关
    • flex-start:交叉轴的起点对齐
      在这里插入图片描述
    • flex-end:交叉轴的终点对齐
      在这里插入图片描述
    • center:交叉轴的中点对齐
      在这里插入图片描述
    • baseline: 项目的第一行文字的基线对齐
      在这里插入图片描述
    • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度
      在这里插入图片描述

align-content

align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。只适用于多行的flex容器

  • align-content: flex-start | flex-end | center | space-between | space-around | stretch
  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

flex-flow

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap

flex-flow: <flex-direction> || <flex-wrap>

示例代码1:flex参数详解

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02-flex参数详解</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        li {
            list-style: none;
        }
        ul {
            width: 600px;
            height: 400px;
            border: 1px solid #000;
            margin: 50px auto;
            /*
                只要给盒子指定display: flex;这个盒子就成为了伸缩盒子(flex布局 弹性盒子)
                就拥有了主轴和交叉轴的概念,默认主轴水平往右,交叉轴垂直往下,盒子在主轴方向从左往右进行排布
            */
            display: flex;
            /*
                注意:主轴的方向是可以进行控制的,通过flex-direction 可以取四个值
                flex-direction:主要是用来调整主轴的方向的,默认是水平方向
                    1.row:主轴方向为水平向右
                    2.column:主轴方向为竖直向下
                    3.row-reverse:主轴方向为水平向左
                    4.column-reverse:主轴方向是竖直向上
            */
            flex-direction: row; /*主轴默认的排布方式*/
            /*flex-direction: column;*/
            /*flex-direction: row-reverse;*/
            /*flex-direction: column-reverse;*/
            /*
                主轴方向对齐方式
                justify-content主要用来设置主轴方向的对齐方式
                    1.flex-start: 弹性盒子元素将向起始位置对齐
                    2.flex-end: 弹性盒子元素将向结束位置对齐
                    3.center: 弹性盒子元素将向行中间位置对齐
                    4.space-around: 弹性盒子元素会平均地分布在行里
                    5.space-between:第一个贴左边,最后一个贴右边,其他盒子均分,保证每个盒子之间的空隙是相等的
            */
            /*justify-content: flex-end;*/
            justify-content: space-between;
            /*
                align-items:用于调整交叉轴的对其方式
                    1.flex-start:元素在交叉轴的起始位置对齐
                    2.flex-end:元素在交叉轴的结束位置对齐
                    3.center:元素在交叉轴上居中对齐
                    4.stretch:元素的高度会被拉伸到最大(不能给死高度)
             */
            /*如果给子元素设置了高度的话,这个元素就看不出来效果,先把高度去掉试一波*/
            /*align-items: stretch;*/
            align-items: flex-start;
        }
        ul li{
            width: 100px;
            height: 100px;
            border:1px solid #000;
            background-color: red;
            /*css3 盒模型 如果设置了border或者是padding自动内减*/
            box-sizing: border-box;
        }
    </style>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
</html>

示例代码2:flex换行问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>03-flex换行问题</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        li {
            list-style: none;
        }
        ul {
            width: 600px;
            height: 400px;
            border: 1px solid #000;
            margin: 50px auto;
            display: flex;
            flex-direction: row;
            /*
                默认伸缩盒子不换行,在一行显示,如果子元素内容溢出,会压缩子元素的宽度
                flex-wrap属性控制flex容器是单行或者多行,默认不换行
                    1.nowrap:不换行(默认),会压缩子盒子的宽度
                    2.wrap:当宽度不够的时候,会换行
            */
            flex-wrap: wrap;  /*默认是不换行的*/
            justify-content: flex-start;
            /*align-items: flex-start; 这个是控制单行的*/
            /*
                1.align-content用来设置多行的flex容器的排列方式
                    1.flex-start:各行向侧轴的起始位置堆叠
                    2.flex-end:各行向弹性盒容器的结束位置堆叠
                    3.center:各行向弹性盒容器的中间位置堆叠
                    4.space-between:各行在侧轴中平均分布
                    5.space-around:第一行贴上边,最后一个行贴下边,其他行在弹性盒容器中平均分布
                    6.stretch:拉伸,不设置高度的情况下

                2.align-items和align-content的区别:
                    1.align-items调整的是交叉轴的对其方式,不换行一般用align-items
                    2.align-content:必须是多行才生效,如果单行,没有效果。换行了就用align-content
            */
            /*一样的设置高度的话效果会看不出来*/
            align-content: stretch;
        }
        ul li{
            width: 100px;
            height: 100px;
            border:1px solid #000;
            background-color: red;
            box-sizing: border-box;
        }
    </style>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
</html>

给子元素设置的样式

order

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

flex-grow

flex-grow属性定义子项目的放大比例,默认为0,即如果存在剩余空间,也不放大。如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个子项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍

flex-shrink

flex-shrink属性定义了子项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小

flex-basis

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小

flex

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。flex: none | [ <‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’> ]。该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值

align-self

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch

示例代码:flex布局给子元素设置样式属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>04-flex布局给子元素设置样式属性</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        li {
            list-style: none;
        }
        ul {
            width: 600px;
            height: 400px;
            border: 1px solid #000;
            margin: 50px auto;
            display: flex;
            flex-direction: row;
            justify-content: center;
            /*align-content: stretch;*/
            align-items: center;
        }
        ul li{
            /*width: 100px;*/
            height: 100px;
            border:1px solid #000;
            background-color: red;
            box-sizing: border-box;
            font-size: 28px;
            line-height: 100px;
            color:#fff;
            text-align: center;
            /*
                需求1:我现在的话想让每个子元素的位置不一样 第一个在最上面 第二个保持不变 第三个的话在最下面
                align-self也是用于设置在侧轴的位置,但是align-self给子元素设置,优先级比align-items的优先级高
                需求2: 我现在想让包含内容为3的li显示在最前面,内容包含为1的li显示在最后面,可以使用order属性进行设置,order属性的值越小,则排在越前面
                需求3: 可以不给li设置宽度,让他们进行平分 使用flex属性 flex属性是去除指定盒子属性宽度后 平分剩下的空间

            */
        }
        ul li:nth-child(1){
            align-self: flex-start;
            /*width: 100px;*/
            flex-grow: 2;
            order: 3;
        }
        ul li:nth-child(2){
            /*align-self: flex-start;*/
            /*flex: 1;*/
            flex-grow: 1;
            order: 2;
        }
        ul li:nth-child(3){
            align-self: flex-end;
            /*width: 100px;*/
            flex-grow: 1;
            order: 1;  /*order属性定义子项目的排列顺序。数值越小,排列越靠前,默认为0*/
        }


    </style>
</head>
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</body>
</html>

在这里插入图片描述

弹性布局练习

效果图

在这里插入图片描述

六面神骰

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>05-六面神骰</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        li {
            list-style: none;
        }
        body{
            background-color: hotpink;
        }
        ul {
            width: 150px;
            height: 150px;
            background-color: #fff;
            border-radius: 5%;
            float: left;
            margin:40px;
        }
        li {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: #000;
        }
        ul:nth-child(1) {
            display: flex;
            justify-content: center;
            align-items: center;
        }
        ul:nth-child(2) {
            display: flex;
            justify-content: space-around;
            align-items: center;
        }
        ul:nth-child(3) {
            display: flex;
            justify-content: space-around;
            align-items: center;
            padding: 10px 0;
            box-sizing: border-box;
        }
        ul:nth-child(3) li:nth-child(1){
            align-self: flex-start;
        }
        ul:nth-child(3) li:nth-child(3){
            align-self: flex-end;
        }
        ul:nth-child(4) {
            display: flex;
            justify-content: space-around;
            flex-wrap: wrap;
            align-content: space-around;
        }
        ul:nth-child(4) li{
            margin: 0 20px;
        }
        ul:nth-child(5) {
            display: flex;
            justify-content: space-around;
            flex-wrap: wrap;
            align-content: space-around;
        }
        ul:nth-child(5) li{
            margin: 0 20px;
        }
        ul:nth-child(5) li:nth-child(3){
            margin: 0 50px;
        }
        ul:nth-child(6) {
            display: flex;
            justify-content: space-around;
            flex-wrap: wrap;
            align-content: space-around;
        }
        ul:nth-child(6) li{
            margin: 0 20px;
        }
    </style>
</head>
<body>
    <ul><li></li></ul>
    <ul><li></li><li></li></ul>
    <ul><li></li><li></li><li></li></ul>
    <ul><li></li><li></li><li></li><li></li></ul>
    <ul><li></li><li></li><li></li><li></li><li></li></ul>
    <ul><li></li><li></li><li></li><li></li><li></li><li></li></ul>
</body>
</html>
原创文章 34 获赞 585 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/98536779