Flexible boxes更加優雅的Web佈局

0
45

在前端中實現居中是一件很頭疼的事情,尤其是實現垂直居中,之前看到一篇實現置中的七種方法,其中提到一種最簡單的方法就是使用transform ,需要5行代碼可以實現完全置中。

Flexible boxes可以解決什麼問題

完全居中

在前端中實現居中是一件很頭疼的事情,尤其是實現垂直居中,之前看到一篇實現置中的七種方法,其中提到一種最簡單的方法就是使用transform ,需要5行代碼可以實現完全置中。

下面看一下Flexible boxes實現置中:

.flex-container{
  display:flex;
  justify-content: center;
  align-items: center;
}

Flexible boxes只要3行代碼就可以實現置中。

 

等高的卡片式布局

在沒有用Flexible boxes之前很多卡片設計的網站都有這樣一個問題,由於卡片裡面的內容多少不同,而產生的不等高問題。

Flexible boxes簡單的實現等高列:

.flex-container{
  display:flex;
  align-items: stretch;
}

 

Flexible boxes實現的原理邏輯

display

  • dislpay:flex使父容器表現為塊盒子
  • display:inline-flex使容器表現為行盒子

flex

  flex是 flex-grow flex-shrink flex-basis 的縮寫形式。默認值是0 1 auto

flex-basis

flex-basis:flex-basis  可以理解為我們給子元素設置的寬度。默認值是auto,寬度設置為auto時,盒子的寬度取決你們元素的寬度。

2

flex-grow和flex-shrink

grow和shrink是一對雙胞胎,grow表示伸張因子,shrink表示是收縮因子。

grow在flex容器下的子元素的寬度和比容器和小的時候起作用。 grow定義了子元素的寬度增長因子,容器中除去子元素之和剩下的寬度會按照各個子元素的grow值進行平分加大各個子元素上。

 

公式:

計算容器還剩空間

available_space(容器还剩的空间)=container_size(容器宽度)-flex_item_total(子元素宽度之和)

計算增長單位

grow_unit(增長單位)=available_space/flex_grow_total(子元素增長因子之和)

得到子元素的宽度

flex-item-width(子元素计算得到的宽度)=flex-basis+grow-unit*flex-grow

 

3

上面例子的計算

container-size=480px; flex-item-total=100*3=300px;flex-grow-total=3+2+1=6
available_space=480300=180px;
grow_unit=180/6=30px;

子元素1的寬度為:

flex_item_width1=100+3*30=190px;

子元素2的寬度為:

flex_item_width1=100+2*30=160px;

子元素3的寬度為:

flex_item_width1=100+30=130px;

 

[codepen_embed height=”400″ theme_id=”0″ slug_hash=”ZLYJYQ” default_tab=”css,result” user=”frankbite”]See the Pen ZLYJYQ by frankbite (@frankbite) on CodePen.[/codepen_embed]

shrink則是在寬度和比容器寬度大時候,才有用。按照shrink的值減去相應大小得到子元素的值。

 

align-content

對單行和單列不起作用,多行時才有效,需設置flex-direction:row;flex-wrap:wrap; 或者flex-flow:row-wrap,對flex container中的行進行佈局排版。

  • flex-start:行填充到容器的開始。
  • flex-bottom:行填充到容器的結束。
  • center:行居中分佈
  • space-between:行平均分佈,第一行在容器開始,最後一行在容器結束。
  • space-around:行平均分佈,但行與行之間有空隙。

實例效果

[codepen_embed height=”400″ theme_id=”dark” slug_hash=”QdbXgm” default_tab=”css,result” user=”frankdo”]See the Pen <a href=’http://codepen.io/frankdo/pen/QdbXgm/’>QdbXgm</a> by frank (<a href=’http://codepen.io/frankdo’>@frankdo</a>) on <a href=’http://codepen.io’>CodePen</a>.[/codepen_embed]

 

align-items

用於當前行中的子元素進行對齊佈局。

flex-start: 子元素的上邊緣對齊到行的上邊緣。
flex-end: 子元素的上邊緣對齊到行的下邊緣。
center: 以中軸線居中。
baseline: 子元素的基線對齊。
stretch:子元素拉伸至充滿容器。

實例效果

[codepen_embed height=”400″ theme_id=”dark” slug_hash=”MJwMvP” default_tab=”html,result” user=”frankdo”]See the Pen <a href=’http://codepen.io/frankdo/pen/MJwMvP/’>MJwMvP</a> by frank (<a href=’http://codepen.io/frankdo’>@frankdo</a>) on <a href=’http://codepen.io’>CodePen</a>.[/codepen_embed]

 

justify-content

水平方向上佈局排版

flex-start:子元素靠容器的左邊線對齊
flex-end:子元素靠容器的右邊線對齊
center: 子元素居中
space-between: 子元素被平均分佈,第一子元素在容器最左邊,最後一個子元素在最右邊。
space-around: 子元素平均分佈,但子元素與子元素之間有空隙。

實例效果

[codepen_embed height=”400″ theme_id=”dark” slug_hash=”KapjXe” default_tab=”css,result” user=”frankdo”]See the Pen <a href=’http://codepen.io/frankdo/pen/KapjXe/’>KapjXe</a> by frank (<a href=’http://codepen.io/frankdo’>@frankdo</a>) on <a href=’http://codepen.io’>CodePen</a>.[/codepen_embed]

 

order

用來改變子元素之間的排列循序,默認值是0,值越小,越往前排。

123

Flexible boxes解決的一些問題。

優雅的實現響應式佈局。

[codepen_embed height=”400″ theme_id=”dark” slug_hash=”WRvqdz” default_tab=”css,result” user=”frankdo”]See the Pen <a href=’http://codepen.io/frankdo/pen/WRvqdz/’>WRvqdz</a> by frank (<a href=’http://codepen.io/frankdo’>@frankdo</a>) on <a href=’http://codepen.io’>CodePen</a>.[/codepen_embed]

 

 

frankbite-關注UI設計/前端/網頁,如果您喜歡我們的文章,歡迎 Follow 我們的 Facebook 專頁,我們將為您提供最新、最實用的資訊!

%e6%9c%aa%e5%91%bd%e5%90%8d-1_03

原文地址:w3cplus