【问题标题】:Remove hover effects when scrolling滚动时移除悬停效果
【发布时间】:2020-11-17 16:49:14
【问题描述】:

我一直在处理一个应用程序。页面上有多个组件。它们里面的内容是可滚动的。预期的功能是当我在组件内滚动时,应该禁用不同元素的悬停效果。在互联网上搜索后,我有一个可行的解决方案。我已经创建了一个像这样的 HoverDisabler 组件,

import React, {useEffect} from 'react';

export const HoverDisabler = ({children}) => {
  let timer = 0;
  useEffect(() => { 
     document.addEventListener('scroll', () => {
        clearTimeout(timer);
        if(!document.body.classList.contains('hoverDisabled')){
            document.body.classList.add('hoverDisabled');
        }
        timer = setTimeout(() => {
            document.body.classList.remove('hoverDisabled');
        },500);
     }, true); 
  }, []);
  return children;
}

hoverDisabled的css如下,

.hoverDisabled {
    pointer-events: 'none',
}

我正在像这样用HoverDisabler 包装我的根App 组件,

<HoverDisabler><App /></HoverDisabler>

现在在所有组件中,如果我开始滚动,hoverDisabled 类将添加到正文中,当我停止滚动时它会被删除。一切正常。我很好奇这是否是拥有此功能的正确方法?这种方法是否有任何缺点或由于我缺乏经验而忽略了一些问题?

【问题讨论】:

  • scroll 事件是一个昂贵的事件。恕我直言,以如此高的频率运行任何东西都不是一个好主意。
  • 如果你没有找到任何其他方法,你应该在你的滚动上使用去抖动,这样滚动事件被触发的次数更少。
  • @MudasirZahoor,任何关于如何做到这一点的指针都会非常有帮助。
  • @SamR。您能否建议一些其他方式来获得此特定功能?

标签: javascript css reactjs scroll dom-events


【解决方案1】:

由于滚动事件是一个昂贵的事件,您可以像这样在滚动事件上添加去抖动:

function debounce(method, delay) {
    clearTimeout(method._tId);
    method._tId= setTimeout(function(){
        method();
    }, delay);
}
function scrollFunction(){
   clearTimeout(timer);
    if(!document.body.classList.contains('hoverDisabled')){
        document.body.classList.add('hoverDisabled');
    }
    timer = setTimeout(() => {
        document.body.classList.remove('hoverDisabled');
    },500);
}
document.addEventListener('scroll', function() {
    debounce(scrollFunction, 100);
});

这肯定会优化您的代码,因为它只会触发滚动功能较少的次数。尽管您尝试解决的问题可能有其他方法,但我只是建议一种优化您当前代码的方法。

【讨论】:

  • 如果我使用 debounce 并开始滚动 body 中的类名不会立即改变。因此,当我滚动时,悬停效果不会被禁用。
猜你喜欢
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2015-02-27
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多