iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0

今天的文章要來幫 Slider 加上「上一個」以及「下一個」按紐。在這之前,先回顧一下 Slider 的基本佈局。就如第二天的文章提到,Slider 套件通常會用在展示相片,最常見的的佈局為四個項目區塊,包裝在一個 HTML 的 <div> 標籤中,如下圖所示。

Slider 基本佈局
圖 a: Slider 基本佈局

灰色底色的區塊為 Slider 容器,黑色虛線代表邊界,內容長度超過不會產生捲軸,而是使用 overflow: hidden 屬性隱藏超過範圍的項目元素。淡藍色底色的區塊為 Slider 的項目區塊。

方向按紐在佈局中的位置
圖 b: 方向按紐在佈局中的位置

以目前的佈局,要塞進兩個按紐到 Slider 的左右方,會因為 overflow: hidden 屬性,可視範圍被部分裁切。

修正佈局

修正後的 Slider 佈局
圖 c: 修正後的 Slider 佈局

新加入的按紐、以及還有未來可能有新功能的需求,例如進度條、讀取動畫等等,無法直接放在 Slider 的 flexbox 容器中,因此需新定義一個外層的包裝 (wrapper),而其它的功能,只要發揮些想像力,都可以在這個包裝容器中實現。

準備

範例 8-1 原始碼
查看範例 8-1

根據新修正後的佈局規劃,我們新增加了一個外層的包裝容器 .slider-wrapper,內層的 .slider 改名為 slider-inner 以供區別,其餘和前幾天的範例的區別如下:

第 8 行:把寬度的設定值改放到外層。
第 14 行:寬度改為 100%,讓這個 flexbox 可以自由縮放。
第 45 行:新角色加入 - 上一個按紐
第 46 行:新角色加入 - 下一個按紐

裝飾按紐
圖 d: 左下角尚未經過 CSS 裝飾的按紐

可以看到尚未經過 CSS 化妝後的新角色們,躲在左下角不敢出來,像個害羞的小媳婦。讓我們來幫忙一下,使用 CSS 屬性加她們裝飾成按紐樣式,並定位到示意圖中,「上一個」以及「下一個」按紐的所在位置吧。

按紐裝飾

裝飾的過程主要分成三個步驟:

  • 把單純的 <div> 裝飾為球型按紐。
  • 把按紐就定位。
  • 在球型按紐上放置代表方向的三角型符號。

球型

範例 8-2 原始碼
查看範例 8-2

第 4 行:將 display 屬性設為 inline-block 把單行區塊變為行間區塊。
第 5 行:使用 overflow 屬性,把超過範圍的元素隱藏,所以設為 hidden
第 6、7 行:設為一個 32 x 32 的正方型區塊。
第 8 行:將邊框半徑為會 50%,正方型的上、下、左、右,四個角都會變成完美圓弧,讓這個區塊變成一個圓型。

圓形按紐
圖 e: 把按紐變成圓形

如上圖所示,「上一個」以及「下一個」區塊已變成圓型,超過的範圍的文字被裁切。

定位

範例 8-3 原始碼
查看範例 8-3

第 3 至 7 行:相同的樣式設定,可以把它放在起。這邊是 .previous.next 共用屬性。
第 5 行:定位用的關鍵屬性 position 設為 absolute
第 6 行:top 屬性是指,從容器上方邊界算下來 50%,再減掉本身高度的一半(32 除以 2),以達成垂直置中。
第 10 行:.previous 的水平位置從左方算起,起點為 0px。
第 14 行:.next 的水平位置從左方算起,起點為 0px。

position 垂直置中
圖 f: 按紐經過 position 垂直置中

結果兩個按紐跑到整個網頁的中間去了,這是為什麼呢?

原因在於,當 position 屬性指定為 absolute 時,該元素會尋找上一層的 position 非預設值 static 的元素作為父容器,並開始定位。

在這個範例中,上一層的 .slider-wrapper 並沒有設定 positionrelative,因此,「上一個」以及「下一個」是以最上層的 <body> 開始定位。

範例 8-4 原始碼
查看範例 8-4

第 11 行:在外容的包裝容器 .slider-wrapper 新增 position: relative 屬性。

按紐位置
圖 g: 按紐位置貼在邊緣

這時候按紐已就定位,不過還差一點點。我們希望它可以貼在邊界上。和垂直線對齊。

範例 8-5 原始碼
查看範例 8-5

將「上一個」的位置往 left 的反方向移 16px,也將「下一個」的位置往 right 的反方向移 16px,這樣微調,就可以和垂直線對齊。

垂直線對齊
圖 h: 按紐位置已和垂直線對齊

如範例所示。按紐已就定位。

三角型符號

在這個階段,我們要將代表方向的三角型符號放上去,這樣看起來才像是「一種按紐」。

範例 8-6 原始碼
查看範例 8-6

第 7 行:把字體大小設為 0,把字藏起來,接下來會用三角型符號取代。
第 19 至 29 行:三角型符號朝左。
第 32 至 43 行:三角型符號朝右。

在第 19 及 32 行看到的 ::before,是使用偽元素 (pseudo element),在網頁中是不存在 HTML 實體,但確是真實存在的元素。

避免離題,關於偽元素會放在明天的文章中,與偽類 (pseudo class) 一起進行專文討論。

按紐三角形圖示
圖 h: 完成按紐三角形圖示

在這裡範例中,利用了邊框屬性具備的特性,稍微修改一下達三角型符號圖示的效果。

總結

原本打算按紐就定位後,就開始介紹如何加上 JavaScript Event,設計監聽按紐的點擊事件,以及加上能讓 Slider 真正「動」起來的 CSS 屬性。

不過實務上的前端工作,熟悉偽類以及偽元素,才是能把 UI 設計師丟出來的設計稿中,天馬行空想法付諸實現的手段。例如,在購物網站買東西,結帳時的付款方式列表,臨時要在每個付款方式前面加上圖示,倒不用真的在 HTML 中加 code,只要針對該付款方式對應的 class,加上偽元素即可。

明天的文章會詳細介紹 CSS 中的偽元素及偽類,相信對大家在解決前端的難題時,會很有幫助。


文中範例可在 GitHub Page 閱讀。
原始碼可在 2022 鐵人賽專用 GitHub Repo 下載。


上一篇
Day 7 - CSS Flex 屬性指南 (3) 項目微調
下一篇
Day 9 - CSS 偽元素 (Pseudo Element)
系列文
重造會 Slide 的輪子!深入 JavaScript、CSS 模組化設計30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言