淺談 CSS 中的 Media Queries

閱讀時間約 10 分鐘

隨著智慧型手機、平板等裝置越來越普及,傳統以電腦螢幕為主的網頁設計方式,漸漸無法滿足大家對於優質 UI/UX 的期待。想像一下,當你用手機打開某個網頁,結果畫面不是破版就是元件很難點擊,一定會氣到跳出網頁不用了吧?因此 RWD (Responsive Web Design) 響應式網站設計蔚為主流。

RWD 的重點,在於為不同螢幕尺寸的裝置,設計不同的版面。主流的做法是從行動裝置,也就是螢幕尺寸比較小的版面開始設計,因此也被稱為 Mobile First 的設計原則。而要做到 Mobile First 和 RWD,CSS 中的 Media Queries 絕對是不可或缺的要角!

本篇學習筆記會著重在 Media Queries 的基本用法。

什麼是 viewport?

根據 MDN 的定義,media queries 的解釋如下,讓我們能依照不同尺寸的 viewport (視窗) 建立不同的版面:

Media queries are a key part of responsive web design, as they allow you to create different layouts depending on the size of the viewport...

這邊需要留意,中文時常也將 window 翻譯為視窗,但是兩者之間的概念其實不同。

  • Window:window 指的是整個瀏覽器視窗,所以包含 URL 搜尋吧、你的書籤列、分頁等等。window 的尺寸會隨著使用者調整瀏覽器視窗大小而改變。
  • Viewport:viewport 指的是當前瀏覽器顯示出來的網頁內容,會隨著 window 大小、裝置的螢幕尺寸而改變。

為了怕引發誤會,我們在這篇學習筆記都會以 viewport 或 window,避免使用視窗這個模稜兩可翻譯名詞。

此外,也建議在 HTML 的 <meta> 裡面加入以下 viewport 設定,告訴瀏覽器 viewport 要以什麼為基準:

name="viewport" content="width=device-width, initial-scale=1"


width=device-width 代表將內容寬度調整為裝置寬度,而 initial-scale=1 則定義在網頁載入時的縮放等級,讓 CSS 像素與裝置實體像素的比例為 1:1。




media queries 基本語法

RWD 通常關注寬度 (width),而在使用 media queries 的時候,往往搭配 max-width 以及 min-width 這兩個屬性。

  • max-width:若 viewport 小於或等於指定的最大寬度,就套用 media queries 包覆的 CSS 設定。
  • min-width:若 viewport 等於或大於指定的最小寬度,就套用 media queries 包覆的 CSS 設定。

舉一個實際上的例子:

@media (max-width:600px) {
body {
background-color: red;
},
h1 {
font-weight: bold;
}
}
  • 首先用關鍵字 @media 表示接下來的程式碼套用 media queries。
  • 半形括號內,帶入 media feature,像是 max-width: 600px

大括號內帶入指定尺寸範圍內套用的 CSS,可以置入多個選擇器,一樣用半形逗號隔開即可。
用白話解釋程式碼:在 viewport 小於等於 600 px 之下,body 的背景顏色為紅色,而且 h1 元素的文字寬度為粗體。

media queries 讓我們可以在不同的 breakpoint 提供不同的 CSS 樣式,帶來更棒的使用體驗
圖片來源:Alpha Camp

圖片來源:Alpha Camp

media type

時常可以在 CSS 的第一組 media query 看到 @media screen,這是因為某些舊型的瀏覽器並未支援 media query,所以我們需要用這個關鍵字,告訴那些瀏覽器說:「嘿,如果你後面看到其他 media query,請直接忽略掉它們,以這個有標記 screen 的 CSS 為主!」。

除了 screen 之外,CSS 還有提供 print 作為影印模式的關鍵字,但最常見的還是 screen,而且時常跟著關鍵字 and 一起出現,後面接上尺寸。更多資訊可以參考 @media - MDN

@media screen and (min-width: 900px) {
article {
padding: 1rem 3rem;
}
}


media feature

widthheight 只是 media feature 的其中兩部分,另一些比較常用的功能包含 orientation

  • orientation: portrait - viewport 的高度大於或等於寬度。
  • orientation:landscape - viewport 的寬度大於或等於高度。
@media only screen and (orientation: portrait) {
h1::before {
content: "PORTRAIT BABY!!!";
}
}


上面的程式碼,代表當 viewport 的高度大於或等於寬度時,h1 元素前面將插入 PORTRAIT BABY!!! 字樣。

orientation 針對行動裝置橫擺或直擺的版面情境下,應該會有其用武之地。其他 media feature 族繁不及備載,可以參考 MDN 文件



優先順序問題

和其他 CSS 一樣,media query 遵循由上而下的順序,也就是說,當某個選擇器同時符合兩組 media query 的設定,後面那一組會贏得勝利。以下面的程式碼為例,若 viewport 寬度大於 1200px,雖然第一組 media query 也符合,但最終 body 背景顏色會呈現黃色。

  1. 瀏覽器檢查當前 viewport 超過 800 px,符合第一組 media query,所以 body 背景顏色套用橘色。
  2. 往下執行 CSS,發現有第二組 media query 符合,body 背景顏色因此被更新為黃色。
  3. 底下沒有其他 CSS 了,最終成果產生~
