CSS View Transitions APIκ° μ΄λ»κ² λΆλλ½κ³ μλμ μΈ μ λλ©μ΄μ μΌλ‘ μΉ λ΄λΉκ²μ΄μ μ νμ μ κ°μ Έμ€λμ§ μμ보μΈμ. μ΄ κ°μ΄λλ μ μΈκ³μ μΌλ‘ λ§€λ ₯μ μΈ μ¬μ©μ κ²½νμ λ§λ€κΈ° μν κΈ°λ₯, ꡬν λ° μ΄μ μ νꡬν©λλ€.
CSS View Transitions: κΈλ‘λ² μΉμ μν λ§€λλ¬μ΄ λ΄λΉκ²μ΄μ μ λλ©μ΄μ μ μ
μ€λλ λΉ λ₯΄κ² λ³ννλ λμ§νΈ νκ²½μμ μ¬μ©μ κ²½ν(UX)μ κ°μ₯ μ€μν©λλ€. κΈλ‘λ² κ³ κ°μ λμμΌλ‘ νλ μΉμ¬μ΄νΈμ μΉ μ ν리μΌμ΄μ μμλ μ§κ΄μ μ΄κ³ λ§€λ ₯μ μ΄λ©° μκ°μ μΌλ‘ μ¦κ±°μ΄ μ¬μ μ λ§λλ κ²μ΄ μ€μν©λλ€. μ΄ κ²½νμμ κ°μ₯ μν₯λ ₯ μλ μμ μ€ νλλ λ΄λΉκ²μ΄μ μ λλ€. κΈ°μ‘΄μ νμ΄μ§ μ νμ μ’ μ’ κ±°μ¬λ¦¬λ λλμ μ£Όμ΄ μ¬μ©μμ νλ¦μ λ¨μ μν¬ μ μμ΅λλ€. νμ§λ§ CSS View Transitions APIμ λ±μ₯μ μ΄λ¬ν μν©μ λ³νμν¬ μ€λΉκ° λμ΄ μμΌλ©°, κ°λ°μμκ² μΉ μ ν리μΌμ΄μ μ μ¬λ¬ λ·° μ¬μ΄λ₯Ό λΆλλ½κ³ μλμ μΈ μ λλ©μ΄μ μΌλ‘ ꡬνν μ μλ κ°λ ₯νκ³ μ°μν λ°©λ²μ μ 곡ν©λλ€.
μ΄ μ’ ν© κ°μ΄λμμλ CSS View Transitions APIμ 볡μ‘ν λΆλΆμ κΉμ΄ νκ³ λ€μ΄ κ·Έ μ μ¬λ ₯, ν¨κ³Όμ μΈ κ΅¬ν λ°©λ², κ·Έλ¦¬κ³ λ€μν κ΅μ μ λ§₯λ½μμ λ°μ΄λ μ¬μ©μ κ²½νμ λ§λλ λ° μ 곡νλ μ€μν μ΄μ λ€μ νꡬν κ²μ λλ€. μ°λ¦¬λ κΈ°λ³Έ κ°λ λΆν° μ€μ μ μ©κΉμ§ λͺ¨λ κ²μ λ€λ£¨μ΄, μ¬λ¬λΆμ΄ μ΄ μ΅μ²¨λ¨ κΈ°μ μ νμ©νμ¬ μ§μ μΌλ‘ κΈ°μ΅μ λ¨λ μΉ μνΈμμ©μ λ§λ€ μ μλλ‘ λ³΄μ₯ν κ²μ λλ€.
λ§€λλ¬μ΄ μ νμ ν μ΄ν΄νκΈ°
API μ체μ λν΄ μμ보기 μ μ, νΉν κΈλ‘λ² κ³ κ°μ λμμΌλ‘ ν λ λ§€λλ¬μ΄ μ νμ΄ μΉ λμμΈμ μ κ·Έν λ‘ μ€μνμ§ μ΄ν΄λ³΄κ² μ΅λλ€:
- ν₯μλ μ¬μ©μ μ°Έμ¬: μκ°μ μΌλ‘ μ¦κ±°μ΄ μ νμ μ¬μ©μμ μ£Όμλ₯Ό λκ³ λΈλΌμ°μ§ κ²½νμ λ μ¦κ²κ³ λ λ°©ν΄λλλ‘ λ§λλλ€. μ΄λ λ―Έμ λν μΌκ³Ό μΈλ ¨λ ννμ μ€μνλ λ¬ΈνκΆμ μ¬μ©μλ€μκ² νΉν μ€μν©λλ€.
- ν₯μλ μ¬μ©μ±κ³Ό λ΄λΉκ²μ΄μ : λΆλλ¬μ΄ μ νμ λͺ νν μ°μμ±κ³Ό λ§₯λ½μ μ 곡ν©λλ€. μ¬μ©μλ μ¬μ΄νΈ λ΄μμ μμ μ μ§ν μν©μ λ μ½κ² μΆμ νκ³ , μ΄λμμ μλμ§ μ΄ν΄νλ©°, μ΄λλ‘ κ°μ§ μμν μ μμ΅λλ€. μ΄λ μΈμ§ λΆνλ₯Ό μ€μ΄κ³ λ΄λΉκ²μ΄μ μ λ μμ°μ€λ½κ² λλΌκ² ν©λλ€.
- μ λ¬Έμ±κ³Ό λΈλλ μΈμ: μ λ§λ€μ΄μ§ μ λλ©μ΄μ μΈν°νμ΄μ€λ μ λ¬Έμ±κ³Ό λν μΌμ λν μ£Όμλ₯Ό μ λ¬ν©λλ€. κ΅μ μ μΈ λΉμ¦λμ€μκ² μ΄λ λΈλλ μΈμμ ν¬κ² κ°ννκ³ λ€μν κ³ κ°μΈ΅κ³Όμ μ λ’°λ₯Ό ꡬμΆν μ μμ΅λλ€.
- μ²΄κ° λ‘λ© μκ° λ¨μΆ: μ 체 νμ΄μ§λ₯Ό λ¨μν μλ‘κ³ μΉ¨νλ λμ μμλ₯Ό μ λλ©μ΄μ μΌλ‘ μ²λ¦¬ν¨μΌλ‘μ¨, λ€μ λ·°μ λν μ²΄κ° λ‘λ© μκ°μ ν¬κ² μ€μ¬ λ λΉ λ₯΄κ³ λ°μμ±μ΄ μ’μ λλμ μ€ μ μμ΅λλ€.
- μ κ·Όμ± κ³ λ €μ¬ν: μ¬λ°λ₯΄κ² ꡬνλμμ λ, μ νμ μΈμ§ μ₯μ κ° μλ μ¬μ©μλ μ 보μ νλ¦μ λ°λΌκ°κΈ° μν΄ μκ°μ λ¨μκ° νμν μ¬μ©μμκ² λμμ΄ λ μ μμ΅λλ€. νμ§λ§ μ λλ©μ΄μ μ λ―Όκ°ν μ¬μ©μλ₯Ό μν΄ λμμ λΉνμ±ννκ±°λ μ€μΌ μ μλ μ΅μ μ μ 곡νλ κ²μ΄ μ€μν©λλ€.
CSS View Transitions APIλ 무μμΈκ°?
CSS View Transitions APIλ κ°λ°μκ° νμ΄μ§ κ° λ΄λΉκ²μ΄μ μ΄λ λμ μ½ν μΈ μ λ°μ΄νΈμ κ°μ DOM λ³κ²½μ CSS κΈ°λ° νΈλμ§μ μΌλ‘ μ λλ©μ΄μ νν μ μκ² ν΄μ£Όλ λΈλΌμ°μ λ€μ΄ν°λΈ APIμ λλ€. μ΄λ λ§μ μΌλ°μ μΈ μλ리μ€μμ 볡μ‘ν μλ°μ€ν¬λ¦½νΈ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬ μμ΄λ μ κ΅ν μ λλ©μ΄μ μ λ§λ€ μ μλ μ μΈμ μΈ λ°©λ²μ μ 곡ν©λλ€. λ³Έμ§μ μΌλ‘, μ΄λ μΉ μ ν리μΌμ΄μ UIμ μ΄μ μνμ μ μν μ¬μ΄λ₯Ό λ§€λλ½κ² "νμ΄λ"νκ±°λ "μ¬λΌμ΄λ"ν μ μκ² ν΄μ€λλ€.
ν΅μ¬ μμ΄λμ΄λ λ΄λΉκ²μ΄μ μ΄λ DOM μ λ°μ΄νΈκ° λ°μν λ λΈλΌμ°μ κ° νμ¬ λ·°μ "μ€λ μ·"κ³Ό μ λ·°μ "μ€λ μ·"μ μΊ‘μ²νλ€λ κ²μ λλ€. κ·Έλ° λ€μ APIλ CSSλ₯Ό μ¬μ©νμ¬ μ΄ λ μν κ°μ μ νμ μ λλ©μ΄μ νν μ μλ ν (hook)μ μ 곡ν©λλ€.
μ£Όμ κ°λ :
- DOM λ³κ²½: μ΄ APIλ λ¬Έμ κ°μ²΄ λͺ¨λΈ(DOM)μ λ³κ²½μ μν΄ νΈλ¦¬κ±°λ©λλ€. μ΄λ μΌλ°μ μΌλ‘ λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μμμ μ 체 νμ΄μ§ λ΄λΉκ²μ΄μ μ΄λ κΈ°μ‘΄ νμ΄μ§ λ΄μ λμ μ λ°μ΄νΈλ₯Ό ν¬ν¨ν©λλ€.
- ν¬λ‘μ€ νμ΄λ(Cross-Fades): κ°μ₯ κ°λ¨νκ³ μΌλ°μ μΈ μ νμ ν¬λ‘μ€ νμ΄λλ‘, λκ°λ μ½ν μΈ κ° νμ΄λ μμλλ λμ λ€μ΄μ€λ μ½ν μΈ κ° νμ΄λ μΈλλ κ²μ λλ€.
- 곡μ μμ μ ν(Shared Element Transitions): λ κ³ κΈ κΈ°λ₯μΌλ‘, μ΄μ λ·°μ μ λ·° λͺ¨λμ μ‘΄μ¬νλ νΉμ μμ(μ: μΈλ€μΌ μ΄λ―Έμ§κ° μμΈ νμ΄μ§μ λ ν° μ΄λ―Έμ§λ‘ μ νλλ κ²½μ°)λ₯Ό μ λλ©μ΄μ νν μ μμ΅λλ€. μ΄λ κ°λ ₯ν μ°μμ±μ λ§λ€μ΄λ λλ€.
- λ¬Έμ μ ν(Document Transitions): μ 체 νμ΄μ§ λ‘λ μ¬μ΄μ λ°μνλ μ νμ μλ―Έν©λλ€.
- λ·° μ ν(View Transitions): λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA) λ΄μμ μ 체 νμ΄μ§ 리λ‘λ μμ΄ λ°μνλ μ νμ μλ―Έν©λλ€.
CSS View Transitions ꡬννκΈ°
CSS View Transitionsμ ꡬνμ μ£Όλ‘ μ νμ μμνλ μλ°μ€ν¬λ¦½νΈμ μ λλ©μ΄μ μ체λ₯Ό μ μνλ CSSλ₯Ό ν¬ν¨ν©λλ€. κ·Έ κ³Όμ μ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€.
κΈ°λ³Έ ν¬λ‘μ€ νμ΄λ μ ν (SPA μμ )
λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μ κ²½μ°, APIλ λΌμ°ν λ©μ»€λμ¦μ ν΅ν©λ©λλ€. μ κ²½λ‘κ° νμ±νλ λ λ·° μ νμ μμν©λλ€.
μλ°μ€ν¬λ¦½νΈ:**
μ΅μ μλ°μ€ν¬λ¦½νΈ νλ μμν¬λ μμ JSμμλ μΌλ°μ μΌλ‘ μ λ·°λ‘ μ΄λν λ μ νμ νΈλ¦¬κ±°ν©λλ€.
// Example using a hypothetical router
async function navigateTo(url) {
// Start the view transition
if (document.startViewTransition) {
await document.startViewTransition(async () => {
// Update the DOM with the new content
await updateContent(url);
});
} else {
// Fallback for browsers that don't support View Transitions
await updateContent(url);
}
}
async function updateContent(url) {
// Fetch new content and update the DOM
// For example:
const response = await fetch(url);
const html = await response.text();
document.getElementById('main-content').innerHTML = html;
}
// Trigger navigation (e.g., on a link click)
// document.querySelectorAll('a[data-link]').forEach(link => {
// link.addEventListener('click', (event) => {
// event.preventDefault();
// navigateTo(link.href);
// });
// });
CSS:
λ§λ²μ CSSμμ μΌμ΄λ©λλ€. λ·° μ νμ΄ νμ±νλλ©΄ λΈλΌμ°μ λ ::view-transition-old(root)
μ ::view-transition-new(root)
λΌλ μμ¬ μμλ₯Ό μμ±ν©λλ€. μ΄λ₯Ό μ€νμΌλ§νμ¬ μ λλ©μ΄μ
μ λ§λ€ μ μμ΅λλ€.
/* Apply a default cross-fade */
::view-transition-old(root) {
animation: fade-out 0.5s ease-in-out;
}
::view-transition-new(root) {
animation: fade-in 0.5s ease-in-out;
}
@keyframes fade-out {
from { opacity: 1; }
to { opacity: 0; }
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
μμ¬ μμ μ νμμ (root)
λ μ 체 λ¬Έμμ κ±ΈμΉ μ νμ κΈ°λ³Έ κ·Έλ£Ήμ λνλ
λλ€. λ μΈλΆνλ μ μ΄λ₯Ό μν΄ μ¬μ©μ μ μ μ ν κ·Έλ£Ήμ λ§λ€ μ μμ΅λλ€.
곡μ μμ μ ν
μ΄κ²μ΄ λ°λ‘ View Transitionsκ° μ§μ μΌλ‘ λΉμ λ°νλ λΆλΆμ λλ€. κ° μ νμ μ΄λ―Έμ§κ° μλ μ ν λͺ©λ‘ νμ΄μ§λ₯Ό μμν΄ λ³΄μΈμ. μ¬μ©μκ° μ νμ ν΄λ¦νλ©΄ ν΄λΉ μ΄λ―Έμ§κ° μ ν μμΈ νμ΄μ§μ λ ν° μ΄λ―Έμ§λ‘ λΆλλ½κ² μ λλ©μ΄μ λκΈ°λ₯Ό μν κ²μ λλ€. 곡μ μμ μ νμ μ΄λ₯Ό κ°λ₯νκ² ν©λλ€.
μλ°μ€ν¬λ¦½νΈ:**
λ·° κ°μ 곡μ λλ μμλ€μ νΉμ μ λλ©μ΄μ
μ΄λ¦μΌλ‘ νμν΄μΌ ν©λλ€. μ΄λ view-transition-name
CSS μμ±μ μ¬μ©νμ¬ μνλ©λλ€.
/* On the list item */
.product-card img {
view-transition-name: product-image-123; /* Unique name per item */
width: 100px; /* Or whatever the thumbnail size is */
}
/* On the detail page */
.product-detail-image {
view-transition-name: product-image-123; /* Same unique name */
width: 400px; /* Or whatever the detail size is */
}
μ νμ μμνλ μλ°μ€ν¬λ¦½νΈλ λΉμ·νκ² μ μ§λμ§λ§, λΈλΌμ°μ λ μΌμΉνλ view-transition-name
κ°μ κ°μ§ μμλ€μ μ λλ©μ΄μ
μ μλμΌλ‘ μ²λ¦¬ν©λλ€.
async function navigateToProduct(productId, imageUrl) {
// Set the shared element's transition name before updating
document.getElementById(`product-image-${productId}`).style.viewTransitionName = `product-image-${productId}`;
if (document.startViewTransition) {
await document.startViewTransition(async () => {
await updateProductDetail(productId, imageUrl);
});
} else {
await updateProductDetail(productId, imageUrl);
}
}
async function updateProductDetail(productId, imageUrl) {
// Update DOM with product detail page content
// Ensure the shared image element has the correct view-transition-name
document.getElementById('main-content').innerHTML = `
Product ${productId}
Details about the product...
`;
}
곡μ μμλ₯Ό μν CSS:**
λΈλΌμ°μ λ μΌμΉνλ view-transition-name
μμλ€μ μ λλ©μ΄μ
μ μ²λ¦¬ν©λλ€. μ΄λ¬ν μμλ€μ΄ μ΄λ»κ² μ λλ©μ΄μ
λ μ§ μ μνλ CSSλ₯Ό μ 곡ν μ μμ΅λλ€.
/* Define how the shared element moves and scales */
::view-transition-old(root), ::view-transition-new(root) {
/* Other styles for cross-fade if any */
}
/* Target the specific shared element transition */
::view-transition-group(root) {
/* Example: control animation for elements within a group */
}
/* Shared element animation */
::view-transition-image-pair(root) {
/* Controls the animation of the shared element itself */
animation-duration: 0.6s;
animation-timing-function: ease-in-out;
}
/* You can also target specific named transitions */
@keyframes slide-in {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
::view-transition-new(product-image-123) {
animation: slide-in 0.5s ease-out;
}
λΈλΌμ°μ λ 곡μ μμλ₯Ό μ΄μ μμΉμμ μ μμΉλ‘ μ΄λμν€κΈ° μν λ³ν(μμΉ λ° ν¬κΈ°)μ μ§λ₯μ μΌλ‘ κ³μ°ν©λλ€. κ·Έλ° λ€μ μ΄ μ νλ μμλ€μ μΆκ°μ μΈ CSS μ λλ©μ΄μ μ μ μ©ν μ μμ΅λλ€.
μ ν 컀μ€ν°λ§μ΄μ§
CSS View Transitionsμ νμ νμ€ CSS μ λλ©μ΄μ κ³Ό νΈλμ§μ μ μ¬μ©νμ¬ μ νμ 컀μ€ν°λ§μ΄μ§ν μ μλ λ₯λ ₯μ μμ΅λλ€. λ€μμ λ§λ€ μ μμ΅λλ€:
- μ¬λΌμ΄λ μ ν: μμλ€μ΄ μμμ μ¬λΌμ΄λ μΈνκ±°λ μ΄λνλ©΄μ νμ΄λ μΈν©λλ€.
- μ€ ν¨κ³Ό: μμλ€μ΄ μ€ μΈ λλ μ€ μμλ©λλ€.
- μμ°¨μ μ λλ©μ΄μ : μ¬λ¬ μμλ₯Ό νΉμ μμλ‘ μ λλ©μ΄μ νν©λλ€.
- μμλ³ μ λλ©μ΄μ : λ€μν μ νμ μ½ν μΈ (μ: μ΄λ―Έμ§, ν μ€νΈ λΈλ‘)μ κ³ μ ν μ νμ μ μ©ν©λλ€.
μ¬μ©μ μ μ μ νμ ꡬννλ €λ©΄ μ¬μ©μ μ μ μ λλ©μ΄μ κ·Έλ£Ήμ μ μνκ³ ν΄λΉ κ·Έλ£Ή λ΄μ νΉμ μμλ₯Ό νκ²ν ν©λλ€. μλ₯Ό λ€μ΄:
/* Define a slide-in animation for new content */
@keyframes slide-in-right {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
/* Apply this animation to new content within a specific transition group */
::view-transition-new(slide-group) {
animation: slide-in-right 0.7s cubic-bezier(0.25, 0.8, 0.25, 1) forwards;
}
/* And a corresponding slide-out for old content */
@keyframes slide-out-left {
from {
transform: translateX(0);
opacity: 1;
}
to {
transform: translateX(-100%);
opacity: 0;
}
}
::view-transition-old(slide-group) {
animation: slide-out-left 0.7s cubic-bezier(0.25, 0.8, 0.25, 1) forwards;
}
κ·Έλ° λ€μ μλ°μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ μ΄ λͺ λͺ λ κ·Έλ£Ήμ νΈλ¦¬κ±°ν©λλ€:
// In the SPA navigation function
if (document.startViewTransition) {
await document.startViewTransition('slide-group', async () => {
await updateContent(url);
});
}
μ 체 νμ΄μ§ λ΄λΉκ²μ΄μ μ μν λ·° μ ν (λ¬Έμ μ ν)
μ²μμλ SPAμ μ΄μ μ λ§μΆμμ§λ§, View Transitions APIλ μ 체 νμ΄μ§ λ‘λ κ°μ μ νμ μ§μνλλ‘ νμ₯λκ³ μμΌλ©°, μ΄λ μ ν΅μ μΈ λ€μ€ νμ΄μ§ μΉμ¬μ΄νΈμ λ§€μ° μ μ©ν©λλ€. μ΄λ document
κ°μ²΄μ navigate()
ν¨μλ₯Ό ν΅ν΄ ꡬνλ©λλ€.
// Example of initiating a document transition
document.addEventListener('click', (event) => {
const link = event.target.closest('a');
if (!link || !link.href) return;
// Check if it's an external link or needs a full page load
if (link.origin !== location.origin || link.target === '_blank') {
return;
}
event.preventDefault();
// Initiate the document transition
document.navigate(link.href);
});
// The CSS for ::view-transition-old(root) and ::view-transition-new(root)
// would still apply to animate between the old and new DOM states.
document.navigate(url)
κ° νΈμΆλλ©΄, λΈλΌμ°μ λ μλμΌλ‘ νμ¬ νμ΄μ§λ₯Ό μΊ‘μ²νκ³ μ νμ΄μ§λ₯Ό κ°μ Έμ¨ λ€μ μ μλ λ·° μ νμ μ μ©ν©λλ€. 곡μ μμ μ νμ μνλ€λ©΄ μ νμ΄μ§μ HTMLμ μΌμΉνλ view-transition-name
μμ±μ κ°μ§ μμκ° ν¬ν¨λμ΄μΌ ν©λλ€.
κΈλ‘λ² κ³ κ°μ μν μ΄μ
CSS View Transitionsλ₯Ό ꡬννλ©΄ κ΅μ μ μΈ μ¬μ©μ κΈ°λ°μ μν΄ λμμΈν λ μ€μ§μ μΈ μ΄μ μ μ»μ μ μμ΅λλ€:
- μΌκ΄λ λΈλλ κ²½ν: λͺ¨λ μΉ μμ°μ κ±Έμ³ ν΅μΌλκ³ λΆλλ¬μ΄ μ ν κ²½νμ μ¬μ©μμ μ§λ¦¬μ μμΉλ μΈμ΄μ κ΄κ³μμ΄ λΈλλ μμ΄λ΄ν°ν°λ₯Ό κ°νν©λλ€. μ΄λ μΉμν¨κ³Ό μ λ’°κ°μ νμ±ν©λλ€.
- λ¬Ένμ μ°¨μ΄ ν΄μ: λ―Έμ μ νΈλλ λ¬Ένμ μΌλ‘ λ€λ₯Ό μ μμ§λ§, μ λμ±κ³Ό μΈλ ¨λ¨μ λν μΈκ°μ κ°μμ 보νΈμ μ λλ€. λΆλλ¬μ΄ μ νμ λ μ κ΅νκ³ λ³΄νΈμ μΌλ‘ λ§€λ ₯μ μΈ μΈν°νμ΄μ€μ κΈ°μ¬ν©λλ€.
- μ±λ₯ μΈμ κ°μ : μΈν°λ· μΈνλΌκ° λ κ²¬κ³ ν μ§μμ μ¬μ©μλ€μκ²λ μ λλ©μ΄μ μ΄ μ 곡νλ μ²΄κ° μλμ λ°μμ±μ΄ νΉν μ μ΅ν μ μμΌλ©°, κ²½νμ λ μ¦κ°μ μ΄κ³ λ λ΅λ΅νκ² λ§λλλ€.
- μ κ·Όμ± λ° ν¬μ©μ±: μ΄ APIλ
prefers-reduced-motion
λ―Έλμ΄ μΏΌλ¦¬λ₯Ό μ‘΄μ€ν©λλ€. μ΄λ λμμ λ―Όκ°ν μ¬μ©μλ€μ΄ μ λλ©μ΄μ μ μλμΌλ‘ λΉνμ±ννκ±°λ μ€μΌ μ μμμ μλ―Ένλ©°, μ μΈκ³μ μΌλ‘ νν μ μλ μ μ μ₯μ λ λ©λ―Έκ° μλ μ¬μ©μλ₯Ό ν¬ν¨ν λͺ¨λ μ¬λμκ² ν¬μ©μ μΈ κ²½νμ 보μ₯ν©λλ€. - κ°λ° κ°μν: 볡μ‘ν μλ°μ€ν¬λ¦½νΈ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ λΉκ΅ν λ, CSS View Transitionsλ μ’ μ’ λ μ±λ₯μ΄ μ’κ³ μ μ§ κ΄λ¦¬κ° μ¬μ κ°λ°μλ€μ΄ 볡μ‘ν μ λλ©μ΄μ λ‘μ§ λμ ν΅μ¬ κΈ°λ₯μ μ§μ€ν μ μκ² ν΄μ€λλ€. μ΄λ λ€λ₯Έ μκ°λμ κΈ°μ μμ€μμ μμ νλ κ°λ°νμκ² μ΄μ μ΄ λ©λλ€.
κ΅μ μ μμ λ° κ³ λ €μ¬ν:
- μ μ μκ±°λ: κ΅μ μ μΈ ν¨μ μλ§€μ 체λ₯Ό μμν΄ λ³΄μΈμ. λλ μ€ μ»¬λ μ μ λλ¬λ³΄λ μ¬μ©μλ κ° λλ μ€ μ΄λ―Έμ§κ° 그리λ λ·°μμ μ ν νμ΄μ§μ λ ν¬κ³ μμΈν λ·°λ‘ λΆλλ½κ² μ νλλ κ²μ λ³Ό μ μμ΅λλ€. μ΄λ¬ν μκ°μ μ°μμ±μ μ μΈκ³ μΌνκ°λ€μκ² λ§€μ° λ§€λ ₯μ μΌ μ μμ΅λλ€.
- μ¬ν λ° μλ°μ : κΈλ‘λ² μμ½ νλ«νΌμ λ·° μ νμ μ¬μ©νμ¬ νΈν μ΄λ λͺ©μ μ§μ μ΄λ―Έμ§ κ°€λ¬λ¦¬λ₯Ό μ λλ©μ΄μ ννμ¬, λλ₯μ λλλλ μ¬νμ κ³ννλ μ μ¬μ μ¬νκ°λ€μκ² λ λͺ°μ κ° μκ³ λ§€νΉμ μΈ λΈλΌμ°μ§ κ²½νμ λ§λ€ μ μμ΅λλ€.
- λ΄μ€ λ° λ―Έλμ΄: λ€κ΅μ λ΄μ€ μΉμ¬μ΄νΈλ κΈ°μ¬λ μΉμ μ¬μ΄μ λ―Έλ¬ν μ νμ μ¬μ©νμ¬ λ μλ€μ μ°Έμ¬λ₯Ό μ μ§νκ³ μ 보μ νλ¦μ λ μ½κ² λ°λΌκ° μ μλλ‘ ν μ μμ΅λλ€.
λͺ¨λ² μ¬λ‘ λ° μ κ·Όμ±
κ°λ ₯νμ§λ§, CSS View Transitionsλ₯Ό μ μ€νκ² κ΅¬ννλ κ²μ΄ νμμ μ λλ€.
prefers-reduced-motion
μ‘΄μ€: μ΄λ μ κ·Όμ±μ μν΄ λ§€μ° μ€μν©λλ€. μ΄ λ―Έλμ΄ μΏΌλ¦¬κ° νμ±νλ λ μ νμ΄ λΉνμ±νλκ±°λ μλΉν μνλλλ‘ νμ νμΈν΄μΌ ν©λλ€.
@media (prefers-reduced-motion: reduce) {
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
}
}
- μ νμ μ§§κ² μ μ§: 300msμμ 700ms μ¬μ΄μ μ λλ©μ΄μ μ λͺ©νλ‘ νμΈμ. λ κΈ΄ μ λλ©μ΄μ μ μ¬μ©μμ μ§νμ λ¦μΆ μ μμ΅λλ€.
- λͺ ννκ³ μ§κ΄μ μΈ μ λλ©μ΄μ μ¬μ©: νΉν μΈν°νμ΄μ€μ μ΅μνμ§ μμ μ¬μ©μλ₯Ό νΌλμ€λ½κ² ν μ μλ μ§λμΉκ² 볡μ‘νκ±°λ μ°λ§ν μ λλ©μ΄μ μ νΌνμΈμ.
- ν΄λ°± λ©μ»€λμ¦ μ 곡: μμ§ APIλ₯Ό μ§μνμ§ μλ λΈλΌμ°μ λ₯Ό μν΄, μ°μν ν΄λ°±(μ: κ°λ¨ν νμ΄λ λλ μ λλ©μ΄μ μμ)μ΄ μλμ§ νμΈνμΈμ.
- 곡μ μμ μ΄λ¦ μ΅μ ν:
view-transition-name
κ°μ΄ κ³ μ νκ³ μ€λͺ μ μ΄λ©°, μμ€ λ·°μ λμ λ·°μ μμμ μ¬λ°λ₯΄κ² μ μ©λμλμ§ νμΈνμΈμ. - μ λλ©μ΄μ μ±λ₯ κ³ λ €: CSS View Transitionsλ μΌλ°μ μΌλ‘ μ±λ₯μ΄ μ’μ§λ§, 볡μ‘ν μ λλ©μ΄μ μ΄λ μλ§μ μμλ₯Ό λμμ μ λλ©μ΄μ ννλ κ²μ μ¬μ ν μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€. νΉν μ μ¬μ μΌλ‘ μ μ¬μ νλμ¨μ΄λ₯Ό μ¬μ©νλ μ§μμ μ¬μ©μλ₯Ό μν΄ λ€μν μ₯μΉμ λ€νΈμν¬ μ‘°κ±΄μμ μ² μ ν ν μ€νΈνμΈμ.
λΈλΌμ°μ μ§μ λ° λ―Έλ
CSS View Transitionsλ νμ¬ Chromeκ³Ό Edgeμμ μ§μλ©λλ€. Firefoxλ μ κ·Ήμ μΌλ‘ μ§μ μμ μ νκ³ μμΌλ©°, λ€λ₯Έ λΈλΌμ°μ λ€λ λ€λ°λ₯Ό κ²μΌλ‘ μμλ©λλ€. μ§μμ΄ νλλ¨μ λ°λΌ μ΄ APIλ νλμ μΈ μΉ κ²½νμ λ§λλ νμ€ λκ΅¬κ° λ κ²μ λλ€.
μ΄ APIλ μ¬μ ν μ§ν μ€μ΄λ©°, μ λλ©μ΄μ νμ΄λ°μ λν λ λμ μ μ΄μ λ μ κ΅ν μ ν μ νμ ν¬ν¨νμ¬ κΈ°λ₯μ ν₯μμν€κΈ° μν λ Όμμ μ μμ΄ κ³μλκ³ μμ΅λλ€.
κ²°λ‘
CSS View Transitions APIλ μΉ μ λλ©μ΄μ μμ μ€μν λμ½μ λνλ΄λ©°, λ§€λλ¬μ΄ λ΄λΉκ²μ΄μ κ²½νμ λ§λλ κ°λ ₯νκ³ μ μΈμ μ΄λ©° μ±λ₯μ΄ μ’μ λ°©λ²μ μ 곡ν©λλ€. 첫μΈμκ³Ό μ¬μ©μ νλ¦μ΄ μ€μν κΈλ‘λ² κ³ κ°μκ² μ΄ APIλ₯Ό λ§μ€ν°νλ κ²μ μΉμ¬μ΄νΈλ μ ν리μΌμ΄μ μ κΈ°λ₯μ μΈ μμ€μμ μ§μ μΌλ‘ λ§€λ ₯μ μΈ μμ€μΌλ‘ λμ΄μ¬λ¦΄ μ μμ΅λλ€. λΆλλ¬μ΄ μ λλ©μ΄μ μ μ°μ μνκ³ , λμ κ°μμ λν μ¬μ©μ μ νΈλ₯Ό μ‘΄μ€νλ©°, μ¬λ € κΉμ λμμΈμ ꡬνν¨μΌλ‘μ¨, μκ°μ μΌλ‘ λ§€λ ₯μ μΌ λΏλ§ μλλΌ λ³΄νΈμ μΌλ‘ μ κ·Ό κ°λ₯νκ³ μ¦κ±°μ΄ μΉ κ²½νμ λ§λ€ μ μμ΅λλ€.
λ€μ κΈλ‘λ² μΉ νλ‘μ νΈ κ΅¬μΆμ μμν λ, CSS View Transitionsλ₯Ό μ΄λ»κ² νμ©νμ¬ λ μ€λλ ₯ μλ μ΄μΌκΈ°λ₯Ό μ λ¬νκ³ , μ¬μ©μλ₯Ό μμ½κ² μλ΄νλ©°, μ§μμ μΈ κΈμ μ μΈμμ λ¨κΈΈ μ μμμ§ κ³ λ €ν΄ λ³΄μΈμ. μΉ λ΄λΉκ²μ΄μ μ λ―Έλλ μ λλ©μ΄μ νλμ΄ μμΌλ©°, κ·Έ μ΄λ λλ³΄λ€ λ λ§€λλ¬μμ‘μ΅λλ€.