Я до этого смотрел много обучающих видео, и большинство лекторов давали общее введение, а потом начинали бессмысленно прививать знания. Так было до тех пор, пока я позже не увидел видео отличного лектора, чей режим лекции заключался в том, чтобы показать результаты в первом классе. Таким образом, когда я вижу окончательный эффект, у меня есть намерение продолжать изучать эту вещь.
Сегодня буду следовать модели этого лектора, особо нечего сказать, эффект будет ~~
1. Простая градиентная анимация
2. Чуть более сложная анимация ключевых кадров
3. Комбинируйте преобразование для достижения эффекта 3D-анимации.
Выглядит нормально, и этому очень легко научиться.
Тогда давайте поиграем шаг за шагом~~
transition
transition даcss3
Одна из изюминок , он обычно имеет следующие атрибуты:
-
transition-property--Укажите имя свойства CSS, которое задает эффект перехода
-
transition-duration--Укажите, сколько секунд или миллисекунд требуется для завершения эффекта перехода
-
transition-timing-function- кривая скорости указана эффект скорости
- transition-delay--определяет, когда начинается эффект перехода
Примерный код выглядит следующим образом, опуская часть кода:
button {
...
background-color: red;
transition-property: opacity, background-color, border-radius; /* 列表以逗号分隔 */
transition-duration: 0.5s;
transition-timing-function: ease; /* 默认速度效果 */
transition-delay: 1s;
...
}
button:hover {
...
opacity: 0.3; background-color: #fff000;
border-radius: 100px;
...
}
Конечно, это немного громоздко писать, конечно можно упростить:
button {
background-color: red;
transition: opacity 0.5s 1s ease, background-color 0.5s 1s ease, border-radius 0.5s 1s ease;
}
Каждая запятая в приведенном выше коде разделяет 4 параметра: свойства CSS, время перехода, время начала паузы и кривую скорости. Кажется, это немного хлопотно:
button {
...
background-color: red;
transition: all 0.5s 1s ease;
...
}
Разве это не выглядит намного проще? Потому что в большинстве случаев различные эффекты нашей анимации вообще выполняются в одно и то же время и исчезают в одно и то же время.Если время другое, то каким будет эффект?
transition: opacity 0.5s 1s ease, background-color 1.5s 2s linear, border-radius 0.5s cubic-bezier(0.215, 0.610, 0.355, 1);
Таким образом, мы можем использоватьall
поставить все тот же эффектcss
Атрибуты заменены~
Хи-хи, разве это не выглядит хорошо, а код лаконичен?
дляtransition-timing-function
Здесь я рекомендую очень полезный веб-сайт для всех, вы можете свободно отлаживать кривую скорости Безье, которую хотите, нажмите GO! Проверьте эффект. Скопируйте верхний код, и вы можете использовать свой код~
Кликните сюда: Я тоже посмотрю на эффект!
animation + @keyframes
- animation-name — указывает имя ключевого кадра, который необходимо привязать к селектору.
- анимация-длительность — указывает время, необходимое для завершения анимации, в секундах или миллисекундах.
- анимация-время-функция - определяет кривую скорости анимации
- анимация-задержка — указывает задержку перед запуском анимации
- анимация-итерация-счетчик — указывает, сколько раз должна воспроизводиться анимация
- анимация-направление - указывает, должна ли анимация воспроизводиться в обратном порядке по очереди
- animation-play-state -- свойство paused|running указывает, запущена анимация или приостановлена
Написание одного за другим все еще будет немного сложным, так что вот окончательный эффект кода~
button{
animation: ani 5s 2s infinite ease;
}
@keyframes ani {
20%{ opacity: 0.3; }
40%{ border-radius: 100px; }
60%{ background-color: #fff000; }
}
здесьkeyframes
как если бы вы объявили функцию анимации,ani
имя вашей функции.animation
просто иди к этомуbutton
для выполнения функции. 5 параметров представляют имя функции анимации, время перехода, время начала паузы и количество анимаций (infinite
представляет бесконечность), кривая скорости.
анимация+преобразование 3d анимация
Наконец-то настал самый волнующий момент. Простая анимация, приведенная выше, может быть знакома большинству людей, но 3D-анимация все еще может использоваться некоторыми людьми. Она включает в себя некоторые 3D-идеи и может быть более абстрактной для детской обуви. Но сегодня мы немного научимся. На самом деле все просто~
Нечего сказать, если мы хотим реализовать куб, конечно, нам нужно 6 плоскостей? (эмммм это не ерунда, детсад будет);
Босс, дайте мне шесть разноцветных дивов!
<p>客观,您要的div:</p>
<div class="aniBox">
<div class="ani1"></div>
<div class="ani2"></div>
<div class="ani3"></div>
<div class="ani4"></div>
<div class="ani5"></div>
<div class="ani6"></div>
</div>
.aniBox {
width: 220px;
height: 220px;
}
.aniBox>div {
width: 100%;
height: 100%;
}
.ani1 {
background: #4879dc;
}
.ani2 {
background: #3bd168;
}
.ani3 {
background: #e31653;
}
.ani4 {
background: #1ed3eb;
}
.ani5 {
background: #e9c80f;
}
.ani6 {
background: #821fd3;
}
Хорошо, приглашенный офицер, это ваш div, я помещу его в большой div, чтобы вы установили~~
Вот рендеринг. . . .
? ? ?
Эмммм босс, они все вылезли из мешка, заверните их для меня~~
.aniBox {
position: relative;
width: 220px;
height: 220px;
}
.aniBox>div {
position: absolute;
width: 100%;
height: 100%;
}
Итак, соедините все 6 div вместе, начните делать 6 граней, используйте transform для поворота и смещения.
Красный посередине можно представить плоскость документооборота. Теперь нужно переместить первую грань вперед на половину расстояния:
.ani1 {
background: #4879dc;
transform: translateZ(110px) /*前*/
}
Эй, кажется, ничего не изменилось, я ясно#4879dc
Цвет переместился на передний план? После некоторых исследований я наконец нашел атрибут transform-style: save-3d, который указывает, как отображать вложенные элементы в трехмерном пространстве. Он должен быть установлен на родительском элементе, и у родительского элемента есть трансформация (то есть есть деформация), и у дочернего элемента тоже должна быть трансформация (трансформация), чтобы увидеть эффект.
- transform-style: flat -- дочерние элементы не сохранят свое трехмерное положение.
- transform-style: save-3d — дочерние элементы сохранят свое трехмерное положение.
┗|`O′|┛ 嗷~~ Это поймёт:
.aniBox {
position: relative;
transform-style: preserve-3d;
width: 220px;
height: 220px;
}
Хахаха, это работает.
OK! Начните с остальных пяти сторон~~~
.ani2 {
background: #3bd168;
transform: translateZ(-110px) /*后*/
}
.ani3 {
background: #e31653;
transform: rotateY(90deg) translateZ(110px) /*右*/
}
.ani4 {
background: #1ed3eb;
transform: rotateY(-90deg) translateZ(110px) /*左*/
}
.ani5 {
background: #e9c80f;
transform: rotateX(90deg) translateZ(110px) /*上*/
}
.ani6 {
background: #821fd3;
transform: rotateX(-90deg) translateZ(110px) /*下*/
}
Эй, кажется, он заблокирован и не видит никакого эффекта~~~ Забудьте об этом, давайте сыграем прямо на консоли:
Ха-ха, получилось, вроде эффектно, ладно, давайте добавим ему анимацию~~
.aniBox {
position: relative;
margin: 30px auto;
transform-style: preserve-3d;
width: 220px;
height: 220px;
animation: box-3d 5s infinite;
}
@keyframes box-3d {
100% {
transform: rotateX(360deg) rotateZ(-720deg)
/* 让他的结束角度 都为360的整数倍,这样他就可以看起来无缝衔接 */
}
}
Эй, эта анимация кажется быстрой, а потом медленной? Добавьте линейку, чтобы она выглядела однородной:
.aniBox {
animation: box-3d 5s infinite linear;
}
Я думал, что все кончено, но всегда чувствовал, что что-то не так. Я искал в Интернете и нашел, о ~ ~ есть еще почти большой, очень маленький эффект!
- перспектива --property определяет расстояние в пикселях от 3D-элемента до вида. Это свойство позволяет изменить представление 3D-элемента 3D-элемента. Когда свойство перспективы определено для элемента, его дочерние элементы получают эффект перспективы, а не сам элемент.
Emmmm онлайн заявление трудно понять. Я объясню это вам своими собственными мыслями.
Я думаю о перспективе как о расстоянии от центра дома до человека перед ним. (Эм~~ Я все еще не понимаю, забудьте, поместите это на картинку выше!)
это куб, который вы можете принять за размер вашей комнаты, иperspective
Вы можете принять его как расстояние между этим красным лицом и лицом ABCD.
Так как это комната, вам нужно упаковать этот куб ~:
<div class="perBox">
<div class="aniBox">
<div class="ani1"></div>
<div class="ani2"></div>
<div class="ani3"></div>
<div class="ani4"></div>
<div class="ani5"></div>
<div class="ani6"></div>
</div>
</div>
.perBox { perspective: 800px;}
Это намного более трехмерно? ? ? ?
Что не работает? ? ?
Это легко сделать, подумай, добавь чашку и поставь ее посреди комнаты, а ты стоишь у оконного стекла дома.Чем меньше дом, тем конкретнее ты выглядишь? Хорошо, давайте сделаем дом меньше!
.perBox { perspective: 400px;}
О-о-о-о~~ Он достаточно трехмерный! ?
Что вы хотите видеть внутри этой коробки? Ширина этого div220px
, половина110px;
Тогда, пока мы меньше, чем110px
, ты можешь заглянуть внутрь? попробуй~~
.perBox { perspective: 100px;}
,
Хахаха, у тебя кружится голова? Нет ощущения горения видеокарты! ! ! ?
Сожги свой GPU!
Это все для нашей анимации, давайте посмотримperspective
Совместимость этой вещи:
О нет~ страшно.
Прикрепил несколько забавных демонстраций: