前言

现在 HTML5/CSS3 很流行罢,也是未来时代的趋势。在 HTML5 带来的许多实用功能之后,CSS3也同带来了一些牛逼哄哄的功能呢。

  • 动画 animation
  • 转化 transform
  • 过渡 translation

尽快这已足够让我们兴奋,许多之前必须用 JS 或 JQ 写的效果用 CSS 就能实现,现在几行 CSS3 代码就够了。

@media

@media 是什么怎么用?

苹果官网对 CSS3 @media 的使用:

我第一次看到这个是在 苹果官网 ,大概这样:

DOM 结构代码:

class 的区别,只有 promo-title-0/1/2/3

promos li

max-height: 200px;
overflow: hidden;

.large-3

width: 25%;

column

position: relative;
z-index: 1;
min-height: 2px;
margin: 0;
padding: 0;
float: left;

section 下面的 4个块写成4个 li

但是按住 Ctrl 同时移动鼠标滚轮放大网页,we will find everthing has changed.

section 变成了两格占一排,再看样式 large-3medium-6

width: 50%;

@media only screen and (max-width: 1068px)

large-3 变成了 medium-6 那么small-12

我们再缩小来看一看,

;

section 变成了一格占一排,之前的 @media only screen and (max-width: 1068px) 变成了 @media only screen and (max-width: 735px) ;再看 class 又由 medium-6 变成了 small-12

width: 100%;

于是,我们可以得出以下结论。

@media only screen and (max-width)large-3

  1.  是四个 li 的共同样式,值为 

width: 25%

  1.  。所以 

float: left

  1.  在一起就是其父元素

section#promos.promos.row

  1.  的 

width: 100%

  1.  。

