Создание анимированного компонента навигации на сайте
Существует множество классных готовых компонентов навигации. А что насчёт своего собственного? Разбираемся, как создать такой с помощью Vue.js и TweenMax.
7К открытий7К показов
В данной статье вы научитесь создавать навигационную панель с анимированными кнопками-иконками. Вдохновением послужил этот пример. Конечный результат:
Подготовка
Основная часть работы выполняется в Vue.js, а для анимации используется TweenMax.
Не забудьте добавить эту ссылку для импорта иконок Font Awesome:
Начальная разметка
Начнём с HTML. Для этого компонента потребуются только контейнер и кнопки. Для кнопок будут использоваться иконки Font Awesome. Они немного отличаются от иконок в оригинальном примере, но это не страшно.
В итоге у вас должно получиться четыре иконки. Самое время заняться их оформлением.
Оформление
Задайте цвет фона в контейнере. Для начала пусть будет чёрный. В дальнейшем вы сможете изменить этот цвет. Используйте flex
и justify-content
для выравнивания элементов по горизонтали и отступы (padding
) для выравнивания по вертикали.
Расположите кнопки друг рядом с другом через тег inline-block
.
Задайте размер кнопок, их содержимое и цвета по умолчанию. Затем придайте им круглую форму через border-radius
и примените несколько правил для выравнивания:
Результат:
Поведение
В экземпляре Vue объявите данные, которые будут использоваться в компоненте. С помощью выбора цвета подберите цвета для кнопок и фона. Чтобы дальше в коде ссылаться на цвета, добавьте их в структуру экземпляра:
Объявите переменную, к которой будет применяться текущий цвет фона, и задайте идентификатор выбранной кнопки.
Поскольку внутри массива кнопок сохраняются данные по иконкам, то можно подкорректировать HTML для рендеринга кнопок через директивы v-for
и большей динамичности кода.
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Цвет фона в коде уже привязан к стилю div
в btn-container
.
Обратите внимание, что в код добавлен обработчик @click
. Он запускает функцию selectButton()
. Кроме того, в коде присутствует атрибут ref
, благодаря которому можно ссылаться на кнопки при создании их анимации.
Нажатие на кнопку
Для начала объявите метод selectButton()
для экземпляра Vue:
Каждый раз при нажатии кнопки атрибут selectedId
будет изменять своё значение в диапазоне от 0 до 3. Однако это никак не отразится на текущем компоненте.
Анимация кнопок начинается с самого простого — изменения цвета фона. Для этого нужно создать вычисляемое свойство, в которое будет попадать информация о выборе кнопки. Затем, на основании этих данных, будет меняться цвет фона.
После изменения selectedId
потребуется возврат к исходному цвету элемента.
Теперь при нажатии на кнопку меняется цвет фона.
Анимация кнопок
Анимировать кнопки не так уж просто. Для начала сохраните две ссылки: на уже выбранную (активную) кнопку и ту, которая будет выбираться далее.
Это делается через добавление $refs
с индексом выбранной кнопки. Данный атрибут добавляется перед строкой, описывающей следующую кнопку:
После того как вы пропишете ссылки, необходимо запустить несколько методов: 1) для деактивации предыдущей кнопки и 2) для активации следующей кнопки:
Перед тем как садиться за написание кода, продумайте все детали анимации. Gif-анимацию кнопки можно разделить на две составляющие:
- Цвет кнопки и иконки.
- Ширина кнопки.
Переход цветов предельно прост. Если кнопка неактивна, то цвет фона — белый. При выборе кнопки цвет берётся из свойства color
. Для иконки цвет меняется с серого на белый.
Интересный момент связан с анимацией ширины кнопки. При изменении своего состояния кнопка становится «эластичной», то есть либо сужается, либо растягивается.
Визуализатор GSAP позволяет подобрать наиболее точные цвета переходов.
Теперь добавьте код для методов animateIn()
и animateOut()
:
Остался последний штрих. При запуске приложения все кнопки должны быть невыбранными. Это делается через вызов метода selectButton()
внутри хука mounted()
:
Готово! Конечный результат можно увидеть на CodePen.
7К открытий7К показов