Что нового в переходах между видами? (Обновление Google I/O 2024)

Опубликовано: 16 мая 2024 г.

На конференции Google I/O 2024 я анонсировал следующий шаг в области переходов между представлениями: переходы между представлениями документов для многостраничных приложений (MPA).

Вдобавок к этому я поделился некоторыми улучшениями, которые позволят вам проще работать с переходами между видами в целом.

  • Совместное использование стилей анимации между псевдоэлементами перехода вида с помощью view-transition-class .
  • Выборочные переходы между видами с активными типами.

Эти улучшения применяются как к переходам между представлениями одного документа для одностраничных приложений (SPA), так и к переходам между представлениями документов для MPA.

Переходы между представлениями документов для MPA

Browser Support

  • Хром: 126.
  • Край: 126.
  • Firefox: не поддерживается.
  • Сафари: 18.2.

Source

В Chrome 111 команда Chrome реализовала переходы между представлениями одного и того же документа для одностраничных приложений — функцию, хорошо принятую в сообществе разработчиков веб-приложений.

Здорово видеть, что многие из вас создали с помощью переходов между видами. От типичных реализаций, которые «заставляют миниатюру расти в большую фотографию», до высоконастраиваемых иммерсивных впечатлений, таких как этот от Airbnb. Удивительно!

Переход к просмотру одного и того же документа на Airbnb.

Однако первоначальная реализация требовала от вас создания SPA для использования переходов между представлениями. Начиная с Chrome 126 это больше не так, переходы между представлениями теперь включены по умолчанию для навигации с одним и тем же источником. Теперь вы можете создать переход между представлениями между двумя разными документами с одним и тем же источником.

Чтобы включить переходы между представлениями документов, обе стороны должны согласиться. Для этого используйте @view-transition at-rule и установите navigation дескриптор на auto .

@view-transition {
  navigation: auto;
}

Переходы между представлениями документов используют те же строительные блоки и принципы, что и переходы между представлениями одного документа. Элементы с примененным view-transition-name захватываются, и вы можете настраивать анимацию с помощью CSS-анимаций.

Для настройки переходов между представлениями документов используйте события pageswap и pagereveal , которые предоставляют вам доступ к объекту перехода представлений.

  • С помощью pageswap вы можете вносить последние изменения на исходящую страницу прямо перед тем, как будут сделаны старые снимки.
  • С помощью pagereveal вы можете настроить новую страницу до того, как она начнет отображаться после инициализации.

В обоих случаях у вас есть доступ к объекту NavigationActivation для настройки перехода между представлениями документов на основе старых и новых записей истории назначения или типа навигации .

В довершение всего, вы можете дождаться загрузки контента с помощью блокировки рендеринга и положиться на предварительную визуализацию, чтобы сократить время загрузки до начала перехода между представлениями.

Демо

Эта демонстрационная версия Stack Navigator объединяет все эти функции (вместе с некоторыми улучшениями ).

Запись демонстрации Stack Navigator . Он использует переходы между представлениями документов, которые настраиваются в событии pagereveal на основе информации об активации навигации. Также используется предварительная визуализация.

Это MPA с кросс-документными навигациями, размещенными на одном источнике. При использовании pagereveal тип анимации определяется на основе старых и новых записей истории назначения.

window.addEventListener("pagereveal", async (e) => {
  if (e.viewTransition) {
    // Determine animation type based on the old/new history entries
    const transitionClass = determineTransitionClass(navigation.activation.from, navigation.currentEntry);
    document.documentElement.dataset.transition = transitionClass;

    // Cleanup after transition ran
    await e.viewTransition.finished;
    delete document.documentElement.dataset.transition;
  }
});

Прочитать документацию

Дополнительную информацию о том, как активировать и настраивать переходы между представлениями документов, см. в нашей документации по переходам между представлениями документов .


Просмотр улучшений переходов

