前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS @supports 特性检测 与 @media 区别
CSS响应式设计

@supports 和 @media 各检测什么,渐进增强怎么写?

@supports 问浏览器是否支持某条 CSS 声明,@media 问当前环境是否满足宽度、色彩偏好等条件。先写可用的基础样式,再用两者分别增强能力与适配环境。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#响应式设计
先看核心答案读代码示例
理解线索

能力与环境分开判断

  1. @supports判断浏览器是否识别 CSS 特性
  2. @media判断视口或设备环境条件
  3. 渐进增强基础体验先可用,支持时再升级

@supports (display: grid) 为真,只说明声明可用,不保证具体 Grid 布局在当前尺寸下合适。

核心回答

先记住这个答案

@supports 检查浏览器是否接受某条 CSS 声明,例如 @supports (display: grid);@media 检查视口宽度、指针类型、用户偏好等当前环境。两者回答的是不同问题。渐进增强先写不用新特性也能阅读的基础布局,再在 @supports 中加入新布局;若还需足够宽的屏幕,可再嵌套 @media。

  • @supports 检测声明支持
  • @media 检测环境条件
  • 基础样式应独立可用
  • 两种条件可以嵌套

先有回退,再有增强

一个列表在旧环境至少应顺序展示内容。支持 Grid 且屏幕够宽时,才改成三列。这样两个条件之一不满足,读者仍能看到完整内容。

支持且足够宽时三列CSS
.list { display: block; }
@supports (display: grid) {
  @media (min-width: 48rem) {
    .list { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; }
  }
}

外层判断 CSS 能力,内层判断当前视口;两者都成立才进入三列。窄屏即便支持 Grid,仍按基础布局展示。反过来,宽屏但不支持 Grid,也保留基础布局。 特性检测只是语法能力判断。浏览器支持某声明,不代表字体、内容长度和列宽就一定满足设计要求,还要实际检查布局。

不要用错检测工具

深色模式是用户环境偏好,可用 @media (prefers-color-scheme: dark);某属性值是否被接受可用 @supports (property: value)。要根据组件所在容器宽度切换,则是 @container 的职责。

三种查询可以组合,但每增加一层限制都要说明真实需求。若没有兼容旧浏览器的需要,额外包一层 @supports 只会增加维护成本。

@supports 接受声明,只说明解析器认识这组属性和值,不会替你判断组合布局是否合理。示例中旧环境保留块级列表,可以阅读;新环境里即使 Grid 可用,也要看三列在 48rem 附近是否容得下最长的标题。若标题挤坏了卡片,应调列宽或断点,而不是继续增加一个“支持 Grid”条件。能力检测和布局验收是两步。

回答前,多想一步

容易答错的地方

用 @media 判断浏览器是否支持 Grid
视口宽度和 CSS 特性支持没有必然关系。大屏旧浏览器也可能不认识 Grid。
认为 @supports 命中就保证视觉正确
它不检查内容溢出、字体加载或用户缩放。增强后的实际排版仍需验收。
试着用自己的话回答

面试官还会怎么问?

如何检测多个特性都支持?

在 @supports 条件中用 and 组合声明测试,只有全部满足才应用规则。

想在不支持某特性时应用样式怎么写?

可以用 not 条件,但通常先写普通回退,再写支持时的增强规则更容易维护。

@supports 能测试图片是否可解码吗?

它主要测试 CSS 声明支持,不适合决定内容图片格式;内容图可用 <picture> 和 type。

从一道题,走向一组知识

把知识连起来

响应式设计

响应式图片选 AVIF、WebP 时该用 picture 还是 srcset?

现代图片格式应由 <picture> 的类型选择,不靠 CSS 特性查询猜解码能力。

响应式设计

给高 DPR 屏幕双倍图时,显示尺寸到底怎么设?

高 DPR 图片需要根据显示尺寸选择资源,与媒体环境判断有关。

参考资料

  • CSS:响应式设计参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 先有回退,再有增强
  3. 不要用错检测工具
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