close

最近認真的在練習Node.js的後端應用,不論前後端是否有分離,為了要顯示自已做的成果,前端必然需要修飾一下,觀看成果是否良好(總不能單看JSON,太痛苦了);

不過,發現自己已經相當生疏,經常排個版都需要花費不少時間研究(即便用Bootstrap也是很花時間);

所以決定到CSS-TRICKS找幾篇文章複習,
率先來看一下Media Queries,是響應式網頁排版基礎起手式,
於是挑到這篇文章,"A Complete Guide to CSS Media Queries" `,
在CSS-TRICKS GUIDES下的一篇「CSS 媒體查詢完全指引」
(第一次刊登時間2020年10月2日,最新更新日2021年5月26日,由   Andrés Galante 撰寫),
一起來看看吧!

首先聲明:這僅是翻譯文章,僅提供英文不慎良好的朋友們參考,內容有誤請告訴我唷!
另外,”媒體查詢”這個翻譯很不自在,因此下文翻譯都將使用media queries表達。


Media queries 可以依照網頁或app所被開啟的使用者裝置、瀏覽器或系統設定,來調整排版外觀(或是表現形式);
Media queries 依照一定的特性(characteristics)、特徵(features)、與使用者偏好,
來套用style(風格,同上,翻譯起來不自在,將使用原文)或運行套用在其上的程式碼。

或許,大多數的media queries都是針對viewport(視埠)大小套用客製化style(如下),這也是響應式設計(responsive design)誕生的原因。

/* When the browser is at least 600px and above */
@media screen and (min-width: 600px) {
  .element {
    /* Apply some styles */
  }
}
上述範例,除了viewport寬度外,其實還有許多其他的東西可以套用;
可以是螢幕解析度(screen resolution)、
裝置方向(device orientation;landscape橫向,寬度大於高度,或portrait直向,高度大於寬度)、
運行的系統偏好、
或甚至是上述三項的組合,都可以做為查詢media的項目來套用style。

在開始正式介紹   media queries 前,來分享除了CSS以外,
也可以在HTML與Javascript來設定(如果要直接進入CSS的部分,請直接到下篇文章),本篇先簡述三種可運用 media query的地方。


HTML:

在<head>標籤內使用<link>,使HTML依照不同media queries來決定連結的CSS檔
<html>
  <head>
    <!-- Served to all users -->
    <link rel="stylesheet" href="all.css" media="all" />
    <!-- Served to screens that are at least 20em wide -->
    <link rel="stylesheet" href="small.css" media="(min-width: 20em)" />
    <!-- Served to screens that are at least 64em wide -->
    <link rel="stylesheet" href="medium.css" media="(min-width: 64em)" />
    <!-- Served to screens that are at least 90em wide -->
    <link rel="stylesheet" href="large.css" media="(min-width: 90em)" />
    <!-- Served to screens that are at least 120em wide -->
    <link rel="stylesheet" href="extra-large.css" media="(min-width: 120em)" />
    <!-- Served to print media, like printers -->
    <link rel="stylesheet" href="print.css" media="print" />
  </head>
  <!-- ... -->
</html>
為何要這樣做?這樣可以提供較良好的分開不同需求的裝置,減少使用者下載CSS檔的需求。
但是,這不會並總是可以成功避免”不符合media queries的檔案被下載”,而僅是被排在較低的下載順序;

所以,小型螢幕,例如手機,將只會下載符合裝置的media query,
而較大螢幕的,例如筆電,將會下載全部的media queries,因為它有可能會符合所有的viewport大小(上述media query例子不會下載print列印的那一個)

上面使用<link>來操作media query,另一篇文章(guide to responsive images響應式圖片) 中,
在HTML也可以在<picture>標籤中使用<source>來告知瀏覽器應該使用哪一個圖片的樣式檔案,範例如下:
<picture>
  <!-- Use this image if the screen is at least 800px wide -->
  <source srcset="cat-landscape.png" media="(min-width: 800px)">
  <!-- Use this image if the screen is at least 600px wide -->
  <source srcset="cat-cropped.png" media="(min-width: 600px)">
  <!-- Use this image if nothing matches -->
  <img src="cat.png" alt="A calico cat with dark aviator sunglasses.">
</picture>
相同的,這也可能可以是讓整體網頁效能提高的方法,但並非所有裝置都可以避免下載不必要的style檔案。

最後,也不要忘記,可以直接在HTML中使用<style>標籤直接撰寫media queries,例如:
<style>
  p {
    background-color: blue;
    color: white;
  }
</style>
<style media="all and (max-width: 500px)">
  p {
    background-color: yellow;
    color: blue;
  }
</style>


Javascript

是的!我們也可以用Javascript套用media queries,他們就跟在CSS檔案中使用的方式大同小異;
微小的差異在於,需要先用 window.matchMedia() 來定義狀態。

舉例來說,我們想要在瀏覽器最小有768px寬度十,在終端機印出一段訊息,
我們先定義一個const(常數)呼叫window.matchMedia()
// Create a media condition that targets viewports at least 768px wide
const mediaQuery = window.matchMedia( '( min-width: 768px )' )

當獲得瀏覽器符合media query時,在終端機印出 ‘Media Query Matched’
// Create a media condition that targets viewports at least 768px wide
const mediaQuery = window.matchMedia( '( min-width: 768px )' )

// Note the `matches` property
if ( mediaQuery.matches ) {
  console.log('Media Query Matched!')
}

不過有個問題,
當瀏覽器開啟時,它只讀取一次瀏覽器狀態,
之後將瀏覽器放大縮小變形,都不會再改變media query,
除非使用者重新整理網頁;

有個簡易的好方法可以解決這個問題,
那就是將mediaQuery這個const(常數)加到監聽器(listener),
在監聽事件發生時重新檢查mediaQuery:
// Create a condition that targets viewports at least 768px wide
const mediaQuery = window.matchMedia('(min-width: 768px)')

function handleTabletChange(e) {
  // Check if the media query is true
  if (e.matches) {
    // Then log the following message to the console
    console.log('Media Query Matched!')
  }
}

// Register event listener
mediaQuery.addListener(handleTabletChange)
// Initial check
handleTabletChange(mediaQuery)

可以看看Marko Ilic完整的文章 “Working with JavaScript Media Queries” ,
有更深入的Javascript media queries討論,
文章中也有比較舊版Javascript resize事件監聽(檢查window.innerWidth或window.innerHeight)的使用方法比較。


CSS

最後,CSS設定media query是最常見的方式,直接在stylesheet使用@media的規則,內部包含標籤(或class、id等等)與條件等,當瀏覽器符合條件時,即套用對應的style:
/* Viewports between 320px and 480px wide */
@media only screen and (min-device-width: 320px) and (max-device-width: 480px) {
  .card {
    background: #bada55;
  }
}

也可以在CSS檔中import(匯入)其他CSS檔案,
但一般建議避免使用@import,會造成效能低落,
原因可以看這篇文章,(原因:因其無法平行運行,造成效能低落)


這是有關media query的前情提要,下篇文章將正式介紹CSS的media query

arrow
arrow
    創作者介紹
    創作者 中意 的頭像
    中意

    中意悾間

    中意 發表在 痞客邦 留言(0) 人氣()