React页面中间内容滚动时,激活选中侧边栏对应的内容(反向锚点)

class Innovation extends Component {
  constructor() {
    super()
    this.state = {
      companyAsideList: [
        {
          title: 'Research & Developme',
          flag: 'Research',
        },
        {
          title: '5 R&D Division',
          flag: '5R&Division',
        },
        {
          title: 'Patents & Awards',
          flag: 'Patents',
        },
      ]
    }
    this.onScroll = this.handleScroll.bind(this)
  }
  // 获取元素距离顶部的距离和offsetParent
  getDomeHeight(el) {
    if (el.nodeName === 'BODY') {
      return 0
    } else {
      return parseInt(el.offsetTop) + this.getDomeHeight(el.offsetParent)
    }
  }
  // 选中侧边栏事件
  setDefult(index, flag) {
    this.setState({ activeTitle: index, activeAside: flag })
  }
  // 滚动事件
  handleScroll() {
    // 获取当前window Scroll距离顶部的高度
    let windowScrollTop = document.documentElement.scrollTop || document.body.scrollTop
    for (let i = 0; i < this.state.companyAsideList.length; i++) {
      // id标识
      const { flag } = this.state.companyAsideList[i]
      // 获取每一个Dom对象
      let curEle = document.getElementById(flag)
      if (curEle) {
        let curEleOffsetTop = this.getDomeHeight(curEle)
        // 判断滚动条滚动到对应位置
        if (curEleOffsetTop <= windowScrollTop && 
          windowScrollTop <= curEle.offsetHeight + curEleOffsetTop) {
          this.setDefult(i, flag)
          // 固定吸顶侧边栏选中方法
          // this.state.isShowAside && this.fixedAsideRef.current.updateActive(i, flag)
        }
      }
    }
  }
  render() {
    return (
        <div className='container'>
            <div className="container-left">
               <div id='Research'>...</div>
               <div id='5R&Division'>...</div>
               <div id='Patents'>...</div>
            </div>
            <div className="container-right">
               // 侧边栏
            </div>
        </div>
    )
  }
}
export default Innovation

你可以使用React和CSS来实现一个侧边栏滚动导航。首先,你需要创建一个包含导航链接的侧边栏组件。然后,使用CSS来设置侧边栏的样式和位置。最后,在React中实现滚动事件,以便在用户滚动页面,高亮显示当前所在的导航链接。 下面是一个简单的示例代码,可以让你更好地理解如何实现侧边栏滚动导航。 ``` import React, { useState, useEffect } from 'react'; import './styles.css'; function Sidebar() { const [activeLink, setActiveLink] = useState(''); useEffect(() => { const handleScroll = () => { const currentScrollPos = window.pageYOffset; const links = document.querySelectorAll('.sidebar a'); const headerHeight = document.querySelector('.header').offsetHeight; links.forEach(link => { const section = document.querySelector(link.hash); if ( section.offsetTop <= currentScrollPos + headerHeight && section.offsetTop + section.offsetHeight > currentScrollPos + headerHeight ) { setActiveLink(link.hash); } }); }; window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, []); return ( <div className="sidebar"> <a href="#section-1" className={activeLink === '#section-1' ? 'active' : ''}> Section 1 </a> <a href="#section-2" className={activeLink === '#section-2' ? 'active' : ''}> Section 2 </a> <a href="#section-3" className={activeLink === '#section-3' ? 'active' : ''}> Section 3 </a> </div> ); } function App() { return ( <div> <div className="header">Header</div> <div className="content"> <div className="section" id="section-1"> Section 1 </div> <div className="section" id="section-2"> Section 2 </div> <div className="section" id="section-3"> Section 3 </div> </div> <Sidebar /> </div> ); } export default App; ``` 在上面的代码中,我们首先定义了一个`Sidebar`组件,它包含三个导航链接,分别对应三个页面部分。然后,我们使用了`useState`钩子来追踪当前活动的导航链接。在组件渲染,我们使用`useEffect`钩子来监听`scroll`事件,并根据当前滚动位置来更新活动导航链接的状态。 最后,我们在`App`组件中渲染了一个包含三个页面部分和`Sidebar`组件的父容器。我们还添加了一个顶部的`Header`组件,用于演示如何将侧边栏与其他组件一起使用。 请注意,上面的示例代码仅提供了一个基本的实现,你可能需要根据你的具体需求进行调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值