当前位置: 首页 > 知识库问答 >
问题:

在滚动到节时更改URL

陈瀚玥
2023-03-14

我使用这段代码在滚动到部分时突出显示导航栏。当我滚动到某个分区时,是否可以立即更改地址栏中的URL?有人能帮我吗?

提前感谢

const [current, setCurrent] = useState('')

const sections = document.querySelectorAll('h3')
const navLi = document.querySelectorAll('nav ul li')

  window.addEventListener('scroll', () => {
    sections.forEach(section => {
      const sectionTop = section.offsetTop 
      if (window.pageYOffset >= sectionTop && (window.pageYOffset + 100) - sectionTop < 200 && current !== section.getAttribute('id')) {
 setCurrent(section.getAttribute('id'))
        
      }
    })
  })

  useEffect(() => {
    navLi.forEach(li => {
      li.classList.remove('test')
      if(li.classList.contains(current)) {
        li.classList.add('test')
      }
    })
  }, [current])

共有1个答案

寇照
2023-03-14

使用交叉点观察者:)使用小borwser窗口在本地尝试此操作。由于CORS/iframe源代码问题,它无法处理StackOverflow代码段,这些代码段在iframe中运行。

<p class="x">Bloop1</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p class="x">Bloop2</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p class="x">Bloop3</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<p>Bleep</p><p>Bleep</p><p>Bleep</p><p>Bleep</p>
<script>
  // which elements to keep track of when they scroll into view
  const elements = document.querySelectorAll(".x");

  // this is observing when the element will come into view
  const observer = new IntersectionObserver((x) => {
    // this is just to get an example
    const text = x[0].target.textContent;
    console.log(text);

    // this actually changes the URL
    window.history.pushState(text, "Title", "/" + text);
  });

  // register the observer for each element we are interested in
  elements.forEach((x) => {
    observer.observe(x);
  });
</script>
 类似资料:
  • 问题内容: 我想在用户滚动角度方式时更改CSS元素。 这是使用JQuery方式的代码 我尝试使用以下代码执行Angular方式,但是$ scope.scroll似乎无法正确获取滚动数据。 Muchos gracias好友! 问题答案: 请记住,在Angular中,DOM访问应从指令内部进行。这是一个简单的指令,可根据窗口的设置变量。 对我来说,您到底要寻找什么样的最终结果尚不清楚,所以这是一个简单

  • 该活动有一个带有3个不同片段的视图页。在片段3中,我使用列表视图来显示自定义适配器。列表中的项目数量是动态的,因此可以出现滚动条。 如果存在滚动条,并且用户将一些视图从显示中滚动出来并再次返回,则值有时会发生变化。我知道这是由于适配器中GetView()的重新创建。但我找不到它变化的原因。 过程应该是这样的: < li >无选择:seekbar为灰色,右侧的textview显示未初始化 < li

  • 我想将我的导航从透明背景更改为白色背景。导航应该缩小,徽标应该消失。 它应该与此页面上的完全相同:https://www.praxis-loeber.de 我已经为它编写了jQuery代码,但不幸的是,它仍然不起作用。 如果有人能告诉我错误在我的代码中,我会非常高兴。 这是我的代码:

  • 问题内容: 该站点使用一个向下滚动的大页面。当您向下滚动并传递不同的部分时,当相应的div出现时,左侧的菜单导航会将css类更改为“当前”。 我猜想这可以通过jQuery使用$(window).height();来完成。 我对jQuery很陌生,我想写的是这样的东西(用外行术语): 获取浏览器窗口的高度–如果div#content1从顶部到顶部100px,和/或从底部到底部200px,将更改菜单a

  • 我已经设置了一个回收器视图,每行都有文本视图和隐藏按钮。 如果用户单击该项,就会显示按钮。 如果用户单击其他项,则按钮将被隐藏。 再循环视图将位置发送到每个接口的活动,该活动更改其属性。 只要不滚动recyclerview,一切都能完美运行。 Layoutmanager.getchildat(职位) 现在,当项目超出视图时,用户滚动recyclerview,位置就会出错。每向下滚动一个用户单击的项

  • 我在使用react路由器导航时遇到滚动问题。 当我导航到另一个组件时,它会保持上次导航时的滚动位置。然而,我希望它恢复和开始从顶部每当导航被改变。 然而,它不起作用。我有一种感觉,问题在于我的导航风格,而不是window.scrollTo()片段。