结论:应直接在目标元素上设置 cursor 属性,而非父级;现代标准写法为 cursor: pointer,禁用非标准值 hand;自定义光标需 .cur/.ani 格式+备选值;移动端 cursor 几乎无效,仅作桌面增强。

直接说结论:用 cursor 属性,不是 STYLE 属性——CSS 里没有叫 STYLE 的属性,style 是 HTML 元素的内联属性名,它只是个容器,真正起作用的是里面写的 cursor: xxx。
为什么写 cursor 必须加在目标元素上,而不是父级?
浏览器只检查鼠标当前所在的**最深有效元素**,不会向上冒泡匹配父容器的 cursor。哪怕父 div 写了 cursor: pointer,子 button 没写,悬停在 button 上时依然显示默认箭头。
- 错误写法:
<div style="cursor: pointer"><button>点我</button></div>→ button 上仍是 default - 正确写法:
<button style="cursor: pointer">点我</button>或用 class:.btn { cursor: pointer; } - 例外情况:如果子元素设置了
pointer-events: none,鼠标会“穿透”它,这时才可能触发父级的cursor
pointer 和 hand 到底能不能混用?
hand 不是标准值,IE5–IE8 私有,现代浏览器已完全废弃。现在所有场景都该用 pointer,写 hand 只会让 CSS 校验失败,且在部分工具链里被静默丢弃。
- 兼容老 IE 的历史写法(已过时):
cursor: hand; cursor: pointer;—— 后者覆盖前者,前者纯属冗余 - 当前推荐写法:
cursor: pointer;单独一行足矣 - 别用
cursor: url(...), hand;做 fallback,hand无效,应写default或auto
自定义光标(url())为什么经常不生效?
根本原因就两个:格式不对 + 缺 fallback。浏览器对自定义光标极其挑剔,稍有偏差就退回到 auto。
- 必须用
.cur或.ani格式,.png/.gif在 Chrome/Firefox 新版本中基本不支持(仅 Safari 旧版偶然能加载) -
url()后必须跟至少一个逗号分隔的备选值,例如:cursor: url("icon.cur"), default;,不能只写url("icon.cur") - 路径必须可访问:本地开发用相对路径要确保路径正确;部署后注意静态资源是否被 CDN 缓存或拦截
- 热点坐标(hotspot)需在 .cur 文件内预设,CSS 无法运行时指定 —— 这点常被忽略,导致光标点击位置和视觉位置错位
移动端和高 DIP 设备上 cursor 还要不要写?
要写,但得清楚它大概率不显示。iOS 和 Android 主流浏览器(Safari、Chrome for iOS、Samsung Internet)对 cursor 值的支持极弱,除了 text 在 <input> 或 contenteditable 区域内可能生效,其余几乎全部忽略。
- 别为按钮加
cursor: pointer后在手机上测试不到效果就怀疑 CSS 写错 - 更关键的是:移动端交互靠触摸反馈(如
:active样式、tap highlight),不是光标 - 如果你的组件同时面向桌面和移动,
cursor只作为桌面增强项存在,不影响功能逻辑
最容易被忽略的一点:cursor 的继承性虽为 yes,但实际中几乎没人靠继承生效——因为几乎所有交互元素(button、a、div[role="button"])都自带用户代理样式或重置规则,会覆盖继承来的值。所以,别省那几行代码,该写的 cursor 就写在元素自己身上。











