现代浏览器基本支持cursor: grab/grabbing,但Safari 15.4及更早版本完全不支持,Firefox 68前需-moz-grab,Chrome/Edge 49–56需-webkit-grab。
现代浏览器其实都支持 cursor: grab 和 cursor: grabbing,但 Safari 15.4 之前(含 iOS 15.4)完全不认这两个值,只当无效声明;Firefox 从 68 开始原生支持,但早期版本需 -moz-grab;Chrome/Edge 从 57 起支持标准值,但 49–56 需 -webkit-grab。现在(2026 年)真正需要前缀的只剩老版 Firefox(
加前缀不是“为了兼容”,而是防止旧环境静默失效——因为 cursor 声明一旦某个值无效,整条规则会被忽略(不像 flex 那样降级)。所以必须保证 fallback 有效,且顺序正确:
cursor: -webkit-grab; 和 cursor: -moz-grab; 必须写在标准值 cursor: grab; 之前,否则被覆盖grab,需手动配置插件或加注释正确写法示例:
button.draggable { cursor: -webkit-grab; cursor: -moz-grab; cursor: grab;}
要。Safari 15.4 之前同样不支持 grabbing,且 -webkit-grabbing 和 -moz-grabbing 是真实存在的私有值(虽文档稀少,但实测有效)。注意两点:
立即学习“前端免费学习笔记(深入)”;
grabbing 在拖动开始后由浏览器自动触发,但 :active 是用户按住鼠标时的瞬间状态,二者时间窗口不同,建议同时覆盖grabbing 当作 JS 动态切换的唯一依据——有些安卓 WebView 拖动中会强制回退到 default,得靠 user-select: none + class 切换兜底推荐写法:
.draggable:active { cursor: -webkit-grabbing; cursor: -moz-grabbing; cursor: grabbing;}
常见原因不是语法错,而是触发条件没满足:
draggable="true" 属性,部分旧 WebView 下 grab 样式仅对原生可拖元素生效cursor: default !important),建议用 !important 显式提升(尤其在第三方 UI 库里)cursor(包括 grab),只响应 pointer 和 text;iOS 上真想提示可拖,得靠视觉反馈(如拖拽图标、微动效)代替最隐蔽的坑:Chrome 115+ 在某些 iframe 场景下,grab 会在 dragstart 后瞬间闪回 default,必须配合 event.dataTransfer.effectAllowed = "move" 才能稳住样式。