iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0

由於 JavaScript Slider 套件通常會用在展示相片,最常見的的佈局為四個項目區塊,包裝在一個 HTML 的 <div> 標籤中,如下圖所示。

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

灰色底色的區塊為 Slider 內容的 wrapper,黑色虛線代表邊界,內容長度超過不會產生捲軸 (scroll bar),而是被隱藏

淡藍色底色的區塊為 Slider 的項目區塊。

小試身手

HTML 語法

我們先用 HTML 它的骨架搭起來。讓網頁長的像示意圖。

範例 2-1 程式碼截圖
查看範例 2-1

在第 7 行定義一個 class 為「slider」的 <div> 標籤在 4 個 class 為「item」的項目區塊包起來。


圖 b: 範例 2-1 網頁畫面縮小至 25%

當我們用瀏覽器閱讀這個網頁時,顯然畫面離預期還差的很遠,而且大張的照片把頁面往下撐開,不得不把檢視比例調到 25%,整個畫面一起截圖才看的到全貌。

尚未加入 style 語法時,4 個項目區塊呈現各自獨立的一行,那是因為 <div> 原始的 display 屬性為 block。其它預設為 block 的 HTML 標籤還有 <section><article><p><h1><h2>... 等等。

要將項目區塊變成在一行中並排顯示,就必須依靠 style 語法來改變原始屬性了。

CSS 語法

範例 2-2 程式碼截圖
查看範例 2-2

添加 CSS 語法到網頁中有兩種模式,一種是透過 <style> 標籤,如上圖,放在 <head> 之間。
另一種被稱為「Inline CSS」,是使用 style 屬性,直接在 HTML 標籤定義語法。

同樣的瀏覽器畫面,完全使用 Inline CSS 的寫法會是這樣:


查看範例 2-3

重覆的 CSS 語法、增加頁面檔案大小、以及維護不容易,開發一般的網頁時,我們盡量不要使用這樣的寫法。

跑版的畫面

範例 2-3 網頁畫面
圖 c: 範例 2-3 網頁畫面

當我們在 .itemdisplay 屬性改成 inline-block 之後,最外圍的 .slider 的寬度被設為 800px,而每個項目區塊 .item 的寬度被設為 25%,換句話說,寬度被設為:

800 x 0.25 = 200

<img> 因為寬度被設為 100% 的關係,它的寬度動態地取決於上層的 HTML 節點寬度,也就是 .item 的 200px。

總算可以不用縮放瀏覽器的檢視比例,可以看到畫面不因圖片的長度、寬度而被撐爆的畫面了。

範例 2-3 網頁畫面 (查看圖片寬度)
圖 d: 範例 2-3 網頁畫面 (查看圖片寬度)

不過還有些美中不足的地方,它並沒有如預期地 4 個項目區塊在同一列,雖然圖片的寬度的確變成 200px,但是最後一個項目區塊被擠到下一列去了。而且每一個 .item 之間很明顯有多出空白的間隔,因此造成最後一個 .item 超出範圍,而被迫擠到下一列,這是為什麼呢?

前端的坑

歡迎光臨前端的坑 XD。一旦開始進入前端的世界,很快會發現奇奇怪怪的坑不少,不僅不同的瀏覽器可能會有不同的結果,就連相同的瀏覽器版本,在不的作業系統也有可能有不同的結果,這個奇怪的空白,可能會是初學者在入門時會遇到的第一個坑。

它的成因比起其它因為瀏覽器版本、特性的不同而造成的問題來說,比較好理解。

「換行」是一種符號,Unix 系統的「LF」、Windows 系統的「CRLF」也會被視為一種空白字元。

範例 2-4 程式碼截圖
查看範例 2-4

如果改成像以上的寫法,前一個關閉的 </div> 和下一個 <div> 之間沒有換行、沒有空白,瀏覽器畫面看起來就正常,但這是閱讀性不佳,很不好的寫法。

埋了一個坑,產生更多的坑

很多人遇到問題,會在 Stack Overflow 網站上搜尋答案,在沒有好好的探究問題的本質的情況下,找到的答案會產生更多問題,以下是一個例子。

範例 2-5 程式碼截圖
查看範例 2-5

例如在第 10 行,我們加上了 font-size: 0 讓空白字元變成 0px。果然沒有被迫換行了,但裡面的文字,在沒有定義文字大小的情況下,也通通變成 0px,在網頁上看不見了。

範例 2-5 網頁畫面 (查看網頁原始碼)
圖 e: 範例 2-5 網頁畫面 (查看網頁原始碼)

仔細看網頁原始碼有著「楓橋夜泊」這首詩。

總結

擺脫奇怪空白字元的糾纏,在 display 屬性上有更好的選擇,也就是「彈性盒子」(flex box),將會成為 Slider 基本佈局的主角。

對於 CSS 語法的初學者來說,什麼樣的屬性會影響到下一層的 HTML 節點,而什麼屬性不會影響,在下一篇文章中,來討論 CSS 的繼承 (inheritance),有更詳細的介紹。


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


上一篇
Day 1 - 前言與內容大綱
下一篇
Day 3 - CSS 屬性繼承 (Inheritance)
系列文
重造會 Slide 的輪子!深入 JavaScript、CSS 模組化設計30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言