react实现导航栏随着内容滚动进行切换

下面展示关键代码

const navigationBarData = [
      { key: "1", name: "首页" },
      { key: "2", name: "知识库" },
      { key: "3", name: "知识问答" },
      { key: "4", name: "专家库" },
      { key: "5", name: "排行榜" },
]; //定义导航栏
onScroll={() => { //滚动监听
          navigationBarData.map((item) => { //遍历每个导航栏对应的内容
            const mark = "#layout" + item.key;
            const scrollTop =
              document.getElementsByClassName("knowledgePortal")[0].scrollTop;
            const dom = $(mark);
            const offsetTop = dom.offset().top;
            const outerHeight = dom.outerHeight();
            if (
              offsetTop - scrollTop <= 0 &&
              offsetTop + outerHeight - scrollTop > 0
            ) { //判断当前导航栏是否处于页面视口中,是的话就将此导航加上选中样式,此判断也可以使用下方原生js方法实现
              this.setState({
                navigationValue: item.key,
              });
            }
          });
        }}

判断视口内也可以使用原生js方法来实现,如下

function isInViewport(element) { //判断方法
  const rect = element.getBoundingClientRect();
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
  );
}
const myElement = document.querySelector('#data-board-sales-hopper'); //获取需要判断的dom
if (isInViewport(myElement)) {
  alert('该元素在视口内')
} else {
 alert('该元素不在视口内')
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值