使用 CSS 媒体查询提升无障碍体验(2025)
摘要
一篇关于利用 prefers-contrast、prefers-reduced-motion、prefers-color-scheme 等 CSS 媒体查询提升网站可访问性的前端实践文章,介绍如何在不重做设计的前提下响应用户偏好设置。
<p><a href="https://lobste.rs/s/0glhl6/improving_accessibility_with_css_media">评论</a></p>
查看缓存全文
缓存时间: 2026/10/21 10:19
# 使用 CSS 媒体查询改善无障碍体验
来源:https://fleeb.ee/blog/improving-accessibility-with-css-media-queries/
遗憾的是,在设计网站时,无障碍往往是事后才考虑的事情。也许你选出了一套令自己满意的配色,但它并不完全符合 WCAG 2 关于对比度的成功标准 (https://www.w3.org/TR/WCAG21/#contrast-minimum),又或者你网站上的动画有些过头了。
幸运的是,有一些新近获得支持、却尚未得到充分利用的 CSS 媒体查询,可以通过考虑*用户偏好*来改善无障碍体验,而无须推翻设计、从头再来。
可以通过媒体查询匹配的用户偏好包括对比度、动态效果、配色方案和透明度。这些偏好可以在操作系统的无障碍或显示设置中配置。
## prefers\-contrast (https://fleeb.ee/blog/improving-accessibility-with-css-media-queries/#prefers-contrast)
默认就具备良好的对比度总是件好事,但有时很难在保持理想美感的同时做到这一点。使用 `prefers\-contrast`,我们可以为明确表示有此偏好的用户提高内容对比度,同时为其他用户保留原有样式。
``
.blue {
color: rgb(117, 105, 255);
@media (prefers-contrast: more) {
color: rgb(44, 0, 255);
}
}
``
为了帮助发现对比度问题,可以在开发者工具中点击某个颜色,查看它与背景之间的对比度。WCAG 2 建议,小号文字的最低对比度为 **4\.5**,标题等大号文字的最低对比度为 **3\.0**。
Firefox 对比度指示器*CSS 变量和颜色混合?没问题。*无须逐一检查:大多数浏览器都提供了工具,可以自动列出网站上的所有对比度问题。
## prefers\-reduced\-motion (https://fleeb.ee/blog/improving-accessibility-with-css-media-queries/#prefers-reduced-motion)
许多用户会因移动或闪烁的动画感到不适。如果能识别出非必要的动画,最好为偏好减少动态效果的用户禁用(或*减少*)这些动画。
``
.jello {
&:hover {
animation: jello 1s ease;
}
@media (prefers-reduced-motion: reduce) {
animation: none;
}
}
``
也可以使用以下 CSS,彻底禁用页面上的所有动画:
``
@media (prefers-reduced-motion: reduce) {
* {
animation: none !important;
transition: none !important;
}
}
``
采用这种方法后,值得检查一下页面是否出现了意料之外的副作用。
## prefers\-color\-scheme (https://fleeb.ee/blog/improving-accessibility-with-css-media-queries/#prefers-color-scheme)
只要你不是与世隔绝,应该都熟悉浅色模式和深色模式的概念。设计两套配色意味着双倍的工作量,但对于愿意更进一步的人来说,可以使用 `prefers\-color\-scheme`:
``
:root {
--color-text: black;
--color-background: white;
}
@media (prefers-color-scheme: dark) {
:root {
--color-text: white;
--color-background: black;
}
}
.theme-aware-element {
color: var(--color-text);
background-color: var(--color-background);
}
``
一种常见的做法是为颜色定义 CSS 变量,然后在所有地方使用这些变量,这样整个网站只需要编写一条 `prefers\-color\-scheme` 查询。很简单。
事实上,截至 2024 年,你还可以使用 `color\-scheme` (https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme) 和 `light\-dark\(\)` (https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark) 来实现相同的效果:
``
:root {
color-scheme: light dark;
--color-text: light-dark(black, white);
--color-background: light-dark(white, black);
}
.theme-aware-element {
color: var(--color-text);
background-color: var(--color-background);
}
``
`color\-scheme` 很实用,因为它能帮助浏览器为滚动条、选中区域等应用与首选配色方案相匹配的默认颜色。
## prefers\-reduced\-transparency (https://fleeb.ee/blog/improving-accessibility-with-css-media-queries/#prefers-reduced-transparency)
这项功能仍处于实验阶段,在撰写本文时,Firefox 和 Safari 默认都不支持它。在这种情况改变之前,我建议谨慎使用半透明效果。
``
.translucent {
opacity: 0.6;
@media (prefers-reduced-transparency) {
opacity: 1;
}
}
``
---
需要认识到,虽然无障碍偏好大多是二元的开关设置,但人们所面临的功能障碍却涵盖更广泛的程度。因此,从一开始就设计具备合理无障碍水平的界面,或许是个好主意。
这些媒体查询并非万能良方,但当你急需更多灵活性时,它们可以派上用场。
相似文章
网站应当支持打印
作者分享如何使用 CSS 的 @media print 规则优化网页的打印效果,包括调整字号、隐藏不必要元素和链接颜色处理,呼吁更多开发者关注网页的可打印性。
可访问性对比度颜色网格小工具
这篇博客文章介绍了一个副项目工具,它可以一次性生成多个颜色的对比度网格,帮助设计师和开发者快速检查WCAG可访问性合规性。
CSS历史趣闻
本文探讨了历史上的CSS技巧和怪癖,详述了早期网页开发中使用的浏览器特定利用方法,例如属性解析和文档级别的检测方法。
使用Web标准实现深色模式
一篇关于使用Web标准(如color-scheme元标签和prefers-color-scheme媒体查询)在网站上实现深色模式的指南,并包含一个JavaScript切换开关,可尊重用户偏好并将其存储在localStorage中。
抖动与复古着色的 Web 之术
Maxime Heckel 深入讲解如何在 Web 上实现抖动(dithering)、颜色量化与 CRT 像素化等复古着色后处理效果,结合 React Three Fiber/Three.js 展示自定义 shader 技术与艺术化应用。