задний план
Я обычно захожу в Apex дома по выходным, готовый сыграть в несколько игр. В процессе посадки ускорителя обнаружилось, что срок службы ускорителя истек.
я использовалУскоритель онлайн-игр Tencent, Однако, когда вы нажимаете кнопку перезарядки, выдается сообщение о том, что клиент был недавно обновлен, и перезарядка в настоящее время не поддерживается (эта операция меня шокировала~). Просто развернитесь, чтобы скачатьАкселератор NetEase UU.
Откройте домашнюю страницу UU Accelerator, и вы увидите эту картинку:
В одно мгновение меня привлекло его фоновое изображение.
Из чувствительности к CSS я вслепую догадался, что это реализовано с помощью CSS, по крайней мере, это должен быть Canvas. Откройте консоль, немного разочарован, это.mp4
документ:
посмотри сноваNetwork
панель, это.mp4
Файлу действительно нужно 3,5М?
Эмм, я больше не хочу играть в игры.Разве CSS не может обработать такое фоновое изображение??
Эффект межзвездного 3D-шаттла с использованием CSS 3D
Этот трюк, яПричудливые 3D-анимации CSS | Насколько удивительно вы можете создавать анимации, используя только CSS?Это также было упомянуто, и вы можете взглянуть на это, если вам интересно.
Предположим, у нас есть такой график:
Поместите эту картинку как запасную. Прежде чем использовать этот график, мы нарисуем такой график:
<div class="g-container">
<div class="g-group">
<div class="item item-right"></div>
<div class="item item-left"></div>
<div class="item item-top"></div>
<div class="item item-bottom"></div>
<div class="item item-middle"></div>
</div>
</div>
body {
background: #000;
}
.g-container {
position: relative;
}
.g-group {
position: absolute;
width: 100px;
height: 100px;
left: -50px;
top: -50px;
transform-style: preserve-3d;
}
.item {
position: absolute;
width: 100%;
height: 100%;
background: rgba(255, 255, 255, .5);
}
.item-right {
background: red;
transform: rotateY(90deg) translateZ(50px);
}
.item-left {
background: green;
transform: rotateY(-90deg) translateZ(50px);
}
.item-top {
background: blue;
transform: rotateX(90deg) translateZ(50px);
}
.item-bottom {
background: deeppink;
transform: rotateX(-90deg) translateZ(50px);
}
.item-middle {
background: rgba(255, 255, 255, 0.5);
transform: rotateX(180deg) translateZ(50px);
}
Всего установлено 5 дочерних элементов, но если внимательно посмотреть на код CSS, то установлено 4 из них.rotateX/Y(90deg/-90deg)
, то есть он повернут на 90° вокруг оси X или оси Y, которая визуально является плоскостью, перпендикулярной экрану, поэтому визуально мы ее не видим, видна только одна плоскость..item-middle
.
Я установил разные цвета фона для 5 подэлементов, и результаты следующие:
Теперь это кажется ничем не примечательным, и это так.
Однако пришло время засвидетельствовать чудо, в это время мы отдаем родительский элемент.g-container
установить минимальныйperspective
, например, установкаperspective: 4px
, и посмотрите на эффект:
.g-container {
position: relative;
+ perspective: 4px;
}
// ...其余样式保持不变
В этот момент стиль рисования резко изменился, и весь эффект стал таким:
из-заperspective
Когда это вступает в силу, исходный плоский эффект становится трехмерным. Затем мы используем карту звездного неба, подготовленную выше, заменяем цвет фона выше и заменяем их все одним и тем же изображением, и происходит волшебство:
из-за набораperspective
очень ниже, и каждый пунктtransform: translateZ(50px)
Настройка относительно большая, поэтому картинка визуально очень сильно вытянута. Но целое заполняет весь экран.
Далее нам просто нужно сдвинуть перспективу, добавить анимацию к родительскому элементу и управлять его перемещением.translateZ()
Внесите изменения в:
.g-container{
position: relative;
perspective: 4px;
perspective-origin: 50% 50%;
}
.g-group{
position: absolute;
// ... 一些定位高宽代码
transform-style: preserve-3d;
+ animation: move 8s infinite linear;
}
@keyframes move {
0%{
transform: translateZ(-50px) rotate(0deg);
}
100%{
transform: translateZ(50px) rotate(0deg);
}
}
Смотрите, эффект волшебного и чудесного звездного неба выходит, Удивительно:
Ложка дегтя в том, что анимацию нельзя подключать бесконечно, и в начале и в конце возникают большие проблемы.
Конечно, это нас не останавливает, мы можем:
- При наложении двух наборов одного и того же эффекта один из них более негативен, чем другой.
animation-delay
Переместиться вперед, чтобы два набора анимаций были связаны (один набор заканчивается, когда другой набор все еще движется) - Потом через смену прозрачности скрыть его
item-middle
Внезапность встречного - Наконец, вы можете передать фильтр родительского элемента
hue-rotate
Управление изменением цвета изображения
Мы пытаемся изменить структуру HTML следующим образом:
<div class="g-container">
<div class="g-group">
<div class="item item-right"></div>
<div class="item item-left"></div>
<div class="item item-top"></div>
<div class="item item-bottom"></div>
<div class="item item-middle"></div>
</div>
<!-- 增加一组动画 -->
<div class="g-group">
<div class="item item-right"></div>
<div class="item item-left"></div>
<div class="item item-top"></div>
<div class="item item-bottom"></div>
<div class="item item-middle"></div>
</div>
</div>
Модифицированный базовый CSS выглядит следующим образом:
.g-container{
perspective: 4px;
position: relative;
// hue-rotate 变化动画,可以让图片颜色一直变换
animation: hueRotate 21s infinite linear;
}
.g-group{
transform-style: preserve-3d;
animation: move 12s infinite linear;
}
// 设置负的 animation-delay,让第二组动画提前进行
.g-group:nth-child(2){
animation: move 12s infinite linear;
animation-delay: -6s;
}
.item {
background: url(https://z3.ax1x.com/2021/08/20/fLwuMd.jpg);
background-size: cover;
opacity: 1;
// 子元素的透明度变化,减少动画衔接时候的突兀感
animation: fade 12s infinite linear;
animation-delay: 0;
}
.g-group:nth-child(2) .item {
animation-delay: -6s;
}
@keyframes move {
0%{
transform: translateZ(-500px) rotate(0deg);
}
100%{
transform: translateZ(500px) rotate(0deg);
}
}
@keyframes fade {
0%{
opacity: 0;
}
25%,
60%{
opacity: 1;
}
100%{
opacity: 0;
}
}
@keyframes hueRotate {
0% {
filter: hue-rotate(0);
}
100% {
filter: hue-rotate(360deg);
}
}
Окончательный полный эффект выглядит следующим образом: эффект шаттла звездного неба, вся анимация связана от конца к концу, может продолжаться вечно, почти без недостатков, очень похвально:
Полный код выше, вы можете ударить здесь:Вдохновение CSS — космический шаттл с 3D-эффектом
Таким образом, мы в основном восстанавливаем то, что видели выше.Акселератор NetEase UUАнимированный фон для главной страницы.
Идя дальше, я не хочу использовать одно изображение
Конечно, здесь по-прежнему будут жаловаться читатели, разве вы не используете здесь ресурс с картинками? Разве это не сработало бы без этой карты звездного неба? Я даже не могу найти эту картинку.
Конечно, CSS YYDS. Здесь мы пытаемся использоватьbox-shadow
, чтобы заменить актуальную звездную карту, также вdiv
Реализовано внутри тега с помощью функции цикла SASS:
<div></div>
@function randomNum($max, $min: 0, $u: 1) {
@return ($min + random($max)) * $u;
}
@function randomColor() {
@return rgb(randomNum(255), randomNum(255), randomNum(255));
}
@function shadowSet($maxWidth, $maxHeight, $count) {
$shadow : 0 0 0 0 randomColor();
@for $i from 0 through $count {
$x: #{random(10000) / 10000 * $maxWidth};
$y: #{random(10000) / 10000 * $maxHeight};
$shadow: $shadow, #{$x} #{$y} 0 #{random(5)}px randomColor();
}
@return $shadow;
}
body {
background: #000;
}
div {
width: 1px;
height: 1px;
border-radius: 50%;
box-shadow: shadowSet(100vw, 100vh, 500);
}
Здесь мы оборачиваем функцию в SASS, которая использует несколькоbox-shadow
Функция генерации входящего количества точек в пределах высоты и ширины входящего размера.
Таким образом, мы можем получить такую картинку, которая используется для замены фактической карты неба:
Давайте заменим приведенное выше изображение настоящей картой звездного неба, в основном для замены.item
Этот класс, перечислите только измененную часть:
// 原 CSS,使用了一张星空图
.item {
position: absolute;
width: 100%;
height: 100%;
background: url(https://z3.ax1x.com/2021/08/20/fLwuMd.jpg);
background-size: cover;
animation: fade 12s infinite linear;
}
// 修改后的 CSS 代码
.item {
position: absolute;
width: 100%;
height: 100%;
background: #000;
animation: fade 12s infinite linear;
}
.item::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 1px;
height: 1px;
border-radius: 50%;
box-shadow: shadowSet(100vw, 100vh, 500);
}
Таким образом, мы добились такого эффекта, используя чистый CSS для достижения вышеуказанного эффекта, не прибегая к дополнительным ресурсам:
CodePen Demo -- Pure CSS Galaxy Shuttle 2
Регулируя время анимации,perspective
значение каждой группы элементовtranslateZ()
Изменяя расстояние, вы можете получить множество различных видов и эффектов.Заинтересованные читатели могут попробовать это на основе ДЕМО, которое я дал выше.
наконец
Хорошо, это конец этой статьи, я надеюсь, что эта статья поможет вам :)
Если вы хотите получить самую интересную информацию о CSS, не пропустите мой официальный аккаунт --Интересные факты о внешнем интерфейсе iCSS😄
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.