css布局----flex彈性布局(移動端完美解決方案)

Flexible Box 模型西设,通常被稱為 flexbox,是一種一維的布局模型答朋。它給 flexbox 的子元素之間提供了強(qiáng)大的空間分布和對齊能力贷揽。本文給出了 flexbox 的主要特性。

我們說 flexbox 是一種一維的布局梦碗,是因?yàn)橐粋€(gè) flexbox 一次只能處理一個(gè)維度上的元素布局禽绪,一行或者一列。作為對比的是另外一個(gè)二維布局網(wǎng)格布局洪规,以后會和大家講到

目錄

1印屁,如何使用
2, Flexbox的兩根軸線
3斩例, Flex 容器
4雄人,API以及用例

1,- 如何使用-因?yàn)閏ss用法過于簡單念赶,所以先給大家介紹簡單的使用方法础钠,隨后介紹一些重要的概念

    <style type="text/css">
        #flex-box {
            background: #ccc;
            display: flex;  /* display 屬性規(guī)定元素應(yīng)該生成的框的類型 ,我們是flex*/
            flex-direction: row; /* 接下來我們會講到*/
        }
        #flex-box > div {
            background: #5990dc;
            margin: 20px;
            padding: 40px;
        }
    </style>
    <div id="flex-box">
        <div>block1</div>
        <div>block2</div>
        <div>block3</div>
    </div>

效果圖如下:
image.png

2叉谜,- Flexbox的兩根軸線

當(dāng)使用 flex 布局時(shí)旗吁,首先想到的是兩根軸線 — 主軸和交叉軸。主軸由 flex-direction 定義正罢,另一根軸垂直于它阵漏。我們使用 flexbox 的所有屬性都跟這兩根軸線有關(guān), 所以有必要在一開始首先理解它。

主軸

主軸由 flex-direction 定義翻具,可以取4個(gè)值:

  • row
  • row-reverse
  • column
  • column-reverse
    如果你選擇了 row 或者 row-reverse履怯,你的主軸將沿著 inline 方向延伸。

如果你選擇了 row 或者 row-reverse裆泳,你的主軸將沿著 **inline **方向延伸叹洲。

If flex-direction is set to row the main axis runs along the row in the inline direction.

選擇 column 或者 column-reverse 時(shí),你的主軸會沿著上下方向延伸 — 也就是 block 排列的方向工禾。

If flex-direction is set to column the main axis runs in the block direction.

交叉軸

交叉軸垂直于主軸运提,所以如果你的flex-direction (主軸) 設(shè)成了 row 或者 row-reverse 的話,交叉軸的方向就是沿著列向下的闻葵。

If flex-direction is set to row then the cross axis runs in the block direction.

如果主軸方向設(shè)成了 column 或者 column-reverse民泵,交叉軸就是水平方向。

If flex-direction is set to column then the cross axis runs in the inline direction.

理解主軸和交叉軸的概念對于對齊 flexbox 里面的元素是很重要的槽畔;flexbox 的特性是沿著主軸或者交叉軸對齊之中的元素栈妆。

Flex 容器

文檔中采用了 flexbox 的區(qū)域就叫做 flex 容器。為了創(chuàng)建 flex 容器, 我們把一個(gè)容器的 display 屬性值改為 flex 或者 inline-flex鳞尔。 完成這一步之后嬉橙,容器中的直系子元素就會變?yōu)?flex 元素。所有CSS屬性都會有一個(gè)初始值寥假,所以 flex 容器中的所有 flex 元素都會有下列行為:

  • 元素排列為一行 (flex-direction 屬性的初始值是 row)市框。
  • 元素從主軸的起始線開始。
  • 元素不會在主維度方向拉伸糕韧,但是可以縮小枫振。
  • 元素被拉伸來填充交叉軸大小。
  • flex-basis 屬性為 auto兔沃。
  • flex-wrap 屬性為 nowrap蒋得。

