初始提交:AI医疗展示网站,包含回到顶部按钮功能(排除大文件)
This commit is contained in:
137
src/components/Header.jsx
Normal file
137
src/components/Header.jsx
Normal file
@@ -0,0 +1,137 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { motion } from 'framer-motion';
|
||||
import { Menu, X, Brain, Heart, Activity } from 'lucide-react';
|
||||
|
||||
const Header = () => {
|
||||
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
||||
const [isScrolled, setIsScrolled] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const handleScroll = () => {
|
||||
setIsScrolled(window.scrollY > 50);
|
||||
};
|
||||
window.addEventListener('scroll', handleScroll);
|
||||
return () => window.removeEventListener('scroll', handleScroll);
|
||||
}, []);
|
||||
|
||||
const scrollToSection = (sectionId) => {
|
||||
const element = document.getElementById(sectionId);
|
||||
if (element) {
|
||||
element.scrollIntoView({ behavior: 'smooth' });
|
||||
}
|
||||
setIsMenuOpen(false);
|
||||
};
|
||||
|
||||
const navItems = [
|
||||
{ id: 'hero', label: '首页' },
|
||||
{ id: 'company', label: '关于我们' },
|
||||
{ id: 'products', label: '产品矩阵' },
|
||||
{ id: 'scenarios', label: 'AI应用' },
|
||||
{ id: 'architecture', label: '系统架构' },
|
||||
{ id: 'vision', label: '未来愿景' },
|
||||
{ id: 'contact', label: '总结展望' }
|
||||
];
|
||||
|
||||
return (
|
||||
<motion.header
|
||||
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
|
||||
isScrolled ? 'bg-white/95 backdrop-blur-md shadow-lg' : 'bg-transparent'
|
||||
}`}
|
||||
initial={{ y: -100 }}
|
||||
animate={{ y: 0 }}
|
||||
transition={{ duration: 0.5 }}
|
||||
>
|
||||
<div className="container-custom">
|
||||
<div className="flex items-center justify-between py-4">
|
||||
{/* Logo */}
|
||||
<motion.div
|
||||
className="flex items-center space-x-3"
|
||||
whileHover={{ scale: 1.05 }}
|
||||
transition={{ type: "spring", stiffness: 400, damping: 10 }}
|
||||
>
|
||||
<div className="relative">
|
||||
<div className="w-10 h-10 medical-gradient rounded-lg flex items-center justify-center">
|
||||
<Brain className="w-6 h-6 text-white" />
|
||||
</div>
|
||||
<div className="absolute -top-1 -right-1 w-4 h-4 bg-blue-500 rounded-full flex items-center justify-center">
|
||||
<Activity className="w-2 h-2 text-white" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h1 className={`text-xl font-bold ${isScrolled ? 'text-gray-900' : 'text-white'}`}>
|
||||
数耀科技
|
||||
</h1>
|
||||
<p className={`text-sm ${isScrolled ? 'text-gray-600' : 'text-white/80'}`}>
|
||||
AI赋能医疗与健康
|
||||
</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
|
||||
{/* Desktop Navigation */}
|
||||
<nav className="hidden md:flex items-center space-x-8">
|
||||
{navItems.map((item, index) => (
|
||||
<motion.button
|
||||
key={item.id}
|
||||
onClick={() => scrollToSection(item.id)}
|
||||
className={`text-sm font-medium transition-colors hover:text-blue-600 ${
|
||||
isScrolled ? 'text-gray-700' : 'text-white'
|
||||
}`}
|
||||
whileHover={{ scale: 1.05 }}
|
||||
whileTap={{ scale: 0.95 }}
|
||||
initial={{ opacity: 0, y: -20 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
transition={{ delay: index * 0.1 }}
|
||||
>
|
||||
{item.label}
|
||||
</motion.button>
|
||||
))}
|
||||
</nav>
|
||||
|
||||
{/* Mobile Menu Button */}
|
||||
<motion.button
|
||||
className={`md:hidden p-2 rounded-lg ${
|
||||
isScrolled ? 'text-gray-700' : 'text-white'
|
||||
}`}
|
||||
onClick={() => setIsMenuOpen(!isMenuOpen)}
|
||||
whileTap={{ scale: 0.95 }}
|
||||
>
|
||||
{isMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
||||
</motion.button>
|
||||
</div>
|
||||
|
||||
{/* Mobile Navigation */}
|
||||
{isMenuOpen && (
|
||||
<motion.nav
|
||||
className="md:hidden py-4 border-t border-white/20"
|
||||
initial={{ opacity: 0, height: 0 }}
|
||||
animate={{ opacity: 1, height: 'auto' }}
|
||||
exit={{ opacity: 0, height: 0 }}
|
||||
transition={{ duration: 0.3 }}
|
||||
>
|
||||
<div className="space-y-3">
|
||||
{navItems.map((item, index) => (
|
||||
<motion.button
|
||||
key={item.id}
|
||||
onClick={() => scrollToSection(item.id)}
|
||||
className={`block w-full text-left py-2 px-4 rounded-lg transition-colors ${
|
||||
isScrolled
|
||||
? 'text-gray-700 hover:bg-gray-100'
|
||||
: 'text-white hover:bg-white/10'
|
||||
}`}
|
||||
initial={{ opacity: 0, x: -20 }}
|
||||
animate={{ opacity: 1, x: 0 }}
|
||||
transition={{ delay: index * 0.1 }}
|
||||
>
|
||||
{item.label}
|
||||
</motion.button>
|
||||
))}
|
||||
</div>
|
||||
</motion.nav>
|
||||
)}
|
||||
</div>
|
||||
</motion.header>
|
||||
);
|
||||
};
|
||||
|
||||
export default Header;
|
||||
|
||||
Reference in New Issue
Block a user