Three.js + React 实战系列-3D 个人主页 :完成 Navbar 导航栏组件

在上一节中,我们搭建了项目的基础结构,搭建好了项目框架。

本节我们将继续完善页面结构,完成第一个视觉组件 ------ Navbar 导航栏 ✅

前置准备:


🎥 02 · 完成 Navbar 导航栏组件

📁 组件结构规划

我们将导航栏作为一个单独组件,放置在 src/sections/Navbar.jsx

bash 复制代码
src/
├── sections/
│   └── Navbar.jsx
├── App.jsx
└── main.jsx

我们的导航栏会固定在顶部,具备以下功能:

  • 左侧 Logo

  • 右侧菜单项(Home、Work、About、Contact )

  • 响应式布局,适配不同屏幕响应式布局,适配不同屏幕

💻 实现代码(使用 Tailwind CSS)

  • 📄 src/components/Navbar.jsx
js 复制代码
import React, { useState } from 'react'
import { navLinks } from '../constants/index.js'

const Navbar = () => {

  const [isOpen, setIsOpen] = useState(false)

  const toggleMenu = () => setIsOpen( (prevIsOpen) => !prevIsOpen );

  const NavItems = () => {
    return (
      <div>
        <ul className='nav-ul'>
            { navLinks.map(({ id, href, name }) => (
                <li key={id} className='nav-li'>
                    <a href={href} className="nav-li_a" onClick={() => {}}> 
                        {name}
                    </a>
                </li>
            ))}
        </ul>
      </div>
    )
  }

  return (
    <header className='fixed top-0 left-0 right-0 z-50 bg-black/90'>
        <div className="max-w-7xl mx-auto">
            <div className="flex justify-between items-center py-5 mx-auto c-space">
                <a href="/" className="text-neutral-400 font-bold text-xl hover:text-white transition-colors">
                    Sunbyte
                </a>

                <button onClick={toggleMenu}  className="text-neutral-400 hover:text-white focus:outline-none sm:hidden flex" aria-label="Toggle menu">
                    <img src={isOpen ? "assets/close.svg" : "assets/menu.svg"} alt="toggle" className="w-6 h-6" />
                </button>

                <nav className='sm:flex hidden'>
                    <NavItems />
                </nav>
            </ div>
        </div>
        <div className={`nav-sidebar ${isOpen ? 'max-h-screen':'max-h-0'}`}>
            <nav className='p-5'>
                <NavItems />
            </nav>
        </div>
    </header>
  ) 
}

export default Navbar 
  • 📄 src/App.jsx
js 复制代码
import React from 'react'
import Navbar from './sections/Navbar'

const App = () => {
  return (
    <main className='max-w-7xl mx-auto'>
        <Navbar />
    </main>
  )
}

export default App

🎨 效果预览

## ⏭ 下一节预告

  • 下一节我们将进入 本次课程最复杂的页面------Hero.jsx!

敬请期待 🎬

相关推荐
曹牧3 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
浅念-6 分钟前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
WeiXiao_Hyy6 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
User_芊芊君子12 分钟前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
Max_uuc23 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
故事不长丨23 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
牵牛老人26 分钟前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
froginwe1134 分钟前
Python3与MySQL的连接:使用mysql-connector
开发语言
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
灵感菇_1 小时前
Java HashMap全面解析
java·开发语言