這會讓你的元素呈線形排列,并且把自己的大小作為主軸上的大小乒疏。如果有太多元素超出容器额衙,它們會溢出而不會換行。如果一些元素比其他元素高怕吴,那么元素會沿交叉軸被拉伸來填滿它的大小窍侧。

Flex布局主要的API

display: flex; 規(guī)定元素應(yīng)該生成flex的類型,直系子元素就會變?yōu)?flex 元素
flex-direction: row | column | row-reverse | column-reverse; 更改flex方向

為了更好地控制 flex 元素转绷,有三個(gè)屬性可以作用于它們:在使用這三個(gè)屬性之前我們簡單了解一下布局空白(available space)這個(gè)概念

image.png
flex-grow 定義了該元素的布局空白(available space)的基準(zhǔn)值伟件。 該屬性的默認(rèn)值是 auto 。此時(shí)议经,瀏覽器會檢測這個(gè)元素是否具有確定的尺寸斧账。 在上面的例子中, 所有元素都設(shè)定了寬度(width)為100px,所以 flex-basis 的值為100px煞肾。

如果沒有給元素設(shè)定尺寸咧织,flex-basis 的值采用元素內(nèi)容的尺寸。這就解釋了:我們給只要給Flex元素的父元素聲明 display: flex 籍救,所有子元素就會排成一行习绢,且自動分配小大以充分展示元素的內(nèi)容。

flex-shrink flex-grow 若被賦值為一個(gè)正整數(shù)蝙昙, flex 元素會以 flex-basis 為基礎(chǔ)闪萄,沿主軸方向增長尺寸。這會使該元素延展奇颠,并占據(jù)此方向軸上的布局空白(available space)败去。如果有其他元素也被允許延展,那么他們會各自占據(jù)布局空白的一部分烈拒。

如果我們給上例中的所有元素設(shè)定 flex-grow 值為1为迈, 容器中的布局空白會被這些元素平分三椿。它們會延展以填滿容器主軸方向上的空間。
flex-grow 屬性可以按比例分配空間葫辐。如果第一個(gè)元素 flex-grow 值為2, 其他元素值為1伴郁,則第一個(gè)元素將占有2/4(上例中耿战,即為 200px 中的 100px), 另外兩個(gè)元素各占有1/4(各50px)。

flex-basis屬性 flex-basis 指定了 flex 元素在主軸方向上的初始大小焊傅。如果不使用 box-sizing 來改變盒模型的話剂陡,那么這個(gè)屬性就決定了 flex 元素的內(nèi)容盒(content-box)的寬或者高(取決于主軸的方向)的尺寸大小。"

這三個(gè)屬性為了方便編碼狐胎,我們一般都會混合著寫在 flex 簡寫形式中:

    <style type="text/css">
        #flex-box {
            background: #ccc;
            display: flex;
            flex-direction: row;
        }
        #flex-box > div {
            flex: 1 1 auto;  /* 從左到右的參數(shù)依次為 flex-grow鸭栖,flex-shrink,flex-basis */
            background: #5990dc;
            margin: 20px;
            padding: 40px;
        }
    </style>
    <div id="flex-box">
        <div>block1</div>
        <div>block2</div>
        <div>block3</div>
    </div>

我們來看看flex元素自適應(yīng)后的效果
image.png

flex元素對齊和空間分配

align-items屬性將所有直接子節(jié)點(diǎn)上的align-self值設(shè)置為一個(gè)組握巢。 align-self屬性設(shè)置項(xiàng)目在其包含塊中的對齊方式晕鹊。") 屬性可以使元素在交叉軸方向?qū)R。
這個(gè)屬性的初始值為stretch暴浦,這就是為什么flex元素會默認(rèn)被拉伸到最高元素的高度溅话。實(shí)際上,它們被拉伸來填滿flex容器 —— 最高的元素定義了容器的高度歌焦。

你也可以設(shè)置align-items的值為flex-start飞几,使flex元素按flex容器的頂部對齊, flex-end 使它們按flex容器的下部對齊, 或者center使它們居中對齊. 在實(shí)例中嘗試——我給出了flex容器的高度,以便你可以看到元素在容器中移動独撇⌒寄看看如果更改 align-items的值為下列值會發(fā)生什么:

  • stretch
  • flex-start
  • flex-end
  • center
