задний план
в предыдущем постеИнтеллектуальное использование фильтров для достижения высокоуровневого эффекта мгновенного переключения текста.В , мы уже упоминали об очень интересном анимационном эффекте отображаемого текста Apple.
В этой статье мы расскажем об еще одном интересном эффекте, используя градиенты для достижения высокоуровневой анимации фонового света. Этот эффект относится кОфициальный сайт Apple iPhone 13 Proвводная страница:
выполнить
Этот эффект трудно воспроизвести полностью с помощью CSS. Тень светового эффекта, смоделированная CSS, будет относительно низкой, и можно сказать, что она будет восстановлена в максимально возможной степени.
На самом деле, каждая группа источников света в основном одинакова, поэтому нам нужно реализовать только один из них, и мы можем добиться почти всего эффекта.
Обратите внимание на этот эффект:
Его ядро на самом делеугловой градиент -- conic-gradient()
, с помощью углового градиента можно примерно добиться такого эффекта:
<div></div>
div {
width: 1000px;
height: 600px;
background:
conic-gradient(
from -45deg at 400px 300px,
hsla(170deg, 100%, 70%, .7),
transparent 50%,
transparent),
linear-gradient(-45deg, #060d5e, #002268);
}
Взгляните на эффект:
Вроде того. Конечно, если вы внимательно наблюдаете, цвет градиента заканчивается не от одного цвета к прозрачности, а от цвета А -- прозрачного -- к цвету Б, так что другая половина источника света не будет такой тупой, модифицированный CSS-код:
div {
width: 1000px;
height: 600px;
background:
conic-gradient(
from -45deg at 400px 300px,
hsla(170deg, 100%, 70%, .7),
transparent 50%,
hsla(219deg, 90%, 80%, .5) 100%),
linear-gradient(-45deg, #060d5e, #002268);
}
Мы добавили дополнительный цвет в конце углового градиента, чтобы лучше выглядеть:
эмм, здесь мы найдем, что простоугловой градиент conic-gradient()
Этого недостаточно, он не может имитировать эффект тени от источника света, поэтому он должен использовать другие свойства для достижения эффекта тени от источника света.
Здесь мы, естественно, будем думать оbox-shadow
. Вот трюк, используя несколькоbox-shadow
, чтобы добиться эффекта неоновых огней.
Давайте добавим div для реализации световых теней через него:
<div class="shadow"></div>
.shadow {
width: 200px;
height: 200px;
background: #fff;
box-shadow:
0px 0 .5px hsla(170deg, 95%, 80%, 1),
0px 0 1px hsla(170deg, 91%, 80%, .95),
0px 0 2px hsla(171deg, 91%, 80%, .95),
0px 0 3px hsla(171deg, 91%, 80%, .95),
0px 0 4px hsla(171deg, 91%, 82%, .9),
0px 0 5px hsla(172deg, 91%, 82%, .9),
0px 0 10px hsla(173deg, 91%, 84%, .9),
0px 0 20px hsla(174deg, 91%, 86%, .85),
0px 0 40px hsla(175deg, 91%, 86%, .85),
0px 0 60px hsla(175deg, 91%, 86%, .85);
}
Хорошо, свет есть, но проблема в том, что нам нужен свет только с одной стороны, что нам делать? Есть много способов вырезать, здесь я представляю использованиеclip-path
Метод отсечения любого пространства элементов:
.shadow {
width: 200px;
height: 200px;
background: #fff;
box-shadow: .....;
clip-path: polygon(-100% 100%, 200% 100%, 200% 500%, -100% 500%);
}
Принцип таков:
Таким образом, мы получаем свет с одной стороны:
Тут, собственно, в CSS тоже есть способ добиться односторонних теней (Уловки и детали CSS-теней, о которых вы не знали), но на самом деле эффект не очень хороший, и, наконец, принимается вышеуказанная схема.
Далее, этоИспользуйте позиционирование и вращениеДругими способами, перекрывая вышеуказанный односторонний световой и угловой градиент, мы можем получить такой эффект:
В этот раз уже очень похоже. Следующее, что нужно сделать, это заставить весь узор двигаться. Здесь тоже много приемов.Ядро по-прежнему использует CSS @Property для реализации анимации углового градиента и позволяет перекрывать световую анимацию и угловой градиент.
Нам нужно использовать CSS @Property для преобразования градиента кода.Основной код выглядит следующим образом:
<div class="wrap">
<div class="shadow"></div>
</div>
@property --xPoint {
syntax: '<length>';
inherits: false;
initial-value: 400px;
}
@property --yPoint {
syntax: '<length>';
inherits: false;
initial-value: 300px;
}
.wrap {
position: relative;
margin: auto;
width: 1000px;
height: 600px;
background:
conic-gradient(
from -45deg at var(--xPoint) var(--yPoint),
hsla(170deg, 100%, 70%, .7),
transparent 50%,
hsla(219deg, 90%, 80%, .5) 100%),
linear-gradient(-45deg, #060d5e, #002268);
animation: pointMove 2.5s infinite alternate linear;
}
.shadow {
position: absolute;
top: -300px;
left: -330px;
width: 430px;
height: 300px;
background: #fff;
transform-origin: 100% 100%;
transform: rotate(225deg);
clip-path: polygon(-100% 100%, 200% 100%, 200% 500%, -100% 500%);
box-shadow: ... 此处省略大量阴影代码;
animation: scale 2.5s infinite alternate linear;
}
@keyframes scale {
50%,
100% {
transform: rotate(225deg) scale(0);
}
}
@keyframes pointMove {
100% {
--xPoint: 100px;
--yPoint: 0;
}
}
Таким образом, мы добились полной анимации света:
Давайте реорганизуем шаги для достижения такой анимации:
- Используйте угловые градиенты
conic-gradient
Базовая рамка построена, и здесь также используется несколько градиентов с темным цветом фона за угловым градиентом; - использовать несколько
box-shadow
Реализовать световые и теневые эффекты (также известные как неоновые эффекты) - использовать
clip-path
Обрезать любую область элемента - Анимация градиентов с помощью CSS @Property
Остальная работа заключается в повторении вышеперечисленных шагов, добавлении других градиентов и источников света, отладке анимации и, наконец, мы можем получить вот такой простой эффект симуляции:
Поскольку первоначальный эффект.mp4
, не может получить точный цвет, не может получить параметры тени, в котором цвет напрямую используется образец для выбора цвета, тень моделируется более небрежно, если есть исходный файл и точные параметры, это может быть моделируется более реалистично.
Вы можете нажать здесь для получения полного кода:CodePen -- iPhone 13 Pro Gradient
наконец
Эта статья больше о радости от картинки.На практике должно быть более изящное решение вышеуказанного эффекта, а если использовать CSS симуляцию, то должен быть способ получше. , 3, 4 Некоторые из самих навыков стоит учиться.
Хорошо, это конец этой статьи, я надеюсь, что эта статья поможет вам :)
Если вы хотите получить самую интересную информацию о CSS, не пропустите мой официальный аккаунт --Интересные факты о внешнем интерфейсе iCSS😄
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.