css 光标跟随效果不会跟随用户向下滚动屏幕

b1uwtaje  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(142)

我有一个光标跟随效果在我的新的着陆页:
https://tiny-cendol-e90774.netlify.app/
由于某种原因,当你向下滚动页面时,光标没有跟随你向下滚动?
下面是代码:

const Layout = ({children}) => {

  const [x, setX] = useState(0);
  const [y, setY] = useState(0);

  useLayoutEffect(() => {
    document.onmousemove = (event) => {
      var e = event;
      setX(e.clientX);
      setY(e.clientY);
    };
  });

  return (
    <div className={styles.layout}>
      <div style={{top: y - 14, left: x - 14}} className={styles.cursor} />;
      <Header />
      {children}
      <Footer />
    </div>
  )
}

这里是风格:

.cursor {
  width: 30px;
  height: 30px;
  display: none;
  border-radius: 50%;
  position: absolute;
  border: 2px solid $white;
  transition-duration: 0.4s;
  transition-timing-function: cubic-bezier(0.18, 0.89, 0.32, 1.28);

  &:after {
    top: 50%;
    left: 50%;
    content: '';
    width: 5px;
    height: 5px;
    position: absolute;
    background-color: $white;
    border-radius: 50%;
    transform: translate(-50%, -50%);
  }

  @media all and (min-width: $tablet) {
    display: block;
  }
}

我假设e.clientX和e.clientY没有浏览器维度的上下文,所以它们不支持滚动。

dgsult0t

dgsult0t1#

可以使用event.pageXevent.pageY属性获取鼠标从页面开始的位置。

const Layout = ({children}) => {

  const [x, setX] = useState(0);
  const [y, setY] = useState(0);

  useLayoutEffect(() => {
    document.onmousemove = (event) => {
      var e = event;
      setX(e.pageX);
      setY(e.pageY);
    };
  });

  return (
    <div className={styles.layout}>
      <div style={{top: y - 14, left: x - 14}} className={styles.cursor} />;
      <Header />
      {children}
      <Footer />
    </div>
  )
}

这将解决您的问题,但它不会更新光标滚动。
我不确定你是否想使用useState来移动屏幕上的光标。你也可以使用ref来达到这个目的。另外,当组件卸载时(即使你从来没有卸载过布局组件),不要忘记清除事件侦听器。

const Layout = ({ children }) => {
  const cursorRef = useRef();

  useLayoutEffect(() => {
    const handleMouseMove = (event) => {
      if (cursorRef.current) {
        cursorRef.current.style.top = `${event.pageY}px`;
        cursorRef.current.style.left = `${event.pageX}px`;
      }
    };

    window.addEventListener("mousemove", handleMouseMove);

    return () => {
      window.removeEventListener("mousemove", handleMouseMove);
    };
  });

  return (
    <div className={styles.layout}>
      <div className="cursor" ref={cursorRef} />
      <Header />
      {children}
      <Footer />
    </div>
  )
tnkciper

tnkciper2#

行为主题是RxJS中的一种主题,RxJS是JavaScript中用于React式编程的库。行为主题允许您跟踪主题的当前值以及该值随时间的任何更改。要在服务函数中使用行为主题,请执行以下步骤:
从RxJS库中导入要使用的行为主体和可观察操作符,例如:

import { BehaviorSubject } from 'rxjs';
import { map, filter } from 'rxjs/operators';

在服务函数中新建一个行为主体,并初始化一个初始值,例如:

const subject = new BehaviorSubject(initialValue);

使用行为主题跟踪当前值以及对该值的任何更改。例如,可以使用.next()方法更新主题的值,使用.getValue()方法获取当前值。复制代码subject.next(newValue); const currentValue = subject.getValue();将行为主题用作可观察对象以创建数据流,并使用可观察运算符将转换应用于这些流。例如:

const stream = subject.pipe(
  filter(value => value > 10),
  map(value => value * 2)
);

通过在服务函数中使用行为主题,您可以跟踪当前值以及对该值的任何更改,并使用这些值创建可在应用程序中转换和使用的数据流。

enter code here

相关问题