Помимо поддержки переходов между представлениями документов для MPA, Chrome также включает несколько усовершенствований для работы с переходами представлений в целом.

Эти улучшения применяются как к переходам между представлениями одного документа для SPA, так и к переходам между представлениями документов для MPA.

Поделиться стилями анимации с помощью view-transition-class

Browser Support

  • Хром: 125.
  • Край: 125.
  • Предварительная версия технологии Firefox: поддерживается.
  • Сафари: 18.2.

До сих пор при анимации нескольких снимков одним и тем же способом вам приходилось выбирать каждый снимок по отдельности, повторяя его псевдоселектор для каждого элемента, имеющего уникальное view-transition-name .

С помощью view-transition-class вы теперь можете добавлять общее имя ко всем снимкам. Используйте это общее имя в псевдоселекторах, чтобы нацелиться на все соответствующие снимки. Это приводит к гораздо более простым селекторам, которые автоматически масштабируются от одного до многих элементов.

#cards-wrapper > div {
  view-transition-class: card;
}
html::view-transition-group(.card) {
  animation-timing-function: var(--bounce);
}

В следующем примере карточек view-transition-class используется для применения одинакового времени анимации ко многим снимкам с помощью одного селектора.

Запись демонстрации карт . Используя view-transition-class он применяет одну и ту же animation-timing-function ко всем картам, кроме добавленных или удаленных.

Чтобы узнать больше о view-transition-class , прочтите специальную документацию по view-transition-class .

Выборочные переходы между видами с активными типами

Browser Support

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Сафари: 18.

Другим усовершенствованием переходов представлений является введение добавления типов к переходу представлений при его захвате и выполнении. Это упрощает работу с различными переходами представлений на одной странице, без того, чтобы объявления одного из них изменяли другой.

Например, при переходе на следующую или предыдущую страницу в последовательности страниц вы можете захотеть использовать разные анимации в зависимости от того, переходите ли вы на более высокую или более низкую страницу последовательности.

Запись демо-версии Pagination . Типы определяют, какую анимацию использовать. Стили разделены в таблице стилей благодаря активным типам переходов.

До появления активных типов вы могли добавлять классы в DOM и реагировать на эти классы в CSS. Однако вам также пришлось бы выполнять очистку после завершения переходов.

С типами перехода вида вы можете достичь того же результата, с дополнительным преимуществом в виде автоматической очистки этих типов после завершения перехода вида. Типы применяются только при захвате или выполнении перехода.

Для переходов между представлениями в пределах одного документа передайте types в метод startViewTransition , который теперь принимает объект. update — это функция обратного вызова, которая обновляет DOM, а types — это последовательность строк.

const direction = determineBackwardsOrForwards();

const t = document.startViewTransition({
  update: updateTheDOMSomehow,
  types: ['slide', direction],
}););

Для перехода между представлениями между документами задайте типы в правиле @view-transition с помощью дескриптора types или задайте их «на лету» в событиях pageswap и pagereveal .

@view-transition {
  navigation: auto;
  types: slide, forwards;
}

Установив типы, вы можете реагировать на эти типы в CSS, используя селекторы псевдоклассов :active-view-transition-type() и :active-view-transition которые применяются к корню перехода представления.

/* Animation styles for forwards type only */
html:active-view-transition-type(forwards) {
  &::view-transition-old(content) {
    animation-name: slide-out-to-left;
  }
  &::view-transition-new(content) {
    animation-name: slide-in-from-right;
  }
}

Дополнительную информацию о типах перехода между представлениями см. в специальной документации по переходам между представлениями в рамках одного документа и между представлениями между документами .


Обратная связь

Обратная связь от разработчиков всегда приветствуется. Чтобы сделать это, отправьте сообщение о проблеме в рабочую группу CSS на GitHub с предложениями и вопросами. Добавьте к проблеме префикс [css-view-transitions] .

Если вы столкнулись с ошибкой, отправьте отчет об ошибке Chromium .