Кратко
Скопировано@view — это CSS-директива для создания плавных анимаций перехода между страницами сайта.
Пример
СкопированоНастроить переход можно в одно правило. Браузер применит дефолтную cross-fade анимацию:
@view-transition { navigation: auto;}
@view-transition {
navigation: auto;
}
Если нужно закастомить, можно добавить свою:
::view-transition-old(root) { animation: 0.3s ease-in-out both slideOut;}::view-transition-new(root) { animation: 0.3s ease-in-out both zoomIn;}
::view-transition-old(root) {
animation: 0.3s ease-in-out both slideOut;
}
::view-transition-new(root) {
animation: 0.3s ease-in-out both zoomIn;
}
Вот что получится:
Обратите внимание, как анимация повторяется: обе страницы исчезают и появляются одинаково. Такой эффект даёт использование парных анимаций.
- Главная появляется через
zoom, уходит черезIn zoom.Out - Страница подробностей появляется через
slide, уходит черезIn slide.Out
Тонкость в том, что мы можем описать уходящую анимацию только в новой странице. Поэтому уходящая анимация zoom описана на странице подробностей, а slide — на главной.
При должной аккуратности этот паттерн можно легко масштабировать. Он отлично подходит для создания визуальной иерархии между переходами.
Как пишется
СкопированоБазовый синтаксис:
@view-transition { navigation: auto;}
@view-transition {
navigation: auto;
}
Свойство navigation внутри директивы принимает одно из двух значений:
none— значение по умолчанию, плавные переходы отключены.auto— браузер применяет стандартную анимацию перехода.
Вот как добавить свою анимацию перехода:
::view-transition-old(root) { animation: 0.3s ease-in-out both slideOut;}::view-transition-new(root) { animation: 0.3s ease-in-out both zoomIn;}
::view-transition-old(root) {
animation: 0.3s ease-in-out both slideOut;
}
::view-transition-new(root) {
animation: 0.3s ease-in-out both zoomIn;
}
Как понять
Скопировано@view работает как контейнер для определения правил перехода между страницами. При навигации браузер автоматически создаёт анимацию перехода при указанном @view.
Обе страницы должны находиться на одном origin. origin — это комбинация протокола, домена и порта (если он указан). Например, doka — это домен, а https — origin.
Опциональная анимация
СкопированоПо умолчанию директива @view со значением auto применяется всегда. При желании её можно ограничить с помощью условных директив.
Например, можно пощадить пользователей, которые предпочитают минимальное количество анимаций:
@media screen and (prefers-reduced-motion: no-preference) { @view-transition { navigation: auto; }}
@media screen and (prefers-reduced-motion: no-preference) {
@view-transition {
navigation: auto;
}
}
Или включить плавные переходы только для определённых размеров экрана:
@media screen and (width > 70em) { @view-transition { navigation: auto; }}
@media screen and (width > 70em) {
@view-transition {
navigation: auto;
}
}
Гранулярная анимация
СкопированоПомимо анимации всей страницы, можно независимо анимировать отдельные элементы. Для этого нужно:
- Задать уникальное имя перехода с помощью свойства
view.- transition - name - Задать отдельную анимацию для перехода.
header { view-transition-name: header;}::view-transition-old(header) { animation: 0.3s ease-in-out both fadeOut;}::view-transition-new(header) { animation: 0.3s ease-in-out both fadeIn;}
header {
view-transition-name: header;
}
::view-transition-old(header) {
animation: 0.3s ease-in-out both fadeOut;
}
::view-transition-new(header) {
animation: 0.3s ease-in-out both fadeIn;
}
Теперь <header> будет анимироваться независимо от основного перехода страницы. Ниже пример.
- Chrome 126, поддерживается
- Edge 126, поддерживается
- Firefox, не поддерживается
- Safari 18.2, поддерживается
На практике
Скопированосоветует
Скопировано@view — это мощный и в то же время простой инструмент. Подключается всего одной директивой и выступает прекрасным примером принципа Progressive enhancement: если браузер не поддерживает директиву, то ничего не развалится, сайт останется функциональным.
Пара советов по использованию:
- Если у вас простой сайт и все переходы стандартизированы, удобно описать их в глобальном стилевом файле.
- Если хотите использовать разные переходы для разных страниц в иерархии, описывайте их в стилевых файлах соответствующих страниц.
- Переходы отдельных элементов подчиняются той же логике: общие для всех страниц — в глобальном стилевом файле, специфичные — рядом с местом использования.
- Заботьтесь о своих пользователях: не пичкайте красивостями пользователей, которым они не нужны, и проверяйте корректность анимаций на разных устройствах.