You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8 同页面锚点滚动时路由变更问题如何解决?

解决方案

实现原理

你原来的代码会修改地址栏,是因为a标签的href属性指定锚点时,默认行为就是将锚点追加到当前URL末尾,同时触发页面滚动。只要阻止该默认行为,手动调用滚动API即可保留原始URL。

方案1:原生JS实现(推荐)

第一步:修改HTML(Blade)代码

给导航链接新增自定义属性存储目标元素ID,移除href中的锚点值:

<li class="nav-item">
   <a class="nav-link scroll-link" data-target="ask_for_help" href="#">Ask for Help</a>
</li>
<div id="ask_for_help">
   我想要跳转到达的段落内容。
</div>

第二步:添加JS逻辑

如果是Laravel项目,可以将以下代码放在公共JS文件中,或者通过Blade的@push指令注入到当前页面:

document.querySelectorAll('.scroll-link').forEach(link => {
  link.addEventListener('click', function(e) {
    // 阻止a标签默认跳转行为,避免修改地址栏
    e.preventDefault();
    const targetId = this.dataset.target;
    const targetEl = document.getElementById(targetId);
    if (targetEl) {
      // 平滑滚动到目标元素,不需要平滑效果可以删除behavior参数
      targetEl.scrollIntoView({
        behavior: 'smooth',
        block: 'start'
      });
    }
  });
});

Blade模板注入示例:

{{-- 当前页面模板 --}}
@push('scripts')
<script>
// 上面的JS代码放这里
</script>
@endpush

确保你的布局模板中存在对应的栈输出:

{{-- 布局模板中body标签结束前 --}}
@stack('scripts')

方案2:极简内联实现(不需要额外JS文件)

如果只有少量滚动需求,可以直接写在内联事件中:

<li class="nav-item">
   <a class="nav-link" href="javascript:void(0)" onclick="document.getElementById('ask_for_help').scrollIntoView({behavior:'smooth'})">Ask for Help</a>
</li>

内容的提问来源于stack exchange,提问作者ZarNiHein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 10:15:04