使用CSS Flexbox 構建可靠實用的網站 Header

2022-01-03 大遷世界

本文已經過原作者 Shadeed 授權翻譯。 

在 CSS3 沒有普及的時候,創建一個網站 header 是一項既可怕又困難的任務 ?。那時,Flexbox 還是個新東西,我們不得不使用老方法,比如 float和clearfix技術。今天,情況完全不同了,Flexbox 得到了廣泛的支持,大大的減少了我們的開發工作,同時也為我們提供了更多的可能性。

有人可能會說,現在 CSS3 這麼普及,製作一個網站 header 不是很容易麼 ??並非如此,因為有一些有趣的挑戰需要解決,在本文中我們會介紹其中的幾種。

簡介

首先,這裡所說的網站 Header 是用戶訪問網站時首先看到的內容之一。通常,它包含logo或網站名稱以及導航連結,如下所示:

不管 Header 的視覺設計如何,關鍵元素都是logo 和導航。

Flexbox

當 flexbox 應用於 Header 元素時,它將使所有子項目在同一行中。然後,你所需要做的就是應用justify-content來分配它們之間的間距。

html

<header class="site-header">
  <a href="#" class="brand">Brand</a>
  <nav class="nav"></nav>
</header>

css

.site-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

很簡單,對吧?對於這樣的用例,是的,可能會比這更複雜。

Header Wrapper

在上面的 lago 和 nav 外沒有包含一層 wrapper,這在大屏幕可能會出現問題。

從上可以看到第一個Header太寬了,因為它沒有內部 wrapper 相比第一個,第二個看起來好多了。所以,我們可以對 HTML 進行如下調整。

<header class="site-header">
  <div class="wrapper site-header__wrapper">
    <a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
    <nav class="nav"></nav>
  </div>
</header>

flexbox應該移動到.site-header__wrapper元素中。

