首頁 > web前端 > css教學 > 主體

關於CSS3中Flexbox佈局的圖文代碼分享

黄舟
發布: 2017-04-24 09:31:50
原創
1521 人瀏覽過

CSS3為我們提供了一種可伸縮的靈活的web頁面佈局方式-flexbox佈局,它具有很強大的功能,可以很輕鬆實現很多複雜佈局,在它出現之前,我們經常使用的佈局方式是浮動或固定寬度+百分比來進行佈局,程式碼量較大且難以理解。

為了更好理解flexbox佈局,這裡首先要介紹幾個概念:

#如果所示:

(1)主軸(側軸),flexbox佈局裡面將一個可伸縮容器按照水平和垂直方向分為主軸或側軸,如果你想讓這個容器中的可伸縮項目在水平方向上可伸縮展開,那麼水平方向上就是主軸,垂直方向上是側軸,反之亦然;

(2)主軸(側軸)長度,當確定了哪個是主軸哪個是側軸之後,在主軸方向上可伸縮容器的尺寸(寬或高)就被稱為主軸長度,側軸方向上的容器尺寸(寬或高)就被稱為側軸長度;

(3)主軸(側軸)起點,主軸(側軸)終點,例如主軸方向是水平方向,通常在水平方向上網頁佈局是從左向右的,那麼可伸縮容器的左border就是主軸起點,右border就是主軸終點,側軸是在垂直方向,通常是從上到下的,所以上border就是側軸起點,下border就是側軸終點;

(4)伸縮容器:如果要建造一個可伸縮的盒子,這些可伸縮的項目必須由一個display:flex的屬性的盒子包裹起來,這個盒子就叫做伸縮容器;

(5)伸縮項目:包含在伸縮容器中需要進行伸縮佈局的元素被稱作伸縮項目;

明確以上概念之後就可以來構建flexbox佈局了;

第一步,構建一個flexbox容器,並在容器中放置幾個可伸縮項目,如下:

css程式碼:

.flex-container{
            display:flex;
            width:600px;
            height:230px;
            background-color: #ccc;
        }.flex-item{
            background-color:blue;
            width: 100px;
            margin: 5px;        }
登入後複製

HTML程式碼:

<p class="flex-container">
       <p class="flex-item ">A</p>
       <p class="flex-item ">B</p>
       <p class="flex-item ">A</p>
       <p class="flex-item ">B</p>
   </p>
登入後複製
登入後複製

效果如下:

## 

其中四個可伸縮的項目在水平方向上被排列成了一行,同時可伸縮項目相左對齊;

display:flex代表這個容器是一個可伸縮容器,還可以取值為inline-flex,兩者的區別在於前者將這個容器渲染為區塊級元素,後者將其渲染為內聯元素

這裡有幾個預設的屬性雖然沒有設置,但是預設值確實起作用了,它們是:

flex-direction#屬性,它的值為row,column,column-reverse,row-reverse,預設值為row,表示在水平方向上展開可伸縮項,如果取column代表在垂直方向上展開可伸縮項目,column-reverse, row-reverse代表相反方向,通俗講,flex-direction屬性就是用來定義主軸側軸方向的。 給予上述效果加入flex-direction:column效果如下:

# justify-content屬性,用來表示可伸縮項目在主軸方向上的對齊方式,可以取值為flex-start,flex-end,center,space-between,space-around,其中flex-start,flex-end,表示相對於主軸起點和終點對齊,center表示居中對齊, space-between表示兩端對齊並將剩餘空間在主軸方向上進行平均分配,space-around表示居中對齊然後在主軸方向上將剩餘空間平均分配

justify-content:space-between

css程式碼:

.flex-container{
            display:flex;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-between;
        }.flex-item{
            background-color:blue;
            width: 100px;
            margin: 5px;
        }
登入後複製

效果如下:

#可以看到它將各個可伸縮項目在主軸方向上兩端對齊並平分了剩餘空間;

justify-content:space-around

css程式碼:

.flex-container{
            display:flex;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
        }.flex-item{
            background-color:blue;
            width: 100px;
            margin: 5px;
        }
登入後複製

效果如下:

