設計稿 - 台灣旅遊景點導覽,今天要實作的區塊是分類按鈕。
有興趣的朋友可以下載 GitHub 專案檔 一起來練習,今天是 Day 25 這個資料夾,example 為完成的範例,exercise 為練習檔,之後會陸續更新每天的進度。
後續單元要撰寫的區塊都會放在 main 元素裡面,由於昨天製作的導覽列是使用 fixed 定位,元素本身是沒有空間的,因此主要區塊 main 需要往上推導覽列的高度 96px mt:96
,以免被導覽列覆蓋。
<header class="fixed ...">
...
</header>
<main class="mt:96">
...
</main>
外層區塊與四邊的距離都為 20px p:20
。
<nav class="p:20">
...
</nav>
內部使用 CSS grid 來製作網格,預設兩個一列,視窗寬度 1024px 以上時四個一列 grid-cols:2 grid-cols:4@md
。
<nav class="p:20">
<ul class="grid-cols:2 grid-cols:4@md">
...
</ul>
</nav>
最後再補上網格的間距 20px gap:20
。
<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
...
</ul>
</nav>
按鈕有分為初始狀態以及選中時的狀態,先來撰寫初始狀態的樣式。
按鈕區塊包含 icon 以及文字,icon 跟文字要左右排列且位於正中間 flex center-content
,高度預設為 60px,視窗寬度 1024px 以上時高度 70px h:60 h:70@md
,背景色 #393c43 bg:fade-30
,圓角 6px r:6
,最後給予 0.2 秒的 transition 過渡 ~background-color|.2s
。
<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
<li>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img src="img/icon/icon-attractions.svg" alt="" />
<span>旅遊景點</span>
</a>
</li>
</ul>
</nav>
icon 的部分寬度預設為 32px,視窗寬度 1024px 以上時 40px w:32 w:40@md
,並且加上 filter 灰階效果 grayscale(1)
,最後給予 0.2 秒的 transition 過渡 ~filter|.2s
。
<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
<li>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img
class="w:32 grayscale(1) ~filter|.2s w:40@md"
src="img/icon/icon-attractions.svg"
alt=""
/>
<span>旅遊景點</span>
</a>
</li>
</ul>
</nav>
文字預設距離左側 icon 8px,視窗寬度 1024px 以上時 10px ml:8 ml:10@md
,文字大小預設 14px,視窗寬度 1024px 以上時 16px f:14 f:16@md
,文字顏色 #b9bbbe f:fade-40
,給予 0.2 秒的 transition 過渡 ~color|.2s
,這邊將 ml:10@md
跟 f:16@md
透過 Master CSS 的群組功能來分組 {ml:10;f:16}@md
。
<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
<li>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img
class="w:32 grayscale(1) ~filter|.2s w:40@md"
src="img/icon/icon-attractions.svg"
alt=""
/>
<span class="ml:8 f:14 f:fade-40 ~color|.2s {ml:10;f:16}@md">
旅遊景點
</span>
</a>
</li>
</ul>
</nav>
接下來要來撰寫按鈕選中時的樣式。
當 li 元素本身有 active 這個類名時,按鈕顏色變為 #202225 bg:fade-10
,icon 取消灰階 grayscale(0)
,文字變為白色 f:white
,這邊使用「Day 10 - 在元素上應用選取器」介紹過的 class 選取器搭配後代選取器來撰寫。
bg:fade-10.active_a
代表當前元素有 active 這個類名時,後代的 a 元素應用 bg:fade-10
這個屬性。grayscale(0).active_img
代表當前元素有 active 這個類名時,後代的 img 元素應用 grayscale(0)
這個屬性。f:white.active_span
代表當前元素有 active 這個類名時,後代的 span 元素應用 f:white
這個屬性。<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
<li class="
bg:fade-10.active_a
grayscale(0).active_img
f:white.active_span
active
">
...
</li>
</ul>
編譯出來的 CSS 規則如下:
.bg\:fade-10\.active_a.active a {
background-color: rgb(32, 34, 37);
}
.grayscale\(0\)\.active_img.active img {
filter: grayscale(0);
}
.f\:white\.active_span.active span {
color: rgb(255, 255, 255);
}
按鈕 hover 時的樣式跟選中的樣式一樣,這邊重複相同的動作。
<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
<li class="
bg:fade-10.active_a
grayscale(0).active_img
f:white.active_span
bg:fade-10:hover_a
grayscale(0):hover_img
f:white:hover_span
active
">
...
</li>
</ul>
</nav>
編譯出來的 CSS 規則如下:
.bg\:fade-10\:hover_a:hover a {
background-color: rgb(32, 34, 37);
}
.grayscale\(0\)\:hover_img:hover img {
filter: grayscale(0);
}
.f\:white\:hover_span:hover span {
color: rgb(255, 255, 255);
}
最終我們使用 Master CSS 完成了分類按鈕的撰寫,完整架構如下:
<main class="mt:96">
<nav class="p:20">
<ul class="grid-cols:2 gap:20 grid-cols:4@md">
<li
class="bg:fade-10.active_a grayscale(0).active_img f:white.active_span bg:fade-10:hover_a grayscale(0):hover_img f:white:hover_span active"
>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img
class="w:32 grayscale(1) ~filter|.2s w:40@md"
src="img/icon/icon-attractions.svg"
alt=""
/>
<span class="ml:8 f:14 f:fade-40 ~color|.2s {ml:10;f:16}@md">
旅遊景點
</span>
</a>
</li>
<li
class="bg:fade-10.active_a grayscale(0).active_img f:white.active_span bg:fade-10:hover_a grayscale(0):hover_img f:white:hover_span"
>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img
class="w:32 grayscale(1) ~filter|.2s w:40@md"
src="img/icon/icon-hotel.svg"
alt=""
/>
<span class="ml:8 f:14 f:fade-40 ~color|.2s {ml:10;f:16}@md"
>推薦旅宿</span
>
</a>
</li>
<li
class="bg:fade-10.active_a grayscale(0).active_img f:white.active_span bg:fade-10:hover_a grayscale(0):hover_img f:white:hover_span"
>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img
class="w:32 grayscale(1) ~filter|.2s w:40@md"
src="img/icon/icon-food.svg"
alt=""
/>
<span class="ml:8 f:14 f:fade-40 ~color|.2s {ml:10;f:16}@md"
>美食饗宴</span
>
</a>
</li>
<li
class="bg:fade-10.active_a grayscale(0).active_img f:white.active_span bg:fade-10:hover_a grayscale(0):hover_img f:white:hover_span"
>
<a
class="flex center-content h:60 bg:fade-30 r:6 ~background-color|.2s h:70@md"
>
<img
class="w:32 grayscale(1) ~filter|.2s w:40@md"
src="img/icon/icon-activity.svg"
alt=""
/>
<span class="ml:8 f:14 f:fade-40 ~color|.2s {ml:10;f:16}@md"
>活動資訊</span
>
</a>
</li>
</ul>
</nav>
</main>
今天是實戰演練的第二天,使用了比較多先前提到的觀念,包括響應式斷點、群組功能、class 選取器等,不熟悉的朋友可以回到這幾個單元複習一下。