.site-header__wrapper {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

使用 flex-wrap

當屏幕很小的時候,可以水平滾動。見下圖

如果沒有設置flex-wrap: wrap,當屏幕過小的時候就會出現水平滾動,如果不想這樣,可以加上 flex-wrap: wrap` ?。

Header 的多種形式

我喜歡使用flexbox的原因是它可以很容易地處理 header 設計的多種變化。基於前面的 header  設計,我擴展了 header 元素的一些選項,如添加按鈕、搜索輸入和更改子項目的順序。

Header 變化 1

假設我想要在導航連結旁邊添加了一個按鈕。這應該如何處理?我們應該把它作為連結添加到導航欄中嗎?還是應該和導航分開?我更喜歡這樣做。

<header class="site-header">
  <div class="wrapper site-header__wrapper">
    <a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
    <nav class="nav"></nav>
    <a href="/track-shipment" class="button">Track</a>
  </div>
</header>

這種情況下,我們不能在用 justify-content: space-between來處理間隙,相反,我會在 nav 元素上使用 margin-left: auto,

這樣,它就會自動向右靠齊。

將導航和 track 按鈕分開對於行動裝置非常有用,因為我們需要保留該按鈕並在其旁邊顯示一個移動切換按鈕。

Header 變化 2

與第一個變化類似,這個變化增加了一個搜索輸入,佔用了剩餘的可用空間。對於flexbox,這可以通過使用flex屬性來實現。

html

<header class="site-header">
  <div class="wrapper site-header__wrapper">
    <a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
    <div class="search"></div>
    <nav class="nav"></nav>
    <a href="/track-shipment" class="button">Track</a>
  </div>
</header>

css

.search {
  flex: 1;
}

現在,搜索輸入將填充 brand  和nav 之間的可用空間。但是,這有一些限制。在較小的視口上,header 將如下所示:

搜索輸入寬度不應小於此寬度,因為這樣很難輸入和查看全文。下面有兩種解決方案:

我更喜歡第二種解決方案,因為它不會過早隱藏導航。一般來說,如果元素不影響布局,我會儘量避免隱藏它。

Header 變化 3

對於這個示例,HTML標記是相同的,但是 header 裡的元素順序是不同的。我們如何才能做到這一點? 你可能想到用 order 屬性來解決這個問題 ?

html

<header class="site-header">
  <div class="wrapper site-header__wrapper">
    <a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
    <nav class="nav"></nav>
    <a href="/track-shipment" class="button">Track</a>
  </div>
</header>

css

.site-header {
  display: flex;
  justify-content: space-between;
}

.nav {
  order: -1;
}

這樣有個問題,間隔空間不會使 logo 居中,它只是分散項目之間的空間。

解決方案是給每個子項一個flex: 1,這將在它們之間分配可用空間。

.brand,
.nav,
.button {
  flex: 1;
}

這樣,由於flex: 1,按鈕元素變寬了, 解決此問題的唯一方法是將其包裹到另一個元素中。

HTML

<header class="site-header">
  <div class="wrapper site-header__wrapper">
    <a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
    <nav class="nav"></nav>
    <div class="button-wrapper">
      <a href="/track-shipment" class="button">Track</a>
    </div>
  </div>
</header>

這樣,我們就可以將下面的logo和按鈕居中。

.logo {
  text-align: center;
}

/* 不要介意這裡的命名,這只是出於演示*/
.button-wrapper {
  text-align: end; /* end 等同於LTR語言中的right */
}

但是,如果添加了更多導航連結,這種方法很容易失敗。我們需要確保導航連結的數量不會超過特定的限制。下面一個logo偏離中心的例子 ?:

正如在上圖中看到的,logo沒有居中。所以要記住這一點,以避免這種意想不到的問題 ?。

使用 Flexbox 構建 Header  的有用技巧flex-basis

如果某個元素需要在行動裝置上佔據整個寬度(不能隱藏的重要導航),我會使用flex-basis: 100% ?。

從上面的模型看,做起來可能很簡單。實際上不是。通常,header 可能有一個內部間距(padding),當我們強制某項佔據全部寬度時,除非清除padding ,否則它不會生效。但是,刪除padding不切實際,因為它將影響設計中的其他元素 ?。

下面解決此問題的一種解決方法 ?:

如有需要,請更改其order。有時,可能還有其他元素,我們想確保導航是最後一個。加上一個等於寬度等於 padding 的負 margin,這也會讓導航佔據整個寬度。在導航中添加 padding,這會增加一些適當的空間。最後,使用了justify-content: center將導航項居中(不重要)
.nav {
  flex: 1 0 100%; /* [1] */
  order: 2; /* [2] */
  margin: 1rem -1rem -1rem -1rem; /* [3] */
  padding: 1rem; /* [4] */
  display: flex; /* [5] */
  justify-content: center; /* [5] */
}

間距

著 Chrome 和 Firefox 支持flex gap屬性,現在在flex項目之間添加間距比以往任何時候都容易。考慮以下標題

要做到上圖的高亮間距,只需將gap: 1rem添加到flex父節點。沒有了gap,我們還是需要用舊的方式來間隔 ?。

/* 老的方式 */
.brand {
  margin-right: 1rem;
}

.sign-in {
  margin-right: 1rem;
}

/* 新的方式 */
.site-header {
  /* Other flexbox styles */
  gap: 1rem;
}

作者:Shadeed  譯者:前端小智  來源:ishadeed原文:https://ishadeed.com/article/website-headers-flexbox/

《CSS世界特效》專欄已經更新到第二季啦,目前共有200個讀者訂閱,感謝讀者們的支持與鼓勵。你們的訂閱就是我堅持分享下去的動力與激情,有需要的朋友,可以看看。

第一季:https://blog.csdn.net/qq449245884/category_9873715.html?tt_from=copy_link&utm_source=copy_link&utm_medium=&utm_campaign=client_share
第二季:https://blog.csdn.net/qq449245884/category_10212382.html?utm_source=copy_link&tt_from=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share

相關焦點

  • 如何使用 Flexbox 和 CSS Grid,實現高效布局
    (點擊上方公眾號,可快速關注)來源:葡萄城控制項www.cnblogs.com/powertoolsteam/p/combine-flexbox-and-css-grids-for-layouts.html
  • 好玩的 CSS - 40 個有趣的 CSS 網站
    🌐 基礎學習cssreference.io/[1] CSS 參考書chokcoco.github.io/CSS-Inspira…[2] CSS 靈感www.awwwards.com/sites/zero-…[3] UI 設計師的靈感源泉
  • 學習CSS Flexbox,玩Flexbox 青蛙遊戲
    學習CSS Flexbox,玩Flexbox 青蛙遊戲 導語在學習CSS中,Flexbox是一個比較實用的CSS 布局屬性,但很複雜,有些人可能沒法很快掌握
  • 使用 PostCSS 插件讓你的網站支持暗黑模式
    --nav-bg-color: #2F2F2F;        --content-bg-color: #2C2C2C;        --font-color: rgba(255, 255, 255, .8);    }}:root {    color: var(--font-color)}.header
  • 十一款遊戲教你學會 CSS!
    關注 「」網上有很多有助於學習CSS的遊戲,本文 收集了一些非常實用的免費CSS遊戲,希望這些遊戲可以幫助你再次體驗CSS的樂趣!詳細說明可以參照這篇文章《CSS技巧:flexbox的完整指南》(https://css-tricks.com/snippets/css/a-guide-to-flexbox/),這個頁面只有兩列,高度卻超過了2萬像素,雖然文章題目表明這是一篇完整的指南,但實際上文中並沒有覆蓋到所有內容。
  • 玩遊戲學 CSS,哎,我就是玩兒!
    美味值:🌟🌟🌟🌟🌟口味:氣泡冷麵
  • DIV+CSS規範命名大全集合
    7)、給每一個表格和表單加上一個唯一的、結構標記id8)、給圖片加上alt標籤9)、儘量使用英文命名原則10)、儘量不縮寫,除非一看就明白的單詞二、相對網頁外層重要部分CSS樣式命名外套 wrap ---用於最外層頭部 header -用於頭部主要內容 main --用於主體內容(中部)左側 main-left --
  • 前端 CSS 常用的幾個用法技巧
    CSS重置(reset)css重置庫如normalize.css已經被使用很多年了,它們可以為你的網站樣式提供一個比較清晰的標準,來確保跨瀏覽器之間的一致性。*{ box-sizing:border-box; margin:0; padding:0}使用box-sizing聲明是可選擇,如果你使用下面繼承的盒模型形式可以跳過它。
  • 一次就能看懂的Tailwind CSS介紹
    原來Bootstrap等框架可以通過提前準備組件集合來高效地設計網站,但是有一個缺點,就是因為使用了相同的設計,所以沒有原創性。相比之下,Tailwind CSS 沒有組件集合,所以即使你創建一個名為相同按鈕的組件,每個人都會應用不同的Utilize Class創建它,可以創建出一個高度原創的網站。
  • 20個 CSS 快速提升技巧
    /本文涵蓋了20個css技巧,可以解決許多工作中常見的問題。1、使用CSS重置(reset)css重置庫如normalize.css已經被使用很多年了,它們可以為你的網站樣式提供一個比較清晰的標準,來確保跨瀏覽器之間的一致性。大多數項目並不需要這些庫包含的所有規則,可以通過一條簡單的規則來應用於布局中的所有元素,刪除所有的margin、padding改變瀏覽器默認的盒模型。
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫今天我們來繼續復盤一些工作中常用的css技巧和知識,以便我們可以更加優雅的用css實現富有動感的網站.
  • css大法之使用偽元素—實現超實用的圖標庫
    偽元素的知識以及如何用css偽元素來減輕javascript的壓力,做出一些腦洞大開的圖形。偽類用來表示無法在CSS中輕鬆或者可靠檢測到的某個元素的狀態或屬性,比如a標籤的hover表示滑鼠經過的樣式,visited表示訪問過的連結的樣式,更多的用來描述元素狀態變化時的樣式,偽類主要有:我們利用css偽類和偽元素可以實現很多強大的視覺效果,這裡我主要介紹偽元素,如果對偽類或其他css特性感興趣,可以看看我之前的css文章,
  • 如何用一行 CSS 實現 10 種現代布局?
    這篇文章重點介紹一些強大的 CSS 代碼片段,用它們可以執行一些繁重的布局編程工作,還能幫助我們構建強大的新式CSS布局。這裡我們會介紹10 種新式 CSS 布局和大小調整技術,突出了單行CSS樣式代碼的強大和影響力。
  • 【乾貨】Css精髓:這些布局你都學廢了嗎?
    gt;</header> <main></main> <footer></footer> cssgt;</header> <main></main> <footer></footer> css
  • 美食網站模板
    DOCTYPE html><html><head><meta charset="utf-8" /><meta name="description" content="" /><meta name="keywords" content="" /><title>美食網站</title
  • 12個CSS高級技巧匯總
    註:在IE11中要小心flexbox。5、使用負的 nth-child 選擇項目在CSS中使用負的 nth-child 選擇項目1到項目n。8、對純CSS滑塊使用 max-height使用 max-height 和溢出隱藏來實現只有CSS的滑塊:.slider ul {max-height: 0;overlow: hidden;}.slider:hover ul {
  • 程序屋|令人驚豔的CSS框架TailWindCSS的安裝使用教程
    >Tailwind CSS 是一個功能類優先的 CSS 框架,它集成了諸如 flex, pt-4, text-center 和 rotate-90 這樣的的類,它們能直接在腳本標記語言中組合起來,構建出任何設計。
  • 如何寫一份不錯的CSS代碼?
    舉個例子<header class="header">    <img class="logo">    <form class="search-form">        <input
  • 前端工程師必備的17個實用網站
    一、配色類網站http://colorhunt.cohttp://www.bootcss.com/p/websafecolors/http://www.css88.com/各種前端類工具和技術文章https://youzan.github.io/vant/#/zh-CN/intro輕量、可靠的移動端 Vue 組件庫
  • 10個非常實用的CSS技巧
    是的,如果你不知道,我們可以在 CSS 中使用圖像作為光標。代碼片段如下:<link rel="preconnect" href="https://fonts.gstatic.com"><link href="https://fonts.googleapis.com/css2?