最直觀的方式學(xué)習(xí)flexbox屬性

英文原文:A Visual Guide to CSS3 Flexbox Properties
譯文地址:http://w3ctrain.com/2015/11/12/visual-guide-to-css3-flexbox-flexbox-playground/

彈性盒模型(Flexbox Layout)是CSS3新增的一種布局模式轧邪。它可以很方便地用來改善動態(tài)或未知大小的子元素在父元素中的對齊勉失,方向和順序等等。flex容器的主要特性是它可以調(diào)整子元素的寬度或高度去填充可用的空白區(qū)舔涎,以最優(yōu)的方式達(dá)到兼容不同屏幕大小。

很多設(shè)計(jì)師和開發(fā)人員發(fā)現(xiàn)flexbox布局很容易使用获列,因?yàn)樵氐亩ㄎ环浅:唵喂仁校恍枰獙懞苌俚拇a,就能達(dá)到預(yù)期效果击孩。Flexbox布局算法不同于那些基于垂直或水平的塊或內(nèi)聯(lián)布局迫悠。Flexbox布局應(yīng)該用在小項(xiàng)目中的組件。

這篇文章主要集中在說明flex屬性如何影響布局巩梢,而不是這些屬性如何工作创泄。

可能你會覺得flex很多屬性很難記住,或是看了很多文字說明但是不知道具體效果如何括蝠,那么這篇文章就非常適合你了鞠抑。

讓我們開始吧!

BASICS

在我們開始之前先來定下規(guī)則又跛,我們把父容器稱為flex container碍拆,它的直接子元素稱為flex items

上面的盒子中慨蓝,你可以看到用來描述flex container 和 它的子元素的屬性與術(shù)語感混。如果你需要查看更多,點(diǎn)擊這里礼烈。

flexbox從2009年的初稿走到現(xiàn)在弧满,經(jīng)歷了時間的洗練和各種語法的變更。所以為了避免沖突庭呜,這篇文章我們只使用最新并且有效的版本。如果你需要兼容舊瀏覽器犀忱,你可以看看這篇文章阴汇。(英文)

最新的flexbox兼容以下瀏覽器:

  • Chrome 29+
  • Firefox 28+
  • Internet Explorer 11+
  • Opera 17+
  • Safari 6.1+ (prefixed with -webkit-)
  • Android 4.4+
  • iOS 7.1+ (prefixed with -webkit-)

如果你需要查看更多瀏覽器兼容性数冬,你可以看這里

USAGE

使用flexbox布局,你需要在父元素上設(shè)置display屬性

.flex-container {
  display: -webkit-flex; /* Safari */
  display: flex;
}

或者你可以把它當(dāng)行內(nèi)元素使用

.flex-container {
  display: -webkit-inline-flex; /* Safari */
  display: inline-flex;
}

注意:你給父容器設(shè)置了這個屬性后搀庶,它的子元素都會自動變成flex items拐纱。

有很多種給flexbox屬性分組的方式,到目前為止哥倔,我認(rèn)為最簡單秸架,并且最容易理解的方式是按照flex container和flex items分成兩組。下面咆蒿,我們來解釋各個元素是如何影響布局效果的东抹。

Flexbox Container 屬性

flex-direction
這個屬性指定了flex items在flex container中是如何布局的蚂子。通過設(shè)置flex container的主軸的方向,它們會按照兩個方向布局缆镣,水平的行或者垂直的列试浙。

例子:

.flex-container {
  -webkit-flex-direction: row; /* Safari */
  flex-direction:         row;
}

設(shè)置為行寞蚌,那么在ltr上下文環(huán)境下田巴,所有flex items會按照從左到右的順序排成一行。

.flex-container {
  -webkit-flex-direction: row-reverse; /* Safari */
  flex-direction:         row-reverse;
}

使用row-reverse屬性壹哺,那么在ltr上下文環(huán)境下艘刚,子元素則會按照從右到左的順序排成一行管宵。

.flex-container {
  -webkit-flex-direction: column; /* Safari */
  flex-direction:         column;
}

使用column屬性,flex items會按照從上到下的方式排列攀甚。

.flex-container {
  -webkit-flex-direction: column-reverse; /* Safari */
  flex-direction:         column-reverse;
}

使用column-reverse秋度,則會放過來。

默認(rèn)值:row

注:row和row-reverse的排列方式取決于書寫模式埠居,所以如果是在rtl上下文環(huán)境下事期,它們都會反轉(zhuǎn)兽泣。

flex-wrap

默認(rèn)的flexbox概念是把所有子元素都放在一行里面,你可以通過flex-wrap屬性來控制flex container是否將子元素分多行處理金踪,以及新增行的方向牵敷。

例子:

.flex-container {
  -webkit-flex-wrap: nowrap; /* Safari */
  flex-wrap:         nowrap;
}

Flex items會被置在一行里面枷餐,并且默認(rèn)它們會被壓縮來適應(yīng)容器的寬度。

