Astro View Transitions: Page Transitions แบบ Native
#astro12 เม.ย. 2569
View Transitions คืออะไร
Astro 3.0 แนะนำ View Transitions API ที่ช่วยให้สร้าง smooth page transitions ได้โดยไม่ต้องใช้ JavaScript framework
เปิดใช้ View Transitions
---
// src/layouts/Layout.astro
import { ViewTransitions } from 'astro:transitions';
---
<html>
<head>
<ViewTransitions />
</head>
<body>
<slot />
</body>
</html>
Transition Directives
<!-- Fade transition -->
<main transition:animate="fade">
<slot />
</main>
<!-- Slide transition -->
<aside transition:animate="slide">
<nav>...</nav>
</aside>
<!-- Custom name สำหรับ shared element -->
<img
src={post.image}
transition:name={`post-image-${post.id}`}
/>
Shared Element Transitions
---
// src/pages/blog/index.astro
const posts = await getCollection('blog');
---
{posts.map(post => (
<a href={`/blog/${post.slug}`}>
<img
src={post.data.image}
transition:name={`post-${post.slug}-image`}
/>
<h2 transition:name={`post-${post.slug}-title`}>
{post.data.title}
</h2>
</a>
))}
---
// src/pages/blog/[slug].astro
const { post } = Astro.props;
---
<img
src={post.data.image}
transition:name={`post-${post.slug}-image`}
/>
<h1 transition:name={`post-${post.slug}-title`}>
{post.data.title}
</h1>
Custom Animations
<div transition:animate={{
forwards: {
old: [{ opacity: 1 }, { opacity: 0 }],
new: [{ opacity: 0 }, { opacity: 1 }]
},
backwards: {
old: [{ opacity: 1 }, { opacity: 0 }],
new: [{ opacity: 0 }, { opacity: 1 }]
}
}}>
<slot />
</div>
Lifecycle Events
document.addEventListener('astro:page-load', () => {
// รันหลังทุก page load
initializeComponents();
});
document.addEventListener('astro:before-swap', (e) => {
// รันก่อน swap DOM
});
สรุป
View Transitions ทำให้ Astro site รู้สึกเหมือน SPA โดยไม่ต้องเพิ่ม JavaScript มาก ผู้ใช้ได้ประสบการณ์ที่ smooth ขึ้นมากครับ