CSS—flex布局之项目属性

目录

一、概述

二、详解


一、概述

flex容器中的项目如下所示,共有6个属性。

(1) flex
(2) flex-grow
(3) flex-shrink
(4) flex-basis
(5) align-self
(6) order

二、详解

flex属性

概念 

flex是一个复合属性,适用于CSS3弹性盒模型中的所有子元素,即容器中的项目。flex用来设置容器中的项目具体如何分配空间。flex属性是flex-grow、flex-shrink和flex-basis属性的简写,默认值为0 1 auto,后两个属性可选。

flex: none; // 表示0 0 auto
flex: auto; // 表示0 1 auto
flex: flex-grow || [ flex-shrink ] || [ flex-basis ]
(1) flex-grow:   定义项目的扩展比率
(2) flex-shrink: 定义项目的收缩比率
(3) flex-basis:  定义项目的默认基准值

实例

 如下代码所示,定义了容器宽即主轴为800px。由于项目设置了基准值,相加300+500+600=1400px,那么子元素将会溢出1400-800=600px。由于项目设置了收缩因子,所以加权可得300*1+500*2+600*3=3100px。 于是计算各个项目分摊的溢出量如下所示。

项目a分摊溢出量:(300 * 1/3100) * 600 = 3/31,  约58px
项目b分摊溢出量:(500 * 2/1000) * 600 = 10/31, 约194px
项目c分摊溢出量:(600 * 3/1000) * 600 = 18/31, 约348px

如上计算所示,项目abc各需消化58px、194px、348px,用原定的宽度减去各自的收缩值,最后得出项目a宽242px,项目b宽306px,项目c宽252px。

<style>
    ul { margin: 0; padding: 0; list-style: none; }
    ul { display: -webkit-flex; display: flex; width: 800px; }     
    ul li:nth-child(1) { -webkit-flex: 1 1 300px; flex: 1 1 300px; background: red; }     
    ul li:nth-child(2) { -webkit-flex: 1 2 500px; flex: 1 2 500px; background: forestgreen; } 
    ul li:nth-child(3) { -webkit-flex: 1 3 600px; flex: 1 3 600px; background: gold; }
</style>
<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>

flex-grow属性

概念

该属性可以设置flex容器中项目的扩展比率。属性值为数值类型,不允许负值。默认属性值为0,表示没有分配剩余空间的权力,即使存在剩余空间,也不扩展元素。

flex-grow:<number>; // 用数值来定义扩展比率

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间。如果一个项目的flex-grow属性为2,其余项目都为1,则前者占据的剩余空间将比其他项多一倍。

实例1

如下代码所示。本例中bc两项都显示定义了flex-grow属性,它们的属性值表示将剩余空间分成4份,其中项目b占1份,项目c占3份,项目a不参与分配剩余空间。

<style>
    ul{ margin: 0; padding: 0; list-style: none; display: flex; }
    ul li:nth-child(2) { flex-grow: 1; background-color: red; }
    ul li:nth-child(3) { flex-grow: 3; background-color: aqua; }
</style>
<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>

实例2

如下代码所示,项目abc均参与分配剩余空间,分配比率1:1:3。

<style>
    ul{ margin: 0; padding: 0; list-style: none; display: flex; }
    ul li:nth-child(1) { flex-grow: 1; background-color: yellow; }
    ul li:nth-child(2) { flex-grow: 1; background-color: red; }
    ul li:nth-child(3) { flex-grow: 3; background-color: aqua; }
</style>
<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>

flex-shrink属性

概念

该属性可以设置flex容器中项目的收缩比率,表示空间不足时,将缩小项目。属性值为数值类型,不允许负值。默认属性值为1,定义如下所示。

flex-shrink:<number>; // 用数值来定义收缩比率

如果所有项目的flex-shrink属性都为1,则当空间不足时,所有项目将等比例缩小。如果一个项目的flex-shrink属性为0,表示空间不足时,该项目将维持原状,不参与缩小。

实例

如果没有显式定义flex-shrink属性,则默认属性值为1。如下代码所示,父容器宽400px,子项目每个宽200px,共计600px,超出父容器200px,则超出部分需被项目abc消化。根据收缩比率,加权综合可得200*1+200*1+200*3=1000px。于是计算各个项目分摊的溢出量如下所示。

项目a分摊溢出量:(200 * 1/1000) * 200 = 40px
项目b分摊溢出量:(200 * 1/1000) * 200 = 40px
项目c分摊溢出量:(200 * 3/1000) * 200 = 120px

如上计算所示,项目abc各需消化40px、40px、120px,用原定的宽度减去各自的收缩值,最后得出项目a宽160px,项目b宽160px,项目c宽80px。

<style>
    ul { width: 400px; margin: 0; padding: 0; list-style: none; display: -webkit-flex; display: flex; }
    ul li { width: 200px; }
    ul li:nth-child(1) { background: red; }
    ul li:nth-child(2) { background: yellow; }
    ul li:nth-child(3) { -webkit-flex-shrink: 3; flex-shrink: 3; background: blue; }
</style>
<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>

                                             