.flex-container {
  -webkit-flex-wrap: wrap; /* Safari */
  flex-wrap:         wrap;
}

wrap, Flex items會被按照從上到下從左到右的順序分配到多行怨咪。

.flex-container {
  -webkit-flex-wrap: wrap-reverse; /* Safari */
  flex-wrap:         wrap-reverse;
}

wrap-reverse, Flex itms會被按照從左到右從下到上的順序在多行中顯示。

默認(rèn)值:nowrap

注:這個屬性也跟書寫模式相關(guān)诗眨。

flex-flow

這個屬性是flex-direction和flex-wrap屬性的縮寫匠楚。

例子:

.flex-container {
  -webkit-flex-flow: <flex-direction> || <flex-wrap>; /* Safari */
  flex-flow:         <flex-direction> || <flex-wrap>;
}

默認(rèn)值:row nowrap

justify-content

這個屬性會根據(jù)當(dāng)前容器的主軸來排列子元素。它可以在所有flex items都在同一行并且不可伸縮峡懈,或是可伸縮但是達(dá)到它們的最大尺寸時候肪康,分配剩余空間撩穿。

例子:

.flex-container {
  -webkit-justify-content: flex-start; /* Safari */
  justify-content:         flex-start;
}

Flex items在lrt上下文中會向左邊靠攏

.flex-container {
  -webkit-justify-content: flex-end; /* Safari */
  justify-content:         flex-end;
}

Flex items在ltr上下文中向右靠攏

.flex-container {
  -webkit-justify-content: center; /* Safari */
  justify-content:         center;
}

Flex items會居中

.flex-container {
  -webkit-justify-content: space-between; /* Safari */
  justify-content:         space-between;
}

除了第一個和最后一個冗锁,F(xiàn)lex items會有相同的間隔冻河。

.flex-container {
  -webkit-justify-content: space-around; /* Safari */
  justify-content:         space-around;
}

所有Flex item 都會有相同間隔

默認(rèn)值: flex-start

align-items

Flex items 會根據(jù)當(dāng)前容器的主軸線對齊叨叙,跟justify-content很相似,但是方向垂直味滞。這個屬性設(shè)置所有flex items默認(rèn)對齊方式钮呀。例子:

.flex-container {
  -webkit-align-items: stretch; /* Safari */
  align-items:         stretch;
}

Flex items會占滿flex container的高度爽醋,從cross start到cross end

.flex-container {
  -webkit-align-items: flex-start; /* Safari */
  align-items:         flex-start;
}

Flex items會與flex container 的交叉軸起始(cross start)線對齊蚂四。

.flex-container {
  -webkit-align-items: flex-end; /* Safari */
  align-items:         flex-end;
}

Flex items會與flex container 的交叉軸結(jié)尾(cross end)線對齊哪痰。

.flex-container {
  -webkit-align-items: center; /* Safari */
  align-items:         center;
}

Flex items會在交叉軸(cross axis)上對齊

.flex-container {
  -webkit-align-items: baseline; /* Safari */
  align-items:         baseline;
}

Flex items會按照它們的基線(baselines)對齊

默認(rèn)值:stretch
注:點(diǎn)擊這里查看更多關(guān)于基線如何運(yùn)算

align-content

align-content屬性對齊flex container上的行,控制交叉軸的多余間隔筷弦,跟主軸上的justify-content屬性很相似奸笤。

例子:

.flex-container {
  -webkit-align-content: stretch; /* Safari */
  align-content:         stretch;
}

每一行Flex items后面都會有區(qū)分開的間隔哼鬓。

.flex-container {
  -webkit-align-content: flex-start; /* Safari */
  align-content:         flex-start;
}

Flex items會向交叉軸起始位置靠攏

.flex-container {
  -webkit-align-content: flex-end; /* Safari */
  align-content:         flex-end;
}

Flex items 會向交叉軸的結(jié)束位置靠攏

.flex-container {
  -webkit-align-content: center; /* Safari */
  align-content:         center;
}

flex items的行會在交叉軸上居中顯示

.flex-container {
  -webkit-align-content: space-between; /* Safari */
  align-content:         space-between;
}

除了起始和結(jié)尾行健盒,flex items的其他行都會有相同的間隔称簿。

.flex-container {
  -webkit-align-content: space-around; /* Safari */
  align-content:         space-around;
}

每一行都會有相同上下間隔

默認(rèn)值:stretch
注:這個屬性只會在flex container有多行的時候才會有效憨降,如果只有一行那么這個屬性就不會有效果。

關(guān)于flex containers

  • 所有的column-*屬性在flex container上都不會有效果
  • ::first-line::first-letter偽類在flex container上不會被應(yīng)用士嚎。

FlexBox Item 屬性

Order
order屬性定義子元素在父容器中的順序莱衩,默認(rèn)它們會被最加到后面

例子:

.flex-item {
  -webkit-order: <integer>; /* Safari */
  order:         <integer>;
}

不需要調(diào)整HTML娇澎,就能修改顯示順序

默認(rèn)值:0

flex-grow

這個屬性是一個flex拉伸因子趟庄,決定了flex items會相對于父容器剩余空間增長多少。

.flex-item {
  -webkit-flex-grow: <number>; /* Safari */
  flex-grow:         <number>;
}

如果所有flex items都有相同的flex-grow奋单,那么他們都會在父容器中有相同的尺寸虑鼎。

調(diào)整一下,看看有什么區(qū)別

默認(rèn)值:0
注:負(fù)數(shù)是不合法的

flex-shrink

flex-shrink是一個flex收縮因子絮短,它決定了當(dāng)父容器體積不足時昨忆,flex items收縮的相對比例邑贴。

.flex-item {
  -webkit-flex-shrink: <number>; /* Safari */
  flex-shrink:         <number>;
}

默認(rèn)所有flex items都是可以壓縮的,但如果我們把它設(shè)為0奖磁,那么它將保持原有大小繁疤。

默認(rèn)值: 1**
注:**負(fù)數(shù)是不合法的

flex-basis

這個屬性會設(shè)置寬度和高度稠腊,原文為:This property takes the same values as the width and height properties并在flex因子分割間隔之前,指定flex items的初始大小吞彤。

.flex-item {
  -webkit-flex-basis: auto | <width>; /* Safari */
  flex-basis:         auto | <width>;
}

flex-basis會指定第四個flex items的初始大小

默認(rèn)值: auto

flex

這個屬性是flex-grow,flex-shrinkflex-basis屬性的縮寫饰恕。

.flex-item {
  -webkit-flex: none | auto | [ <flex-grow> <flex-shrink>? || <flex-basis> ]; /* Safari */
  flex:         none | auto | [ <flex-grow> <flex-shrink>? || <flex-basis> ];
}

默認(rèn)值:0 1 auto
注:w3c鼓勵使用簡寫懂盐,而不是每個屬性都分開寫糕档。

align-self

這個屬性允許為單個flex items重寫對齊方式。

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


默認(rèn)值:auto**
注:**The value of auto for align-self computes to the value of align-items on the element’s parent, or stretch if the element has no parent.

關(guān)于flex items

  • float, clear俐银,vertical-align在flex item上都不會有作用捶惜,也不會讓它脫離文檔流荔烧。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市景醇,隨后出現(xiàn)的幾起案子吝岭,更是在濱河造成了極大的恐慌,老刑警劉巖散劫,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件获搏,死亡現(xiàn)場離奇詭異颜凯,居然都是意外死亡仗扬,警方通過查閱死者的電腦和手機(jī)蕾额,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門早芭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來退个,“玉大人调炬,你說我怎么就攤上這事〉痘模” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宜猜。 經(jīng)常有香客問我姨拥,道長渠鸽,這世上最難降的妖魔是什么柴罐? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任丽蝎,我火速辦了婚禮,結(jié)果婚禮上红省,老公的妹妹穿的比我還像新娘吧恃。我一直安慰自己麻诀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布呻率。 她就那樣靜靜地躺著礼仗,像睡著了一般逻悠。 火紅的嫁衣襯著肌膚如雪童谒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天象浑,我揣著相機(jī)與錄音融柬,去河邊找鬼趋距。 笑死,一個胖子當(dāng)著我的面吹牛外盯,可吹牛的內(nèi)容都是我干的饱苟。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼类垦,長吁一口氣:“原來是場噩夢啊……” “哼蚤认!你這毒婦竟也來了糕伐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褥蚯,沒想到半個月后遵岩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弥锄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽暇。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡戒悠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卤恳,到底是詐尸還是另有隱情,我是刑警寧澤若债,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布蠢琳,位于F島的核電站镜豹,受9級特大地震影響逛艰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菇绵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一咬最、第九天 我趴在偏房一處隱蔽的房頂上張望欠动。 院中可真熱鬧,春花似錦翅雏、人聲如沸人芽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疟羹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丸逸,已是汗流浹背剃袍。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工民效, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畏邢,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓程储,卻偏偏與公主長得像章鲤,于是被迫代替她去往敵國和親咆贬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • H5移動端知識點(diǎn)總結(jié) 閱讀目錄 移動開發(fā)基本知識點(diǎn) calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,453評論 0 26
  • 移動開發(fā)基本知識點(diǎn) 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,460評論 0 6
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案眷蜈? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,741評論 1 92
  • Flexbox布局官方稱之為CSS Flexible Box布局模塊,他是CSS3中的一種新的布局模式酌儒。Flexb...
    流動碼文閱讀 697評論 0 3
  • 簡書的Markdown貌似不支持插入iframe今豆,所以文章里的JSFiddle示例都改做截圖了柔袁,如果有需要可以點(diǎn)擊...
    kangflict閱讀 1,113評論 2 8