初始化
This commit is contained in:
@@ -31,6 +31,13 @@
|
|||||||
:alt="work.title"
|
:alt="work.title"
|
||||||
>
|
>
|
||||||
<div class="absolute inset-0 bg-black/40"></div>
|
<div class="absolute inset-0 bg-black/40"></div>
|
||||||
|
|
||||||
|
<!-- Play Button Overlay -->
|
||||||
|
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-24 h-24 rounded-full border border-white/20 bg-white/5 backdrop-blur-md flex items-center justify-center cursor-pointer hover:scale-110 hover:bg-white/10 transition-all duration-500 group-hover:border-art-accent/50 z-20">
|
||||||
|
<i data-lucide="play" class="w-8 h-8 text-white fill-white ml-1"></i>
|
||||||
|
<div class="absolute inset-0 rounded-full border border-white/20 animate-pulse-slow"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="absolute bottom-0 left-0 p-8 md:p-20 w-full">
|
<div class="absolute bottom-0 left-0 p-8 md:p-20 w-full">
|
||||||
<div class="flex items-end justify-between border-t border-white/30 pt-8 animate-slide-down">
|
<div class="flex items-end justify-between border-t border-white/30 pt-8 animate-slide-down">
|
||||||
<div>
|
<div>
|
||||||
@@ -74,17 +81,26 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="md:w-2/3 bg-[#080808] flex flex-col">
|
<div class="md:w-2/3 bg-[#080808] flex flex-col">
|
||||||
<div id="work-gallery" class="flex flex-col flex-grow">
|
<div id="work-gallery" class="flex flex-col flex-grow">
|
||||||
<img
|
<template v-for="(img, index) in work.gallery" :key="index">
|
||||||
v-for="(img, index) in work.gallery"
|
<!-- Alternating layout logic -->
|
||||||
:key="index"
|
<img
|
||||||
:src="img"
|
v-if="index % 2 === 0"
|
||||||
:alt="`${work.title} - 图片 ${index + 1}`"
|
:src="img"
|
||||||
class="gallery-image"
|
:alt="`${work.title} - 图片 ${index + 1}`"
|
||||||
>
|
class="gallery-image w-full object-cover aspect-video mb-8 md:mb-16 grayscale hover:grayscale-0 transition-all duration-700"
|
||||||
|
>
|
||||||
|
<div v-else class="flex justify-end mb-8 md:mb-16">
|
||||||
|
<img
|
||||||
|
:src="img"
|
||||||
|
:alt="`${work.title} - 图片 ${index + 1}`"
|
||||||
|
class="gallery-image w-4/5 object-cover aspect-[4/3] grayscale hover:grayscale-0 transition-all duration-700"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="h-[40vh] flex items-center justify-center border-t border-white/5 bg-[#050505] cursor-pointer group hover:bg-white/5 transition-colors"
|
class="h-[40vh] flex items-center justify-center border-t border-white/5 bg-[#050505] cursor-pointer group hover:bg-white/5 transition-colors"
|
||||||
@click="$router.push('/works')"
|
@click="openNextWork"
|
||||||
>
|
>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<p class="font-mono text-xs text-art-muted mb-4 tracking-widest">下一个作品</p>
|
<p class="font-mono text-xs text-art-muted mb-4 tracking-widest">下一个作品</p>
|
||||||
@@ -99,7 +115,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted, onBeforeUnmount } from 'vue'
|
import { ref, onMounted, onBeforeUnmount, watch } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import { fetchWork, Work } from '../services/api'
|
import { fetchWork, Work } from '../services/api'
|
||||||
import { useScrollAnimation } from '../composables/useScrollAnimation'
|
import { useScrollAnimation } from '../composables/useScrollAnimation'
|
||||||
@@ -137,6 +153,14 @@ const updateScrollProgress = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const openNextWork = () => {
|
||||||
|
if (work.value.next) {
|
||||||
|
router.push(`/works/${work.value.next}`)
|
||||||
|
} else {
|
||||||
|
router.push('/works')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const fetchWorkDetails = async () => {
|
const fetchWorkDetails = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
error.value = ''
|
error.value = ''
|
||||||
@@ -157,6 +181,16 @@ const fetchWorkDetails = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 监听路由变化,重新获取数据
|
||||||
|
watch(() => route.params.id, (newId) => {
|
||||||
|
if (newId) {
|
||||||
|
// 强制刷新当前组件状态
|
||||||
|
work.value = { ...work.value, id: newId as string, title: '加载中...' }
|
||||||
|
window.scrollTo(0, 0)
|
||||||
|
fetchWorkDetails()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
fetchWorkDetails()
|
fetchWorkDetails()
|
||||||
// 初始化Lucide图标
|
// 初始化Lucide图标
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
>
|
>
|
||||||
<!-- 作品图片 -->
|
<!-- 作品图片 -->
|
||||||
<div
|
<div
|
||||||
:class="['md:order-1', index % 2 === 1 ? 'md:order-2' : 'md:order-1']"
|
:class="index % 2 === 1 ? 'md:order-2' : 'md:order-1'"
|
||||||
class="relative aspect-[4/3] overflow-hidden rounded-sm bg-gray-900 border border-white/5"
|
class="relative aspect-[4/3] overflow-hidden rounded-sm bg-gray-900 border border-white/5"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- 作品信息 -->
|
<!-- 作品信息 -->
|
||||||
<div
|
<div
|
||||||
:class="['md:order-2', index % 2 === 1 ? 'md:order-1 md:text-right' : 'md:order-2']"
|
:class="index % 2 === 1 ? 'md:order-1 md:text-right' : 'md:order-2'"
|
||||||
class="space-y-6"
|
class="space-y-6"
|
||||||
>
|
>
|
||||||
<!-- 年份和分类 -->
|
<!-- 年份和分类 -->
|
||||||
|
|||||||
@@ -91,6 +91,12 @@
|
|||||||
.animate-reveal.visible { opacity: 1; transform: translateY(0); }
|
.animate-reveal.visible { opacity: 1; transform: translateY(0); }
|
||||||
.animate-slide-down { opacity: 0; transform: translateY(-30px); transition: all 1s cubic-bezier(0.16, 1, 0.3, 1); }
|
.animate-slide-down { opacity: 0; transform: translateY(-30px); transition: all 1s cubic-bezier(0.16, 1, 0.3, 1); }
|
||||||
.animate-slide-down.visible { opacity: 1; transform: translateY(0); }
|
.animate-slide-down.visible { opacity: 1; transform: translateY(0); }
|
||||||
|
.animate-pulse-slow { animation: pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite; }
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { opacity: 1; transform: scale(1); }
|
||||||
|
50% { opacity: .5; transform: scale(1.05); }
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes marquee { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
|
@keyframes marquee { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
|
||||||
@keyframes marquee-reverse { 0% { transform: translateX(-50%); } 100% { transform: translateX(0); } }
|
@keyframes marquee-reverse { 0% { transform: translateX(-50%); } 100% { transform: translateX(0); } }
|
||||||
|
|||||||
Reference in New Issue
Block a user