Spaces:
Running
Running
| <script setup lang="ts"> | |
| import { ref, onMounted } from 'vue' | |
| defineProps<{ | |
| msg: string | |
| }>() | |
| const isVisible = ref(false) | |
| onMounted(() => { | |
| setTimeout(() => { | |
| isVisible.value = true | |
| }, 100) | |
| }) | |
| </script> | |
| <template> | |
| <div class="hero-section"> | |
| <div class="background-animation"> | |
| <div class="floating-shapes"> | |
| <div class="shape shape-1"></div> | |
| <div class="shape shape-2"></div> | |
| <div class="shape shape-3"></div> | |
| <div class="shape shape-4"></div> | |
| <div class="shape shape-5"></div> | |
| </div> | |
| </div> | |
| <div class="hero-content" :class="{ 'visible': isVisible }"> | |
| <div class="title-container"> | |
| <h1 class="main-title">{{ msg }}</h1> | |
| <div class="title-underline"></div> | |
| </div> | |
| <div class="subtitle-container"> | |
| <p class="subtitle">全栈开发者 | 技术分享者 | 代码艺术家</p> | |
| </div> | |
| <div class="description"> | |
| <p>专注于前端开发、后端架构和技术创新</p> | |
| <p>用代码创造美好,用技术改变世界</p> | |
| </div> | |
| <div class="tech-stack"> | |
| <div class="tech-item">Vue.js</div> | |
| <div class="tech-item">React</div> | |
| <div class="tech-item">Node.js</div> | |
| <div class="tech-item">Python</div> | |
| <div class="tech-item">TypeScript</div> | |
| </div> | |
| <div class="cta-buttons"> | |
| <button class="btn btn-primary"> | |
| <span>查看作品</span> | |
| <div class="btn-glow"></div> | |
| </button> | |
| <button class="btn btn-secondary"> | |
| <span>联系我</span> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </template> | |
| <style scoped> | |
| .hero-section { | |
| position: relative; | |
| min-height: 100vh; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| overflow: hidden; | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| } | |
| .background-animation { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| z-index: 1; | |
| } | |
| .floating-shapes { | |
| position: relative; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .shape { | |
| position: absolute; | |
| background: rgba(255, 255, 255, 0.1); | |
| border-radius: 50%; | |
| animation: float 6s ease-in-out infinite; | |
| } | |
| .shape-1 { | |
| width: 80px; | |
| height: 80px; | |
| top: 20%; | |
| left: 10%; | |
| animation-delay: 0s; | |
| } | |
| .shape-2 { | |
| width: 60px; | |
| height: 60px; | |
| top: 60%; | |
| right: 20%; | |
| animation-delay: 1s; | |
| } | |
| .shape-3 { | |
| width: 100px; | |
| height: 100px; | |
| bottom: 20%; | |
| left: 20%; | |
| animation-delay: 2s; | |
| } | |
| .shape-4 { | |
| width: 40px; | |
| height: 40px; | |
| top: 30%; | |
| right: 10%; | |
| animation-delay: 3s; | |
| } | |
| .shape-5 { | |
| width: 70px; | |
| height: 70px; | |
| bottom: 40%; | |
| right: 30%; | |
| animation-delay: 4s; | |
| } | |
| @keyframes float { | |
| 0%, 100% { | |
| transform: translateY(0px) rotate(0deg); | |
| } | |
| 50% { | |
| transform: translateY(-20px) rotate(180deg); | |
| } | |
| } | |
| .hero-content { | |
| position: relative; | |
| z-index: 2; | |
| text-align: center; | |
| color: white; | |
| max-width: 800px; | |
| padding: 2rem; | |
| opacity: 0; | |
| transform: translateY(50px); | |
| transition: all 1s ease-out; | |
| } | |
| .hero-content.visible { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| .title-container { | |
| margin-bottom: 2rem; | |
| } | |
| .main-title { | |
| font-size: 4rem; | |
| font-weight: 700; | |
| margin: 0; | |
| background: linear-gradient(45deg, #fff, #f0f0f0); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| text-shadow: 0 0 30px rgba(255, 255, 255, 0.3); | |
| animation: titleGlow 2s ease-in-out infinite alternate; | |
| } | |
| @keyframes titleGlow { | |
| from { | |
| text-shadow: 0 0 30px rgba(255, 255, 255, 0.3); | |
| } | |
| to { | |
| text-shadow: 0 0 40px rgba(255, 255, 255, 0.5), 0 0 60px rgba(255, 255, 255, 0.2); | |
| } | |
| } | |
| .title-underline { | |
| width: 100px; | |
| height: 3px; | |
| background: linear-gradient(90deg, transparent, #fff, transparent); | |
| margin: 1rem auto; | |
| animation: underlineGlow 2s ease-in-out infinite; | |
| } | |
| @keyframes underlineGlow { | |
| 0%, 100% { | |
| opacity: 0.7; | |
| transform: scaleX(1); | |
| } | |
| 50% { | |
| opacity: 1; | |
| transform: scaleX(1.2); | |
| } | |
| } | |
| .subtitle-container { | |
| margin-bottom: 2rem; | |
| } | |
| .subtitle { | |
| font-size: 1.5rem; | |
| font-weight: 300; | |
| margin: 0; | |
| opacity: 0.9; | |
| letter-spacing: 2px; | |
| } | |
| .description { | |
| margin-bottom: 3rem; | |
| font-size: 1.1rem; | |
| line-height: 1.6; | |
| opacity: 0.8; | |
| } | |
| .description p { | |
| margin: 0.5rem 0; | |
| } | |
| .tech-stack { | |
| display: flex; | |
| justify-content: center; | |
| gap: 1rem; | |
| margin-bottom: 3rem; | |
| flex-wrap: wrap; | |
| } | |
| .tech-item { | |
| background: rgba(255, 255, 255, 0.1); | |
| backdrop-filter: blur(10px); | |
| padding: 0.5rem 1rem; | |
| border-radius: 25px; | |
| font-size: 0.9rem; | |
| border: 1px solid rgba(255, 255, 255, 0.2); | |
| transition: all 0.3s ease; | |
| } | |
| .tech-item:hover { | |
| background: rgba(255, 255, 255, 0.2); | |
| transform: translateY(-2px); | |
| box-shadow: 0 5px 15px rgba(255, 255, 255, 0.1); | |
| } | |
| .cta-buttons { | |
| display: flex; | |
| gap: 1rem; | |
| justify-content: center; | |
| flex-wrap: wrap; | |
| } | |
| .btn { | |
| position: relative; | |
| padding: 1rem 2rem; | |
| border: none; | |
| border-radius: 50px; | |
| font-size: 1.1rem; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all 0.3s ease; | |
| overflow: hidden; | |
| } | |
| .btn span { | |
| position: relative; | |
| z-index: 1; | |
| } | |
| .btn-primary { | |
| background: linear-gradient(45deg, #ff6b6b, #feca57); | |
| color: white; | |
| } | |
| .btn-primary:hover { | |
| transform: translateY(-3px); | |
| box-shadow: 0 10px 25px rgba(255, 107, 107, 0.4); | |
| } | |
| .btn-glow { | |
| position: absolute; | |
| top: 0; | |
| left: -100%; | |
| width: 100%; | |
| height: 100%; | |
| background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); | |
| transition: left 0.5s; | |
| } | |
| .btn-primary:hover .btn-glow { | |
| left: 100%; | |
| } | |
| .btn-secondary { | |
| background: transparent; | |
| color: white; | |
| border: 2px solid rgba(255, 255, 255, 0.3); | |
| } | |
| .btn-secondary:hover { | |
| background: rgba(255, 255, 255, 0.1); | |
| transform: translateY(-3px); | |
| box-shadow: 0 10px 25px rgba(255, 255, 255, 0.1); | |
| } | |
| @media (max-width: 768px) { | |
| .main-title { | |
| font-size: 2.5rem; | |
| } | |
| .subtitle { | |
| font-size: 1.2rem; | |
| } | |
| .tech-stack { | |
| gap: 0.5rem; | |
| } | |
| .tech-item { | |
| font-size: 0.8rem; | |
| padding: 0.4rem 0.8rem; | |
| } | |
| .cta-buttons { | |
| flex-direction: column; | |
| align-items: center; | |
| } | |
| .btn { | |
| width: 200px; | |
| } | |
| } | |
| </style> | |