纯CSS无法实现光标跟随,需JS驱动。cursor:url()有定位错位、无交互局限。推荐::before伪元素结合CSS变量,通过mousemove/touchmove获取坐标赋值,用transform:translate(calc(var(--x)-12px),calc(var(--y)-12px))定位,注意移动端支持。
如果非要说“用CSS实现跟随鼠标光标”,那必须先把话说明白。纯CSS压根没有读取clientX或clientY的能力,更别提运行时实时计算坐标。所谓“CSS实现”,本质上都是JS驱动逻辑、CSS负责渲染,前者是大脑,后者是手脚。所以别指望只靠CSS就能让一个元素跟着鼠标满屏跑,这不在它的能力范围。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
cursor: url()只是一个伪解法很多人第一反应是:直接用cursor: url()不就好了?但这条路径走不通,因为cursor: url()只接受一个静态图片路径,浏览器不会在每次鼠标移动时重新加载或重定位图片。滚动、缩放、transform变换、容器嵌套……这些场景下,系统级光标根本不会配合。一旦页面有了横向滚动条,或者用户按了Ctrl+把页面放大到1.2倍,光标位置就会明显错位。而且系统级光标完全没办法做hover状态切换、尺寸缩放、动画过渡——这些交互层面的需求,cursor: url()一个都满足不了。
::before伪元素配合CSS变量比新增DOM节点更省开销,也能避免pointer-events: none漏设导致点击失效这种低级错误。具体做法分几步:
mousemove和touchmove,从事件对象中取e.clientX和e.clientY,注意这里用的是clientX而不是pageX,前者更稳定。document.documentElement.style.setProperty('--x', Math.round(e.clientX) + 'px')。content: ""、position: fixed、pointer-events: none,这三点缺一不可。transform: translate(calc(var(--x) - 12px), calc(var(--y) - 12px)),这里假设光标宽高各24px,所以偏移了12px。如果光标尺寸不同,偏移量要相应调整。* 1px不能省。因为var(--x)是带单位字符串,calc()需要显式转换单位,否则计算结果会变成NaN。在桌面端跑通,不等于全平台可用。这里有几个坑必须提前踩平:
mousemove事件,必须同时监听touchmove,并且从e.touches[0]取坐标。给事件监听加上{ passive: false },才能调用preventDefault()阻止默认行为。clientX和CSS像素会自动对齐,不需要手动去除window.devicePixelRatio。但要注意,如果外层容器用了transform: scale(0.8)这种写法,就需要反向修正坐标。最稳妥的做法是直接避免这种布局。touchmove事件。监听document比监听body更可靠,实在不行还可以用scroll事件配合requestAnimationFrame补帧。还有一个最容易被忽略的细节:伪元素的尺寸浮动问题。如果光标是个文字提示框,内容长度变化会破坏translate(-12px, -12px)的居中基准。生产环境建议固定宽高,用text-overflow: ellipsis控制内容溢出,或者干脆把光标设计成固定尺寸的图标。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述