capture属性仅对input type="file"有效,必须搭配accept="image/*"等通配符值,且需HTTPS、静态DOM、用户手势触发及可见性条件满足,否则静默降级。

capture 属性只在 input type="file" 里有效,其他地方加了没用
很多人把 capture 往 input type="text" 或 button 上写,结果一点反应都没有。它本质是 input type="file" 的专属提示属性,浏览器只会在该上下文中解析它。加错位置等于白写。
必须配 accept="image/*",写 accept="image/jpeg" 或留空就失效
accept 不是可选项,而是硬性开关。iOS Safari 对 MIME 类型极其严格:写 accept="image/jpeg" 会被直接忽略,降级为相册;accept="" 或没写,capture 就被当空气。Android Chrome 117+ 虽稍宽松,但部分厂商 ROM(如华为 EMUI、小米 HyperOS)仍会 fallback。
-
accept="image/*"✅ 最通用,iOS 16.4+ 和主流安卓均认 -
accept="video/*"✅ 可触发录像,但部分安卓定制系统会降级为拍照 -
accept="audio/*"✅ Android Chrome 117+ 支持录音入口,iOS Safari 完全不支持 -
accept="*"❌ 系统无法判断意图,必退化为文件选择器
别信 capture="camera",标准值只有 "user" 和 "environment"
早期安卓私有扩展的 capture="camera" 已被 Chrome 和 Safari 废弃。现在 W3C 唯一认可的值是 "user"(前置)和 "environment"(后置),但实际效果极不可控:
- iOS Safari 16.4+ 才开始识别这两个值,且仅 HTTPS 下生效;即使写了
capture="environment",仍大概率默认打开前置 - Android 上
capture="environment"在原生 Chrome 84+ 表现较好,但在华为、小米、OPPO 等厂商 WebView 中常被忽略,甚至触发“用哪个应用打开”二次选择 - 最稳妥写法其实是只写
capture(无值),让浏览器按自身策略决定,多数安卓机型倾向后置
真机失效的四大静默原因:HTTPS、静态 DOM、用户手势、非隐藏
页面点一下没反应,控制台也没报错?大概率是浏览器悄悄降级了。以下任一条件不满足,capture 就自动作废:
立即学习“前端免费学习笔记(深入)”;
- 页面必须走
https://—— HTTP 下 iOS Safari 16.4+ 和 Chrome 90+ 直接禁用媒体设备访问(localhost本地调试除外,但真机测试必须 HTTPS) -
input元素必须在初始 HTML 中存在 —— Vue/React 动态渲染、innerHTML插入、appendChild添加,iOS Safari 一律无视capture - 触发
.click()必须在用户真实点击/触摸回调中 —— 放在setTimeout、Promise.then、滚动监听或IntersectionObserver里调用,全都会失败 - 元素不能包裹在
display: none或visibility: hidden容器中 —— Safari 会跳过该节点,连尝试都不做
鸿蒙手机(HarmonyOS Webview)目前对 capture 支持极弱,基本等同于微信 X5 内核,建议直接 fallback 到 navigator.mediaDevices.getUserMedia() 自建预览流 —— 那才是唯一能绕过系统选择器、真正拿到摄像头控制权的方式。



















