詳解彈性盒Flexbox

Flexbox

背景

Flexbox 是一個(gè)CSS3新增的模塊,主要可以用來方便地進(jìn)行布局操作。

術(shù)語

container, 父容器

container指用于應(yīng)用這個(gè)布局的容器,它的值應(yīng)該為

.container {
  display: flex;
}
  1. flex-direction: 指明了布局的方向,
.container {
  flex-direction: row | row-reverse | column | column-reverse;
}

包括了豎排還是橫排,reverse就是做逆序排序。默認(rèn)方向?yàn)閺淖笙蛴?,從上到下?/p>

2.flex-wrap: 默認(rèn)情況下,子元素會盡量排在一行,但是你也可以利用這個(gè)屬性讓其換行。

.container {
  flex-wrap: nowrap | wrap | wrap-reverse;
}

3.flex-flow: 這是flex-directionflex-wrap的縮寫形式,默認(rèn)值為row nowrap

.container {
  flex-flow: <'flex-direction'> || <'flex-wrap'>;
}

4.justify-content: 該屬性主要用于控制子元素間空余空間的分布,適用于行分布的情況

.container {
  justify-content: flex-start | flex-end | center | space-between| space-around;
}

這里給出各個(gè)屬性值得意義:

屬性值 作用
flex-start(默認(rèn)) 子元素盡量向頭部靠攏
flex-end 子元素盡量向尾部靠攏
center 子元素居中
space-between 子元素平均分布,首元素在頭部,尾元素在尾部
space-around 子元素平均分布,各個(gè)元素兩端都有相等的空余空間

5.align-items: 該屬性控制子元素縱軸方向上排列方式

.container {
  align-items: flex-start | flex-end |center | baseline | stretch;
}
屬性值 作用
flex-start 子元素margin邊緣處于容器上邊緣
flex-end 子元素margin邊緣處于容器下邊緣
center 子元素垂直居中
baseline 子元素基線對齊
stretch(默認(rèn)) 子元素收縮去填充容器,但仍然受min-widthmax-width影響

6.align-content: 該屬性與justify-content類似,適用于多行內(nèi)容的剩余空間分配情況

.container {
  align-content: flex-start| flex-end | center | space-between |space-around|stretch;
}
屬性 作用
flex-start 每一行子元素盡量向容器上部分靠攏
flex-end 每一行子元素盡量向容器下部分靠攏
center 子元素居中排布
space-between 子元素平均分布,第一行在容器上部分,最后一行在容器底部
space-around 子元素每一行之間間隔相等
stretch(默認(rèn)) 子元素填充容器

屬性總結(jié)

這里其實(shí)你可以將flex-flow的相關(guān)屬性看做是一條軸線(也是主軸main axis),你用flex-direction來控制這條軸線的方向(橫向或豎向),而用flex-wrap來控制其子元素是否換行。而容器內(nèi)的各個(gè)子元素將會沿著這條軸線進(jìn)行排布。
另一方面,控制子元素布局方式的屬性依據(jù)其軸線方向。主軸用justify-content,而縱軸方向用align-itemsalign-content,后者和水平justify-content類似,控制著每行子元素組之間的間距(可以認(rèn)為行間距),而align-items就是控制子元素間的對齊方式的。

children,子元素

說完容器的屬性,再來看一下子元素的屬性。

  1. order: 默認(rèn)情況下元素之間的排列順序是按照其在HTML文檔中定義好的順序進(jìn)行排列的,不過可以通過這個(gè)屬性對其進(jìn)行更改。
.item {
  order: <integer>;
}

元素的數(shù)值會按自然數(shù)的排列順序進(jìn)行排序。

2.flex-grow: 這個(gè)屬性控制元素的放大,默認(rèn)值為0,不允許出現(xiàn)負(fù)數(shù)

.item {
  flex-grow: <number>;
}

容器內(nèi)的各個(gè)元素大小是根據(jù)其比例進(jìn)行計(jì)算的,如所有元素都是1,則元素大小就會均分,如果有一個(gè)是2,則這個(gè)元素就會比其他元素都大2倍。

3.flex-shrink: 與flex-grow類似,它是用來控制元素的縮小的,默認(rèn)值為1,也是不允許出現(xiàn)負(fù)值。

4.flex-basis: 在分配容器剩余空間時(shí)會對元素基于此值先進(jìn)行計(jì)算

.item {
  flex-basic: <length> | auto;
}

如果設(shè)置為0, 在內(nèi)容去額外的空間不會被考慮進(jìn)去,如果設(shè)置為auto,則額外的空間會基于flex-grow的值進(jìn)行分配。

屬性值 作用
auto(默認(rèn)) 根據(jù)元素的寬高屬性進(jìn)行計(jì)算
content 根據(jù)元素內(nèi)的內(nèi)容
<length> 可以是百分比,rem等

5.flex: 這是flex-growflex-shrinkflex-basis的縮寫形式,默認(rèn)值為0,1,auto

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'>]
}

6.align-self: 這個(gè)屬性值允許子元素復(fù)寫容器的設(shè)置的align-items值。

.item {
  align-self: auto | flex-start| flex-end| center |baseline|stretch;
}

PS:設(shè)置了flex的子元素,float,clearvertical-align對其都不會有作用。

屬性總結(jié)

針對子元素之間的屬性,主要是用來設(shè)置子元素的大小而排布順序的。其中伸縮都會根據(jù)容器的軸線進(jìn)行。這樣就可以很容易實(shí)現(xiàn)等分,1:n:1之類的布局方式了。

舉個(gè)栗子??

在這里,舉一個(gè)簡單的例子,利用flexbox可以很容易地解決絕對居中的布局問題,而且代碼量很少。

居中布局

.parent {
  display: flex;
  height: 300px;
}

.child {
  width: 100px;
  height: 100px;
  margin: auto;
}

從上面代碼可以看到,將父元素display的值設(shè)置為flex后,子元素的margin值設(shè)置為auto后就自動居中了,是不是很神奇呢?

參考文檔

A Guide to Flexbox

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • H5移動端知識點(diǎn)總結(jié) 閱讀目錄 移動開發(fā)基本知識點(diǎn) calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,829評論 0 26
  • 移動開發(fā)基本知識點(diǎn) 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,722評論 0 6
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,126評論 1 92
  • CSS 3中彈性盒布局的最新版概述 在CSS 3中,CSS Flexible Box模塊為一個(gè)非常重要的模塊,該模...
    吾名無雙閱讀 1,301評論 0 5
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 2,114評論 0 2

友情鏈接更多精彩內(nèi)容