@media only screen and (min-width: 800px) {
body {
background-color: orange;
}
}

@media only screen and (min-width: 1200px) {
body {
background-color: yellow; /* This one wins! */
}
}

假設我們改變兩者的順序,body 背景顏色會改為橘色。:

@media only screen and (min-width: 1200px) {
body {
background-color: yellow;
}
}

@media only screen and (min-width: 800px) {
body {
background-color: orange; /* This one wins! */
}
}


✍️ 為了避免誤會和閱讀直覺性,最好還是依循尺寸大小進行排序。



如何在瀏覽器測試不同尺寸的設定

寫好 media queries 之後,我們當然會想測試看看結果如何,最直覺的方法是自由擴展、壓縮瀏覽器視窗來調整 viewport。這樣不是不行,但是非常麻煩,而且看起來有點蠢,所以我們應該多多善用瀏覽器提供的測試工作。

這邊以 Chrome 的 DevTool 為例,打開之後點選裝置的 icon,左手邊的視窗便會進入 RWD 設定模式,於上方調整寬度和長度的數字即可測試 RWD 效果如何,非常方便 ❤️

前面我們提過 orientation: landscape 或是 orientation: portrait,想要測試這一塊,也可以點擊上方調整欄當中,最右邊的裝置搖晃 icon,切換橫擺或直擺。

raw-image

Mobile First 設計原則

現代生活中,行動裝置已經成為主流了,因此我們在進行前端開發時,務必要把行動裝置使用者放在設計核心。Mobile First 的設計原則應運而生。它講求的重點如下:

如何隨著裝置螢幕放大,而增加應用程式的內容

要注意,Mobile First 不是要我們想方設法把所有內容都塞進行動裝置的排版裡面,設度的斷捨離,才能創造更優質的使用體驗。畢竟雖然是同一個應用程式,但桌機使用和行動裝置使用,很可能情境與需求都會變化

除此之外,由於行動裝置的效能往往比不上電腦,因此把行動版的程式碼放到前面,也不失為一種好做法,這部分還需要在後續的實作中體會。



參考資料


