如何使用媒体查询(Media Queries)

最近许小珂在研究响应式布局,说到响应式布局就不得不提媒体查询,那么Media Queries是如何使用的?
媒体查询的两种方式

一种是直接在link中判断设备的尺寸,然后引用不同的css文件:

<link rel="stylesheet" type="text/css" href="styleA.css" media="screen and (min-width: 400px)">
//意思是当屏幕的宽度大于等于400px的时候,应用styleA.css

在media属性里:

  1. screen是媒体类型里的一种,定义了10种媒体类型
  2. and被称为关键字,其他关键字还包括not(排除某种设备),only(限定某种设备)
  3. (min-width: 400px)就是媒体特性,其被放置在一对圆括号中。
<link rel="stylesheet" type="text/css" href="styleB.css"  media="screen and (min-width: 600px) and (max-width: 800px)">
//意思是当屏幕的宽度大于600小于800时,应用styleB.css

媒体查询能使我们根据设备的各种功能特性来设定相应的样式,而不仅仅只针对设备类型。可以将媒体查询想象成对浏览器的提问。如果浏览器回答“是” ,则应用样式;如果回答是“否” ,则不应用样式。相对于在 CSS 2中能且只能问浏览器“你是一块显示屏吗?” ,媒体查询能问的问题要多一点。例如,媒体查询可以问: “你是一块纵向放置的显示屏吗?”我们看看对应的实际代码:

<link rel="stylesheet" media="screen and (orientation: portrait)" href="portrait-screen.css" />

首先,媒体查询表达式询问了媒体类型(你是一块显示屏吗? ) ,然后询问了媒体特性(显示屏是纵向放置的吗? ) 。任何纵向放置的显示屏设备都会加载 portrait-screen.css样式表, 其他设备则会忽略该文件。 在媒体查询的开头追加 not 则会颠倒该查询的逻辑。

例如,下面的代码就会颠倒前例中的效果,会使非纵向放置的显示屏设备加载样式文件:

<link rel="stylesheet" media="not screen and (orientation: portrait)" href="portrait-screen.css" />

也可以将多个表达式组合在一起。如,我们扩展一下前面的例子,限制只有视口宽度大于800像素的显示屏设备才能加载文件。

<link rel="stylesheet" media="screen and (orientation: portrait) and (min-width:800px)" href="por-screen.css" />

更进一步,还可以写一个媒体查询列表。查询列表中的任意一个查询为真,则加载文件。全部查询都不为真,则不加载。例子如下:

<link rel="stylesheet" media="screen and (orientation: portrait) and (min-width:800px), projection" href="por-screen.css" />

TIPS

媒体查询之间使用逗号分隔。
你会注意到在projection 之后,没有 and ,也没有任何特性/值的组合。没有后续表达式,意味着只要是 projection 就满足条件。

另一种方式,即是直接写在<style>标签里:

写法是前面加@media,其它跟link里的media属性相同。

其实基本上就是样式覆盖~判断设备~引用不同的样式文件覆盖。
要注意的是由于网页会根据屏幕宽度调整布局,所以不能使用绝对宽度的布局,也不能使用具有绝对宽度的元素。这一条非常重要,否则会出现横向滚动条。

body {
    background-color: grey;
}
@media screen and (max-width: 960px) {
    body {
        background-color: red;
    }
}
@media screen and (max-width: 768px) {
    body {
        background-color: orange;
    }
}
@media screen and (max-width: 550px) {
    body {
        background-color: yellow;
    }
}
@media screen and (max-width: 320px) {
    body {
        background-color: green;
    }
}

你可以在不同的浏览器尺寸下试试上面的代码,有惊喜哦。

媒体查询能检测那些特性

创建媒体查询时,最常用的是设备的视口宽度( width )和屏幕宽度( device-width ) 。
依我的经验,很少需要检测其他特性。但是,为方便查阅,下面列出了所有可供媒体查询检测的特性,希望其中有能让你心动的特性。

  1. width :视口宽度。
  2. height :视口高度。
  3. device-width :渲染表面的宽度(对我们来说,就是设备屏幕的宽度) 。
  4. device-height :渲染表面的高度(对我们来说,就是设备屏幕的高度) 。
  5. orientation :检查设备处于横向还是纵向。
  6. aspect-ratio :基于视口宽度和高度的宽高比。一个 16∶9 比例的显示屏可以这样定义 aspect-ratio: 16/9 。
  7. device-aspect-ratio :和 aspect-ratio 类似,基于设备渲染平面宽度和高度的宽高比。
  8. color :每种颜色的位数。例如 min-color: 16 会检测设备是否拥有 16位颜色。
  9. color-index :设备的颜色索引表中的颜色数。值必须是非负整数。
  10. monochrome :检测单色帧缓冲区中每像素所使用的位数。值必须是非负整数,如monochrome: 2 。
  11. resolution :用来检测屏幕或打印机的分辨率,如 min-resolution: 300dpi 。还可以接受每厘米像素点数的度量值,如 min-resolution: 118dpcm 。
  12. scan :电视机的扫描方式,值可设为 progressive (逐行扫描)或 interlace (隔行扫描) 。 如 720p HD电视 (720p的 p即表明是逐行扫描) 匹配 scan: progressive ,而 1080i HD 电视(1080i中的 i表明是隔行扫描)匹配 scan: interlace 。
  13. grid :用来检测输出设备是网格设备还是位图设备。

在上述所有特性中, 除 scan和 grid之外, 都可使用 min 和 max前缀来创建一个查询范围。
例如,分析如下所示的代码片段:

@import url("phone.css") screen and (min-width:200px) and (max-width:360px);

这里对 width 应用了 min 和 max 来设定查询范围。 这样 phone.css 文件只会引入视口宽度介于 200像素至 360像素的显示屏设备。