Анимация для переходов на страницах, похожая на нативную

Анимация для переходов на страницах, похожая на нативную

От автора: некоторые из наиболее вдохновляющих примеров, которые я видел во front end разработке, связаны с переходом на страницу. Анимация перехода гладкая, как в мобильных приложениях. Взаимодействий подобного рода можно представить множество, но на посещаемых мной сайтах я их не вижу. Существует несколько способов сделать такую анимацию!

Что мы создадим:

ДЕМО | GITHUB

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

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

Почему?

В последние годы Интернет подвергся критике за появление «датированных» по сравнению с обычными приложениями для iOS и Android. Переход между двумя состояниями может снизить когнитивную нагрузку пользователя, так как при сканировании страницы необходимо создать ментальную карту всего, что содержится на ней. Когда мы переходим со страницы на страницу, пользователь должен переназначить все это пространство. Если элемент повторяется на нескольких страницах, но слегка изменен, он имитирует опыт, к которому мы уже биологически подготовлены – в пространство ничего резко не влетает и не меняется; происходит плавный переход из одного пространства в это. Глаза устроены так, что видимые объекты кажутся меньше вдали. Когда они приближаются к вам, они становятся все больше. Без этих переходов изменения могут быть потрясающими. Они заставляют пользователя перенастраивать размещение и даже понимать один и тот же элемент. Именно по этой причине эти эффекты становятся критическими в опыте, который помогает пользователю чувствовать себя как дома и быстро собирать информацию в Интернете.

Хорошая новость заключается в том, что реализация таких переходов вполне осуществима. Поехали!

Что нужно знать

Если вы не знакомы с Nuxt и как работать с его помощью создавать приложения Vue.js, есть еще одна моя статья. Если вы знакомы с React и Next.js, Nuxt.js является эквивалентом Vue. Он предлагает рендеринг на стороне сервера, разделение кода и, самое главное, перехваты для переходов страниц. Несмотря на то, что переходы с переходом на страницы, которые он предлагает, превосходны, мы не собираемся выполнять основную часть наших анимаций в этом учебнике. У фреймворка есть отличные хуки для переходов по страницам, но мы большую часть анимации реализуем по-другому.

Чтобы понять, как работают переходы, с которыми мы работаем сегодня, вам также понадобятся базовые знания о компоненте <transition /> и понимание разницы между анимациями CSS и переходами. Вам также понадобятся базовые знания о компоненте <transition-group />, и этот пост Snipcart — отличный ресурс, чтобы узнать больше об этом.

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

Начало работы

Сперва необходимо создать Nuxt проект с помощью Vue CLI:

Отлично! Теперь первое, что вы заметите, это то, что у нас есть каталог страниц. Nuxt будет принимать любые файлы .vue в этом каталоге и автоматически настраивать маршрутизацию для нас. Довольно круто. Мы можем создать некоторые страницы для работы здесь, в нашем случае: about.vue и users.vue.

Настройка хуков

Как упоминалось ранее, Nuxt предлагает некоторые перехватчики страниц, которые действительно хорошо подходят для переходов между страницами. Другими словами, у нас есть крючки для входа и выхода страницы. Поэтому, если бы мы хотели создать анимацию, которая позволила бы нам красиво исчезать со страницы на страницу, мы могли бы сделать это, потому что хуки классов уже доступны. Мы даже можем назвать новые переходы на странице и использовать JavaScript-переходы для более продвинутых эффектов.

Но что, если у нас есть какие-то элементы, которые не должны уходить и возвращаться, а скорее должны плавно менять положение? В мобильных приложениях вещи не всегда уходят, когда они перемещаются из состояния в состояние. Иногда они легко переходят из одной точки в другую, и это делает приложение очень жидким.

Шаг 1: Vuex Store

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

Nuxt предположит, что этот файл будет находиться в каталоге store и называется index.js:

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

Шаг 2: промежуточное ПО

Затем в нашем промежуточном ПО нам понадобится скрипт, который я назвал page.js. Он откроет нам доступ к роуту, который меняется и обновляется перед любым из других компонентов, поэтому он будет очень эффективным.

Промежуточное ПО необходимо зарегистрировать в файле nuxt.config.js:

Шаг 3: регистрация навигации

