【CSS in Depth 2 精译_047】7.2 CSS 响应式设计中的媒体查询原则(上):深入理解媒体查询的类型

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 【第七章 响应式设计】(概述)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇) ✔️​
      • 7.2.1 深入理解媒体查询的类型(上篇) ✔️​
      • 7.2.2 页面断点的添加(中篇,待翻译 ⏳)
      • 7.2.3 响应式列的添加(下篇)

文章目录

  • 7.2 媒体查询 Media queries
    • 7.2.1 深入理解媒体查询的类型 Understanding types of media queries
      • 1 最小宽度、最大宽度及其他 min-width, max-width, and beyond
      • 2 媒体查询中的范围表示法 Range syntax in media queries
      • 3 浅色主题与深色主题 Light and dark themes
      • 4 媒体类型 Media types

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
从这一篇开始,我们将进入 CSS 响应式设计的第二个原则——媒体查询的学习。相关内容在第一版的基础上进行了大幅增补,以适应当下媒体查询的最新需要。篇幅较长,拟分为上、中、下三篇分别介绍,本篇为上篇,将带您深入了解媒体查询的具体类型;中篇将介绍媒体查询断点的设置技巧;下篇涉及响应式列的相关知识。让我们步步为营,先搞定上篇的学习——

7.2 媒体查询 Media queries

