IE和旧版Safari不支持无前缀cursor: grab,必须添加-ms-grab、-webkit-grab、-moz-grab等私有前缀,且顺序需为-ms-优先;:active状态下的grabbing同理需对应前缀,否则拖拽起始时指针无法切换。

直接原因:IE 和旧版 Safari 不认识 cursor: grab 这个值,必须加对应前缀才能生效。这不是 bug,是标准落地过程中的兼容性断层——grab 和 grabbing 直到 CSS Basic User Interface Module Level 4 才被正式纳入,而 IE 11、Safari ≤ 12.1 等浏览器只实现了早期草案里的私有版本。
IE 10–11 必须用 -ms-grab,不是可选而是刚需
IE 完全忽略无前缀的 grab 和 grabbing。即使你写了 cursor: grab,它也会跳过,继续尝试下一个声明(如果有的话)。所以必须显式写出 -ms-grab 和 -ms-grabbing:
button.draggable {
cursor: -ms-grab;
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
button.draggable:active {
cursor: -ms-grabbing;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
- 顺序不能乱:IE 从左到右匹配,
-ms-必须放在最前面,否则它看到后面的grab就停了,根本不读后续 - 别省略
:active状态下的前缀——-ms-grabbing同样不被原生支持,漏掉会导致拖拽开始时指针卡在grab上不动 - 注意:IE 不支持
cursor: url()配合grab混用,会直接失效;只用纯关键字前缀最稳
Safari ≤ 12.1 需要 -webkit-grab,且不能依赖 :active 自动切换
旧版 Safari 虽然认 -webkit-grab,但对 :active 的触发很保守——尤其是当元素没设 tabindex 或不是原生可聚焦元素时,:active 可能压根不触发,导致 grabbing 样式永远不会出现。
- 稳妥做法是用 JS 在
dragstart事件里手动加类:element.classList.add('is-dragging'),再配 CSS:.is-dragging { cursor: -webkit-grabbing !important; } - 别指望
cursor: -webkit-grab在<svg>内部元素上生效——Safari 对 SVG 子元素的 cursor 绑定极弱,得把样式提到外层<div>或改用内联style="cursor: -webkit-grab;" - macOS Safari 有时会把
-webkit-grabbing渲染成旋转动画,这是已知行为,不是错误,但若影响体验,可用cursor: move降级替代
为什么 cursor: pointer 不需要前缀,但 grab 就要?
因为 pointer 是 CSS2.1 就定义的老牌值,所有浏览器从第一天起就支持;而 grab 是后来为拖拽交互补上的语义化值,各厂商实现节奏不一:
立即学习“前端免费学习笔记(深入)”;
- Chrome 从 57 开始支持无前缀
grab,但 49–56 需要-webkit-grab - Firefox 从 48 开始支持,之前需
-moz-grab - Edge 12–18 只认
-webkit-grab(EdgeHTML 引擎),Chromium 版 Edge 则直接走标准 - 真正麻烦的是混合环境:比如一个页面同时跑在 IE 11 + Safari 11 + Chrome 60 上,不写全前缀等于放弃一半用户
最容易被忽略的一点:就算加了所有前缀,如果父元素或自身设置了 pointer-events: none,cursor 声明会直接被浏览器跳过——连前缀都来不及解析。检查这个比调前缀还优先。


















