@media 如何使用?
前言
现在 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
的 css 代码。
1
2
3
|
max-height: 200px;
overflow: hidden;
|
以及.large-3
的代码
1
2
|
width:25%;
|
以及column
1
2
3
4
5
6
7
|
position: relative;
z-index: 1;
min-height: 2px;
margin: 0;
padding: 0;
float: left;
|
CSS 很简单,大家一目了然其作用。将section
下面的 4个块写成4个li
同时给个相对定位和左浮动最小高度和Z轴,Yes so easy.
但是按住 Ctrl 同时移动鼠标滚轮放大网页,we will find everthing has changed.
这里的section
变成了两格占一排,再看样式large-3
被划上了删除线.
取而代之的是medium-6
。
1
2
|
width:50%;
|
Question 1: So@media only screen and (max-width: 1068px)
是什么鬼?
为什么这时候 @media 下定义的样式让 CSS 发生了变化,从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
。
1
2
|
width:100%;
|
于是,我们可以得出以下结论。
@media only screen and (max-width)
的值改变,则对应 class 改变。large-3
是四个 li 的共同样式,值为width: 25%
。所以float: left
在一起就是其父元素section#promos.promos.row
的width: 100%
。medium-6 { width: 50% }
则相应的是 每2个 li 左浮动在一起为一行(width: 100%
)。small-12 { width: 100% }
则一个 li 便左浮动占据一行。- 所以它的响应式设计思路与
bootstrap
的 Gird System同样原理。 - 所有的一切都由
@media
控制,针对不同媒体类型(或者说屏幕宽度)自适应采用不同的样式规则。当你重置浏览器大小的过程中,页面会根据浏览器的宽度和高度重新渲染页面。(不明觉厉咯)
以下内容据此摘录与修改,当然为了更便于各位理解。
http://blog.qiji.tech/archives/10167?utm_source=tuicool&utm_medium=referral
CSS3 多媒体查询
CSS3 的多媒体查询继承了 CSS2 多媒体类型的所有思想: 取代了查找设备的类型,CSS3 根据设置自适应显示。
媒体查询可用于检测很多事情,例如:
viewport(视窗) 的宽度与高度
设备的宽度与高度
朝向 (智能手机横屏,竖屏)
分辨率
目前很多针对苹果手机,Android 手机,平板等设备都会使用到多媒体查询。
自适应视窗
必须在<head>
中添加一个<meta>
标签:
<meta name="viewport" content="width=device-width, initial-scale=1">
代码原意翻译过来既是: 视窗的宽度等于设备宽度,原始比例始终为 1:1 。这样在改变 device-width 的时候任意变化修改都能自适应了。
Bootstrap自适应视窗简介
多媒体查询语法
- 多媒体查询由多种媒体组成,可以包含一个或多个表达式,表达式根据条件是否成立返回
true
或false
。 - 如果指定的多媒体类型匹配设备类型则查询结果返回 true,文档会在匹配的设备上显示指定样式效果。
- 除非你使用了 not 或 only 操作符,否则所有的样式会适应在所有设备上显示效果。
方法一: 直接写在 CSS 样式中让其根据设备判断:
@media mediatype and|not|only (media feature) {CSS-Code;
}
方法二: 针对不同的媒体设备外部链入不同的 stylesheets:
<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">
not / only / all
not: not是用来排除掉某些特定的设备的,比如 @media not print(非打印设备)。
only: 用来定某种特别的媒体类型。
对于支持 Media Queries 的移动设备来说,如果存在 only 关键字,移动设备的 Web 浏览器会忽略 only关键字并直接根据后面的表达式应用样式文件。
对于不支持 Media Queries 的设备但能够读取 Media Type 类型的 Web浏览器,遇到 only 关键字时会忽略这个样式文件。all: 所有设备,这个应该经常看到。
多媒体类型 mediatype
值 | 描述 |
---|---|
all | 用于所有多媒体类型设备 |
用于打印机 | |
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)
仅电脑设备中的页面最大可见区域宽度为 1068px 时显示其定义的样式。所以当设备宽度小于 1068px 采用medium-6
。
@media only screen and (max-width: 735px)
仅电脑设备中的页面最大可见区域宽度为 735px 时显示其定义的样式。所以当设备宽度小于 735px 采用small-12
。
这个时候小伙版你也一定机智的想到了如果我想做一个 平板 和 手机之间的 @media 属性怎么办?当然有办法了。 办法就是:
1
2
3
4
5
6
7
8
|
@mediascreen(max-width:1068px)and(min-width:765px){
CSScode
}
@mediascreenand(max-width:640px)and(min-width:481px){
CSScode
}
|
那么屏幕 retina 分辨率怎么办?看看 apple 怎么做:
这是完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), only screen and (max-width: 735px) and (min-resolution: 1.5dppx), only screen and (max-width: 735px) and (min-resolution: 144dpi){
}
@media only screen and (max-width: 735px){
}
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), only screen and (max-width: 1068px) and (min-resolution: 1.5dppx), only screen and (max-width: 1068px) and (min-resolution: 144dpi){
}
@media only screen and (max-width: 1068px){
}
@media only screen and (max-width: 1068px) and (max-width: 735px){
}
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), only screen and (max-width: 735px) and (min-resolution: 1.5dppx), only screen and (max-width: 735px) and (min-resolution: 144dpi){
}
@media only screen and (max-width: 735px){
}
@media only screen and (max-width: 1068px) and (max-width: 735px){
}
@media only screen and (max-width: 1068px){
}
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), only screen and (max-width: 1068px) and (min-resolution: 1.5dppx), only screen and (max-width: 1068px) and (min-resolution: 144dpi){
}
@media only screen and (max-width: 1068px){
}
@media only screen and (max-width: 1441px) and (max-width: 735px){
}
@media only screen and (max-width: 1068px) and (max-width: 1441px){
}
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), only screen and (max-width: 1441px) and (min-resolution: 1.5dppx), only screen and (max-width: 1441px) and (min-resolution: 144dpi){
}
@media only screen and (max-width: 1441px){
}
|
是不是很有趣? apple 将设计化简为繁,但这背后的代价却更大。但为了给用户最直观明了和完美的呈现,这些都不足为惧。
但如果你以为 copy 上面代码就够了? Too young too naive! 我们需要学习的还很多,你会发现有时候写入 CSS3 @media 属性没卵用。
比如: Quesition2:-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 定义输出设备的屏幕可见宽度与高度的最大/小比率。
那么 Question2-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倍,等于没变化,恢复到正常效果,不模糊了。
1
2
3
4
|
@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-ratio
唯一的不同是什么?
dppx
dpi
单位,所以这里的兼容这是兼容不同的浏览器的计算单位。
设备像素比devicePixelRatio简单介绍
单位 pixel-ratio/dpi/dppx 区别
不同设备 pixel-ratio/dpi/dppx 值的区别
设备兼容 及 浏览器 支持情况区别及简明易懂案例
@media 注意事项
写作顺序问题
这简直是个小技巧,一开始我也十分纳闷。为什么写的有些 @media 没有起作用。原来有这么回事:
我们知道min-width
表示最小即大于等于,
max-width
表示最大即小于等于; 但我们也很清楚 CSS 样式 跟 DOM 结构 跟 JS 一样 从前往后加载,后面重复代码会覆盖之前代码。
那么这样的顺序有问题吗?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*样式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
时样式3
起作用
当640 <= device-width <= 321
时样式2
起作用但无效
当device-width >= 640
时样式1
起作用
Question3: 为什么上面代码起作用但无效?
min-width:320px
即width >= 320px
max-width: 640px and min-width: 320px
即320<= width <= 640 px
max-width: 640px
即width <= 640px
Answer3:根据 CSS 从上至下执行的规律以及我们的分析:
当视窗宽度大于等于 320px 时候执行样式1,(有效)
当视窗宽度小于等于 640px 大于等于 320px 时执行样式2,有效但无法使用,因为被样式3
覆盖。(CSS 解析器跟 JS 一样在相同方法上覆盖之前定义的方法)
当视窗宽度小于等于 640px 时执行样式3。(有效)
解决办法:
调整顺序并适当修改,
当width <= 320px
时,执行 样式1;
当640px <= width <= 321px
时,执行 样式2;(给min-wdith
的值 +1px 以让 devic-width 值等于320时 样式2 不会覆盖 样式1)
当width >= 641px
时,执行 样式3;
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*样式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
小于等于 分辨率从大小到大 如果同一选择器样式在更小分辨率下没有重写则会沿用 CSS中定义的基本样式
1
2
|
mW <= 320; mW <= 480; mW <= 768; mW <= 960; mW <= 1080; mW <= 1280; mW <= 1440; /*@media 则会根据 `` max-width `` 的大小变化从小到小取值 */
|
(min-width: number1) and (max-width: number2)
大于等于number1 同时满足 小于等于 number2
写完max-wdith
则开始写其中间值;
number1 必须在 number0 的基础上 +1px 以避免覆盖之前width <= number0
时的样式,
number2 则不要求必须在 number3 的基础上 -1px (因为后面定义的width >= number3
就算 width 的 number 相等也会根据先后原则覆盖这个样式) 。
min-wdith: number3
大于等于 分辨率从小写到大 如果同一选择器样式在更大分辨率下没有重写则会沿用之前@media
定义的样式 其次再是 CSS中定义的基本样式
1
2
|
mW>=1440;mW>=1280;mW>=1080;mW>=960;mW>=768;mW>=480;mW>=320; /*@media 则会根据 `` min-width `` 的大小变化从大到小取值 */
|
结语
说了这么多,但我们都最喜欢福利了。彩蛋如下:
国外某网站给出的 iPad @media 属性写法
国外某妹子推荐的 browser @media 写法
Bootstrap 的 @media 属性写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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:前文顺序不同 因为其定义的选择器不是同一组 下列代码笔者已经修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
@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";}
}
|
推荐阅读材料:
CSS3 媒体查询
CSS3 Media Queries
笔者心得:
@media 用好了做自适应网站手到擒来,而且极其方便。值得你花时间深入研究学习。
如果文章有错误或者纰漏敬请指正,非常感谢。
@media 如何使用?相关推荐
- 用Windows Media Player截图的方法
视频截图方法: 关闭"视频加速功能即可". 以Windows Media Player 9.0为例,选择菜单"工具→选项",找到"性能"选项 ...
- oracle block media recovery,Oracle非归档模式Media Recovery错误之--ORA-26040
11.转储对应的logfile 14:35:48 SYS@ prod>alter system dump logfile '/dsk1/oradata/prod/redo01a.log': Sy ...
- 【73套】Epic Stock Media配乐音效素材合集包
[73套]Epic Stock Media配乐音效素材合集包 大小:114G丨WAV Epic Stock Media 系列音效合辑 包含了战争电影音效.史诗梦幻音效.日常生活音效.森林环境音效.电影 ...
- 【Qt】Qt再学习(八):Media Player(Qt实现多媒体播放器)
1.简介 Media Player演示了一个简单的多媒体播放器,该播放器可以使用各种编解码器播放音频和/或视频文件. 涉及到的类有 QMediaPlayer.QMediaPlaylist.QVideo ...
- linux挂载media装服务,CentOS8服务器入门系列教程(五):Linux挂载光盘、yum安装软件包...
不废话,直接上货!!!旨在为您解决开发中遇到的疑难杂症,文末有大厂必备资料分享. 一.环境准备 二.步骤 本篇文章分享的是如何用yum软件包管理器安装光盘中自带的软件包,我们以iptables.ser ...
- 媒体查询漫谈——@media Queries
通过不同的媒体类型和条件定义样式表规则.媒体查询让CSS可以更精确作用于不同的媒体类型和同一媒体的不同条件.媒体查询的大部分媒体特性都接受min和max用于表达"大于或等于"和&q ...
- 【原】YUI压缩与CSS media queries下的bug
大概是上个月,使用YUI压缩一个css文件后,发现只要是被压缩后的css文件有部分根本无法工作,一直都不知啥问题引起的,让我感到头疼. 今天发现了只要是在媒体查询中的样式无法起作用,于是才开始怀疑是m ...
- 移动端zepot媒体查询media queries
使用zepot做轮播图 <head> <meta charset="utf-8"> <meta name="viewport" c ...
- Media Queries
支持情况罗列成如下表: Media Queries 使用 说起CSS3的新特性,就不得不提到 Media Queries . 本文比较详细,所以很多实际中用不到.所以如果只是想简单了解Media Qu ...
- 《Adobe Premiere Pro CS5经典教程》——2.9 用Media Browser查找素材
本节书摘来自异步社区<Adobe Premiere Pro CS5经典教程>一书中的第2课,第2.9节,作者 [美]Adobe公司 ,译者 许伟民,袁鹏飞,更多章节内容可以访问云栖社区&q ...
最新文章
- 网站的高性能架构--应用服务器优化
- 命令行避免输入错误文件名_GitHub 60000+ Star 登顶,命令行的艺术
- 极简写作语言-Markdown
- 第15天学习Java的笔记(封装性,this,构造方法)
- 【Linux系统编程】Linux进程调度
- win10如何改变鼠标的形状和颜色?
- sql server如何输出排序序号_Group by中子查询order by排序失效问题分析
- _过程_函数_触发器_游标
- [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用
- 【SLAM小车】硬件_TB6612FNG设计记录
- c# [NETSDK1005] havent a target “net48“
- GPS测量原理及应用 知识总结
- uniapp H5公众号errMsg: “onMenuShareAppMessage:fail, the permission value is offline verifying“
- 迪文屏CRC16校验
- SPD查看内存默认频率
- 云和恩墨荣获阿里云云合计划2021年度优秀伙伴技术先锋奖
- 怎么查看Python扩展库所有可用安装版本
- 长沙麻将APP(起手胡)
- 52o1314小符号_我要1314数字的特殊符号。数字很小的那种
- 天梯赛训练 电话聊天狂人(25 分)
热门文章
- html微信公众平台登录界面,微信公众平台登录界面在哪里
- 中国科学院计算机博士范,范习之 博士
- 迷你世界显示服务器超时,迷你世界因出现不良信息下架 迷你世界下架原因
- 2014.3 USACO月赛T1 Watering the Fields
- Redis实战篇(四)
- 网络(韩志刚版笔记)
- Sequel pro 连接mysql 报MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded...
- 【语篇标记练习题】Dismissing what was said
- JavaScript navigator对象
- 公网远程开机(唤醒家庭PC)