medium-6 { width: 50% }

  1.  则相应的是 每2个 li 左浮动在一起为一行( 

width: 100%small-12 { width: 100% }

  1. 所以它的响应式设计思路与 

bootstrap

  1.  的 Gird System 同样原理。
  2. 所有的一切都由 

@media

@media 如何使用?

通常这种类型的文档在 w3cschool 类型的网站代码属性收集最全最权威,当然还有国内山寨但更强大版 w3cschool.cc 即 菜鸟教程 。

以下内容 据此摘录 与修改,当然为了更便于各位理解。

CSS3 多媒体查询

CSS3 的多媒体查询继承了 CSS2 多媒体类型的所有思想: 取代了查找设备的类型,CSS3 根据设置自适应显示。媒体查询可用于检测很多事情,例如:

  • viewport(视窗) 的宽度与高度
  • 设备的宽度与高度
  • 朝向 (智能手机横屏,竖屏)
  • 分辨率

目前很多针对苹果手机,Android 手机,平板等设备都会使用到多媒体查询。

自适应视窗

必须在 <head> 中添加一个 <meta> 标签:
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;

代码原意翻译过来既是: 视窗的宽度等于设备宽度,原始比例始终为 1:1 。这样在改变 device-width 的时候任意变化修改都能自适应了。

Bootstrap自适应视窗简介

多媒体查询语法

  • 多媒体查询由多种媒体组成,可以包含一个或多个表达式,表达式根据条件是否成立返回 

true

  •  或 

false

  • 如果指定的多媒体类型匹配设备类型则查询结果返回 true,文档会在匹配的设备上显示指定样式效果。
  • 除非你使用了 not 或 only 操作符,否则所有的样式会适应在所有设备上显示效果。

方法一: 直接写在 CSS 样式中让其根据设备判断:

@mediamediatypeand|not|only (mediafeature) {
    CSS-Code;
}

方法二: 针对不同的媒体设备外部链入不同的 stylesheets:

&lt;link rel=&quot;stylesheet&quot; media=&quot;mediatype and|not|only (media feature)&quot; href=&quot;mystylesheet.css&quot;&gt;

not / only / all

not: not是用来排除掉某些特定的设备的,比如 @media not print(非打印设备)。

only: 用来定某种特别的媒体类型。

对于支持 Media Queries 的移动设备来说,如果存在 only 关键字,移动设备的 Web 浏览器会忽略 only关键字并直接根据后面的表达式应用样式文件。对于不支持 Media Queries 的设备但能够读取 Media Type 类型的 Web浏览器,遇到 only 关键字时会忽略这个样式文件。

all: 所有设备,这个应该经常看到。

多媒体类型 mediatype


描述

all

用于所有多媒体类型设备

print

用于打印机

screen

用于电脑屏幕,平板,智能手机等。

speech

用于屏幕阅读器

多媒体特性 media feature


描述

aspect-ratio

定义输出设备中的页面可见区域宽度与高度的比率

color

定义输出设备每一组彩色原件的个数。如果不是彩色设备,则值等于0

color-index

定义在输出设备的彩色查询表中的条目数。如果没有使用彩色查询表,则值等于0

device-aspect-ratio

定义输出设备的屏幕可见宽度与高度的比率。

device-height

定义输出设备的屏幕可见高度。

device-width

定义输出设备的屏幕可见宽度。

grid

用来查询输出设备是否使用栅格或点阵。

height

定义输出设备中的页面可见区域高度。

max-aspect-ratio

定义输出设备的屏幕可见宽度与高度的最大比率。

max-color

定义输出设备每一组彩色原件的最大个数。

max-color-index

定义在输出设备的彩色查询表中的最大条目数。

max-device-aspect-ratio

定义输出设备的屏幕可见宽度与高度的最大比率。

max-device-height

定义输出设备的屏幕可见的最大高度。

max-device-width

定义输出设备的屏幕最大可见宽度。

max-height

定义输出设备中的页面最大可见区域高度。

max-monochrome

定义在一个单色框架缓冲区中每像素包含的最大单色原件个数。

max-resolution

定义设备的最大分辨率。

max-width

定义输出设备中的页面最大可见区域宽度。

min-aspect-ratio

定义输出设备中的页面可见区域宽度与高度的最小比率。

min-color

定义输出设备每一组彩色原件的最小个数。

min-color-index

定义在输出设备的彩色查询表中的最小条目数。

min-device-aspect-ratio

定义输出设备的屏幕可见宽度与高度的最小比率。

min-device-width

定义输出设备的屏幕最小可见宽度。

min-device-height

定义输出设备的屏幕的最小可见高度。

min-height

定义输出设备中的页面最小可见区域高度。

min-monochrome

定义在一个单色框架缓冲区中每像素包含的最小单色原件个数

min-resolution

定义设备的最小分辨率。

min-width

定义输出设备中的页面最小可见区域宽度。

monochrome

定义在一个单色框架缓冲区中每像素包含的单色原件个数。如果不是单色设备,则值等于0

orientation

定义输出设备中的页面可见区域高度是否大于或等于宽度。

resolution

定义设备的分辨率。如:96dpi, 300dpi, 118dpcm

scan

定义电视类设备的扫描工序。

width

定义输出设备中的页面可见区域宽度。

至此,我们解释之前 apple 官网 的 Question1 :

@media only screen and (max-width: 1068px)

medium-6

@media only screen and (max-width: 735px)

small-12

这个时候小伙版你也一定机智的想到了如果我想做一个 平板 和 手机之间的 @media 属性怎么办?当然有办法了。 办法就是:

@mediascreen ( max-width: 1068px ) and (min-width: 765px) {
  CSScode
 }
 
@mediascreenand (max-width: 640px) and (min-width: 481px){
  CSScode
 }

那么屏幕 retina 分辨率怎么办?看看 apple 怎么做:

这是完整代码:

@mediaonlyscreenand (-webkit-min-device-pixel-ratio:                              1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){
 
 }
 
 @mediaonlyscreenand (max-width: 735px){
 
 }
 
 @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){
 
 }
 
 @mediaonlyscreenand (max-width: 1068px){
 
 }
 
 @mediaonlyscreenand (max-width: 1068px) and (max-width: 735px){
 
 }
 
 @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){
 
 }
 
 @mediaonlyscreenand (max-width: 735px){
 
 }
 
 @mediaonlyscreenand (max-width: 1068px) and (max-width: 735px){
 
 }
 
 @mediaonlyscreenand (max-width: 1068px){
 
 }
 
 @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){
 
 }
 
 @mediaonlyscreenand (max-width: 1068px){
 
 }
 
 @mediaonlyscreenand (max-width: 1441px) and (max-width: 735px){
 
 }
 
 @mediaonlyscreenand (max-width: 1068px) and (max-width: 1441px){
 
 }
 
 @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi){
 
 }
 
 @mediaonlyscreenand (max-width: 1441px){
 
 }

