搜尋

CSS @media 媒體查詢 ( Media Queries )

如果要在不同解析度的螢幕上瀏覽同一個網頁,常常會透過 CSS 的方式製作 RWD 響應式網頁,而 CSS 的 @media 媒體查詢可以定義判斷不同媒體的條件,只要符合條件,就會替這種媒體套用對應的 CSS 樣式屬性,這篇教學會介紹 CSS @media 媒體查詢 ( Media Queries ) 的相關用法。

快速導覽:

CSS 教學 - @media 媒體查詢 ( Media Queries )

認識與使用 @media

由於 CSS 基本上是按照權重大小進行「覆蓋並套用」樣式,不容易進行邏輯判斷套用樣式,但如果透過 CSS 的 @media 媒體查詢 ( Media Queries ),就能透過「邏輯判斷」的方式,根據裝置的媒體類型( 例如螢幕或列印 )或其他特性( 例如螢幕解析度、方向、寬高比等 ),套用不同的樣式,如果判斷條件符合為 true 就會套用樣式,反之為 false 就不會套用樣式

@media 共有下列三種使用方式:

媒體類型 ( Media Types )

現行 CSS 支援的 Media 類型有以下三種 ( 其他像是 speech、tty、tv、projection...等已不支援,參考:W3C Media Types ):

Type 說明
all 所有設備。
print 印刷裝置,包含使用列印預覽產生的所有畫面 ( 例如列印為 pdf )。
screen 螢幕裝置,不屬於 print 的設備。

這三種類型必須寫在語句的「開頭」,不然就無法順利執行,下方是可以正確執行的寫法:

@media all {...}
@media print {...}
@media screen {...}

@media all and (max-width:200px) {...}     /* 後方可串接條件語句 */
@media print and (max-width:200px)  {...}  /* 後方可串接條件語句 */
@media screen and (max-width:200px)  {...} /* 後方可串接條件語句 */

@media (max-width:200px), all {...}        /* 逗號後的開頭也可以 */
@media (max-width:200px), print {...}      /* 逗號後的開頭也可以 */
@media (max-width:200px), screen {...}     /* 逗號後的開頭也可以 */

下方寫法為「錯誤」寫法,無法正確執行:

@media (max-width:200px) and all {...}   
@media (max-width:200px) and print  {...}
@media (max-width:200px) and screen  {...}

媒體特色 ( Media Features )

了解媒體類型後,會搭配一些「媒體特色 ( Media Features )」進行更進階的邏輯判斷,下方列出主要的媒體特色 ( 詳細參考 W3C Media Features )

媒體查詢條件語法

使用 Media Queries 時,除了基本的寫法,還有另外四種條件語法,分別是* OR、AND、NOT 和 ONLY,撰寫時前後條件使用「小括號 ()」包覆,當中的判斷條件只能使用「:」賦予精確數值,不能使用大於小於等其他符號*,此外 NOT 和 ONLY 必須擺在開頭,相關語法如下:

<link rel="stylesheet" type="text/css" media="( 條件 ) , ( 條件 ) {...}" href="style.css"> <!-- OR 條件語法 -->
<link rel="stylesheet" type="text/css" media="( 條件 ) and ( 條件 ) {...}" href="print.css"> <!-- AND 條件語法 -->
<link rel="stylesheet" type="text/css" media="not ( 條件 ) {...}" href="style.css"> <!-- NOT 條件語法 -->
<link rel="stylesheet" type="text/css" media="only ( 條件 ) {...}" href="style.css"> <!-- ONLY 條件語法 -->

@media ( 條件 ) , ( 條件 ) {...}    /* OR 條件語法 */
@media ( 條件 ) and ( 條件 ) {...}  /* AND 條件語法 */
@media not ( 條件 ) {...}  /* NOT 條件語法 */
@media only ( 條件 ) {...} /* ONLY 條件語法 */

@import "print.css" ( 條件 ) , ( 條件 ) {...};     /* OR 條件語法 */
@import "print.css" ( 條件 ) and ( 條件 ) {...};   /* AND 條件語法 */
@import "print.css" not ( 條件 ) {...};   /* NOT 條件語法 */
@import "print.css" only ( 條件 ) {...};  /* ONLY 條件語法 */

下方列出這四種條件語法的說明:

透過 Media Queries 製作響應式網頁 ( RWD )

因為響應式網頁 ( RWD ) 必須要在「不同寬度」或「不同比例」的裝置中顯示網頁,所以 @media 大多都是作為處理響應式網頁使用,下方範例會呈現頁面寬度在 200px~500px,使用 max-width 所表現的不同樣式。

線上展示:https://codepen.io/oxxo/pen/zxOBEag

<!-- HTML 程式碼 -->
<h1>Hello OXXO!!</h1>

