reactjs 如何使用鼠标滚轮进行React水平滚动

z0qdvdin  于 2023-10-17  发布在  React
关注(0)|答案(4)|浏览(198)

我在react js上使用了tailwind-CSS,我想当用户悬停在卡片部分时使用鼠标滚轮水平滚动,这样对于pc用户来说就可以使用鼠标滚轮水平滚动,而不是同时使用shift和鼠标滚轮。任何地方生活

  1. <div className="flex space-x-3 overflow-y-scroll scrollbar-hide p-3 -ml-3">
  2. {cardsDate?.map(({ img, title }) => (
  3. <MediumCard key={img} img={img} title={title} />
  4. ))}
  5. </div>
  6. </section>

xqkwcwgp

xqkwcwgp1#

您可以使用自定义滚动函数作为div的引用。

  1. export function useHorizontalScroll() {
  2. const elRef = useRef();
  3. useEffect(() => {
  4. const el = elRef.current;
  5. if (el) {
  6. const onWheel = e => {
  7. if (e.deltaY == 0) return;
  8. e.preventDefault();
  9. el.scrollTo({
  10. left: el.scrollLeft + e.deltaY,
  11. behavior: "smooth"
  12. });
  13. };
  14. el.addEventListener("wheel", onWheel);
  15. return () => el.removeEventListener("wheel", onWheel);
  16. }
  17. }, []);
  18. return elRef;
  19. }

上述函数可以导入并使用如下:

  1. <div className="App" ref={scrollRef} style={{ overflow: "auto" }}>
  2. <div style={{ whiteSpace: "nowrap" }}>
  3. <Picture />
  4. </div>
  5. </div>

我创建了一个codesandbox作为示例。

展开查看全部
b91juud3

b91juud32#

尝试使用scroll通过运行良好

  1. const element = document.querySelector("#container");
  2. element.addEventListener('wheel', (event) => {
  3. event.preventDefault();
  4. element.scrollBy({
  5. left: event.deltaY < 0 ? -30 : 30,
  6. });
  7. });

容器及其子元素

v9tzhpje

v9tzhpje3#

你可以在不使用refs或hook的情况下通过以下代码内联地实现这一点:

  1. <div
  2. style={{ scrollbarColor="transparent", overflowX="auto" }}
  3. onWheel={(e) => {
  4. // here im handling the horizontal scroll inline, without the use of hooks
  5. const strength = Math.abs(e.deltaY);
  6. if (e.deltaY === 0) return;
  7. const el = e.currentTarget;
  8. if (
  9. !(el.scrollLeft === 0 && e.deltaY < 0) &&
  10. !(
  11. el.scrollWidth -
  12. el.clientWidth -
  13. Math.round(el.scrollLeft) ===
  14. 0 && e.deltaY > 0
  15. )
  16. ) {
  17. e.preventDefault();
  18. }
  19. el.scrollTo({
  20. left: el.scrollLeft + e.deltaY,
  21. // large scrolls with smooth animation behavior will lag, so switch to auto
  22. behavior: strength > 70 ? "auto" : "smooth",
  23. });
  24. }}
  25. >
  26. // ...
  27. </div>
展开查看全部
vdgimpew

vdgimpew4#

hd3adcode的版本是完美的。下面是typescript版本:

  1. export function useHorizontalScroll<T extends HTMLElement>() {
  2. const elRef = useRef<T>(null);
  3. useEffect(() => {
  4. const el = elRef.current;
  5. if (el) {
  6. const onWheel = (e: WheelEvent) => {
  7. if (e.deltaY == 0) return;
  8. e.preventDefault();
  9. el.scrollTo({
  10. left: el.scrollLeft + e.deltaY,
  11. behavior: 'smooth',
  12. });
  13. };
  14. el.addEventListener('wheel', onWheel);
  15. return () => el.removeEventListener('wheel', onWheel);
  16. }
  17. }, []);
  18. return elRef;
  19. }
展开查看全部

相关问题