用auto margins來布局flexbox吧材泄!以及學術(shù)一點兒的對比研究:auto margins與align-self

常見的margin: 0 auto;可以將block元素水平居中,實際上auto margins可不止這一點用處呢吨岭。在flexbox布局中拉宗,auto margins不僅能實現(xiàn)左、右對齊和水平居中未妹,還能實現(xiàn)上簿废、下對齊和垂直居中,甚至可以在同一個container中同時實現(xiàn)多種對齊方式络它,布局功能頗為強大。在很多情況下化戳,auto margins比alignjustify系列對齊屬性(alignment properties)更加簡潔和巧妙单料,還不容易出錯!

在flexbox布局中点楼,auto margins之所以有這么強大的功能扫尖,是因為它能夠?qū)⑹S嗫臻g(free space)全部“吃掉”。沒有了剩余空間掠廓,justify-contentalign-self屬性也無從下手换怖,自然變得無效了。

來看幾個例子吧~

Example 1: 實現(xiàn)flex元素的響應式水平垂直居中

<head>
  <style>
    .container {
      height: 300px;
      background-color: lavender;
      display: flex;
      flex-wrap: wrap;
    }
    
    .item {
      background-color: cornflowerblue;
      width: 100px;
      height: 50px;
      margin: auto;
      text-align: center;
      line-height: 50px;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    <div class="item">Item 3</div>
    <div class="item">Item 4</div>
    <div class="item">Item 1</div>
    <div class="item">Item 6</div>
  </div>
</body>
Example 1-1.png 窗口寬800px
Example 1-2.png 窗口寬350px

Example 2: 實現(xiàn)同一個flex container中多種對其方式并存蟀瞧。特別適用于導航欄或表單欄沉颂,可將某些元素左對齊条摸,另一些元素右對齊。

<head>
  <style>
    .nav {
      height: 100px;
      background-color: lavender;
      display: flex;
      flex-wrap: wrap;
    }
    
    .item {
      background-color: cornflowerblue;
      width: 100px;
      height: 50px;
      text-align: center;
      line-height: 50px;
      margin: auto 0;
    }

    .other {
      margin-left: auto;
    }
    
    .content {
      background-color: mistyrose;
      font-size: 5em;
      width: 100%;
      height: 300px;
      text-align: center;
      line-height: 300px;
    }
  </style>
</head>
<body>
  <div class="nav">
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    <div class="item">Item 3</div>
    <div class="item">Item 4</div>
    <div class="item">Item 5</div>
    <div class="item other">Item 6</div>
  </div>
  <div class="content">CONTENT</div>
</body>
Example 2-1.png

類似的铸屉,使用auto margins可以更加簡單地實現(xiàn)如下圖的常見效果钉蒲。
圖片出自http://www.flexboxpatterns.com/home,原效果并沒有使用auto margins實現(xiàn)彻坛。

Example 2-2.png
Example 2-3.png
Example 2-4.png

關(guān)于auto margins算法的一點想法

下面的內(nèi)容有點學術(shù)啦顷啼,請做好心理準備~

Flex布局算法中對auto margins的對齊原理有如下解釋,原文是英文昌屉,我盡量準確翻譯:

在主軸(main axis)方向

  • 如剩余空間為正數(shù)钙蒙,則剩余空間會被平均分配在擁有主軸方向auto margin(s)的flex元素之間。
  • 如剩余空間為負數(shù)怠益,則將主軸方向的auto margin(s)設定為‘0’仪搔。

在側(cè)軸(cross axis)方向

  • 如果擁有側(cè)軸方向auto margins(s)的元素的outer cross size(計算時將auto margins(s)作‘0’計算)小于其所在的flex line的cross size,則將剩余空間平均分配給auto margin(s)蜻牢。
  • 否則,如果側(cè)軸方向block-startinline-start方向的margin為auto偏陪,則將其設定為‘0’抢呆。設置相對方向的margin值,使此元素的outer cross size等于其所在的flex line的cross size笛谦。

我不太明白算法解釋最后一句“設置相對方向的margin值抱虐,使此元素的outer cross size等于其所在的flex line的cross size”的意思。

補充知識:

CSS Writing Modes中饥脑,block-start方向是根據(jù)書寫模式屬性(writing-mode)定義的block flow direction的開始端恳邀,在上至下書寫模式下定義為頂端,在左至右書寫模式下定義為左端灶轰,在右至左書寫模式下定義為右端谣沸,inline-start方向由inline base direction屬性定義,左至右則開始端定義為左端笋颤,右至左則開始端定義為右端乳附。

從字面上分析,剛剛那最后一句的意思似乎是如果flex元素超高10px伴澄,相對方向的margin則會被設置為-10px赋除,從而將outer cross size減小10px至與flex line的cross size相等,但我目前不知該如何核實這個理解非凌。能夠看到的結(jié)果是举农,側(cè)軸(cross axis)方向的margin: auto與align-self: center產(chǎn)生了不同的效果。

Example 3: auto margins 與align-self: center的區(qū)別敞嗡。

<head>
  <style>
    .container {
      height:300px;
      margin: 0 auto;
    }

    .box {
      width: 160px;
      height: 300px;
      display: flex;
      flex-direction: column;
      background-color: cornflowerblue;
      padding: 10px;  
      margin: 30px auto;
    }
    
    .item {
      background-color: lavender;
      height: 50px;
      margin-top: auto;
      margin-bottom: auto;
      align-self: flex-start;
      text-align: center;
      line-height: 50px;
      padding-left: 10px;
      padding-right: 10px;
    }
    
    .a {
      margin: auto;
    }
    
    .b {
      align-self: center;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="box">margin: auto
      <div class="item a">Item_1</div>
      <div class="item a">Item_2_LongLongLongLongLongLong</div>
      <div class="item a">Item_3</div>
    </div>
    <div class="box">align-self: center
      <div class="item b">Item_4</div>
      <div class="item b">Item_5_LongLongLongLongLongLong</div>
      <div class="item b">Item 6</div>
    </div>
  </div>
</body>
Example 3.png

在這個例子中颁糟,兩個藍色box的cross axis均為水平方向祭犯,上方box中元素使用margin: auto進行水平居中,下方box中元素使用align-self: center進行水平居中滚停。margin: automargin-left: automargin-right: auto也可實現(xiàn)沃粗,但將會影響普通長度元素的水平居中)可將超長元素block-start方向、即左邊的margin設定為‘0’键畴,從而使元素具有完全的可讀性最盅;而align-self: centre將超長元素進行了絕對居中,在不需要可讀性的情況下可能更有優(yōu)勢起惕。


看過這些例圖涡贱,auto margins的使用方法應該不會忘了吧。最后再來提個醒兒:

  • auto margins僅針對當前的flex item惹想,對其子元素無效问词。
  • 在計算flex-bases與flexible lengths (main size與cross size)時,auto margins取值為0嘀粱。
  • auto margins優(yōu)先于justify-contentalign-self激挪。由于相應方向上的剩余空間已分配給auto margins,justify-contentalign-self將無效锋叨。
  • auto margins對溢出的(overflowing)flex item無效垄分。

//如需轉(zhuǎn)載,請聯(lián)系作者//

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娃磺,一起剝皮案震驚了整個濱河市薄湿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偷卧,老刑警劉巖豺瘤,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異听诸,居然都是意外死亡坐求,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門蛇更,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞻赶,“玉大人,你說我怎么就攤上這事派任≡已罚” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵掌逛,是天一觀的道長师逸。 經(jīng)常有香客問我,道長豆混,這世上最難降的妖魔是什么篓像? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任动知,我火速辦了婚禮,結(jié)果婚禮上员辩,老公的妹妹穿的比我還像新娘盒粮。我一直安慰自己,他們只是感情好奠滑,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布丹皱。 她就那樣靜靜地躺著,像睡著了一般宋税。 火紅的嫁衣襯著肌膚如雪摊崭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天杰赛,我揣著相機與錄音呢簸,去河邊找鬼。 笑死乏屯,一個胖子當著我的面吹牛根时,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓶珊,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啸箫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伞芹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝉娜,失蹤者是張志新(化名)和其女友劉穎唱较,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召川,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡南缓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荧呐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汉形。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倍阐,靈堂內(nèi)的尸體忽然破棺而出概疆,到底是詐尸還是另有隱情,我是刑警寧澤峰搪,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布岔冀,位于F島的核電站,受9級特大地震影響概耻,放射性物質(zhì)發(fā)生泄漏使套。R本人自食惡果不足惜罐呼,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侦高。 院中可真熱鬧嫉柴,春花似錦、人聲如沸奉呛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侧馅。三九已至危尿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馁痴,已是汗流浹背谊娇。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罗晕,地道東北人济欢。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像小渊,于是被迫代替她去往敵國和親法褥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • H5移動端知識點總結(jié) 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,518評論 0 26
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,482評論 0 6
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案酬屉? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,756評論 1 92
  • title: flex布局date: 2017-07-07 14:13:33tags: css筆記 flexbox...
    Gary23閱讀 1,536評論 0 0
  • 前言 溫馨提示:本文較長半等,圖片較多,本來是想寫一篇 CSS 布局方式的呐萨,但是奈何 CSS 布局方式種類太多并且實現(xiàn)...
    sunshine小小倩閱讀 3,142評論 0 59