react使用scrollIntoView实现锚点跳转效果,这种效果并不会改变url

相比传统的a标签方式,这个更好理解和使用,无非就是给你需要跳转的目标一个唯一标识,然后获取到这个节点,在调用这个节点的scrollIntoView属性

 <div  onClick={() => this.goAnchor('#anchor') >我是设置锚点的地方 </div>
 <div className="listTypeContent" id='anchor' >
 我是埋锚的地方</div>

方法:

goAnchor(index) {
    let param= {
      behavior: "smooth",
      block: "start",
    };
    if (index) {
      document.querySelector(index).scrollIntoView(param);
    }
  }

参数如下图:
在这里插入图片描述
具体参考文档地址:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView

特别注意:在我们使用这个方法在顶部导航栏使用时,当内部进行滚动时,外层也会滚动,会导致顶部区域消失,这个时候就需要用到一个方法,默认外层滚动是禁用的,在滚动完成后,需要手动将外层的overflow属性设置成可以滚动,让他外层触发一次滚动,这样顶部的导航栏区域又会重新出现,但是触发后必须再次禁用掉外层滚动,以便下次滚动使用,但是考虑到执行执行,直接在放开后马上禁用会直接被覆盖,所以我们放在每次滚动前执行一次禁用,这样也能达到每次滚动前外层容器是处于禁用状态
举个栗子:
如下所示
其中data-board-content-box内部容器,data-board-sales-hopper为内部容器中的某个dom,marginDom为外部容器

      let param = {
        behavior: "smooth",
         block: "start",
      };
      const dom = document.querySelector('#data-board-sales-hopper');
      const marginDom = document.querySelector('.data-board-content-box').parentNode;
      dom1.style.overflow = 'unset'; //滚动前禁用
      dom.scrollIntoView(param);
      dom1.style.overflow = 'auto'; //滚动后放开禁用

另外当我们想知道scrollIntoView方法是否执行完成,在执行完成后做一些处理可以通过以下代码实现

// 创建一个IntersectionObserver实例
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 当元素进入视口时
      console.log('scrollIntoView 执行完成');
      // 停止观察
      observer.unobserve(entry.target);
    }
  });
});
 
// 执行scrollIntoView
const element = document.getElementById('your-element-id');
element.scrollIntoView();
 
// 开始观察指定元素
observer.observe(element);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,react-marknavbar和Anchor都是React组件,可以一起使用实现页面内的导航栏和锚点跳转。 首先,您需要安装这两个组件,可以使用npm或yarn进行安装。例如,使用npm安装: ``` npm install react-marknavbar anchor-js ``` 安装完成后,您可以在React项目中引入这两个组件: ```javascript import React from 'react'; import { MarkNav, Anchor } from 'react-marknavbar'; import 'anchor-js'; const App = () => { return ( <div> <MarkNav> <Anchor href="#section1">Section 1</Anchor> <Anchor href="#section2">Section 2</Anchor> <Anchor href="#section3">Section 3</Anchor> </MarkNav> <div id="section1"> <h2>Section 1</h2> <p>Content for section 1 goes here.</p> </div> <div id="section2"> <h2>Section 2</h2> <p>Content for section 2 goes here.</p> </div> <div id="section3"> <h2>Section 3</h2> <<p>Content for section 3 goes here.</p> </div> </div> ); }; export default App; ``` 在上面的代码中,我们首先引入了MarkNav和Anchor组件,然后使用MarkNav组件包裹了几个Anchor组件,这些Anchor组件分别对应页面中的几个锚点。在每个锚点的href属性中,我们使用了类似于#section1的语法来指定跳转的目标位置。最后,我们在页面中添加了几个div元素,这些元素分别对应了不同的锚点位置。 当用户在页面上点击导航栏中的链接时,页面会自动滚动到对应的锚点位置。这一过程是通过Anchor组件中的anchor-js库来实现的。如果您需要更多关于这些组件的信息,可以参考官方文档或者相关的开发社区。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值