Теперь мы перейдем к нашему файлу layouts / default.vue. Этот каталог позволяет вам устанавливать разные макеты для разных структур страниц. В нашем случае мы не собираемся создавать новый макет, но изменим тот, который мы повторно используем для каждой страницы. Наш шаблон будет выглядеть следующим образом:

И этот nuxt / тег будет вставлять все, что находится в шаблонах на разных страницах. Но вместо повторного использования навигационного компонента на каждой странице мы можем добавить его здесь, и он будет представлен последовательно на каждой странице:

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

Шаг 4: создание перехода в компоненте Navigation

Теперь мы можем создать навигацию, но я также собираюсь использовать этот SVG, чтобы продемонстрировать основные функции, которые мы собираемся реализовать для большего приложения

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

В шаблоне у нас есть обычный nav с nuxt-link, который мы используем для маршрутизации ссылок в Nuxt. У нас также есть класс, который будет обновляться по условию на странице (он будет меняться на .active).

Мы также используем компонент <transition-group> вокруг нескольких элементов, которые будут менять позиции. Компонент <transition-group> немного волшебный, потому что он использует концепции FLIP. Если вы уже слышали о FLIP, вам будет очень приятно услышать это, потому что это действительно эффективный способ анимации в Интернете, но он обычно требуется много вычислений для реализации. Если вы еще не слышали о FLIP, вам, безусловно, будет полезно почитать, чтобы понять, как это работает, и, возможно, что более важно, чтобы сделать такой эффект, вам не придется все это делать!

Ниже представлен CSS. Мы в основном заявляем, как мы хотели бы, чтобы все элементы были размещены в этом «активном» хуке, который мы сделали. Затем мы говорим элементам, что переход применяется, если что-то меняется. Я использую 3D-преобразования, даже если я просто перемещаю что-то вдоль одной оси X или Y, потому что преобразования лучше для производительности, чем top/left/margin для уменьшения отрисовок. А еще я хочу включить аппаратное ускорение.

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

Я хочу отметить, что любые реализации, которые я использую здесь, — это выбор, который я сделал для размещения и перемещения — вы можете создать любой эффект, который вам нравится! Я выбираю SVG здесь, потому что он передает концепцию макета в небольшом количестве кода, но вам не нужно использовать SVG. Я также использую переходы вместо анимации из-за их декларативности: вы, по сути, заявляете: «Я хочу, чтобы это было перегруппировано здесь, когда этот класс переключается в Vue», тем более, что единственной задачей перехода является описание движение во время изменения. Это отлично подходит для нашего случая использования, потому что он очень гибкий. Затем я могу изменить его на любое другое условное размещение, и оно все равно будет работать.

Отлично! Мы получили плавный эффект между страницами, а контент все равно получает легкий плавный переход:

Я добавил один пример с сайта Nuxt, хотел показать, что можно делать внутренние анимации на странице:

GitHub

Хорошо, это работает на маленьком демо. Давайте применим подход к чему-то более реальному. Опять же, есть демо сайт и код.

В такой же концепции:

Название страницы храним в хранилище Vuex

Промежуточное ПО фиксирует мутацию, чтобы хранилище знало, что страница изменилась

Применяем специальный класс к страницам и вкладываем переходы для каждой страницы

Навигация остается единообразной на всех страницах, но меняется положение, и мы применяем переходы

Контент страницы имеет легкий переход, и мы встраиваем некоторые взаимодействия на основе пользовательских событий

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

Это все! Мы сделали все красиво и просто. Также мы используем flexbox, grid и абсолютное позиционирование в относительном контейнере, чтобы убедиться, что все легко переводится на всех устройствах, и у нас очень мало медиа-запросов в этом проекте. В основном я использую CSS для изменений навигации, потому что я могу декларативно изложить размещение элементов и их переходов. Для микро-взаимодействия любого пользовательского события я использую JavaScript и GreenSock, потому что он позволяет мне очень легко координировать много перемещений и стабилизировать transform-origin в браузерах. Однако существует очень много способов реализации. Есть миллион способов, которыми я мог бы улучшить это демо-приложение или использовать эти анимации, это быстрый проект, чтобы показать некоторые возможности в реальном контексте.

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

Автор: Sarah Drasner

Источник: //css-tricks.com/

Редакция: Команда webformyself.

Метки:

Похожие статьи:

Комментарии Вконтакте: