在CSS中,有一个极其实用的功能:@media 响应式布局。具体来说,就是可以根据客户端的介质和屏幕大小,提供不同的样式表或者只展示样式表中的一部分。通过响应式布局,可以达到只使用单一文件提供多平台的兼容性,省去了诸如浏览器判断之类的代码。

当然这种设计也存在着缺点,比如我所见的不少使用响应式布局的设计在适配移动端时大量使用 display:none 隐藏富媒体元素,这样势必会导致大量不必要的流量。因此,如果有较为重要的移动端需求,那么还是开发专门的移动版页面为好。不过,对于诸如内容较少的页面或者单页式网站来说,响应式布局依然不失为一种偷懒的好方法 ^ ^

一、在 <head> 链接CSS文件时提供判断语句,选择性加载不同的CSS文件

<link rel="stylesheet" href="middle.css" media="screen and (min-width: 400px)">

这句意味在满足 media 的判断语句 screen and (min-width: 400px) 即 屏幕并且最小宽度不小于400px 的介质上面使用 middle.css 。

二、在CSS文件中分段书写不同设备的代码

/* CSS Code */
@media screen and (min-width: 600px) { /* CSS Code */ }
@media screen and (max-width: 599px) { /* CSS Code */ }

相信这个代码也很容易理解,写在 @media 语句段外的是共用代码,第一个 @media 语句段是 屏幕以及最小宽度600px ,第而个 @media 语句段是 屏幕以及最大宽度599px 。

如果不同的代码段有冲突或者重叠,会按照CSS原本的代码优先级排序,即后方代码替代前方代码,等等。

三、媒体介质类型

CSS3中提供了多种媒体介质类型,虽然常用的就俩……注意媒体类型名称区分大小写,并且尽管有些介质类型有重合,但是一个平台只会有一种介质类型。(我猜这个标准很多浏览器不会遵守吧?)

  1. all – 全部媒体类型
  2. braille – 盲文触摸装置
  3. embossed – 分页盲文打印机 (W3C的无障碍做的真细心……)
  4. handheld – 小屏幕和流量有限的手持设备(注意!安装标准来说移动设备都应该使用这个介质类型,但是实际上安卓根本不理会这个介质,请使用 screen 结合媒体查询语句使用)
  5. print – 提供给打印机的样式,最常用的介质类型,打印页面时获得适合阅读的效果
  6. projection – 投影,给投影机使用(有人用?)
  7. screen – 彩色屏幕,最常用的介质类型,一般和屏幕大小表达式联合使用
  8. speech – 语音朗诵,用于屏幕阅读软件(和将来的Siri?)
  9. tty – 固定间距字符网格,例如功能机那样的
  10. tv – 智能电视设备(唔不知道我家的创维酷开支持如何……)

四、媒体查询语句

除了媒体介质,我们还能通过 and 使用 Media Query 语句,达到对屏幕大小的判断生成响应式布局。(可以通过改变浏览器窗口大小在桌面下测试效果)

一个 Media Query 包含一种媒体类型,如果媒体类型没有指定,那么就是默认类型all,比如:

media="(max-width: 600px)"

也可以使用 and 表示同时满足这两者时生效,达到限定范围:

handheld and (min-width:20em) and (max-width:50em)

逗号 , 被用来表示 并列 和 或者 :

handheld and (max-width:20em), screen and (max-width:30em)

not 用来排除符合表达式的设备:

not screen and (color)

下面来解释一下遇到冲突时的机制:

<link rel="stylesheet" href="styleA.css" media="screen and (min-width: 800px)">
<link rel="stylesheet" href="styleB.css" media="screen and (min-width: 600px) and (max-width: 800px)">
<link rel="stylesheet" href="styleC.css" media="screen and (max-width: 600px)">

上面将设备分成3种,分别是宽度大于800px时,应用 styleA ,宽度在600px到800px之间时应用 styleB ,以及宽度小于600px时应用 styleC 。那假如宽度正好等于800px时该应用那个样式?是 styleB,因为前两条表达式都成立,按CSS默认优先级规则后者覆盖了前者。

因此,为了避免冲突,这个例子正常情况应该这样写:

<link rel="stylesheet" href="styleA.css" media="screen">
<link rel="stylesheet" href="styleB.css" media="screen and (max-width: 800px)">
<link rel="stylesheet" href="styleC.css" media="screen and (max-width: 600px)">

五、浏览器支持

媒体介质在CSS2中已经被添加,因此主流平台的浏览器毫无疑问都可以正确支持。但是 Media Query 语句是CSS3中添加的新功能,部分浏览器可能并不理解。例如IE能成功解读媒体介质,但是却无法解读 and 后面的媒体查询语句,就会连带媒体介质一起忽略。为了让不识别媒体查询语句的浏览器依然识别到媒体介质,可以使用 only 关键字进行hack。

<link rel="stylesheet"  href="example.css" media="only screen and (color)">

添加了 only 关键字后,支持媒体查询语句的浏览器依然正常解析。但不支持媒体查询语句但正确读取媒体介质的设备,由于先读取到 only 而不是 screen ,将忽略这个样式。不支持媒体查询的IE不论是否有 only ,都直接忽略样式。

最后是浏览器支持情况:

  • IE8-
  • IE9+
  • Chrome 5+
  • Opera 10+
  • Firefox 3.6+<
  • Safari 4+

媒体类型还支持 not和only关键字,它们可以用来更方便的定位某个媒体设备:

not:排除某种制定的媒体类型

@media not print and (color){
}

only:指定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器:

@media only screen and (color){
}

CSS3 Media Query 响应式媒体查询的更多相关文章

  1. 一种让 IE6/7/8 支持 media query 响应式设计的方法

    在不同的浏览器宽度下使用不同的 CSS 声明,常见的方案是使用 media query,但这个方案不支持 IE9 以下浏览器. 国外比较流行的 UI 框架 bootstrap v3 版本中使用 med ...

  2. CSS3学习笔记--media query 响应式布局

    语法:@media screen and (min-width: 320px) and (max-width : 479px) media属性后面跟着的是一个 screen 的媒体类型(上面说过的十种 ...

  3. Bootstrap的介绍和响应式媒体查询

    Bootstrap的介绍 凡是使用过Bootstrap的开发者,都不在乎做这么两件事情:复制and粘贴.哈哈~,是的使用Bootstrap非常简单,但是在复制粘贴之前,需要先对Bootstrap的用法 ...

  4. css3 @media 实现响应式布局

    使用css3的@media,可以实现针对不同媒体.不同分辨率的响应式布局. 方法1:根据不同分辨率使用不同css文件 <link rel="stylesheet" media ...

  5. CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)

    点评:Media Queries这功能是非常强大的,他可以让你定制不同的分辨率和设备,并在不改变内容的情况下,让你制作的web页面在不同的分辨率和设备下都能显示正常,并且不会因此而丢失样式   Med ...

  6. pc端响应式-媒体查询

    媒体查询(@media):能在不同的条件下使用不同的样式,使页面在不同在终端设备下达到不同的渲染效果 列举常用的pc屏幕宽度: 1024  1280  1366  1440  1680  1920  ...

  7. (原)css 响应式媒体查询 模板

    @media only screen and (max-width:340px) { html,input{ font-size:80%; } } @media only screen and (ma ...

  8. [转]CSS3 Media Query实现响应布局

    讲到响应式布局, 相信大家都有一定的了解,响应式布局是今年很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果, 设计师提出了响应式布局的设计方案.今 ...

  9. CSS3 Media Query实现响应Web设计(宽度为不同的移动设备)

    现在的屏幕分辨率.小到320px(iPhone),大到2560px或甚至更高(大显示屏).范围内变化很大.除了使用传统的台式机.用户会越来越多的通过手机.上网本.iPad一类的平板设备来浏览页面. 这 ...

随机推荐

  1. network FAQ

    @1: 参考 ifconfig eth0之后IP总是自动清除,解决方法, 修改vim /etc/network/interfaces 然后执行sudo /etc/init.d/networking r ...

  2. python16_day09【Select多路复用】

    一.select多路复用 句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间) 参数: 可接受四个参数(前三个必须) 返回 ...

  3. MySQL -表完整性约束(Day41)

    阅读目录 一.介绍 二.not null 与 default 三.unique 四.primary key 五.auto_increment 六.foreign key 七. 总结 一 介绍 回到顶部 ...

  4. python中的pass语句是什么

    当用python写代码时,有时可能还没想好函数怎么写,只写了函数声明,但为了保证语法正确,必须输入一些东西,这种情况下,我们会使用pass语句 def func(*args): pass break语 ...

  5. PHPcms 调用命令的基本格式:

    PHPcms 调用命令的基本格式: 开始:{pc:content action="模块操作名" catid="调用栏目ID" num="数据调用数量& ...

  6. 菩提树下的杨过.Net 的《hadoop 2.6全分布安装》补充版

    对菩提树下的杨过.Net的这篇博客<hadoop 2.6全分布安装>,我真是佩服的五体投地,我第一次见过教程能写的这么言简意赅,但是又能比较准确表述每一步做法的,这篇博客主要就是在他的基础 ...

  7. 笔记——Springboot response、ServletOutputStream、图形验证码显示慢

    今天遇到一个图形验证码加载很慢的问题,大概耗时有200~500毫秒左右. 根据追踪,图形验证码图片生成耗时0~1毫秒,而response.getOutputStream.write()将图片写入前台页 ...

  8. HCNP学习笔记之ICMP协议与ping原理以及用Python实现ping

    一.ICMP协议分析 ICMP:Internet控制报文协议.由于IP协议并不是一个可靠的协议,它不保证数据被成功送达,那么,如何才能保证数据的可靠送达呢? 这里就需要使用到一个重要的协议模块ICMP ...

  9. Tomcat Connector 参数优化说明

    默认参数 注: Connector 通常在%HOME_TOMCAT%/conf/servser.xml 文件内 # 正常参数 <Connector port=" protocol=&q ...

  10. QT的基本数据类型

    QT的基本数据类型(转) qint8:signed char 有符号8比特数据 qint16:signed short 16位数据类型 qint32:signed int. 32位有符号数据类型 qi ...