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!

敬请期待 🎬

相关推荐
2501_906314322 分钟前
How to Scrape Popular Products on TikTok Shop
java·开发语言·数据库
KhalilRuan17 分钟前
C++手撕STL-其一
开发语言·c++
stoneSkySpace18 分钟前
算法—冒泡排序—js(教学示例、小数据)
java·javascript·算法
moyu8418 分钟前
高效开发必备:手把手整合IconFont、 Vant与Element Plus
前端·javascript
trust Tomorrow19 分钟前
JS案例-基于Proxy的响应式数据
前端·javascript·css·html
永远在Debug的小殿下19 分钟前
String +memset字符串类题型【C++】
开发语言·c++
BillKu21 分钟前
Vue3 + TypeScript,关于item[key]的报错处理方法
前端·javascript·vue.js·typescript
dwqqw21 分钟前
Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问
开发语言·php
Shingmc324 分钟前
【C++】多态
开发语言·c++
我真的不会C26 分钟前
QT常见输入类控件及其属性
开发语言·qt