Modernizr 检测具体特性而非“是否支持 HTML5”,通过运行时探测将结果挂载为 Modernizr 对象的布尔属性,需在依赖脚本前加载;推荐定制化引入,优先用特性检测代替 UA 判断,并注意其静态局限性。
Modernizr 不是检测“浏览器是否支持 HTML5”,而是检测具体特性(比如 localStorage、canvas、flexbox)是否存在。直接判断“是否支持 HTML5”没有意义——HTML5 是一大组松散标准,各浏览器支持程度千差万别。
Modernizr 本质是一个运行时脚本,它在页面加载早期执行探测,把结果挂到全局 Modernizr 对象上。必须确保它在其他依赖特性的 JS 执行前就位。
末尾或 开头,**不能**放在所有 JS 之后再加载Modernizr.canvas 返回 true 或 false,不是 Promise 或回调Modernizr 把每个检测结果作为布尔属性暴露在
Modernizr 对象上。名字基本和特性名一致,但有少数例外(如 inputtypes 对应 date 类型输入框)。
Modernizr.websockets → WebSocket 支持Modernizr.history → History API(pushState / replaceState)Modernizr.cssgrid → 原生 CSS Grid(注意:旧版 Modernizr 用 cssgrids,v3+ 统一为 cssgrid)Modernizr.adownload → 属性支持Modernizr 查看完整属性列表不要用 if (Modernizr.xxx) { ... } 包裹整段功能代码,而应分离「能力判断」和「行为实现」。否则容易漏掉降级路径或触发未定义行为。
立即学习“前端免费学习笔记(深入)”;
if (Modernizr.geolocation) 比 navigator.userAgent.includes('Chrome') 可靠得多const hasCanvas = Modernizr.canvas;
!Modernizr.webp 时,用 + +
Modernizr.serviceworker 虽返回 true,但不代表 navigator.serviceWorker 已 ready,仍需调用 navigator.serviceWorker.register() 并处理 promiseModernizr 是静态探测,无法反映运行时环境变化(如用户禁用 Cookie 后 Modernizr.cookies 仍是 true),也不检测 API 行为差异(比如 Safari 的 IntersectionObserver 在某些滚动场景下不触发)。
'geolocation' in navigator、'fetch' in window、typeof Worker !== 'undefined'
@modernizr/load(Modernizr v3+ 的按需加载模块)feature-detect-es6 或手写轻量探测函数,避免引入整个 Modernizrmin-width 是否生效),这类问题必须靠真实 DOM 测试或视觉回归验证