flex-basis属性

概念

该属性定义了flex容器中项目伸缩的基准值,即项目占据的主轴空间,浏览器根据这个属性值,计算主轴是否有多余空间。flex-basis默认属性值为auto,表示项目的本来大小。定义如下所示。

flex-basis:<length> | <percentage> | auto; // 默认值auto

// auto: 项目的本来大小
// <length>: 用长度值来定义宽度。不允许负值
// <percentage>: 用百分比来定义宽度。不允许负值

实例1

同时声明width属性和flex-basis属性时,会用flex-basis的值参与计算。

如下代码所示,项目c同时设置了flex-basis和width属性,则width属性无效,以flex-basis属性为准。父容器宽600px,子项目宽100*4+600=1000px,超出400px。根据收缩比率,各项目加权综合可得100*1+100*1+600*1+100*1+100*1=1000px,于是计算各个项目分摊的溢出量如下所示。

项目a分摊溢出量:(100 * 1/1000) * 400 = 40px
项目b分摊溢出量:(100 * 1/1000) * 400 = 40px
项目c分摊溢出量:(600 * 1/1000) * 400 = 240px
项目d分摊溢出量:(100 * 1/1000) * 400 = 40px
项目e分摊溢出量:(100 * 1/1000) * 400 = 40px

如上计算所示,项目abcde各需消化40px、40px、240px、40px、40px,用原定的宽度减去各自的收缩值,最后得出项目a宽60px,项目b宽60px,项目c宽360px,项目d宽60px,项目e宽60px。

<style>
    .box { width: 600px; margin: 0; padding: 0; list-style: none; background-color: #eee; }
    .box { display: -webkit-flex; display: flex; }
    .box li { width: 100px; height: 100px; background-color: red; } 
    .box li:nth-child(3) { -webkit-flex-basis:600px; flex-basis:600px; }
</style>
<ul class="box">
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
</ul>

                       

实例2

在实例1的基础上分别为flex容器中的项目添加内边距1px、外边距1px和边框1px,如下代码所示。在计算公式中只须改变超出部分的数值,将400px修改为410px,其余不变。

.box li {
    width: 100px;
    height: 100px;
    padding: 1px;
    background-color: red;
}

        

.box li {
    width: 100px;
    height: 100px;
    margin: 1px;
    background-color: red;
}

       

.box li {
    width: 100px;
    height: 100px;
    border: 1px solid;
    background-color: red;
}

       

align-self属性

概念

设置flex容器中项目在交叉轴上的对齐方式,可覆盖align-items属性。定义如下所示。

align-self:auto | flex-start | flex-end | center | baseline | stretch
(1) auto:默认值, 表示属性值为父元素的align-items属性值, 如果没有父元素,则属性值为stretch
(2) flex-start:项目向上对齐
(3) flex-end:项目向下对齐
(4) center:项目垂直居中
(5) baseline:如项目的行内轴与纵轴为同一条,则该值与flex-start等效,其它情况下,该值将参与基线对齐
(6) stretch:如果指定纵轴大小的属性值为auto,则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制

实例

<style>
    .box {
        display: -webkit-flex;
        display: flex;
        align-items: flex-end;
        height: 100px;
        margin: 0;
        padding: 10px;
        border-radius: 5px;
        list-style: none;
        background-color: #eee;
    }
    .box li {
        margin: 5px;
        padding: 10px;
        border-radius: 5px;
        background: #aaa;
        text-align: center;
    }
    .box li:nth-child(1) {
        -webkit-align-self: flex-end;
        align-self: flex-end;
    }
    .box li:nth-child(2) {
        -webkit-align-self: center;
        align-self: center;
    }
    .box li:nth-child(3) {
        -webkit-align-self: flex-start;
        align-self: flex-start;
    }
    .box li:nth-child(4) {
        -webkit-align-self: baseline;
        align-self: baseline;
        padding: 20px 10px;
    }
    .box li:nth-child(5) {
        -webkit-align-self: baseline;
        align-self: baseline;
    }
    .box li:nth-child(6) {
        -webkit-align-self: stretch;
        align-self: stretch;
    }
    .box li:nth-child(7) {
        -webkit-align-self: auto;
        align-self: auto;
    }
</style>
<ul id="box" class="box">
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
    <li>f</li>
    <li>g</li>
    <li>h</li>
    <li>i</li>
</ul>

order属性

定义

设置flex容器中项目排列顺序。属性值为整数类型,默认值为0,可以为负数。用整数来定义项目出现的顺序,数值小的排在前面。定义如下所示。

order:<integer>

实例

<style>
    .box {
        display: -webkit-flex;
        display: flex;
        margin: 0;
        padding: 10px;
        list-style: none;
        background-color: #eee;
    }
    .box li {
        width: 100px;
        height: 100px;
        border: 1px solid #aaa;
        text-align: center;
    }
    #box li:nth-child(3) {
        -webkit-order: -1;
        order: -1;
    }
</style>
<ul id="box" class="box">
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
</ul>

 

发布了223 篇原创文章 · 获赞 82 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42472040/article/details/103992481
今日推荐