You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

黑色背景下Flashlight cursor滚动不跟随下移问题求助

解决手电筒光标随页面滚动失效的问题

问题根源

你当前的代码用absolute定位手电筒元素,它的坐标基于整个文档,但clientX/clientY是鼠标在视口中的位置。当页面滚动时,文档内容相对于视口偏移,导致手电筒位置和鼠标实际指向的内容脱节。另外现有代码也没实现真正的“照亮”效果,只是一个黄色圆形在文本下方。

修复方案

以下是调整后的代码,解决滚动跟随问题并优化照亮效果:

修正后的CSS

body {
  background-color: black;
  margin: 0;
  padding: 2rem;
}

.content {
  color: #fff; /* 文本设为白色,在黑色背景上可见 */
  max-width: 800px;
  margin: 0 auto;
  line-height: 1.6;
}

#light {
  width: 300px;
  height: 300px;
  border-radius: 50%;
  position: fixed; /* 改为fixed,基于视口定位,滚动时自动跟随 */
  transform: translate(var(--light-position-x, 0px), var(--light-position-y, 0px));
  background-color: rgb(231, 221, 122);
  mix-blend-mode: screen; /* 混合模式,实现照亮效果 */
  pointer-events: none; /* 避免遮挡鼠标事件 */
  z-index: 10; /* 放在文本上方 */
}

修正后的JavaScript

const light = document.getElementById('light');

document.documentElement.addEventListener('mousemove', function(event) {
  // 减去150px让鼠标位于手电筒中心(300px宽高的一半)
  const x = event.clientX - 150;
  const y = event.clientY - 150;
  
  light.style.setProperty('--light-position-x', `${x}px`);
  light.style.setProperty('--light-position-y', `${y}px`);
});

关键改动说明

  • position: fixed:让手电筒始终相对于浏览器视口定位,页面滚动时无需额外计算偏移量,自动跟随鼠标在视口中的位置。
  • mix-blend-mode: screen:让黄色手电筒区域与下方白色文本混合后变亮,黑色背景区域则保持深色,完美模拟手电筒照亮效果。
  • pointer-events: none:防止手电筒元素遮挡鼠标事件,确保页面交互正常。
  • 调整位置计算:减去手电筒宽高的一半,让鼠标精准落在圆形中心。

这个方案完全可行,长篇小说滚动时,手电筒会始终跟随鼠标,照亮当前视口内的阅读区域。

内容的提问来源于stack exchange,提问作者Omar Eduardo Barenas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:04:49