响应式设计的第二个原则是使用 媒体查询媒体查询(media queries 允许某些样式仅在页面满足特定条件时才生效。这样就可以根据屏幕尺寸定制样式。可以先针对小屏设备定义一套样式,再针对中等屏幕设备定义另一套样式,最后针对大屏设备再定义一套样式,这样就能让页面内容呈现多种布局。

媒体查询使用写作 @media@规则 选中符合特定条件的设备。一条简单的媒体查询写法如以下代码所示:

@media (min-width: 560px) {.title > h1 {font-size: 2.25rem;}
}

在最外层的大括号内可以定义任意的样式规则。@media 规则会进行条件检查,只有满足所有条件时,才会将这些样式应用到页面上。本例中浏览器会检查 min-width: 560px;,即仅当设备的视口宽度大于等于 560px 时,样式类 title 下的一级标题 h1 元素才能设为 2.25rem 的大号字;若视口小于 560px,则内部规则集都会被忽略。

媒体查询中的规则仍然遵循常规的层叠原理。它们既可以覆盖媒体查询外部的样式规则(根据选择器的优先级或源码顺序等),也可能被这些样式规则覆盖掉。而媒体查询本身不会影响到它里面的选择器优先级。

关于在媒体查询中使用 px 与 em

虽然也可以使用很多其他单位来定义媒体查询,但 pxem 无疑是最常用的。例如,除了写成上面的 @media (min-width: 560px),还可以写成 @media (min-width: 35em)。而用 rem 则通常与用 em 差不多。

在媒体查询中,em 的值基于浏览器的默认字号,也就是关键字 medium(译注:媒介、媒体)通常对应的 16px。但如果用户在浏览器设置中更改了默认字号,em 的含义也会随之改变。这可能对设计而言是个好事,随着默认字号的增加,页面断点的尺寸也会同步增大。但要注意一点:该行为在所有浏览器中并不一致(Safari 就是个突出的反例)。

在过去,由于浏览器存在不一致性,开发人员(包括我本人在内)都会推荐在媒体查询中使用相对单位 em;然而在最近版本的浏览器中,像素单位 px 的表现更加一致。因此,在很多情况下我反倒更推荐使用 px;而当我希望断点处的尺寸可以随默认字号同步缩放时,再换回相对单位 em 也不迟。

接下来演示几个给页面设置媒体查询的例子。找到样式表中的 .title 样式,并按照代码清单 7.7 中的样式添加媒体查询,让页面标题拥有响应式行为。

代码清单 7.7 给页面标题样式添加断点

.title > h1 {color: #333;text-transform: uppercase;font-size: 1.5rem;margin-block: 0.2em;
}@media (min-width: 560px) {  /* 匹配宽度在 560px 及以上的视口 */.title > h1 {font-size: 2.25rem;  /* 用更大的字号覆盖移动端的小号字(1.5rem) */}
}

此时,根据视口大小的不同,页面标题就有了两种不同的字号:视口宽度不足 560px 时字号为 1.5rem;超过 560px 则为 2.25rem(译注:刚好等于 560px 时也是 2.25rem)。

通过缩放浏览器窗口就能测出标题的样式:窗口很窄的时候,看到的是适配移动端的小字号;慢慢扩大浏览器窗口,字号也会平滑过渡,因为页面通过 clamp()(详见代码清单 7.2)事先设置了响应式的字号;而当页面宽度达到 560px 时,标题的字号则会立马变为 2.25rem

窗口宽 560px 的这个临界点,就被称为一个 断点(breakpoint。大多数情况下,整个样式表里的媒体查询只会复用几个为数不多的断点。本章稍后会介绍如何挑选合适的断点。


7.2.1 深入理解媒体查询的类型 Understanding types of media queries

还可以进一步将两个条件用 and 关键字联合起来,组合为 一个 媒体查询:

@media (min-width: 320px) and (max-width: 560px) { ... }

这样的组合式媒体查询仅在设备同时满足这两个条件时才会生效。如果设备只需要满足其中一个条件,可以用逗号分隔,写作:

@media (max-width: 320px), (min-width: 560px) { ... }

上述媒体查询将匹配宽度小于等于 320px、或者大于等于 560px 的视口。另外,关键字 or 已收入 W3C 媒体查询第四级规范(W3C Media Queries Level 4 specification),与这里的逗号等效。该写法相对较新,仅在最近版本的 ChromeFirefoxSafari 浏览器中有效。

1 最小宽度、最大宽度及其他 min-width, max-width, and beyond

刚才那段代码中,min-width 用于匹配视口大于特定宽度的设备;max-width 则相反,用于匹配视口小于特定宽度的设备。它们被统称为 媒体特征(media feature

min-widthmax-width 是目前使用最为广泛的媒体特征,但还有一些别的媒体特征可供选用。下面列出了其中的部分写法:

  • (min-height: 320px) —— 匹配高度不低于 320px 的视口。
  • (max-height: 320px) —— 匹配高度不超过 320px 的视口。
  • (orientation: landscape) —— 匹配宽度大于高度的视口。
  • (orientation: portrait) —— 匹配高度大于宽度的视口。
  • (min-resolution: 2dppx) —— 匹配屏幕分辨率不小于 2dppx(即每个 CSS 像素里包含两个物理像素点)的设备,比如“视网膜”("retina")屏慕。
  • (max-resolution: 2dppx) —— 匹配屏幕分辨率不超过 2dppx 的设备。
  • (pointer: coarse) —— 匹配不具备精确指向方法(precise pointing method,比如鼠标)的设备。通常匹配的是触摸屏设备,因为用户手指无法准确选中太小的按钮;可以用它来放大这些点击目标。
  • (pointer: fine) —— 匹配具备精确指向方法的设备,例如鼠标。

查看完整的媒体特征列表,详见 MDN 官方文档:https://developer.mozilla.org/en-US/docs/Web/CSS/@media

基于分辨率的媒体查询对于能够渲染更高分辨率的图像或图标的设备屏幕非常有用。这样一来,屏幕分辨率较低的用户在加载较大的图像时就不会浪费带宽,因为他们看不出差异。本章稍后还将进一步介绍响应式图像的相关知识。

提示

媒体查询还可以放在 <link> 标签中。在页面加入 <link rel="stylesheet" media="(min-width: 45em)" href="large-screen.css" />,只有在 min-width 处的媒体查询条件被满足时,文件 large-screen.css 中的样式才会在页面生效。但要注意,此时无论视口的宽度如何,该样式文件都会被下载。因此该方案旨在更好地组织代码,并不会节省网络流量。

此外,还有个关键点值得注意:在媒体查询中无法访问自定义属性。也就是说,像 @media (min-width: var(--breakpoint)) 这样的写法是无效的,因为 var() 的使用场景仅限于在给某个属性(property)的样式声明赋上某个值时使用。

2 媒体查询中的范围表示法 Range syntax in media queries

媒体查询还有一种新的语法,可以使用小于和大于符号。例如,之前的 @media (min-width: 800px) 可以直接写成 @media (width >= 800px)。此外,还可以为查询提供一组上下边界(upper and lower bound),例如写作 @media (800px < width < 1200px),表示仅对宽度介于 800px1200px 之间的视口生效。

该语法较之传统写法有两个明显优势:首先,使用了该语法的媒体查询读起来更加直观,尤其是在定义上下边界时,像 (800px <= width <= 1200px) 的写法比之前冗长的 (min-width: 800px) and (max-width: 1200px) 更容易理解。

而该语法的第二个好处,则是提供了小于等于(<=)和大于等于(>=)符号的配置选项。使用传统写法的媒体查询时,假设某个应用场景中同时存在像 max-width: 30emmin-width: 30em 这样的两个媒体查询。如果视口宽度恰巧为 30em,则二者都将生效,从而可能带来一些不符合预期的效果。而使用新的范围表示方法,就能通过 是否使用等号 来准确描述目标范围在对应边界上的包含情况。再来看几个类似的用法:

@media (480px <= width < 1200px) { ... }
@media (800px < height) { ... }
@media (width = 1600px) { ... }

该语法尽管仍然相对较新,但所有主流浏览器的最新版本都对其提供了支持。获取该语法在各版本浏览器中的最新兼容情况,详见:https://caniuse.com/css-media-range-syntax。

3 浅色主题与深色主题 Light and dark themes

此外,您还可以使用媒体查询来检测用户的操作系统是否设置成了深色模式(dark mode)并据此来为页面提供浅色或深色背景,以匹配用户的偏好:

@media (prefers-color-scheme: dark) {:root {--theme-font-color: white;--theme-background: #222;}
}

或者匹配浅色主题来进行设置:

@media (prefers-color-scheme: light) {:root {--theme-font-color: #222;--theme-background: #eee;}
}

我发现,像上述代码这样充分利用自定义属性,不失为更改整个页面样式的一种相对简单的做法,只要能确保在样式表中始终如一地使用自定义属性就行。

实际运用过程中,完成这样的任务肯定不止这两个自定义变量。后续章节将进一步深入探讨颜色变量的管理。

4 媒体类型 Media types

最后一个要介绍的媒体查询配置选项,为 媒体类型(media type。常见的两种类型为 screenprint。使用 print 媒体查询可以控制打印时的页面布局,这样就能在打印时去掉背景图(为了省墨),或者隐藏不必要的导航栏。毕竟用户打印网页时,通常只想打印主体内容。

要编写仅在打印时生效的样式(即打印样式),需使用查询语句 @media print。与 min-width 及其他媒体特征一样,该语句不用加小括号。而针对屏幕样式,则使用 @media screen

开发 CSS 的时候,通常在事后才会处理打印样式(an afterthought),而且只在确实需要打印时才会考虑;但还是有必要思考用户是否想要打印该网页。为了帮助用户打印出网页,需要采取一些通用步骤。大多数情况下,都需要将基础打印样式放在 @media print {...} 的媒体查询内。

要使用 display: none 来隐藏像导航菜单、页脚这样的次要内容。用户打印网页时,他们绝大多数情况下只关心网页的主体内容。

还可以将整体的字体颜色设置为黑色,并去掉文字后面的背景图片或背景色。大多数情况下,使用通用选择器就能搞定这一切。以下代码使用了 !important 标记,这样就不用担心被后面的样式代码覆盖掉。

@media print {* {color: black !important;background: none !important;}
}

花费一些时间来优化打印样式,对用户来说是一项很不错的服务。如果要开发的网站预计会有很多打印需求(例如食谱类网站),那就应该花更多时间确保所有的样式都能正常打印。



关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版第 2 版
读者评分原版:4.7(亚马逊);中文版:9.3(豆瓣)原版:5.0(亚马逊);中文版:暂无,待出版
出版时间原版:2018 年 3 月;中文版:2020 年 4 月原版:2024 年 7 月;中文版:暂无,待出版
原价原版:$44.99;中文版:¥139.00原版:$59.99;中文版:暂无,待出版
现价原版:$36.49;中文版:¥52.54 起步原版:$52.09;中文版:暂无,待出版
原版国内预订起步价 ¥461.00起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局(已完结)
    • 5.1 构建基础网格
    • 5.2 网格结构剖析 (上)
      • 5.2.1 网格线的编号(下)
      • 5.2.2 网格与 Flexbox 配合(下)
    • 5.3 两种替代语法
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格(上)
      • 5.4.1 添加变化 (中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格(全新增补内容)
    • 5.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB - 机器人机械臂设计轨迹规划器

系列文章目录 前言 本示例介绍了一种设计抓取和轨迹规划器的方法,该规划器可用于垃圾箱拣选系统。 在机器人技术中,垃圾箱拣选包括使用机械手从垃圾箱中取出物品。智能垃圾箱拣选是这一过程的高级版本,具有更强的自主性。使用摄像系统感知部件,规划器生成与场景相适应的无碰…

NASA:ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型,以及相关的大气数据

目录 简介 信息 代码 引用 网址推荐 知识星球 机器学习 MISR L2 FIRSTLOOK Aerosol Product subset for the ARCTAS region V001 简介 这是 ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型&#xff0c;以及相关的大气数据&#xff0c;…

关于摩托车一键启动无钥匙进入、智能科技创新

摩托车一键启动无钥匙进入功能 一、工作原理 摩托车的一键启动无钥匙进入功能采用了世界最先进的RFID无线射频技术和最先进的车辆身份编码识别系统&#xff0c;率先应用小型化、小功率射频天线的开发方案&#xff0c;并成功融合了遥控系统和无钥匙系统&#xff0c;沿用了传统…

在 MTT GPU 上使用 llama.cpp 推理

大语言模型因其出色的自然语言理解和生成能力而迅速被广泛使用&#xff0c;llama.cpp 大幅降低了进行大语言模型推理的门槛&#xff0c;MTT GPU 同样也是 llama.cpp 支持的运行平台&#xff0c;能够充分利用硬件的性能来助力用户的大语言模型应用。 本文主要介绍了如何在摩尔线…

出处不详 取数游戏

目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环&#xff0c;规则如下&#xff1a; 第一名玩家随意选取数字&#xff1b;第二名玩家从与第一名玩家相邻的两个数字中选择一个&#xff1b;而后依次在…

用Arduino单片机制作一个简单的音乐播放器

Arduino单片机上有多个数字IO针脚&#xff0c;可以输出数字信号&#xff0c;用于驱动发声器件&#xff0c;从而让它发出想要的声音。蜂鸣器是一种常见的发声器件&#xff0c;通电后可以发出声音。因此&#xff0c;单片机可以通过数字输出控制蜂鸣器发出指定的声音。另外&#x…

【尚硅谷】FreeRTOS学笔记(更新中更新时间2024.10.12)

在网上看到的一段很形象的描述&#xff0c;放在这里给大家娱乐一下。 裸机开发&#xff1a;n个人拉屎&#xff0c;先进去一个拉完&#xff0c;下一个再来。看门狗&#xff1a;如果有人拉完屎还占着&#xff0c;茅坑刷视频&#xff0c;把他拖出去中断系统&#xff1a;n个人拉屎&…

Python | Leetcode Python题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; class Solution:def totalHammingDistance(self, nums: List[int]) -> int:n len(nums)ans 0for i in range(30):c sum(((val >> i) & 1) for val in nums)ans c * (n - c)return ans

数通--3

一、动态路由 内部 路由器之间要互联互通&#xff0c;必须遵循相同的协议 企业内部用 IGP&#xff0c;企业之间用BGP RIP&#xff08;已淘汰&#xff0c;不考&#xff09; 距离就是长短&#xff0c;矢量就是方向&#xff0c;即路由的出接口 一台路由器 A 配好RIP&#xff0c;…

C++面试速通宝典——25

473. HTTP如何减少重定向请求 重定向请求&#xff1a; ‌‌‌‌  服务器上的一个资源可能由于迁移、维护等原因从url1移至url2后&#xff0c;而客户端不知情&#xff0c;他还是继续请求url1&#xff0c;这时服务器不能粗暴地返回错误&#xff0c;而是通过302响应码和Locati…

鸿蒙--商品列表

这里主要利用的是 List 组件 相关概念 Scroll:可滚动的容器组件,当子组件的布局尺寸超过父组件的视口时,内容可以滚动。List:列表包

Appium Device Farm安装教程

环境要求&#xff1a;Appium version ≥ 2.4.X 安装appium npm install -g appium2.11.3 如果安装提示如下问题 npm error code EEXIST npm error syscall rename npm error path /Users/wan/.npm/_cacache/tmp/d5787519 npm error dest /Users/wan/.npm/_cacache/content-…

鸿蒙--WaterFlow 实现商城首页

目录结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ ├──constants │ │ │ └──CommonConstants.ets // 公共常量类 │ │ └──utils │ │ └──Logger.ets // 日志打印类 │ ├──entryability │ │ └──EntryAbility.ets // 程序入口…

【2024最新】基于springboot+vue的体质数据分析及可视化lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

数据结构-5.6.二叉树的先,中,后序遍历

一.遍历&#xff1a; 二.二叉树的遍历&#xff1a;利用了递归操作 1.简介&#xff1a; 二叉树的先序遍历&#xff0c;中序遍历&#xff0c;后序遍历都是以根结点遍历顺序为准的&#xff0c;如先序遍历就先遍历根结点 2.实例&#xff1a; 例一&#xff1a; 例二&#xff1a; …

Rust 与生成式 AI:从语言选择到开发工具的演进

在现代软件开发领域&#xff0c;Rust 语言正在逐步崭露头角&#xff0c;尤其是在高性能和可靠性要求较高的应用场景。与此同时&#xff0c;生成式 AI 的崛起正在重新塑造开发者的工作方式&#xff0c;从代码生成到智能调试&#xff0c;生成式 AI 的应用正成为提升开发效率和质量…

爬虫设计思考之二

“所谓爬虫,其本质是一种计算机程序,它的行为看起来就像是蜘蛛在网上面爬行一样,顺着互联网这个“网”,一条线一条线地“爬行”。 一、认识爬虫 爬虫这个词对于非专业人士比较的陌生&#xff0c;但是实际却和我们的生活息息相关。例如我们国内经常使用的百度浏览器搜索&#x…

线性代数 行列式

一、行列式 1、定义 一个数学概念&#xff0c;主要用于 线性代数中&#xff0c;它是一个可以从方阵&#xff08;即行数和列数相等的矩阵&#xff09;形成的一个标量&#xff08;即一个单一的数值&#xff09; 2、二阶行列式 &#xff0c;像这样将一个式子收缩称为一个 2*2 的…

【数据结构】【链表代码】移除链表元素

移除链表元素 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) { // 创建一个虚拟头节点&#xff0c;以处理头节点可能被删除的情况 struct…