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!

敬请期待 🎬

相关推荐
大金乄2 小时前
封装一个vue2的elementUI 表格组件(包含表格编辑以及多级表头)
前端·javascript
Lee川3 小时前
解锁 JavaScript 的灵魂:深入浅出原型与原型链
javascript·面试
ZengLiangYi3 小时前
React 事件订阅的稳定引用问题:从 useEffect 到 useEffectEvent
react.js
swipe4 小时前
从原理到手写:彻底吃透 call / apply / bind 与 arguments 的底层逻辑
前端·javascript·面试
Lee川6 小时前
探索JavaScript的秘密令牌:独一无二的`Symbol`数据类型
javascript·面试
Lee川6 小时前
深入浅出JavaScript事件机制:从捕获冒泡到事件委托
前端·javascript
光影少年6 小时前
async/await和Promise的区别?
前端·javascript·掘金·金石计划
codingWhat6 小时前
如何实现一个「万能」的通用打印组件?
前端·javascript·vue.js
前端Hardy9 小时前
别再无脑用 `JSON.parse()` 了!这个安全漏洞你可能每天都在触发
前端·javascript·vue.js
前端Hardy9 小时前
别再让 `console.log` 上线了!它正在悄悄拖垮你的生产系统
前端·javascript·vue.js