当前位置: 首页 > news >正文

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

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

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

前置准备:

  • ✅下载静态资源在根目录下 (src 同级)
  • 谷歌云盘地址

🎥 02 · 完成 Navbar 导航栏组件

📁 组件结构规划

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

src/
├── sections/
│   └── Navbar.jsx
├── App.jsx
└── main.jsx

🧱 Navbar 组件内容

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

  • 左侧 Logo

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

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

💻 实现代码(使用 Tailwind CSS)

  • 📄 src/components/Navbar.jsx
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
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!

敬请期待 🎬

相关文章:

  • Mac-VScode-C++环境配置
  • Git拉分支技巧:从零开始创建并推送分支
  • 深入理解 CICD 与 Jenkins 流水线:从原理到实践
  • 基于Docker+k8s集群的web应用部署与监控
  • 【esp32 点亮led】-解决不能闪烁问题
  • 深入理解Linux中的线程控制:多线程编程的实战技巧
  • 常用算法解析:从基础排序到图论应用
  • 51单片机的原理图和PCB绘制
  • 常用的几种 Vue 父子组件传值方式
  • 使用 GitHub Actions 和 Nuitka 实现 Python 应用(customtkinter ui库)的自动化跨平台打包
  • 状态管理最佳实践:Bloc架构实践
  • Android Jetpack Compose 状态管理解析:remember vs mutableStateOf,有啥不一样?为啥要一起用?
  • HTML表单与数据验证设计
  • 区块链预言机(Oracle)详解:如何打通链上与现实世界的关键桥梁?
  • 如何将自己封装的组件发布到npm上:详细教程
  • JavaScript学习教程,从入门到精通,DOM节点操作语法知识点及案例详解(21)
  • Android学习总结之APK打包流程
  • 使用Ingress发布应用程序
  • swift-12-Error处理、关联类型、assert、泛型_
  • ospf实验
  • 被指违反代理协议遭南航暂停售票资格, 去哪儿网:今起恢复
  • 著名政治学学者、中国人民大学教授仝志敏逝世
  • 承认出现误判,以军公布加沙救护车队遭袭事件调查结果
  • 广东音像城清退,发烧友紧急“淘宝”,曾见证广州音乐黄金期
  • 数智时代出版专业技能人才培养研讨会在沪举行
  • “科技+萌点”机器人马拉松刷屏!宇树回应“半马摔倒”