CSS 媒体查询 响应式
媒体查询
从 CSS 版本 2 开始,就可以通过媒体类型在 CSS 中获得媒体支持。如果您曾经使用过打印样式表,那么您可能已经使用过媒体类型。清单 1 展示了一个示例。
清单 1. 使用媒体类型
<link rel="stylesheet" type="text/css" href="site.css" media="screen" />
<link rel="stylesheet" type="text/css" href="print.css" media="print" />
在清单 1 中,media
属性定义了应该用于指定每种媒体类型的样式表:
screen
适用于计算机彩色屏幕。print
适用于打印预览模式下查看的内容或者打印机打印的内容。
作为 CSS v3 规范的一部分,可以扩展媒体类型函数,并允许在样式表中使用更精确的显示规则。媒体查询 是评估 True 或 False 的一种表达。如果为 True,则继续使用样式表。如果为 False,则不能使用样式表。这种简单逻辑通过表达式变得更加强大,使您能够更灵活地对特定的设计场景使用自定义的显示规则。
媒体查询包含一个媒体类型,后跟一个或多个检查特定条件(如最小的屏幕宽度)的表达式。样式表中的媒体查询看起来如清单 2 中的示例所示。
清单 2. 媒体查询规则
@media all and (min-width: 800px) { ... }
根据清单 2 中的标记,所有最小水平屏幕宽度为 800 像素的屏幕(屏幕和打印等)都应使用如下 CSS 规则。该规则在示例中省略号所在的地方。对于该媒体查询:
@media all
是媒体类型,也就是说,将此 CSS 应用于所有媒体类型。(min-width:800px)
是包含媒体查询的表达式,如果浏览器的最小宽度为 800 像素,则会告诉浏览器只运用下列 CSS。
请注意,在清单 2 中,可以省略关键词 all
和 and
。在将某个媒体查询应用于所有媒体类型时,会省略 all
。后面的 and
也是可选的。使用简写语法重新编写媒体查询,如清单 3 所示。
清单 3. 简写语法
@media (min-width:800px) { ... }
媒体查询也可以包含复杂表达式。例如,如果您想要创建一个仅在最小宽度为 800 像素且最大宽度为 1200 像素时应用的样式,则需要按照清单 4 中的规则来做。
清单 4. 复杂表达式
@media (min-width:800px) and (max-width:1200px) { ... }
在您的表达式中,您可以根据自己的喜好使用任意数量的 and
条件。如果您想要增加其他条件来检查特定的屏幕方向,只需添加另一个 and
关键词,后跟 orientation
媒体查询,如清单 5 所示。
清单 5. and
条件
@media (min-width:800px) and (max-width:1200px) and (orientation:portrait) { ... }
清单 5 中的媒体查询仅在宽度为 800 到 1200 像素且方向是纵向时才能激活。(通常,方向仅对能够轻易转换纵横模式的智能手机和平板电脑上是有意义的。)如果其中一个条件为 False,则无法应用媒体查询规则。
and
关键词的反义词是 or
关键词。和 and
一样,这些条件组合在一起会构成复杂表达式。如果其中有一个条件为 True,那么整个表达式或分离的两个条件都会为 True,如清单 6 所示。
清单 6. or
关键词
@media (min-width:800px) or (orientation:portrait) { ... }
如果宽度至少是 800 像素或方向是纵向的,则会应用该规则。
另一个保存在词库中的媒体查询关键词是 not
。位于媒体查询的开始处,not
会忽略结果。换句话说,如果该查询本来在没有 not
关键词的情况下为 true,那么现在它将为 false。清单 7 展示一个示例。
清单 7. 使用 not
@media (not min-width:800px) { ... }
仅从英文意思上理解,清单 7 中代码的表示:当最小宽度不是 800 像素时,会应用下列 CSS 规则。这些示例只是将像素作为媒体查询中的测量单位,但是测量单位并不仅限于像素。您可以使用任何有效的 CSS 测量单位,比如厘米 (cm)、英寸 (in)、毫米 (mm) 等。
有用的媒体特性
媒体很多特性,比如宽度、颜色和网格,您可以在媒体查询中使用它们。对每个可能的媒体特性进行描述不在本文讨论范围内。关于媒体查询的文档 The World Wide Web Consortium's (W3C) 提供了这方面的一个完整清单。(请参阅 参考资料)。
要设计响应式网站,只需要了解一些媒体特性:方向、宽度和高度。作为一个简单媒体特性,方向的值可以是 portrait
或 landscape
。这些值适用于持有手机或平板电脑的用户,使您可以根据两个形状因素来优化内容。当高度大于长度时,则认为屏幕是纵向模式,当宽度大于高度时,则认为屏幕是横向模式。清单 8 显示了一个使用 orientation
媒体模式查询的示例。
清单 8. orientation
媒体查询
@media (orientation:portrait) { ... }
高度和宽度行为十分相似,都支持以 min-
和 max-
为前缀。清单 9 展示了一个有效的媒体查询。
清单 9. 高度和宽度媒体查询
@media (min-width:800px) and (min-height:400px) { ... }
如果没有 min-
或 max-
前缀,您还可以使用 width
和 height
媒体特性,如清单 10 所示。
清单 10. 不带 min-
和 max-
前缀
@media (width:800px) and (height:400px) { ... }
当屏幕正好是 800 像素宽、400 像素高时,可以使用清单 10 中的媒体查询。现实中,像这样的媒体查询可能过于具体而不太有用。检测精确维度是大多数网站访问者都不可能遇到的一个场景。通常情况下,响应式设计会使用范围来执行屏幕检测。
作为媒体查询大小范围的后续内容,下一节将讨论一些常见的媒体查询,在设计一个响应式网站时,您可能会发现它们非常有用。
常见媒体查询
因为 Apple 首次向市场推出了用户智能手机和平板电脑产品,所以下列大多数媒体查询都是基于这些型号的设备。
如果目标是横向模式智能手机,则使用: @media (min-width: 321px) { ... }
如果目标是纵向模式智能手机,则使用: @media (max-width: 320px) { ... }
如果目标是横向模式 Apple iPad,则使用: @media (orientation: landscape) { ... }
如果目标是纵向模式 iPad,则使用: @media (orientation: portrait) { ... }
您可能已经注意到了,iPad 上使用的是 orientation
媒体特性,而 width
用于 Apple iPhone 之上。主要是因为 iPhone 不支持orientation
媒体特性。您必须使用 width
模拟这些方向断点。请参阅 参考资料,获取有关常见媒体特性的更多信息。
SASS 中的媒体查询
Ruby on Rails 中的内置支持有助于推进 Syntactically Awesome Style Sheets (SASS) 的盛行,使其在 Web 开发社区中迅速走强。关于 SASS 的详细讨论已超出了本文的讨论范围,但我会在基于 SASS 的样式表中简要介绍使用媒体查询的基础知识。请参阅 Resources,获取有关 SASS 的更多信息。
SASS 行为中的媒体查询与普通 CSS 中的完全相同,但有一个例外:它们可以嵌套在其他 CSS 规则中。当一个媒体查询嵌套在另一个 CSS 规则中时,会将规则置于样式表的顶层,如清单 11 所示。
清单 11. 嵌套的媒体查询
#header {
width: 400px;
@media (min-width: 800px) {
width: 100%;
}
}
清单 11 中的示例将编译到清单 12 的代码中。
清单 12. 编译结果
#header {
width: 400px;
}
@media (min-width: 800px) {
#header {
width: 100%;
}
}
组织您的媒体查询
现在,我们已经了解了如何编写媒体查询,是时候考虑采用以一种合乎逻辑的、有组织的方式将媒体查询部署到您的 CSS 代码中了。确定如何组织媒体查询很大程度上是一种个人偏好。这一小节将探讨两种主要方法的优点和缺点。
第一个方法是为不同屏幕大小指定完全不同的样式表。优点是规则可以保存在独立样式表中,这使得显示逻辑能够清楚地划分出来,更便于团队进行维护。另一个优势是源代码分支之间的合并变得更为容易。但优点同时也是缺点。如果要为每个媒体查询创建单独的样式表,则无法将一个元素的所有样式表放在同一文件夹的同一位置。当改变一个 CSS 中的一个元素时,需要创建多个位置进行查看,这使得网站 CSS 的维护变得更加困难。
第二个方法是在现有样式表中使用媒体查询,该样式表就在定义其余元素样式表的位置的旁边。这种方法的优势是可以将所有元素样式保存在同一个位置。当在团队模式下工作时,这种做法可以创建更多源代码合并工作,但这是所有基于团队的软件开发都可以管理且常见的一部分。
没有所谓正确或错误方法。您只需选择最适合您的项目和团队的方法即可。
浏览器支持
到现在为止,您可能已经相信 CSS 媒体查询是一个强大的工具,而且想知道哪些浏览器支持 CSS 媒体查询。以下是这方面的好消息和坏消息。
- 好消息是:大多数现代浏览器(包括智能手机上的浏览器)都支持 CSS 媒体查询。
- 坏消息是:最近,来自 Redmond 的 Windows® Internet Explorer® 8 浏览器不支持媒体查询。
对于大多数专业 Web 开发人员来说,这意味着您需要提供一个解决方案,以便在 Internet Explorer 中支持媒体查询。
下列解决方案是一个名为 respond.js 的 JavaScript polyfill。
带有 respond.js 的 Polyfill
Respond.js 是一个极小的增强 Web 浏览器的 JavaScript 库,使得原本不支持 CSS 媒体查询的浏览器能够支持它们。该脚本循环遍历页面上的所有 CSS 引用,并使用媒体查询分析 CSS 规则。然后,该脚本会监控浏览器宽度变化,添加或删除与 CSS 中媒体查询匹配的样式。最终结果是,能够在原本不支持的浏览器上运行媒体查询。
由于这是一个基于 JavaScript 的解决方案,所以浏览器需要支持 JavaScript,以便运行脚本。该脚本只支持创建响应式设计所需的最小和最大width
媒体查询。这并不是适用于所有可能 CSS 媒体查询的一个替代。在 参考资料 部分,可以阅读关于该脚本特性和局限性的更多信息。
Respond.js 是您可以选择的诸多可用开源媒体查询 polyfills 之一。如果您觉得 respond.js 无法满足您的需求,在进行一个小小的研究之后,您就会发现几个替代方案。
结束语
有了 CSS 媒体查询,您就可以轻松地将特定屏幕大小作为目标,并创建一个可靠的用户体验,不管使用何种浏览器或设备来访问您的网站。这些技术是响应式设计的重中之重,响应式设计是一个新兴移动 Web 设计和开发实践。在您的网站上尝试使用媒体查询并不涉及实际成本(除了只是增强您的现有 CSS 文件),为何不尝试一下使在平板电脑、手机或电子阅读器上访问您网站的访客有良好的体验。
CSS 媒体查询 响应式的更多相关文章
- 使用 CSS 媒体查询创建响应式网站
简介 现今每天都有更多的手机和平板电脑问市.消费者能够拥有可想象到的各种规格和形状的设备,但是网站开发人员却面临一个挑战:如何使他们的网站在传统浏览器.手机和平板电脑浏览器上有很好的效果,如何在各种大 ...
- css媒体查询:响应式网站
css媒体查询:响应式网站 媒体查询 包含了一个媒体类型和至少一个使用如宽度.高度和颜色等媒体属性来限制样式表范围的表达式.CSS3加入的媒体查询使得无需修改内容便可以使样式应用于某些特定的设备范围. ...
- CSS 媒体查询创建响应式网站
使用 CSS 媒体查询创建响应式网站 适用于所有屏幕大小的设计 固定宽度的静态网站很快被灵活的响应式设计所取代,该设计可以根据屏幕大小进行上扩和下扩.利用响应式设计,无论您采用什么设备或屏幕来访问网 ...
- 我的Vue之旅、04 CSS媒体查询完全指南(Media Quires)
什么是SCSS Sass: Sass Basics (sass-lang.com) SCSS 是 CSS 的预处理器,它比常规 CSS 更强大. 可以嵌套选择器,更好维护.管理代码. 可以将各种值存储 ...
- 巧妙使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的好方法
有无数的理由要求我们在任何时候都应该知道用户是使用的什么设备浏览我们的网站——宽屏,普通屏,平板,手机?知道这些特征,我们web应用的CSS和JavaScript才能同步做相应的操作.在给Mozill ...
- 纯CSS + 媒体查询实现网页导航特效
纯css+媒体查询实现网页导航特效 附上效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html lang="en"> <hea ...
- css媒体查询aspect-ratio宽高比在less中的使用
css媒体查询有一个 宽高比很方便,aspect-ratio ,可以直接使用宽/高 来进行页面适配 使用样例如下: // 宽高比在((320/50)+(728/90))/2 两个尺寸中间值以内 适 ...
- CSS:使用CSS媒体查询创建响应式布局
现如今在Web前端领域,BootStrap是一个最流行的UI库,其12列的栅栏系统为响应式布局提供了一种对程序员来说很好操作的模式. 追究Bootstrap的内在原理,其实就是通过媒体查询来完成对不同 ...
- CSS学习笔记——响应式布局
响应式布局 响应式布局是现在很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果,设计师提出了响应式布局的设计方案.所谓的响应式布局,就是一个网站能够 ...
随机推荐
- 复习线程——状态和几个Thread方法
一.线程的状态 (参考文章:https://blog.csdn.net/a58220655/article/details/76695142) 状态介绍 新建(new):处于该状态的时间很短暂.已被分 ...
- KEIL_RTX资源介绍
调度方法:时间片轮转. 参考文档:Keil参考手册和rtl.h(任务的每个.c文件都应包含此头文件)头文件这两个文档 1)事件管理:让一个进程等待一个事件,这个事件可以由其它进程和中断触发(只能在中断 ...
- google kickstart 2018 round D A Candies
思路: 对于small数据,由于求和及奇数数量两个限制条件均满足区间单调性,可以直接使用尺取法(滑动窗口法)求解. 对于large数据,奇数数量依然是满足区间单调性的.首先使用尺取法,找到所有满足奇数 ...
- Web开发入门不得不看章
引 如今,各种互联网的Web应用程序层出不穷,那么如何快速入门,成长为一个优秀的Web开发工作者呢? 这个问题不容易回答,几乎所有的培训机构都不能清晰地解答. 所以对于Web开发刚刚入门的菜鸟们,我觉 ...
- activity间的传参
Intent有两个作用:激活组件和附带数据 激活另一个activity的方法显示意图: 1. Intent intent = new Intent(); intent.setClass ...
- Power BI 连接到 Azure 账单,自动生成报表,可刷新
开始研究Azure官网等,提供的链接都是错误的,躺了很大的一个坑,配置后根本无法获取账单信息,经过多次查询找到了方向,过来记录一下: 错误的地址(应该是适用于全球版,国内版无法这样获取): https ...
- 为网站设置icon图标用于显示在浏览器标签页最左侧
icon图标,想必大家对它并不陌生吧,在浏览网页时会看到浏览器标签页的最左侧会有一个小图标,这个正是icon图标.本例为大家介绍下如何为网站设置这个图标 这句话起什么作用 ?复制代码 代码如下: &l ...
- gunzip
gunzip——解压缩.gz的压缩文件 GNU unzip 命令所在路径:/bin/gunzip 示例1: # gunzip services.gz 解压缩当前目录下的services.gz文件,执行 ...
- python打飞机pro版
# -*- coding: utf-8 -*- import pygame from sys import exit import random pygame.init() screen = pyga ...
- leetcode_1053. Previous Permutation With One Swap
1053. Previous Permutation With One Swap https://leetcode.com/problems/previous-permutation-with-one ...