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!

敬请期待 🎬

相关推荐
LawrenceLan6 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客6 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz6 小时前
C语言第1章
c语言·开发语言
行者967 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon7 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio7 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词8 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派8 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx9 小时前
kotlin中 ?:的用法
android·开发语言·kotlin