是不是很有趣? apple 将设计化简为繁,但这背后的代价却更大。但为了给用户最直观明了和完美的呈现,这些都不足为惧。

但如果你以为 copy 上面代码就够了? Too young too naive! 我们需要学习的还很多,你会发现有时候写入 CSS3 @media 属性没卵用。

-webkit-min-device-pixel-ratio

@media 细致深入理解

不同设备有不同的宽高,不同分辨率,不同的DPI,不同的长宽比,如何区分?如何针对?它们对应的 @media 属性功能怎么写入呢?

上面表格中其实全部有标明方法 但你真的理解了吗?这样更简单一些!

不同的宽高:

width/height 定义输出设备中的页面可见区域宽度/高度。

max/min-width/height 定义输出设备中的页面最大/小可见区域宽度/高度。

device-width/height 定义输出设备的屏幕可见宽/高度。

max/min-device-width/height 定义输出设备的屏幕最大/小可见宽/高度。

不同的分辨率:

resolution 定义设备的分辨率。如:96dpi, 300dpi, 118dpcm

max/min-resolution 定义设备的最大/小分辨率。

不同的长宽比:

aspect-ratio 定义输出设备中的页面可见区域宽度与高度的比率。

device-aspect-ratio 定义输出设备的屏幕可见宽度与高度的比率。

max/min-aspect-ratio 定义输出设备的屏幕可见宽度与高度的最大/小比率。

max/min-device-aspect-ratio 定义输出设备的屏幕可见宽度与高度的最大/小比率。

-webkit-min-device-pixel-ratio

它得意思是:Gives the number of device pixels per CSS pixel. css px 和物理 px(device px) 之间的比率即设备像素比率。

iphone 的物理分辨率是 320X480,但是呈现的内容却是 640×960,但其实我们设置的 css px 是相对于物理分辨率的,即 320×480,但是因为我们设置的 css px 要显示在更宽阔的 640×960 的内容区域里头,所以10个 css px 在 640×960 的呈现效果就相当于5个 device px 在 320×480 的呈现效果。

所以如果图片得大小是100×100,那么到iphone里头就会被放大2倍,于是图像会变得比以前模糊,通常得解决办法是,用 background-size 设置为50%,以前的一半,然后再在 iphone 放大2倍,等于没变化,恢复到正常效果,不模糊了。

@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi) {
 
}

-webkit-min-device-pixel-ratio 跟 min-resolution 意思一致, 我们发现每个逗号间除了 -webkit-min-device-pixel-ratiodppxdpi

设备像素比devicePixelRatio简单介绍

单位 pixel-ratio/dpi/dppx 区别

不同设备 pixel-ratio/dpi/dppx 值的区别

设备兼容 及 浏览器 支持情况区别及简明易懂案例

@media 注意事项
写作顺序问题

这简直是个小技巧,一开始我也十分纳闷。为什么写的有些 @media 没有起作用。原来有这么回事:

min-width 表示最小即大于等于, max-width

那么这样的顺序有问题吗?