<!-- CSS 程式碼 -->
<style>
  /* 螢幕時 */
  @media screen {
    h1{
      font-size:60px;
      color: gray;
    }
  }
  /* 頁面最大寬度小於 500px */
  @media (max-width:500px) {
    h1{
      font-size:50px;
      color: blue;
    }
  }
  /* 頁面最大寬度小於 400px */
  @media (max-width:400px) {
    h1{
      font-size:40px;
      color: green;
    }
  }
  /* 頁面最大寬度小於 300px */
  @media (max-width:300px) {
    h1{
      font-size:30px;
      color: black;
    }
  }
  /* 頁面最大寬度小於 200px */
  @media (max-width:200px) {
    h1{
      font-size:20px;
      color: red;
    }
  }
</style>

CSS 教學 - CSS @media 媒體查詢 ( Media Queries ) - 透過 Media Queries 製作響應式網頁 ( RWD )

使用 @media 也需要遵循 CSS 的「權重」規則,後方的 @media 會在條件判斷相同時,覆蓋前方的 @media如果將上方範例中的 @media screen 放到最後方,則前方所有的 @media 都會被覆蓋而不呈現樣式。

線上展示:https://codepen.io/oxxo/pen/qEWNPyO

<!-- HTML 程式碼 -->
<h1>Hello OXXO!!</h1>

<!-- CSS 程式碼 -->
<style>
  @media (max-width:500px) {
    h1{
      font-size:50px;
      color: blue;
    }
  }
  @media (max-width:400px) {
    h1{
      font-size:40px;
      color: green;
    }
  }
  @media (max-width:300px) {
    h1{
      font-size:30px;
      color: black;
    }
  }
  @media (max-width:200px) {
    h1{
      font-size:20px;
      color: red;
    }
  }
  /* 移動到最後方 */
  @media screen {
    h1{
      font-size:60px;
      color: gray;
    }
  }
</style>

CSS 教學 - CSS @media 媒體查詢 ( Media Queries ) - Media Queries 遵守權重規範

因為權重的緣故,如果將上方範例改成 min-width,寬度的排列順序就必須改成「小到大」,才不會因為權重覆蓋導致無法套用樣式。

線上展示:https://codepen.io/oxxo/pen/VYZjMBK

<!-- HTML 程式碼 -->
<h1>Hello OXXO!!</h1>

<!-- CSS 程式碼 -->
<style>
  /* 小於 200px 時 */
  @media screen {
    h1{
      font-size:60px;
      color: gray;
    }
  }
  /* 最小寬度 200px */
  @media (min-width:200px) {
    h1{
      font-size:20px;
      color: red;
    }
  }
  /* 最小寬度 300px */
  @media (min-width:300px) {
    h1{
      font-size:30px;
      color: black;
    }
  }
  /* 最小寬度 400px */
  @media (min-width:400px) {
    h1{
      font-size:40px;
      color: green;
    }
  }
  /* 最小寬度 500px */
  @media (min-width:500px) {
    h1{
      font-size:50px;
      color: blue;
    }
  }
</style>

CSS 教學 - CSS @media 媒體查詢 ( Media Queries ) - min-width 和 max-width 順序相反

小結

@media 媒體查詢是進行響應式網頁開發時,不可或缺的重要技巧,如果自己的網頁還沒有使用響應式網頁,不妨趕快透過 @media,讓不同的裝置都能順利地瀏覽網頁。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則 CSS 常用樣式屬性

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 使用巢狀結構語法 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 位置名稱與時間單位

規則與定義

變數 ( Variables ) 媒體查詢 ( @media ) 容器查詢 ( @container ) 自訂屬性值 ( @property ) 匯入樣式 ( @import ) 分層優先順序 ( @layer )

函式類型

數學計算 文字與清單計數 形狀與線段 路徑 ( path ) 生成內容與引號

顏色與濾鏡

顏色單位 色彩模型 漸層色 影像濾鏡 ( filter ) 背景濾鏡 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字與段落

設定字型 ( font-family ) 使用外部字型 定義字型 ( @font-face ) 文字尺寸 文字樣式 ( 常用 ) 文字樣式 ( 其他實用 ) 文字樣式 ( 特殊用途 ) 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 文字自動分欄

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 ( border-radius ) 影像邊框 ( border-image ) 輪廓 ( outline ) 內容溢出與裁切 ( overflow ) 內容範圍 ( contain ) 可見性與透明度

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 自訂動畫路徑 ( offset ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 平移、旋轉與縮放 3D 轉換與透視 3D 正多面體

視窗與使用者行為

捲軸樣式 ( scrollbar ) 滑鼠游標圖示 ( cursor ) 滑鼠事件 ( pointer-events ) 使用者選取 ( user-select ) 捲動行為 ( scroll、overscroll )

範例效果

CSS 圓餅圖 CSS 跑馬燈 Google 載入動畫 漸層色的轉場與動畫 電子時鐘數字 不規則形狀動畫