html降级核心是依靠原生语义与渐进增强:用实现零js交互降级,nomodule/type="module"控制脚本加载,实现资源格式降级,:defined伪类做组件就绪检测。

HTML 本身没有“组件”概念,所谓降级显示,本质是让现代功能在不支持的环境里退回到基础 HTML 内容——不是靠 JS 框架兜底,而是靠原生语义和渐进增强逻辑。
用 <details></details> + <summary></summary> 实现交互降级
这是最轻量、零 JS 的折叠/展开降级方案。不支持 <details></details> 的老浏览器(如 IE)会直接渲染全部内容,不报错也不隐藏,符合降级预期。
- 支持 JS 的环境:点击
<summary></summary>触发折叠,open属性可控制初始状态 - 不支持的环境(IE、部分旧安卓 WebView):
<details></details>被忽略,子内容照常显示,无样式干扰 - 慎用自定义
<summary></summary>样式:某些旧 Safari 对display: flex下的<summary></summary>渲染异常,建议用inline-flex或保留默认块级流
<details open><summary>配置选项</summary><fieldset> <label><input type="checkbox"> 启用通知</label> </fieldset></details>
用 nomodule 和 type="module" 控制脚本加载路径
这是现代组件(比如用 ES Module 加载的 Web Component)实现降级的核心开关。浏览器只执行它理解的脚本类型。
-
<script type="module"></script>:仅被支持 ES Module 的浏览器执行(Chrome 61+、Firefox 60+、Safari 11+),旧浏览器直接跳过 -
<script nomodule></script>:仅被不支持type="module"的浏览器执行,适合加载 polyfill 或降级逻辑 - 注意:两个
<script></script>标签不能共用src,否则旧浏览器可能因解析失败而中断后续脚本;推荐分开写,且降级脚本优先加载
<script type="module" src="my-button.js"></script><script nomodule src="fallback-button.js"></script>
用 <picture></picture> + <source></source> 实现资源级降级
当组件依赖特定格式资源(如 AVIF、WebP)时,<picture></picture> 是声明式降级的事实标准,比 CSS image-set() 兼容性更好、更可控。
-
<source></source>按顺序匹配:第一个满足type或media条件的生效,其余被忽略 - 必须保留末尾的
<img>:它是所有浏览器都识别的 fallback,src 必须指向最兼容格式(通常是 JPEG/PNG) - 不要在
<source></source>里用srcset混合分辨率和格式降级——某些旧 Edge 会误判条件,优先用独立<source></source>分离格式判断
<picture><source type="image/avif" srcset="chart.avif"><source type="image/webp" srcset="chart.webp"> @@##@@ </source></source></picture>
用 :defined 伪类做 CSS 层面的组件就绪检测
自定义元素(Custom Elements)注册后才匹配 :defined,这让你能区分“标签存在但未升级”和“已升级完成”两种状态,避免闪动或样式错乱。
- 未定义时(如 JS 加载中、失败、被禁用):
my-card:not(:defined)可设为visibility: hidden或最小占位 - 定义后自动生效:
my-card:defined应承载完整样式,包括 shadow DOM 外部穿透规则(如::part()) - 注意:IE 完全不支持
:defined,所以该方案必须配合nomodule脚本降级,不能单独使用
my-card:not(:defined) {
display: inline-block;
opacity: 0.5;
}
my-card:defined {
opacity: 1;
display: block;
}
真正难的不是写出降级代码,而是判断哪些逻辑必须由 HTML 承担、哪些必须交给 JS 补足。比如表单验证可以靠 required 和 pattern 原生降级,但异步提交状态就必须用 JS 切换 class——HTML 只管结构和基础行为,状态流转永远需要明确的控制点。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