/*样式1*/
@media (min-width: 320px) {
  .container{ width: 92%; margin: 4%; }
}
 
 
/*样式2*/
@media (min-width:320px) and (max-width: 640px){
  .container{ width: 86%; margin: 7%; }
}
 
 
/*样式3*/
@media (max-width: 640px) {
  .container{ width: 80%; margin: 10%; }
}

会发生什么?

device-width <= 640 时 样式3640 <= device-width <= 321 时 样式2device-width >= 640 时 样式1

Question3: 为什么上面代码不起起作用但无效?

min-width:320px 即 width >= 320pxmax-width: 640px and min-width: 32px 即 640 <= width <= 320pxmax-width: 640px 即 width <= 640px

Answer3:根据 CSS 从上至下执行的规律以及我们的分析:

当视窗宽度大于等于 320px 时候执行样式1,(有效)

样式3 覆盖。( CSS 解析器跟 JS 一样在相同方法上覆盖之前定义的方法 )

当视窗宽度小于等于 640px 时执行样式3。(有效)

解决办法:

调整顺序并适当修改,

width <= 320px640px <= width <= 321px 时,执行 样式2;(给 min-wdithwidth >= 641px

代码如下:

/*样式1*/
@media (max-width: 320px) {
  .container{ width: 92%; margin: 4%; }
}
 
 
/*样式2*/
@media (min-width:321px) and (max-width: 639px){
  .container{ width: 86%; margin: 7%; }
}
 
 
/*样式3*/
@media (min-width: 640px) {
  .container{ width: 80%; margin: 10%; }
}

所以是不是很简单?万能了也。任意分辨率混搭啊。

注意事项总结:

1, 适配顺序

max-wdith: number0

mW <= 320; mW <= 480; mW <= 768; mW <= 960; mW <= 1080; mW <= 1280; mW <= 1440;  /*@media 则会根据 `` max-width `` 的大小变化从小到小取值 */

(min-width: number1) and (max-width: number2)

max-wdith

number1 必须在 number0 的基础上 +1px 以避免覆盖之前 width <= number0时的样式,

width >= number3

min-wdith: number3 大于等于 分辨率从小写到大 如果同一选择器样式在更大分辨率下没有重写则会沿用之前 @media

mW >= 1440; mW >= 1280; mW >= 1080; mW >= 960; mW >= 768; mW >= 480; mW >= 320;  /*@media 则会根据 `` min-width `` 的大小变化从大到小取值 */

Bootstrap 的 @media 属性写法

@media (max-width: 767px) {
  // col-xs
}
 
@media (min-width: 768px) and (max-width: 991px) {
  // col-sm
}
 
@media (min-width: 992px) and (max-width: 1199px) {
  // col-md
}
 
@media (min-width: 1200px) {
  // col-lg
}

apple 的 @media 属性写法 ( 含 Retina ) PS:前文顺序不同 因为其定义的选择器不是同一组 下列代码笔者已经修改

@mediaonlyscreenand (max-width: 1441px){
    .container::after{ content: "1441"; }
}
 
@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi){
    .container::after{ content: "1441 Retina"; }
}
 
@mediaonlyscreenand (min-width: 1068px) and (max-width: 1441px){
    .container::after{ content: "1068 - 1441"; }
}
 
@mediaonlyscreenand (max-width: 1068px){
    .container::after{ content: "1068"; }
}
 
@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){
    .container::after{ content: "1068 Retina"; }
}
 
@mediaonlyscreenand (max-width: 1068px) and (min-width: 735px){
    .container::after{ content: "735 - 1068"; }
}
 
@mediaonlyscreenand (max-width: 735px){
    .container::after{ content: "735"; }
}
 
@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){
    .container::after{ content: "735 Retina"; }
}
 
@mediaonlyscreenand (max-width: 340px){
    .container::after{ content: "340"; }
}
 
@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 340px), onlyscreenand (max-width: 340px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 340px) and (min-resolution: 144dpi){
    .container::after{ content: "340 Retina"; }
}
 
@mediaonlyscreenand (min-width: 1441px) {
    .container::after{ content: "1441"; }
}