Этот совет исходит из этой статьи -How to animate box-shadow with silky smooth performance
Эта статья не является дословным переводом, потому что я считаю эту технику очень интересной и полезной, поэтому написала статью.
box-shadow
В нашей работе используется все больше и больше, анимация, сопровождающая тень, более-менее немного. Предположим, у нас есть следующий ящик:
div {
width: 100px;
height: 100px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
Когда я хочу навести курсор, тень окна меняется сbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.3)
Переход кbox-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)
.
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3)
-->box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)
ОК, самый простой способ, конечно:
div:hover {
width: 100px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
Поскольку анимация перехода происходит в двух разных состояниях тени блока, браузер будет постоянно перерисовывать тень блока во время анимации перехода. И поскольку тень — это стиль, интенсивно использующий производительность, эта анимация кажется несколько застрявшей.
Вот небольшой трюк, чтобы оптимизировать анимацию теней в этом случае.
Оптимизировано с помощью псевдоэлементов и прозрачности
Используя псевдоэлементы и прозрачность для оптимизации, мы добавляем к вышеприведенному элементу псевдоэлемент before, размер такой же, как у родительского div, и добавляем к этому элементу заранее требуемое финальное состояние тени блока, но прозрачность элемент равен 0.
div {
position: relative;
width: 100px;
height: 100px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
div::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
opacity: 0;
}
Затем при наведении нам просто нужно установить непрозрачность псевдоэлемента от 0 до 1.
div:hover::before {
opacity: 1;
}
Преимущество этого в том, что фактическое изменение тени на самом деле является только изменением прозрачности, без постоянной перерисовки тени, что эффективно улучшает плавность анимации теней и делает ее более плавной.
Почему прозрачностьopacity
Анимируйте, чтобы сравнитьbox-shadow
Как насчет лучшей производительности для анимации? Вы можете взглянуть на эту таблицу здесь, в которой перечислены эффекты различных преобразований атрибутов при переупорядочении и перерисовке страницы:
Наконец, демо может увидеть:
Демонстрация CodePen — оптимизируйте анимацию тени блока
Проблемы, другое решение
Приведенная выше схема в исходном тексте на самом деле не идеальна, потому что окончательный эффект — это наложение двух теней, что может сделать цвет тени немного темнее в общем ощущении.
Поэтому необходимо тонко настроить тень конечного состояния, немного ослабить эффект и попытаться сделать эффект наложения двух теней похожим на эффект одиночной тени.
Конечно, мы можем еще раз оптимизировать приведенную выше схему, воспользуемся другим::after
псевдоэлемент,::after
Псевдоэлемент устанавливается в исходное состояние с прозрачностью 1,::before
Псевдоэлемент устанавливается в конечное состояние с прозрачностью 0:
div {
position: relative;
width: 100px;
height: 100px;
}
div::before {
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
opacity: 0;
}
div::after {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
При фактическом наведении два псевдоэлемента отображаются и скрываются, так что конечный эффект имеет только один эффект тени, и нет наложения теней, что согласуется с эффектом прямого перехода тени:
div:hover::before {
opacity: 1;
}
div:hover::after {
opacity: 0;
}
Демонстрация CodePen — оптимизируйте анимацию тени блока
наконец
Ну вот и конец этой статьи, надеюсь она вам поможет :)
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.