iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
自我挑戰組

學習HTML&CSS的30天系列 第 27

[Day27]活用 CSS 編排各種 Layout

  • 分享至 

  • xImage
  •  

今天我們要開始試著用 CSS 動手編排網頁的版面(Layout)。
排版時善用屬性,就能輕鬆編排出常見的「彈性版面」(Flexible Layout)
或「格線式版面」(Grid Layout),請一定要試試看喔!


  • 用 Flexbox 屬性將元素水平排列

    Flexbox 是 CSS3 獨特的彈性排版屬性,全名是「Flexible Box Layout Module」,
    能輕鬆組合出複雜的「彈性版面」(Flexible Layout)。
    以前比較流行用 float 屬性排版,在 CSS3 之後排版的主流就是 Flexbox 屬性,
    建議初學者一定要學會。
  • Flexbox 的基本寫法
    首先要掌握 Flexbox 排版的原則,
    就是在 HTML 中要建立稱為「Flex Container」的父元素,
    並在父元素中插入稱為「Flex Item」的子元素。

    下面就實際來撰寫,請先在 HTML 中建立一個 < div > 標籤,
    將他套用「container」類別,當作父元素;
    接著在父元素的 < div > 標籤內再插入幾個 < div > 標籤,
    套用「item」類別,當作子元素。

    https://ithelp.ithome.com.tw/upload/images/20221012/20152216BHSMgA8pgh.png

    https://ithelp.ithome.com.tw/upload/images/20221012/20152216bo5rEOV1RO.png

    • 本例包含一個父元素 div 標籤和四個子元素 div 標籤

    https://ithelp.ithome.com.tw/upload/images/20221012/20152216ygXpxXolRN.png

    • 在此先建立子元素要套用的類別「.item」
      (為了方便辨識,替「.item」設定藍色背景與留白)

    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221012/201522166LDo7hkD9h.png

    • 用瀏覽器開啟 html 檔案,會發現四個套用「.item」類別的子元素會如圖從上到下垂直排列。

    接著只要做一點小修改,就可以把這些方塊變成水平排列了。
    HTML 不用更改,請在 CSS 檔案中建立父元素要套用的「.container」類別,
    並加上「display: flex;」。

    https://ithelp.ithome.com.tw/upload/images/20221012/20152216sXIi9GVzL5.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221012/20152216AF67bWf1QU.png

    • 修改後,套用「.item」的子元素也會受到父元素的「display: flex;」屬性影響,變成水平排列。

    在父元素中描述「display: flex;」之後,子元素就會自動並排,
    接下來若在父元素中增加屬性,就可以控制子元素的排列方法,包括改變順序、改變方向、換行等。
    以下將分別示範,請注意大部分都是修改父元素(「container」類別)的描述內容。

  • 用「flex-direction」屬性設定子元素的排列方向
    利用 flex-direction 屬性可以設定子元素要往哪個方向排列,水平或垂直都可以。

    flex-direction 屬性可以使用的值

    說明

    row(預設值)|由左往右排列子元素
    row-reverse|由右往左排列子元素
    column|由上往下排列子元素
    column-reverse|由下往上排列子元素

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216eum5eV2HOk.png

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216MClJpibdQT.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216ys7rj9epQs.png

    • 套用了「row-reverse」的子元素,會從右側視窗開始,由右往左水平排列。
  • 用「flex-wrap」屬性將子元素換行
    使用 flex-wrap 屬性可以設定讓子元素排成一行或多行。
    排成多行的狀況,是當子元素超過父元素的寬度時,會自動換行變成多行。

    flex-wrap 屬性可設定的值

    說明

    nowrap(預設值)|子元素不換行,排列成一行
    wrap|子元素自動換行,由上往下排列
    wrap-reverse|子元素自動換行,由下往上排列

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216g4NhsvsLyH.png

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216wwEKtFXWC2.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216pgNoHaUU2h.png

    • 套用「wrap」的設定後,會在排列到父元素的邊緣時,自動排到下一行。
  • 用「justify-content」屬性設定水平對齊方式
    目前子元素都是採用預設的對齊方式,如果父元素有足夠空間,
    可利用 justify-content 屬性設定水平對齊方式,自行決定要如何對齊。

    justify-content 屬性可以使用的值

    說明

    flex-start(預設值)|靠左對齊:從行頭開始排列
    flex-end|靠右對齊:從行尾開始排列
    center|置中對齊
    space-between|左右對齊:把最初與最後的元素放在左右兩端,再以均等間隔排列元素
    space-around|分散對齊:讓所有子元素(包含最初與最後的元素)都以均等的間隔排列

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216uGE40cjAS5.png

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216u0r3rnsDb3.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216FeALybjJ4w.png

    • 子元素會對齊畫面的右邊。
  • 用「align-items」屬性設定垂直對齊方式
    同樣的,也可以使用 align-items 屬性,設定垂直方向的對齊方式。
    元素仍會水平排列,但會改變垂直位置。

    align-item 屬性可以使用的值s

    說明

    stretch(預設值)|延伸:會根據父元素高度或內容最多的子元素高度,將所有元素往垂直方向填滿
    flex-start|靠上對齊:從父元素的起始位置開始排列
    flex-end|靠下對齊:從父元素的終點開始排列
    center|置中對齊:對齊垂直置中的位置
    baseline|基線對齊:對齊內容的基線

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216EujgUvVDtB.png

    • vh 是以 Viewport(瀏覽器顯示區域)的高度為基準的單位。

    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216i2y8LEhV4w.png

    • 使用「height」設定高度,高度設定為「100vh」,因此是在整個顯示區域的垂直中央位置排列元素。
  • 用「align-content」屬性設定多行對齊
    當子元素橫跨多行時,可使用 align-content 屬性設定垂直方向的對齊方式。
    不過要注意,當父元素設定「flex-wrap: nowrap;」屬性(不換行)時,
    子元素會變成一行,則 align-content 的設定就會無效。

    align-content 屬性可以使用的值

    說明

    stretch(預設值)|延伸:會根據父元素的高度延伸填滿
    flex-start|靠上對齊:從父元素的起始位置開始排列
    flex-end|靠下對齊:從父元素的終點開始排列
    center|置中對齊:對齊垂直置中的位置
    space-between|上下對齊:把最初與最後的元素放在上下兩端,再以均等間隔排列元素
    space-around|分散對齊:所有的子元素都等距排列

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216FXbnjaaVKn.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216rvzeoXDRlj.png

    • 利用「flex-wrap: wrap;」屬性讓方塊自動換行、上下對齊。
  • 用 CSS 隔線(CSS Grid)屬性設計磚牆式版面

    所謂的磚牆式版面,顧名思義就是好像在牆上貼磁磚一樣,
    將元素設定成同樣大小的方塊、等距排列,
    這個功能可以用「CSS Grid(CSS 格線)」這個屬性來製作。
  • 活用 CSS 格線的排版方式
    使用 CSS 格線時,和 flexbox 一樣,需要有父元素和子元素。
    要使用稱為「格線容器(Grid Container)」的父元素包夾整體,
    然後在父元素中置入要水平排列的「格線項目(子元素)」。
    格線項目之間的空隙,則稱為「格線間距(Grid Gap)」。

    以下舉個例子,是利用 CSS 格線,把 6 個方塊排成 3 欄 2 行的磚牆式版面。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216qeKjau0O1I.png

    Point
    -----
    如果要水平排列元素,必須先用父元素包夾要排列的子元素。
    
  • CSS 格線的寫法
    下面就實際來撰寫,方法和 Flexbox 的範例很類似,請先在 HTML 中建立一個 < div > 標籤,
    將他套用「container」類別,當作父元素;
    接著在父元素的 < div > 標籤內再插入六個 < div > 標籤,
    套用「item」類別,當作子元素。

    接著請在 CSS 檔案中建立父元素要套用的格線容器「.container」,
    並且加上一行「display: grid;」屬性,接著就可以編排 CSS 格線版面。
    接著再建立子元素的「.item」類別,在此為了方便辨識,也將子元素加上藍色背景色。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216e5rv4Wc6QE.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216wqmpf6S4PJ.png

    • 目前只會垂直排列格線項目。
  • 用「grid-template-columns」屬性設定格線項目(子元素)的寬度
    目前子元素是呈現垂直上下排列的狀態,接下來要透過幾個屬性,調整成等距排列的方塊。
    首先要用 grid-template-columns 屬性設定每個格線項目的寬度,
    這樣就會變成水平排列。如果想要指定「在同一行內需要多個格線項目」,
    就用半形空格隔開需要的格線項目數量,並指定每個項目的寬度。
    例如希望一行排列 3 個格線項目、每個項目的寬度為 200px 時,
    就設定為「200px 200px 200px」。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216EwFNdo6BQF.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216KnZaHYJM0H.png

    • 格線項目會水平排列、三個一行
  • 用「gap」屬性設定格線項目(子元素)之間的空隙寬度
    前面的範例有點難辨識範圍,我們可以在格線項目之間再插入空隙,
    方法是利用 gap 屬性設定空隙的寬度。
    指定的寬度只會套用在子元素彼此之間的空隙,
    所有子元素上下左右四邊仍會貼齊父元素格線容器的外框。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216Citt14S4oZ.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/201522163aW3wnS7hg.png

    • 在格線項目之間加上了寬度為 10px 的空隙。
  • 認識「fr」:CSS 格線可以使用的單位
    在使用 CSS 格線時,可以使用一個特別的單位「fr」。
    「fr」是指「fraction(比例)」,意思是可以用比例來設定父元素對應子元素的大小。
    假如用「px」設定寬度時,寬度是固定的;
    使用「fr」來設定寬度就可以讓內容依畫面的寬度自動伸縮,非常方便。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216EAi4BMce9C.png

    • 用「px」設定時,寬度是固定的,如果畫面較寬,右邊會出現空白。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216ijxBVI75na.png

    • 用「px」設定時,寬度是固定的,如果畫面較窄,右邊會被裁切。

    我們重新用「fr」這個單位設定格線項目的寬度,也就是 grid-template-columns 屬性
    只要設定成「1fr 1fr 1fr」,就能以 1:1:1 的比例來顯示格線項目。
    若要改變大小,就調整數值。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216G1qnMGPKZg.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216JnE1igxQMW.png

    • 設定成「fr」就會依畫面的寬度自動縮放。畫面較寬時,格線項目也會擴大。

    https://ithelp.ithome.com.tw/upload/images/20221013/20152216wKkUMGvF9Z.png

    • 畫面寬度變窄時,寬度會自動縮小。
  • 用「grid-template-rows」屬性設定格線項目(子元素)的高度
    使用 grid-template-rows 屬性可以設定格線項目的高度。
    假如有多行,就用半形空格隔開,需要幾列就寫幾次。
    例如要排 2 列、高度皆為 200px 時,請描述為「200px 200px」(把 200px 寫 2 次)。
    設定完成後,就做出磚牆式版面了!

    https://ithelp.ithome.com.tw/upload/images/20221013/201522167xxJd2LhN7.png
    實際畫面
    https://ithelp.ithome.com.tw/upload/images/20221013/20152216PFrl3uJR7R.png

    • 指定了寬和高,就能把相同大小的方塊排成磚牆狀。
  • 如何提高版面的易讀性

    網站的版面設計,會影響使用者對網站的印象,所以事前一定要仔細規劃,每個元素都應該要妥善的安排。
    排版時需要特別注意的,就是版面的易讀性,要了解使用者如何瀏覽,才能做出最容易讀的版面。
    以下分為幾點來分析如何排版才能順利地傳達訊息。
  • 了解人的視線如何移動
    使用者瀏覽畫面時,視線流動的方式其實有一定的規則。
    如果能按照視覺動線來安排元素,就可以讓版面發揮更好的效果。

    據說,如果是使用者首次造訪的網站,或是圖片較多的網站,通常會以「Z 字型動線」來瀏覽整個畫面;
    而如果是使用者經常造訪的網站或是資料量較多的網站,則是常用「F 字型動線」來搜尋要看的目標。

  • 決定資料的優先順序
    利用「Z 字型動線」及「F 字型動線」掌握使用者的視線流動後,
    請先思考這個網頁最想強調的部分,然後再開始排版。
    如果想要傳達的內容太多,或是排版太過雜亂,會無法傳達重點,容易導致使用者跳離。

    思考排版順序
    根據前面的視覺動線,大部分使用者都是從畫面的左上方開始瀏覽網頁的,
    因此左上方就是最重要的位置,建議要放置最重要的資訊,或是最希望使用者馬上注意到的元素。

    至於優先順序較低的元素,只要方在網頁的下方或右側即可。

    Point
    -----
    建議使用 Flexbox 或 CSS 格線排版,就能組合出整齊又富有彈性(可自動調整)的版面。
    

    評估每個元素所佔的面積
    如果是最重要的資訊,只要放大面積就能提高注目度。
    例如在首頁置入較大的主視覺影像。

    反之,如果是不重要的資料,就縮小面積。
    這樣就能完成有強弱對比,容易閱讀的版面。

    Point
    -----
    排版時,要思考優先順序,再安排元素。
    

今天只有初步介紹了 Flexbox 跟排版,雖然圖片跟內容有點多,
但還是希望可以帶來幫助!

那麼我是沒魚,這是我的第二十七天,距離完賽剩下三天.../images/emoticon/emoticon29.gif

<上一篇> [Day26]設定「類別(class)」與「ID」
<下一篇> [Day28]重置網頁的 CSS 設定


上一篇
[Day26]設定「類別(class)」與「ID」
下一篇
[Day28]重置網頁的 CSS 設定
系列文
學習HTML&CSS的30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言