<style type="text/css">
        #flex-box {
            height: 400px;
            background: #ccc;
            display: flex;
            flex-direction: row;
            align-items: center;   /* 這個(gè)時(shí)候flex元素就會在交叉軸的地方居中對齊 */
        }
        #flex-box > div {
            /* flex: 1 1 auto;  為了更方便查看效果,我們先注釋 */
            background: #5990dc;
            margin: 20px;
            padding: 40px;
        }
    </style>
    <div id="flex-box">
        <div>block1</div>
        <div>block2</div>
        <div>block3</div>
    </div>
image.png

justify-content屬性用來使元素在主軸方向上對齊纷铣,主軸方向是通過 flex-direction 設(shè)置的方向卵史。初始值是flex-start,元素從容器的起始線排列关炼。但是你也可以把值設(shè)置為flex-end程腹,從終止線開始排列,或者center儒拂,在中間排列.

你也可以把值設(shè)置為space-between寸潦,把元素排列好之后的剩余空間拿出來,平均分配到元素之間社痛,所以元素之間間隔相等见转。或者使用space-around蒜哀,使每個(gè)元素的左右空間相等斩箫。

在實(shí)例中嘗試下列justify-content屬性的值:

  • stretch
  • flex-start
  • flex-end
  • center
  • space-around
  • space-between
<style type="text/css">
        #flex-box {
            height: 400px;
            background: #ccc;
            display: flex;
            flex-direction: row;
            align-items: center;
            justify-content: center;  /* 結(jié)合align-items:center 和 justify-content: center 我們就能實(shí)現(xiàn)我們所說的垂直水平居中 */
        }
        #flex-box > div {
            /*flex: 1 1 auto;*/
            background: #5990dc;
            margin: 20px;
            padding: 40px;
        }
    </style>
    <div id="flex-box">
        <div>block1</div>
        <div>block2</div>
        <div>block3</div>
    </div>

最終效果:
image.png

最主要的flex用法介紹完了,目前幾乎能兼容所有移動端(你要相信人們換手機(jī)的速度)

更詳細(xì)的內(nèi)容請參閱:https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乘客,隨后出現(xiàn)的幾起案子狐血,更是在濱河造成了極大的恐慌,老刑警劉巖易核,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匈织,死亡現(xiàn)場離奇詭異,居然都是意外死亡牡直,警方通過查閱死者的電腦和手機(jī)缀匕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碰逸,“玉大人乡小,你說我怎么就攤上這事《罚” “怎么了满钟?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長约急。 經(jīng)常有香客問我零远,道長,這世上最難降的妖魔是什么厌蔽? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任牵辣,我火速辦了婚禮,結(jié)果婚禮上奴饮,老公的妹妹穿的比我還像新娘纬向。我一直安慰自己,他們只是感情好戴卜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布逾条。 她就那樣靜靜地躺著,像睡著了一般投剥。 火紅的嫁衣襯著肌膚如雪师脂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天江锨,我揣著相機(jī)與錄音吃警,去河邊找鬼。 笑死啄育,一個(gè)胖子當(dāng)著我的面吹牛酌心,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挑豌,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼安券,長吁一口氣:“原來是場噩夢啊……” “哼墩崩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侯勉,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鹦筹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后址貌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盛龄,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年芳誓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啊鸭。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锹淌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赠制,到底是詐尸還是另有隱情赂摆,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布钟些,位于F島的核電站烟号,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏政恍。R本人自食惡果不足惜汪拥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篙耗。 院中可真熱鬧迫筑,春花似錦、人聲如沸宗弯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒙保。三九已至辕棚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邓厕,已是汗流浹背逝嚎。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑狸,地道東北人懈糯。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像单雾,于是被迫代替她去往敵國和親赚哗。 傳聞我的和親對象是個(gè)殘疾皇子她紫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348