Listeye öğe eklendiğinde, listeden öğe kaldırıldığında veya öğeler yeniden düzenlendiğinde geçişler, kullanıcıların bağlamı korumasına yardımcı olabilir. Görünüm geçişleri, öğeye benzersiz bir view-transition-name vererek öğenin iki durumu arasında geçiş yapmanızı sağlar. Bir sayfadaki birden fazla öğe aynı geçiş davranışını paylaştığında view-transition-class, bu mantığı her benzersiz view-transition-name için tekrarlamak yerine CSS'de bir kez tanımlamanıza olanak tanır. Bu sayede stil sayfalarınızın bakımı kolaylaşır ve bir grup öğe arasında tutarlı animasyonlar elde edilir.
Uygulama adımları
Benzersiz adlar ve paylaşılan bir sınıf atama
Geçiş sırasında ayrı ayrı izlenmesi gereken her öğenin benzersiz bir
view-transition-namedeğeri olmalıdır.<!-- Mandatory: Each element must have a unique view-transition-name --> <li style="view-transition-name: item-1" class="item">Item 1</li> <li style="view-transition-name: item-2" class="item">Item 2</li>Paylaşılan stilleri uygulamak için bir
view-transition-classda atayın..item { view-transition-class: list-item; }Paylaşılan geçiş mantığını tanımlama
Bu gruptaki tüm üyelere stil uygulamak için sınıf seçiciyle birlikte
::view-transition-group()sözde öğesini kullanın./* Targets any view transition group that has the 'list-item' class */ ::view-transition-group(.list-item) { animation-duration: 0.5s; animation-timing-function: ease-in-out; } /* Handle accessibility by respecting motion preferences */ @media (prefers-reduced-motion: reduce) { /* Disable all group transitions, including the default `root` group. */ ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; } }İsteğe bağlı: Giriş ve çıkış animasyonlarını tanımlama
Eklenen veya kaldırılan öğelere belirli geçişler eklemek için
:only-childseçiciyi kullanın.::view-transition-new()ve::view-transition-old()sözde öğeleri, bir::view-transition-image-pair()sözde öğesinin alt öğeleridir. Bu nedenle, tek alt öğe ise eklenen veya kaldırılan bir öğe olduğunu belirleyebiliriz./* A `::view-transition-new()` element is the only child if it wasn't present before the view transition, so it is an added element. */ ::view-transition-new(.list-item):only-child { animation-name: slide-in; /* Specify an animation duration if you want something different than the UA default of 0.5s */ animation-duration: 1s; } /* A `::view-transition-old()` element is the only child if it isn't present after the view transition, so it is a removed element. */ ::view-transition-old(.list-item):only-child { animation-name: slide-out; /* Specify an animation duration if you want something different than the UA default of 0.5s */ animation-duration: 1s; } @keyframes slide-in { from { translate: -100vw 0; } } @keyframes slide-out { to { translate: -100vw 0; } }Geçişi tetikleme
DOM güncellemesini
document.startViewTransition()içine alın. Tarayıcı eski durumu yakalar, güncellemeyi gerçekleştirir ve ardından yeni duruma animasyon uygular.function updateList(newData) { document.startViewTransition(() => { // All DOM changes inside this callback will be transitioned render(newData); }); }Geçiş yapılmayan öğelerin etkileşimini koruma
Görünüm geçişleri, DOM öğelerinin anlık görüntülerini üst üste yerleştirip ardından anlık görüntüleri geçirerek çalışır. Bu, geçiş sırasında öğelerin etkileşimli olmadığı anlamına gelir. Geçiş yapılmayan etkileşimli öğeler varsa görünüm geçişlerinde dokunma etkinliklerini devre dışı bırakarak bunları etkileşimli hale getirebilirsiniz.
::view-transition {
/* Non-transitioned elements below the view transitions remain interactive */
pointer-events: none;
}
Ayrıca, varsayılan olarak :root öğesinin root adlı bir görünüm geçişi vardır. Bu geçiş, varsayılan tam sayfa geçişlerini etkinleştirir. Kök öğede değişiklik yoksa bu, etkileşimli olmayan iki aynı anlık görüntü arasında geçiş olur. Ekranın tamamını değil, yalnızca belirli öğeleri geçişe tabi tuttuğumuz için root geçişini devre dışı bırakabiliriz.
:root {
/* Disable the root transition because we are only transitioning specific elements. */
view-transition-name: none;
}
Yedek stratejiler
Görünüm geçişleri, progresif bir geliştirmedir. Tarayıcı document.startViewTransition özelliğini desteklemiyorsa DOM güncellemesi yine de hemen gerçekleşmeli ve animasyonlu olmayan ancak işlevsel bir deneyim sunmalıdır.
if (document.startViewTransition) {
document.startViewTransition(() => updateDOM());
} else {
// Fallback: Perform the update without animation
updateDOM();
}
CSS için view-transition-class veya ::view-transition-group() sınıf seçiciyi tanımayan tarayıcılar bu kuralları yoksayar ve animasyon uygulanmaz.