【css】Flex布局


本文档完全参考阮一峰大神的 Flex布局教程,详细记录以备忘。

  • Flex容器
    display:flex|inline-flex
  • Flex项
    Flex容器内的子元素
  • 主轴/交叉轴
    Flex项总是沿主轴排列。
    默认水平轴为主轴,主轴起点在左端;垂直轴为交叉轴,交叉轴的起点在上端。
    flex-direction默认值是row
容器属性
flex-direction

flex-direction:row | row-reverse | column | column-reverse

<body>
    <div class="container flexbox">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
    </div>
</body>
.container{
    width:100px;
    height:100px;
    background-color:lightgoldenrodyellow;
}
.box{
    width:20px;
    height:20px;
    border:5px solid transparent;
    background-clip:padding-box;
    background-color:lightskyblue;
    text-align:center;
}
.flexbox{
    display:flex;
    flex-direction:row;
    flex-direction:row-reverse;
    flex-direction: column;
    flex-direction: column-reverse;
}

在这里插入图片描述
在这里插入图片描述

flex-wrap

Flex项总是沿主轴排列,如果主轴排不下,要不要换行,flex-wrap对此作决定。
flex-wrap的默认值是nowrap ,意思是,即使一行排不下所有的Flex项,也不换行。
flex-wrap:nowrap | wrap | wrap-reverse

    <div class="container flexbox">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
        <div class="box">7</div>
    </div>

在这里插入图片描述

justify-content

justify-content 决定了浏览器如何分配主轴的剩余空间,也因此确定了Flex项在主轴上的对齐方式。
justify-content:flex-start | flex-end | center | space-between | space-around | space-evenly

</head>
<body>
    <div class="container flexbox">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <!-- <div class="box">4</div> -->
    </div>
</body>

在这里插入图片描述

align-items

align-items决定了Flex项在交叉轴上的对齐方式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

align-content

对单行(flex-wrap:nowrap)无效,仅对多行有效,即flex-wrap:wrap
align-content 决定了 多行情况下浏览器如何分配交叉轴上的剩余空间。

<body>
    <div class="container flexbox">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
        <div class="box">7</div>
    </div>
</body>
.container{
    width:100px;
    height:200px;
    background-color:lightgoldenrodyellow;
}
.box{
    width:20px;
    height:20px;
    border:5px solid transparent;
    background-clip:padding-box;
    background-color:lightskyblue;
    text-align:center;
}
.flexbox{
    display:flex;
    flex-wrap: wrap;
    align-items:flex-start;
    /* align-items:flex-end;
    align-items:center;
    align-items:space-between;
    align-items:space-around;
    align-items:space-evenly; */
}

在这里插入图片描述

flex-flow

flex-flow:flex-direction flex-wrap

项目属性
order

决定了Flex项的排列顺序,默认值是0,值越小越往前排。
在这里插入图片描述
在这里插入图片描述

flex-grow

如果Flex容器有剩余空间,flex-grow决定了Flex项能够分配得到多少剩余空间。
flex-grow的默认值是0,这意味着,即使有剩余空间,该Flex项目也不会参与分配。
看例子吧。
例1:第一个.itemflex-grow设置为3,第二个.itemflex-grow设置为1,第三个.itemflex-grow取默认值0

<body>
    <div class="container">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
</body>
.container{
    width: 400px;
    display: flex;
}
.item{
    height: 100px;
}
.item:nth-of-type(1){
    width: 80px;
    background-color: lightgoldenrodyellow;
    flex-grow: 3;
}
.item:nth-of-type(2){
    width: 120px;
    background-color: lightskyblue;
    flex-grow: 1;
}
.item:nth-of-type(3){
    width: 140px;
    background-color: lightgrey;
}
  • 总扩展空间
    400px-(80px+120px+140px)=60px
  • 总权重
    3+1+0=4
  • 单项的权重
    第一个项目的权重是3;
    第二个项目的权重是1
    第三个项目的权重是0
  • 单项的扩展空间
    第一项的扩展空间是60px*3/4=45px;
    第二项的扩展空间是60px*1/4=15px;
    第三项的扩展空间是60px*0/4=0px
  • 单项的最终宽度
    第一项的最终宽度是80px+45px=125px
    第二项的最终宽度是120px+15px=135px;
    第三项的最终宽度是140px+0px=140px
    在这里插入图片描述

例2:第一个.itemflex-grow设置为0.1,第二个.itemflex-grow设置为0.2,第三个.itemflex-grow设置为0.2

  • 总扩展空间
    400px-(80px+120px+140px)=60px
  • 总权重
    0.1+0.2+0.2=0.5
    所有.itemflex-grow加起来等于0.1+0.2+0.2=0.5,小于1,这时总权重就不是0.5,而是1
  • 单项的权重
    第一个项目的权重是0.1;
    第二个项目的权重是0.2
    第三个项目的权重是0.2
  • 单项的扩展空间
    第一项的扩展空间是60px*0.1/1=6px;
    第二项的扩展空间是60px*0.2/1=12px;
    第三项的扩展空间是60px*0.2/1=12px
  • 单项的最终宽度
    第一项的最终宽度是80px+6px=86px
    第二项的最终宽度是120px+12px=132px;
    第三项的最终宽度是140px+12px=152px
    在这里插入图片描述
