Flex佈局到底解決了什麼問題

Flex佈局到底解決了什麼問題--這一直是讓我以爲困惑的地方。javascript

響應式設計出現好多年,這些年咱們一直使用浮動與block來佈局,也沒以爲什麼很差。。css

flex的教程看了挺多,但理解老是很模糊。這幾天我從另外一個角度開始了flex的學習,在實際對比了flex和普通佈局後,發現它不只更加符合響應式設計的特色,並且之前的一些佈局難點也迎刃而解了。html

一種似曾熟悉的感受襲來,就像在我使用gulp後忽然明白了grunt爲何會被取代同樣。java

如下全當總結git


1.如何在一個超短的頁面中,使footer固定在最下方。代碼以下github

<body>
    <div class="wrapper">
        <p>404 not found</p>
    </div>
    <div class="footer">
        <p>Copyright (c) 2008</p>
    </div>
</body>

正如404這種頁面,通常的解決方案爲以下。經過設置負邊距來容納頁腳,達到全屏的效果。web

.wrapper {
  height: 100%;
  margin: 0 auto -2em;
}
.footer {
  height: 2em;
}

利用flex自己自適應的特色以下,達到的效果一致。但不用手動設置footer的寬高,完美實現footer放置在最下面的需求。gulp

body {
  display: flex;
  flex-direction: column;
}
.wrapper {
  flex: 1;
}

2.如何使表單對齊。app

<div class="cover">
  <form class="flex-form">
      <input type="search" placeholder="Where do you want to go?">
      <label for="from">From</label>
      <input type="date" name="from">
      <label for="from">To</label>
      <input type="date" name="to">
      <select name="" id="">
        <option value="1">1 Guest</option>
        <option value="2">2 Guest</option>
      </select>
      <input type="submit" value="Search">
  </form>
</div>

一個長表單。input輸入框有大有小不整齊,標籤文字與表單文字沒有對齊。按照普通方案搞定這些將很是麻煩:涉及到元素高度,文字居中。。。ide

.cover {
  display: flex;
}
.flex-form {
  display: flex;
  align-items: center;
  border: 1px solid black;
}

/*如下爲完善效果所需*/
.flex-form > * {
  border: 0;
  padding:10px;
  font-size: 20px;
  line-height: 50px;
  outline: 0;
  border-right:1px solid rgba(0,0,0,0.2);
  -webkit-appearance:none;
}

.flex-form > *:not([type="date"]) {
  border-top:1px solid white;
  border-bottom:1px solid white;
}

.flex-form input[type="submit"] {
  background:#FF5A5F;
  border-top: 1px solid #FF5A5F;
  border-bottom: 1px solid #FF5A5F;
  color:white;
}

仍是利用flex自適應高度的特色,咱們沒有設置任何一個框的寬高,就達到了文字所有水平對齊的效果。

3.響應式設計

若是上面兩個例子依然讓你以爲flex沒什麼大不了的話,第三個例子絕對會讓你大吃一驚。
在設計頁面時,爲了達到響應式的效果,咱們在最初佈局時就須要考慮到在移動端的顯示效果。狀況每每是當須要移動端實現某些效果時,才發現html裏的結構已經固定了,某些板塊佈置起來怎麼寫css都沒法實現。有時耗費的時間比開發兩套頁面還要多。但flex佈局的出現使css有了改變html結構的能力。footer板塊能夠放置到header板塊之上還不用改變html結構,就這麼神奇!

<div class="wrapper">
    <header class="top">
        <h1>What The Flexbox?!</h1>
    </header>
    <nav class="flex-nav">
        <a href="#" class="toggleNav">☰ Menu</a>
        <ul>
            <li><a href="#">Item 01</a></li>
            <li><a href="#">Item 02</a></li>
            <li><a href="#">Item 03</a></li>
        </ul>
    </nav>
</div>
<script type="text/javascript">
  const toggle = document.querySelector('.toggleNav');
  const menu = document.querySelector('.flex-nav ul')
  toggle.addEventListener('click', () => menu.classList.toggle('open'));
</script>

這個頁面由兩部分組成。標題是第一部分,菜單是第二部分,但在移動端呈現時每每是菜單在最上面,之前的css是沒法實現這種效果的
。利用flex能夠設置子元素的排序,這個特性能夠把頁面中的塊變得像積木同樣--咱們想怎麼搭就怎麼搭,隨便你排列組合。

.wrapper {
  display: flex;
  flex-direction: column;
}
.top {
  text-align: center;
}
h1 {
  padding: 40px 0;
  background-image: linear-gradient(60deg, #2bcfd8 0%, #93d02b 100%);
}
a {
  display: inline-block;
  text-decoration: none;
  background-image: linear-gradient(260deg, #2376ae 0%, #c16ecf 100%);
  padding: 20px 5px;
  text-align: center;
  width: 100%;
}
.flex-nav ul {
  display: flex;
  margin: 0 auto;
  border:1px solid black;
}
.toggleNav{
  display: none;
}

ul li{
  flex: 3;
}


@media all and (max-width:500px) {
  .wrapper > * {
    order: 999;
  }
  .toggleNav {
    display: block;
  }
  .flex-nav {
    order: 1;
  }
  .flex-nav ul{
    display: none;
  }
  .top {
    order: 2;
  }
  .flex-nav .open {
    display: block;
  }
}

在pc端時,標題在上方菜單在下方,當屏幕小於500px時,菜單移動到最上面。
這個事例簡單介紹了flex靈活的排列方式,即使你有 10 個內容塊,在響應式設計的時候也能夠隨意更改他們的排序,達到任何你想要的效果。省時省力。


固然flex遠遠不止這些,但它的出現解決了很多css長久以來積累下的佈局疼點。利用浮動和行內塊來佈局致使的各類BUG層出不窮,由於它們的初衷均不是用來佈局。在響應式設計已經成爲網站標配的情況下,浮動和行內塊越顯得力不從心,這也是flex出現的緣由。flex更符合響應式的特色,你從不用給它設置一個固定的寬高,它就能達到你想要的效果。

分享兩個flex學習資源:

  1. css-tricks flex徹底指南 圖多字少,清晰明瞭。

  2. github上的一個項目 flex解決了哪些問題 告訴你flex到底解決了哪些以往css很難解決或沒法解決的問題。

相關文章
相關標籤/搜索