################################### # 可以看到這個屬性讓可伸縮項目沿著主軸方向進行了居中對齊並且均分了剩餘空間;#########align-items###屬性:該屬性是用來表示可伸縮項目在側軸方向上的對齊方式,可取的值有flex-start,flex-end,center,baseline,stretch,需要解釋的是baseline值,它是按照一個計算出來的基準線然後讓這些項目沿著這個基準線對齊,基準線的計算取決於可伸縮項目的尺寸及內容,如下:######align-items:baseline;######css程式碼:###
.flex-container{
            display:flex;     
            flex-direction: row;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
        }
        .flex-item{
            background-color:blue;
            width: 100px;
            margin: 5px;;        }
        .a{
            margin-top: 10px;
            height: 100px;
        }
        .b{
            margin-top: 20px;
            height: 150px;
        }
        .c{
            margin-top: 30px;
            height: 80px;
        }
登入後複製

HTML代码:

 <p class="flex-container">
       <p class="flex-item a">A</p>
       <p class="flex-item b">B</p>
       <p class="flex-item c">A</p>
       <p class="flex-item a">B</p>
   </p>
登入後複製

效果如下:

可以看到四个可伸缩项目在侧轴方向上(垂直方向)高度不一,margin不一样,但是最后都按照计算出来的一个基准线对齐;

align-items:stretch;

这个是取值会让可伸缩项目在侧轴方向上进行拉伸,前提是这些项目在侧轴方向上没有设置尺寸,否则会按照你设置的尺寸来渲染。

css代码:

.flex-container{
            display:flex;
            flex-direction: row;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:stretch;
        }
        .flex-item{
            background-color:blue;
            width: 100px;            /*height: 100px;*/
            margin: 5px;;        }
登入後複製

HTML代码:

<p class="flex-container">
       <p class="flex-item ">A</p>
       <p class="flex-item ">B</p>
       <p class="flex-item ">A</p>
       <p class="flex-item ">B</p>
   </p>
登入後複製
登入後複製

效果如下:

可以看到这些可伸缩项目在侧轴方向上被拉伸了,因为在垂直方向上没有设置高度。

到目前为止,我们所有的伸缩项目都是在一行或者一列上进行的,并没有进行换行和换列,flex-wrap属性表示是否支持换行或者换列,它有nowrap,wrap,wrap-reverse三个取值,nowrap是默认值,表示不换行或者换列,wrap表示换行或者换列,wrap-reverse表示支持换行或者换列,但是会沿着相反方向进行排列(如主轴是垂直方向换行后就按照先下后上的顺序来排列伸缩项)

css代码:

.flex-container{
            display:flex;
            flex-direction: row;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
            flex-wrap: wrap;
        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
登入後複製

HTML代码:

<p class="flex-container">
    <p class="flex-item ">A</p>
    <p class="flex-item ">B</p>
    <p class="flex-item ">A</p>
    <p class="flex-item ">B</p>
    <p class="flex-item ">A</p>
    <p class="flex-item ">B</p>
    <p class="flex-item ">A</p>
    <p class="flex-item ">B</p></p>
登入後複製

效果如下:

可以看到伸缩项增多之后一行难以放下的时候会接着换行。wrap属性保证换行后按照正常的从上到下顺序排列

align-content属性用来表示换行之后各个伸缩行的对齐方式,它的取值有 stretch,flex-start,flex-end,center,space-between,space-around,意义和align-items属性取值意义相同,上面我们将7个伸缩项目分成了两行来排列,

将css代码添加align-content属性,html代码不变,如下

CSS代码:

.flex-container{
            display:flex;
            flex-direction: row;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
            flex-wrap: wrap;
            align-content: space-between;
        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
登入後複製

效果如下:

可以看到两个伸缩行在侧轴(垂直)方向上两端对齐了。

flex-flow属性,该属性是个复属性,它是flex-direction和flex-wrap的复合属性,flex-direction:row;flex-wrap:wrap就等同于flex-flow:row wrap

order属性该属性用来表示伸缩项目的排列方式,正常情况下伸缩项目会按照主轴起点到主轴终点排列,遇到换行或者换列会按照从侧轴起点到终点进行排列(除非设置了某些 对齐方式的reverse),但是某些情况下这种默认显示顺序不符合要求,可以采用给伸缩项添加order属性来指定排列顺序,默认情况下,每个伸缩项的order都是0,改属性可正可负,越大的值会被排列在越后面。

css代码:

 .flex-container{
            display:flex;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;    
            flex-flow: row wrap;
            align-content: space-between;

        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
        .order1{
            order:1;
        }
        .order2{
            order:2;
        }
登入後複製

HTML代码:

<p class="flex-container">
    <p class="flex-item order1">1</p>
    <p class="flex-item  order2">2</p>
    <p class="flex-item ">3</p>
    <p class="flex-item ">4</p>
    <p class="flex-item ">5</p>
    <p class="flex-item ">6</p>
    <p class="flex-item ">7</p>
    <p class="flex-item ">8</p></p>
登入後複製

效果如下:

默认情况下,会按照HTML的顺序1-8进行显示,但是由于给p1和2设置了大于0的order,所以他们被放在了最后显示(因为其他没有被设置的p的order默认属性都是0)

margin属性在flexbox布局中有很强大的作用,如果给某个可伸缩项设置某个方向上的margin为auto,那么这个可伸缩项就会在这个方向上占用该方向的剩余空间来作为自己的这个方向上的margin。

css代码:

.flex-container{
            display:flex;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
            flex-flow: row wrap;
            align-content: space-between;

        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
        .a{
            margin-right:auto;
        }
登入後複製

HTML代码:

<p class="flex-container">
    <p class="flex-item a">1</p>
    <p class="flex-item  ">2</p>
    <p class="flex-item ">3</p></p>
登入後複製

效果如下:

由于给伸缩项1添加了margin-right为auto,所以它独占了本行的剩余空间作为它的right margin值。

利用这个特性,我们在flexbox布局中很容易实现可伸缩元素的垂直水平居中,

css代码;

.flex-container{
            display:flex;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
            flex-flow: row wrap;
            align-content: space-between;

        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
        .a{
            margin:auto;
        }
登入後複製

HTML代码:

<p class="flex-container">
    <p class="flex-item a">1</p></p>
登入後複製

效果如下:

align-self属性,该属性是给各个可伸缩项设置自己的在侧轴上的对齐方式的,之前在容器上设置的align-item属性是作为一个整体设置的,所有的元素对齐方式都一样,align-self属性会覆盖之前的align-item属性,让每个可伸缩项在侧轴上具有不同的对齐方式,取值和align-item相同:

css代码:

.flex-container{
            display:flex;
            flex-direction: row;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
            align-content: space-between;

        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
        .a{
            align-self:flex-start ;
        }
        .b{
            align-self:flex-end;
        }
        .c{
            align-self:center;
        }
登入後複製

html代码:

<p class="flex-container">
    <p class="flex-item a">1</p>
    <p class="flex-item  b">2</p>
    <p class="flex-item c">3</p></p>
登入後複製
登入後複製

效果如下:

可以看到三个伸缩项在侧轴上被赋予了不同的对齐方式。

flex属性,这个属性是加在伸缩项上面的,它定义了伸缩项如何分配主轴尺寸,通常取值为auto或者数字,auto浏览器会自动均分,数字会按照伸缩项所占的数字比重来分配空间,

这个属性会覆盖伸缩项在主轴上设定的尺寸,当给主轴上伸缩项设定了尺寸(宽或高)和这个属性的时候,事实上还是会按照这个属性来进行空间分配。

css代码:

.flex-container{
            display:flex;
            flex-direction: row;
            width:600px;
            height:230px;
            background-color: #ccc;
            justify-content: space-around;
            align-items:baseline;
            align-content: space-between;

        }
        .flex-item{
            background-color:blue;
            width: 100px;
            height: 70px;
            margin: 5px;;        }
        .a{
            align-self:flex-start ;
            flex:1;
        }
        .b{
            align-self:flex-end;
            flex:2;
        }
        .c{
            align-self:center;
            flex:1;
        }
登入後複製

HTML代码:

<p class="flex-container">
    <p class="flex-item a">1</p>
    <p class="flex-item  b">2</p>
    <p class="flex-item c">3</p></p>
登入後複製
登入後複製

效果如下:

可以看到伸缩项尽管设置了宽度,但是最终还是按照我们设置的flex比例对水平空间进行了分割。

以上是關於CSS3中Flexbox佈局的圖文代碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!