flex-shrink

如果Flex项的宽度总和大于Flex容器的宽度,即Flex容器空间不足时,Flex项会缩小,缩小的程度由flex-shrink决定,flex-shrink的默认值是1
看例子吧。
例1: .itemflex-shrink都取默认值1

<body>
    <div class="container">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
</body>
 .container{
     width: 400px;
     display:flex;
 }
 .item{
     height: 100px;
 }
 .item:nth-of-type(1){
     width: 120px;
     background-color: lightgoldenrodyellow;
     /* flex-shrink: 2; */
 }
 .item:nth-of-type(2){
     width: 150px;
     background-color: lightskyblue;
     /* flex-shrink: 3; */
 }
 .item:nth-of-type(3){
     width: 180px;
     background-color: lightgrey;
 }
  • 总溢出空间
    (120px+150px+180px)-400px=50px
  • 总权重
    120*1+150*1+180*1=450
  • 单项的权重
    第一个项目的权重是120*1=120;
    第二个项目的权重是150*1=150
    第三个项目的权重是180*1=180
  • 单项的压缩空间
    第一项的压缩空间是50px*120/450=13.33px;
    第二项的压缩空间是50px*150/450=16.66px;
    第三项的压缩空间是50px*180/450=20px
  • 单项的最终宽度
    第一项的最终宽度是120px-13.33px=106.66px
    第二项的最终宽度是150px-16.66px=133.34px;
    第三项的最终宽度是180px-20px=160px
    在这里插入图片描述

例2:第一个.itemflex-shrink设置为2,第二个.itemflex-shrink设置为3,第三个.itemflex-shrink取默认值1

  • 总溢出空间
    (120px+150px+180px)-400px=50px
  • 总权重
    120*2+150*3+180*1=870
  • 单项的权重
    第一个项目的权重是120*2=240;
    第二个项目的权重是150*3=450
    第三个项目的权重是180*1=180
  • 单项的压缩空间
    第一项的压缩空间是50px*240/870=13.79px;
    第二项的压缩空间是50px*450/870=25.86px;
    第三项的压缩空间是50px*180/870=10.35px
  • 单项的最终宽度
    第一项的最终宽度是120px-13.79px=106.21px
    第二项的最终宽度是150px-25.86px=124.14px;
    第三项的最终宽度是180px-10.35px=169.65px
    在这里插入图片描述

例3:第一个.itemflex-shrink设置为0.1,第二个.itemflex-shrink设置为0.2,第三个.itemflex-shrink设置为0.3

  • 总溢出空间
    (120px+150px+180px)-400px=50px
    所有.itemflex-shrink加起来等于0.1+0.2+0.3=0.6,小于1,这时总溢出空间就不是(120px+150px+180px)-400px=50px了,而是50px*(0.1+0.2+0..3)/1=30px
  • 总权重
    120*0.1+150*0.2+180*0.3=96
  • 单项的权重
    第一个项目的权重是120*0.1=12;
    第二个项目的权重是150*0.2=30
    第三个项目的权重是180*0.3=54
  • 单项的压缩空间
    第一项的压缩空间是30px*12/96=3.75px;
    第二项的压缩空间是30px*30/96=9.37px;
    第三项的压缩空间是30px*54/96=16.87px
  • 单项的最终宽度
    第一项的最终宽度是120px-3.75px=116.25px
    第二项的最终宽度是150px-9.37px=140.63px;
    第三项的最终宽度是180px-16.87px=163.13px
    在这里插入图片描述
flex-basis

在分配剩余空间之前,Flex项占据了多少主轴空间,这个由flex-basis决定。
flex-basis的默认值是auto,即Flex项本身的大小。
浏览器根据各Flex项的flex-basis,计算Flex容器的剩余空间。
flex-directionrow| row-reverse,且flex-basiswidth同时存在时,此时flex-basis的优先级高于width
flex-directioncolumn|column-reverse,且flex-basisheight同时存在时,此时flex-basic的优先级高于height

<body>
    <div class="container">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
</body>
.container{
    width: 400px;
    display: flex;
}
.item{
    height: 100px;
}
.item:nth-of-type(1){
    width: 80px;
    background-color: lightgoldenrodyellow;
    flex: 100px 0 0;
}
.item:nth-of-type(2){
    width: 120px;
    background-color: lightskyblue;
    flex: 120px 0 0;
}
.item:nth-of-type(3){
    width: 140px;
    background-color: lightgrey;
    flex: 140px 0 0;
}

在这里插入图片描述

flex

flex:flex-grow flex-shrink flex-basis
flex:无单位的数 无单位的数 有效的宽度值
无单位的数,第一个是flex-grow,第二个是flex-shrink;有效的宽度值是flex-basis。

align-self

设置单个Flex项的对齐方式,将覆盖align-items。

参考文档

justify-content
align-content
align-items
flex-shrink
flex-grow
Flex布局教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值