type="month" 默认只选年月,value 为 "YYYY-MM" 格式字符串;min/max 必须用完整年月(如 "2025-01"),否则无效;手动输入非法值可能不校验,JS 赋值需严格匹配格式;iOS Safari 等存在兼容性问题,强需求建议用 select 或 JS 库替代。

type="month" 本身只选年份和月份,不需要额外限制
它天生就不带“日”,value 永远是 "YYYY-MM" 格式字符串(如 "2026-08"),不是 Date 对象,也不能输日期。所谓“限制只选年月”,正是它的默认行为——你不用做任何事,它就只让你选年+月。
但 min/max 必须写全 YYYY-MM,否则无效
想限定可选范围(比如只能选 2025 年到 2027 年),min 和 max 的值必须是完整年月格式,单写月份或年份会被浏览器忽略:
-
min="2025-01"✅ 合法,限制从 2025 年 1 月起 -
min="2025"❌ 无效,浏览器静默忽略 -
min="01"❌ 无效,不识别为月份 -
max="2027-12"✅ 合法,截止到 2027 年 12 月
如果用户手动输入非法值(如 "2026-13"),控件会变为空,checkValidity() 返回 false,但不能依赖这个——Android 部分 WebView 允许乱输且不校验,得自己守边界。
value 赋值必须严格匹配 YYYY-MM,否则清空
JS 动态设置时,哪怕少一个零、换一个分隔符,都会导致 input 显示为空:
立即学习“前端免费学习笔记(深入)”;
- ✅ 正确:
el.value = "2026-08"或el.value = year + "-" + String(month).padStart(2, "0") - ❌ 错误:
el.value = "2026/08"、"2026-8"、"2026年08月"—— 全部清空 - ⚠️ 注意时区:
new Date().toISOString().slice(0,7)在 UTC+8 时区可能返回上个月,别用
真要“只选年月”还强兼容?别用原生 type="month"
原生控件在 iOS Safari(直到 16.4)、旧 Edge、部分安卓 WebView 中 fallback 成文本框,甚至允许输入任意字符。如果你的业务要求:
- 用户一定点选、不能手输
- 统一滚动/下拉体验
- 支持禁用某几个月、标季度、多语言
那就别赌浏览器实现,直接用两个 select 或轻量 JS 库(如 flatpickr 配 mode: "month")。原生 type="month" 最容易被忽略的坑,从来不是功能缺不缺,而是“你以为它做了,其实它没做”。



