18會員
34Content count
Bonjour à tous,我本身是法文系畢業,這邊會刊登純文組學習網頁開發的筆記。如果能鼓勵更多文組夥伴一起學習,那就太開心了~
留言0
查看全部
發表第一個留言支持創作者!
蕭宇廷的沙龍 的其他內容
淺談 JavaScript 同步、非同步、Event Loop 的觀念
如何安裝、初階使用 Express 框架的學習筆記。
如何善用 NPM 安裝現成套件,提高開發效率
初探 Node.js 的模組概念,以及 module 物件中的 exports 與 require 屬性,完成模組輸出與帶入。
參考 Node.js 官方文件,快速建立一個簡單的網站伺服器~
淺談 JavaScript 同步、非同步、Event Loop 的觀念
如何安裝、初階使用 Express 框架的學習筆記。
如何善用 NPM 安裝現成套件,提高開發效率
初探 Node.js 的模組概念,以及 module 物件中的 exports 與 require 屬性,完成模組輸出與帶入。
參考 Node.js 官方文件,快速建立一個簡單的網站伺服器~
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
人的修行到了一定阶段,就会经历虚幻的过程,这些幻象是真是存在的,是虚空法界的东西,但是如果修行人做到有足够的定力,也即使人在幻象阶段,也能做到明辨是非,知道什么是对的,什么是错的。 若是错的,在幻象里的,那就不要去做。 在现实当中,也不要把虚空法界的东西当成现实,不能作真像去看待。
Thumbnail
很早期的学生,会听我讲过“缘法”。会知道要用“缘法”去看问题。但“缘法”究竟详细说的是什么?大家可能还是一知半解。 而隨着大家了解的东西越多,越來越觉得需要往上修,增加无漏功德,然后自己真的变好了时。突然就会想到一个问题,今生我能有这改变,有这些助力,全因为碰到我在讲这些东西,也因为我在讲的时候,
Thumbnail
倪海厦老师在天纪中提到了很多种断卦方法,这里只选取几个简单的方法进行概括,总结和简化,没有任何关于倪海厦老师知识的文章可以比得上倪海厦老师的原视频,建议各位看官从原视频中吸取更多好方法。
昨晚睡觉前,我把手机放在枕头边,躺在床上,听Youtbue 上,一位叫做LT视界的大咖讲解沈栋发表的《红色赌盘》中的一些细节。 这位大咖的分析非常到位。我之前也听过很多沈栋在台湾的访谈节目。我当初对于这位作者的印象还不错,觉得他思路很敏捷,谈吐不凡,见识广,的确是很有感染力,吸引力和洞察力。是个了不
今日看到一句话让我感触颇深,想到了成长与经历这些字眼,觉得有道理便记下这段话; 离群索居者,不是野兽便是神灵。 尤其是在学生时代这种感觉尤为强烈,却不知都是一群连价值观都没形成的孩子。这种现象在学校中尤为突出。 被孤立的人啊!愿你成为上帝的宠儿。
Thumbnail
台劇《斯卡羅》在剪輯部分遭到許多人詬病,個人也覺得這部戲的剪輯確實可以再更好。 不過第六集有一幕的剪輯,個人相當喜愛。 為了阻止美國海軍攻打部落,女主角蝶妹回到故鄉瑯嶠(現今的恆春),隻身上山前去和部落交涉,希望族人交出殺害美國人的兇手,卻遭族人視為叛徒而被趕下山。
Thumbnail
「我們用一個東西去比擬另一個東西,這兩件東西最好距離夠遠,又同時具備平行的相似性,連結的方式要精準有說服力,夠遠則表示有創意。也就是要找到一個夠有創意且執行度高的表現策略。」── 羅智成
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
Thumbnail
短篇小說,看似字數比較短,卻不代表內容品質與高度能偷工減料,也就是,你得呈現出和「長篇」小說同樣的效果,很驚人吧? 長篇小說的字數多,寫作彈性比較大,短篇小說當然就沒那麼有彈性,所以,不要相信那種「短篇小說適合初學者練習」這種鬼話,那是「請鬼拿藥單」。
Thumbnail
這篇很長很長,而且觀點可能與台灣一般人接收到的很不一樣。重點就在兩句話,「太陽底下沒新鮮事」與「國際關係源自各國的國內政治」,說穿了人類總是老幹同樣的事情,沒啥長進。(註:但筆者也想不到更好的方法)
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
人的修行到了一定阶段,就会经历虚幻的过程,这些幻象是真是存在的,是虚空法界的东西,但是如果修行人做到有足够的定力,也即使人在幻象阶段,也能做到明辨是非,知道什么是对的,什么是错的。 若是错的,在幻象里的,那就不要去做。 在现实当中,也不要把虚空法界的东西当成现实,不能作真像去看待。
Thumbnail
很早期的学生,会听我讲过“缘法”。会知道要用“缘法”去看问题。但“缘法”究竟详细说的是什么?大家可能还是一知半解。 而隨着大家了解的东西越多,越來越觉得需要往上修,增加无漏功德,然后自己真的变好了时。突然就会想到一个问题,今生我能有这改变,有这些助力,全因为碰到我在讲这些东西,也因为我在讲的时候,
Thumbnail
倪海厦老师在天纪中提到了很多种断卦方法,这里只选取几个简单的方法进行概括,总结和简化,没有任何关于倪海厦老师知识的文章可以比得上倪海厦老师的原视频,建议各位看官从原视频中吸取更多好方法。
昨晚睡觉前,我把手机放在枕头边,躺在床上,听Youtbue 上,一位叫做LT视界的大咖讲解沈栋发表的《红色赌盘》中的一些细节。 这位大咖的分析非常到位。我之前也听过很多沈栋在台湾的访谈节目。我当初对于这位作者的印象还不错,觉得他思路很敏捷,谈吐不凡,见识广,的确是很有感染力,吸引力和洞察力。是个了不
今日看到一句话让我感触颇深,想到了成长与经历这些字眼,觉得有道理便记下这段话; 离群索居者,不是野兽便是神灵。 尤其是在学生时代这种感觉尤为强烈,却不知都是一群连价值观都没形成的孩子。这种现象在学校中尤为突出。 被孤立的人啊!愿你成为上帝的宠儿。
Thumbnail
台劇《斯卡羅》在剪輯部分遭到許多人詬病,個人也覺得這部戲的剪輯確實可以再更好。 不過第六集有一幕的剪輯,個人相當喜愛。 為了阻止美國海軍攻打部落,女主角蝶妹回到故鄉瑯嶠(現今的恆春),隻身上山前去和部落交涉,希望族人交出殺害美國人的兇手,卻遭族人視為叛徒而被趕下山。
Thumbnail
「我們用一個東西去比擬另一個東西,這兩件東西最好距離夠遠,又同時具備平行的相似性,連結的方式要精準有說服力,夠遠則表示有創意。也就是要找到一個夠有創意且執行度高的表現策略。」── 羅智成
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
Thumbnail
短篇小說,看似字數比較短,卻不代表內容品質與高度能偷工減料,也就是,你得呈現出和「長篇」小說同樣的效果,很驚人吧? 長篇小說的字數多,寫作彈性比較大,短篇小說當然就沒那麼有彈性,所以,不要相信那種「短篇小說適合初學者練習」這種鬼話,那是「請鬼拿藥單」。
Thumbnail
這篇很長很長,而且觀點可能與台灣一般人接收到的很不一樣。重點就在兩句話,「太陽底下沒新鮮事」與「國際關係源自各國的國內政治」,說穿了人類總是老幹同樣的事情,沒啥長進。(註:但筆者也想不到更好的方法)