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!

敬请期待 🎬

相关推荐
大牧师14 分钟前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest
格林威17 分钟前
C# 图像异步落盘存储:基于Channel 配合 ArrayPool 实现异步落盘
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测
软件黑马王子18 分钟前
11.缓存池优化:窗口布局
开发语言·前端框架·c#
深圳市益普科技有限公司23 分钟前
半导体MES的数字孪生:虚拟调试如何把上线风险提前清零
java·开发语言
低代码布道师29 分钟前
外包项目管理平台全栈实战课02搭建数据底座:Next.js + PostgreSQL + Prisma 7
开发语言·javascript·postgresql·全栈开发
格林威32 分钟前
C# 图像使用AVX2指令集:使用OpenCvSharp实现字节图像解压缩速度和map_image算子速度提升
开发语言·图像处理·人工智能·计算机视觉·c#·视觉检测·工业相机
(Charon)37 分钟前
【C++】网络缓冲区设计(四):epoll + Reactor中Buffer的完整读写流程
开发语言·c++
志尊宝44 分钟前
Vue3 零基础每日笔记(004):模板语法初识——插值表达式、v-bind、v-on 一次学会
javascript·vue.js·笔记