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

React个人作品集网站导航栏点击滚动至指定区块实现方法咨询

实现React页面内导航滚动的可行方案

你的问题出在react-router-dom的Link组件默认是用于路由跳转,而非页面内锚点滚动,直接用它带#的方式不会触发预期的页面内滚动。下面是两种实用的解决方法:

方法一:原生JavaScript实现自定义滚动(推荐,无额外依赖)

直接通过点击事件调用原生的scrollIntoView方法,实现平滑滚动到指定区块,同时处理汉堡菜单的关闭逻辑:

import React, { useState, useEffect } from 'react'
import "./Navbar.css"
import { FaBars, FaTimes } from 'react-icons/fa'

const Navbar = () => {
  const [click, setClick] = useState(false)
  const handleClick = () => setClick(!click)
  const [color, setColor] = useState(false)

  // 优化滚动监听逻辑,避免重复绑定事件
  const changeColor = () => {
    setColor(window.scrollY >= 100);
  };

  useEffect(() => {
    window.addEventListener('scroll', changeColor);
    return () => window.removeEventListener('scroll', changeColor);
  }, []);

  // 滚动到指定区块的核心函数
  const scrollToSection = (sectionId) => {
    const targetElement = document.getElementById(sectionId);
    if (targetElement) {
      // 平滑滚动,可配置滚动对齐方式
      targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
    }
    // 点击导航后自动关闭汉堡菜单
    setClick(false);
  };

  return (
    <div className={color ? "header header-bg":"header"}>
      {/* 点击logo回到顶部 */}
      <div onClick={() => scrollToSection('header')} style={{ cursor: 'pointer' }}>
        <h1 className="header6">Portfolio</h1>
      </div>
      <ul className={click?"nav-menu.active":"nav-menu"}>
        <li onClick={() => scrollToSection('header')}>Home</li>
        <li onClick={() => scrollToSection('projects')}>Projects</li>
        <li onClick={() => scrollToSection('qualification')}>Qualification</li>
        <li onClick={() => scrollToSection('experience')}>Experience</li>
        <li onClick={() => scrollToSection('about')}>About</li>
        <li onClick={() => scrollToSection('contact')}>Contact</li>
      </ul>
      <div className='hamburger' onClick={handleClick}>
        {click
          ? (<FaTimes size={20} style={{ color: "whitesmoke" }} />)
          : (<FaBars size={20} style={{ color: "whitesmoke" }} />)
        }
      </div>
    </div>
  )
}

export default Navbar

注意事项:

  • 确保页面中对应区块已设置正确的id,例如:<section id="projects">...</section>
  • 如果需要保留<a>标签的默认样式,可以替换为:
    <a href="#projects" onClick={(e) => {
      e.preventDefault();
      scrollToSection('projects');
    }}>Projects</a>
    

方法二:使用HashRouter配合锚点(适合需要保留URL锚点的场景)

如果需要在URL中保留锚点信息(比如刷新页面后停留在对应区块),可以改用HashRouter并配合CSS平滑滚动:

  1. 修改路由配置(在项目入口文件如index.js):
import { HashRouter } from 'react-router-dom';

ReactDOM.render(
  <HashRouter>
    <App />
  </HashRouter>,
  document.getElementById('root')
);
  1. 保留Link组件并修正to属性:
<Link to="#header">Home</Link>
<Link to="#projects">Projects</Link>
<!-- 其他导航项同理 -->
  1. 在全局CSS中添加平滑滚动样式:
html {
  scroll-behavior: smooth;
}

这种方法会让URL变为http://your-site/#projects的形式,用户刷新页面时会自动滚动到对应区块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:20:28