Привет, меня зовут Стивен.
В этом выпуске мы сделаем несколько причудливых спецэффектов, которые имитируют эффект увеличения значка Dock в macOS:
Если просто увеличивать иконку за иконкой, то это на самом деле не сложно. Однако наш стиль заключается в том, чтобы делать это достаточно осторожно. Когда курсор перемещается влево и вправо по одному и тому же значку, это влияет на размер значков слева и справа для достижения очень последовательного эффекта. В этом сложность этого времени. . . .
Хорошо, так что давайте начнем.
Видеоверсия этого урока находится по адресувооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо поДобро пожаловать три подряд внимание!
часть HTML
Откройте редактор CodePen, добавьте несколько значков в часть HTML, здесь я буду использовать смайлики Emoji для представления, добавьте<ul>
метка списка,class
установить какdock
, затем используйте<li>
Возьмите каждый смайлик и наложите на него слой<div>
, классglass
.
Разделы CSS
Затем часть CSS, добавьтеhtml
селектор, чтобы установить базовый размер текста на15px
. Присоединяйсяbody
селектор, будетmargin
иpadding
установить как0
,display
установить какflex
, ширина установлена на100%
,min-height
Минимальная высота установлена на100vh
,overflow
установить какhidden
.
а затем поместите его внизу страницы,align-items
установить какflex-end
.
Присоединяйся.glass
селектор с шириной, установленной на100%
, высота установлена на8rem
, затем установите светло-серый цвет фона,display
установить какflex
,justify-content
установить какcenter
.
Присоединяйся.dock
селектор, центрирование значков и их расположение по горизонтали,list-style
Стиль списка настроен наnone
,margin
иpadding
установить как0
,display
установить какflex
,justify-content
иalign-items
установить какcenter
.
Затем установите стиль значка и добавьте.dock li
Селектор, поскольку здесь используется эмодзи, его можно установить, установивfont-size
чтобы изменить его размер,font-size
установить как6rem
. затем добавьте немногоpadding
, левый и правый настроены на0.5rem
,cursor
Стиль курсора установлен наdefault
Это стрелка по умолчанию.
Что ж, часть стиля почти такая же, следующим шагом будет реализация части со спецэффектами.
Принципы анимации
Во-первых, давайте разберемся в принципе этого эффекта, например, когда мы подводим курсор к четвертому значку, он увеличивается. Кроме того, третья и пятая иконки рядом с ней немного увеличены, а при расположении курсора влево третья иконка увеличивается чуть больше, чем пятая, и наоборот.
Поэтому нам нужно знать, находится ли курсор слева, посередине или справа, когда курсор находится на значке.
часть JavaScript
Перейдите к части JavaScript, сначала используйтеquerySelectorAll()
положить все.dock li
Вернись. Затем пройдите цикл, для каждогоli
Присоединяйсяmousemove
прослушиватель событий.
определить переменнуюitem
, назначенный какe.target
, так как он будет упоминаться несколько раз позже. Тогда вам нужно знать, где значокli
Ширину контейнера определяем переменнойitemRect
, назначенный какitem.getBoundingClientRect()
.
Затем нужно вычислить положение курсора на иконке и определить переменнуюoffset
, назначенный какe.clientX
минусitemRect.left
, поскольку оно может быть отрицательным, положимMath.abs()
, затем разделите наitemRect.width
.
Теперь, когда курсор перемещается влево от значка,offset
подойдет0
, при движении вправоoffset
подойдет1
.
С этим значением мы можем рассчитать увеличение значка. Определите две переменные, которыеprev
иnext
,пройти черезpreviousElementSibling
а такжеnextElementSibling
Получить значок, где находится текущий курсор, предыдущий и следующийli
элемент.
определить другую переменнуюscale
, если я хочу, чтобы значок был самым большим1.6
раз, он назначается как0.6
.
Затем рассчитывается коэффициент увеличения и записывается в переменную CSS соответствующего элемента. в обстановкеprev
Раньше вы должны сначала судить, можете ли вы его получить, потому что, когда курсор находится на первом значке,prev
было быnull
. затем пройтиsetProperty()
, установите коэффициент масштабирования в переменную CSS, я бы установил его равным1
плюсscale
умножить наMath.abs(offset - 1)
,offset - 1
потому что элемент слева теперь устанавливается, поэтомуoffset
Значение противоположно, т.0
к1
изменить на1
к0
.
Затем используйте ту же логику, чтобы установить коэффициент увеличения элемента справа, разница в том, что здесьoffset
Его можно использовать напрямую, и для текущего значка он напрямую установлен на1 + scale
является максимальным значением.
определить сброс--scale
функция с именемresetScale()
, положить всеli
из--scale
сбросить на1
.
Всего есть два места, где эта функция должна выполняться, а именно вmousemove
событие, и когда курсор покидает Dock. новыйmouseleave
прослушиватель событий и выполнитьresetScale()
, Это оно.
С помощью инструментов разработчика взгляните--scale
Перемена:
Во время движения курсора за пределами диапазонаli
из--scale
сбросить на1
, а когда курсор покидает Dock, всеli
из--scale
сбрасываются на1
.
последний шаг
Ну, вот и мы, мы всего в одном шаге.
Вернувшись в раздел CSS, измените настройку размера текста на6rem
умножить наvar(--scale)
, потому что это включает в себя операции, поэтому поместите слойcalc()
.
существует.dock
Инициализация селектора--scale
за1
. есть тест:
Эффект увеличения достигается, но позиционирование немного проблематично. Это не сложно решить, т.position
установить какrelative
. затем вычислитьtop
Смещение относительно увеличенной иконки в порядке. добавить еще немногоtransition
Настройки перехода анимации.
Кстати, давайте сделаем эффект нажатия на иконку с последующей ее загрузкой.Если вам интересно, сделайте паузу на некоторое время и попробуйте реализовать это самостоятельно.
Здесь также очень просто, определить вызываемыйloading
настройки анимации черезtranslateY()
Переместите его вверх и вниз, затем присоединитесь.dock li.loading
селектор, то есть когдаli
имеютloading
При вызове этого класса анимация выполняется и повторяется бесконечно.
Перейдите в раздел JavaScript, добавьтеli
Прослушиватель событий щелчка, а затем добавьте целевой элементloading
этоclass
Вот и все.
Давайте посмотрим на завершенный эффект этого случая
Выше приведено все содержание, которое будет представлено в этом выпуске.
Исходный код для этого случая находится накод спрей.IO/стивен класс/боюсь...
Ваша поддержка-моя мотивация, пожалуйста, обратите вниманиеМинимальный класс CodingStartup, давайте работать вместе!
- Станция Б:space.bilibili.com/451368848
- YouTube: YouTube.com/кодирование начало…
- Самородки:Талант /user/249773…