Ключевые кадры и анимация в CSS. Свойства анимации. 3D трансформации. Сдвиг и перспектива

А читатели моего telegram - канала узнают все новости и полезности самыми первыми.
А читатели моего telegram - канала узнают все новости и полезности самыми первыми.

Продолжаем постигать всеми любимый CSS и его возможности. Я постигаю его вместе с вами, а написание статьи хорошо закрепляет изученный материал.

Итак, анимация в CSS позволяет элементу постепенно измениться с одного стиля к другому. Вы можете изменять множество CSS свойств столько раз, сколько вы хотите. Ключевые кадры содержат стили, которые будут иметь элементы в определенное время
При определении стилей CSS внутри правила @keyframes, анимация постепенно изменится от текущего стиля к новому стилю в определенное время.
Чтобы получить работающую анимацию, вам необходимо связать анимацию с элементом.

Ключевые кадры содержат стили, которые будут иметь элементы в определенное время. В примере ниже, анимация длится 3 секунды и изменяет зеленый фоновый цвет класса animation на красный и голубой три раза: когда анимация выполнена на 50%, на 70%, и когда анимация будет выполнена на 100%.

<style> .animation { width: 100px; height: 100px; background-color: rgb(5, 136, 75); animation-name: color; animation-duration: 3s; } @keyframes color { 0% { background-color: rgb(5, 136, 75); } 50% { background-color: rgb(187, 60, 56); } 100% { background-color: rgb(0, 145, 255); } } </style> <body> <div class="animation"></div> </body>


color это название анимации. Вы можете использовать любое имя для вашей анимации. Вставьте этот код в свой редактор и поэксперементируйте с цветами и временем.

В качестве альтернативы использования процентов, вы можете использовать ключевые слова from и to , где:
from это значение начинающееся с 0%
to это значение заканчивающееся на 100%.

Например, оба примера выводят один и тот же результат:

@keyframes color { 0% { background-color: rgb(5, 136, 75); } 50% { background-color: rgb(187, 60, 56); }

Или:

@keyframes color { from { background-color: rgb(5, 136, 75); } to { background-color: rgb(187, 60, 56); }

Чтобы анимация работала, вам необходимо связать анимацию с элементом.

Теперь перейдем к изучению свойств animation.

animation-name определяет какую анимацию использовать.

animation-name: color;

Свойство animation-duration определяет длительность выбранных анимаций в секундах.

animation-duration: 3s;

Если свойство animation-duration не было определено, то анимация не будет воспроизведена, потому что значением по умолчанию длительности является 0.

animation-delay - определяет задержку до начала анимации.

Значения animation-delay и animation-duration могут быть определены в секундах (s) или миллисекундах (ms).

animation-timing-function определяет кривую скорости анимации. Может иметь следующие значения:ease - анимация начинается медленно, затем быстро, затем медленно заканчивается (по умолчанию), linear - анимация с одинаковой скоростью от начала и до конца, ease-in - анимация с медленным началом, ease-out - анимация с медленным концом, ease-in-out - анимация с медленным началом и концом, cubic-bezier(n,n,n,n) - позволяет вам определять собственные значения в функции cubic-bezier.

Свойство animation-iteration-count определяет количество повторов анимации. Infinity - бесконечно количество раз. Если вы используете 0 или отрицательное число для animation-iteration-count, то анимация никогда не начнется.

animation-direction указывает, как ключевой кадр должен быть применен. Значениями могут быть: normal - значение по умолчанию, что значит, что оно выполняется от 0 % до 100%. reverse - анимация выполняется в обратном направлении от 100 % до 0%. alternate - анимация выполняется вперед, затем обратно, затем снова вперед. alternate reverse - анимация сначала выполняется в обратном направлении, затем вперед, затем снова в обратном направлении.

Разберем как можно сократить код, посмотрите пример ниже:

div { animation-name: color; animation-duration: 3s; animation-timing-function: ease-in; animation-delay: 2s; animation-iteration-count: infinite; animation-direction: normal; }

А теперь сокращаем:

div { animation: color 3s ease-in 2s infinite normal; }

3D трансформации.
Вместе с осями x и y, 3D Трансформация представляет ось-Z, которая позволяет 3D манипуляции.

3D Трансформация похожа на 2D Трансформацию:rotateX(), rotateY() и rotateZ() вращают элемент в 3-х мерном пространстве вокруг соответствующих осей и с заданным градусом.

div.X { transform: rotateX(150deg); } div.Y { transform: rotateY(150deg); } div.Z { transform: rotateZ(150deg); }

Вы можете выключить все трансформации, примененные к элементу, используя функцию none: transform: none;

Сдвиг.

Методы 3D сдвига позволяют вам передвигать элементы горизонтально (translateX), вертикально (translateY) и к или от экрана (translateZ), используя любые единицы длины (px, em, %, и т.д.). Положительные значения сдвигают элемент к зрителю, а отрицательные – от него.

#box { transform: translateX(30px) translateY(4em) translateZ(-12px); }

Скопируйте и посмотрите код на практике, чтобы сравнить результат до сдвига и после сдвига.

Метод translate3d() позволяет вам передавать значения x, y, и z, все за один раз, следующим образом:

#box { transform: translate3d(-22px, 4em, 10px); }

Также, как и в методе translate3d(), существуют также scale3d() и rotate3d(), которые применяются для масштабирования и вращения элементов в 3D.

Сдвиг элемента похож на косвенное позиционирование - он не влияет на поток документа. Сдвинутый элемент оставит свое положение в потоке и появится только для перемещения.

Перспектива.

Перспектива определяет глубину воспроизведения 3D сцены. Представляйте себе перспективу, как расстояние от зрителя до объекта. Чем больше значение, тем больше расстояние и меньше интенсивность визуального эффекта. При определении свойства perspective для элемента, перспективный вид получают именно дочерние элементы, а не сам элемент.

div.yellow { perspective: 100px; } div.red { transform: rotateX(45deg); }

Свойство perspective влияет только на трансформированные 3D элементы.

Испытывайте эти свойства на практике, внедряйте в свои проекты, чтобы оживить их. Также мы можем реализовать анимации через JavaScript, что я и планирую изучать дальше и делиться полученными знаниями с Вами.

Начать дискуссию
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"


color это название анимации. Вы можете использовать любое имя для вашей анимации. Вставьте этот код в свой редактор и поэксперементируйте с цветами и временем.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"e2ebddba-23a0-541c-ad8d-ed554e083083","width":88,"height":70,"size":24925,"type":"gif","color":"158555","hash":"","external_service":[],"duration":0,"isVideo":false,"has_audio":false}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В качестве альтернативы использования процентов, вы можете использовать ключевые слова from и to , где:
from это значение начинающееся с 0%
to это значение заканчивающееся на 100%.

Например, оба примера выводят один и тот же результат:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@keyframes color {\n0% {\n background-color: rgb(5, 136, 75);\n}\n50% {\n background-color: rgb(187, 60, 56);\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Или:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@keyframes color {\nfrom {\n background-color: rgb(5, 136, 75);\n}\nto {\n background-color: rgb(187, 60, 56);\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Чтобы анимация работала, вам необходимо связать анимацию с элементом.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Теперь перейдем к изучению свойств animation.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

animation-name определяет какую анимацию использовать.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"animation-name: color;","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Свойство animation-duration определяет длительность выбранных анимаций в секундах.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"animation-duration: 3s;","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Если свойство animation-duration не было определено, то анимация не будет воспроизведена, потому что значением по умолчанию длительности является 0.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

animation-delay - определяет задержку до начала анимации.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Значения animation-delay и animation-duration могут быть определены в секундах (s) или миллисекундах (ms).

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

animation-timing-function определяет кривую скорости анимации. Может иметь следующие значения:ease - анимация начинается медленно, затем быстро, затем медленно заканчивается (по умолчанию), linear - анимация с одинаковой скоростью от начала и до конца, ease-in - анимация с медленным началом, ease-out - анимация с медленным концом, ease-in-out - анимация с медленным началом и концом, cubic-bezier(n,n,n,n) - позволяет вам определять собственные значения в функции cubic-bezier.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Свойство animation-iteration-count определяет количество повторов анимации. Infinity - бесконечно количество раз. Если вы используете 0 или отрицательное число для animation-iteration-count, то анимация никогда не начнется.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

animation-direction указывает, как ключевой кадр должен быть применен. Значениями могут быть: normal - значение по умолчанию, что значит, что оно выполняется от 0 % до 100%. reverse - анимация выполняется в обратном направлении от 100 % до 0%. alternate - анимация выполняется вперед, затем обратно, затем снова вперед. alternate reverse - анимация сначала выполняется в обратном направлении, затем вперед, затем снова в обратном направлении.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Разберем как можно сократить код, посмотрите пример ниже:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"div {\n animation-name: color;\n animation-duration: 3s;\n animation-timing-function: ease-in;\n animation-delay: 2s;\n animation-iteration-count: infinite;\n animation-direction: normal;\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

А теперь сокращаем:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"div {\n animation: color 3s ease-in 2s infinite normal;\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

3D трансформации.
Вместе с осями x и y, 3D Трансформация представляет ось-Z, которая позволяет 3D манипуляции.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

3D Трансформация похожа на 2D Трансформацию:rotateX(), rotateY() и rotateZ() вращают элемент в 3-х мерном пространстве вокруг соответствующих осей и с заданным градусом.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"div.X {\n transform: rotateX(150deg);\n}\ndiv.Y {\n transform: rotateY(150deg);\n}\ndiv.Z {\n transform: rotateZ(150deg);\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вы можете выключить все трансформации, примененные к элементу, используя функцию none: transform: none;

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Сдвиг.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Методы 3D сдвига позволяют вам передвигать элементы горизонтально (translateX), вертикально (translateY) и к или от экрана (translateZ), используя любые единицы длины (px, em, %, и т.д.). Положительные значения сдвигают элемент к зрителю, а отрицательные – от него.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#box {\n transform: translateX(30px)\n translateY(4em)\n translateZ(-12px);\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Скопируйте и посмотрите код на практике, чтобы сравнить результат до сдвига и после сдвига.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Метод translate3d() позволяет вам передавать значения x, y, и z, все за один раз, следующим образом:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#box {\n transform: translate3d(-22px, 4em, 10px);\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Также, как и в методе translate3d(), существуют также scale3d() и rotate3d(), которые применяются для масштабирования и вращения элементов в 3D.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Сдвиг элемента похож на косвенное позиционирование - он не влияет на поток документа. Сдвинутый элемент оставит свое положение в потоке и появится только для перемещения.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Перспектива.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Перспектива определяет глубину воспроизведения 3D сцены. Представляйте себе перспективу, как расстояние от зрителя до объекта. Чем больше значение, тем больше расстояние и меньше интенсивность визуального эффекта. При определении свойства perspective для элемента, перспективный вид получают именно дочерние элементы, а не сам элемент.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"div.yellow {\n perspective: 100px;\n}\ndiv.red {\n transform: rotateX(45deg);\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Свойство perspective влияет только на трансформированные 3D элементы.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Испытывайте эти свойства на практике, внедряйте в свои проекты, чтобы оживить их. Также мы можем реализовать анимации через JavaScript, что я и планирую изучать дальше и делиться полученными знаниями с Вами.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

#frontenddeveloper #html #css #javascript #карьера #разработчики #программирование #itтехнологии #it #frontend

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":1,"reposts":0,"views":107,"hits":726,"reads":null,"online":0},"dateFavorite":0,"hitsCount":726,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id1259896/478589-klyuchevye-kadry-i-animaciya-v-css-svoistva-animacii-3d-transformacii-sdvig-i-perspektiva","author":{"id":1259896,"name":"FRONT-END INFO","nickname":null,"description":"Hi there 👋, I'm Liza I'm FrontEnd Developer 👍 I like to write code ⚡ I like to write articles for https://t.me/lizafrontend","uri":"","avatar":{"type":"image","data":{"uuid":"28d75f76-a7e6-5fae-b7d9-d3145d5b8b87","width":466,"height":558,"size":19126,"type":"jpg","color":"a9a6a7","hash":"07332b297064e4c1","external_service":[]}},"cover":null,"achievements":[{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 31 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":5455236,"userId":1259896,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5455236"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4187613,"userId":1259896,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4187613"}],"lastModificationDate":1764917438,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1259896,"name":"FRONT-END INFO","nickname":null,"description":"Hi there 👋, I'm Liza I'm FrontEnd Developer 👍 I like to write code ⚡ I like to write articles for https://t.me/lizafrontend","uri":"","avatar":{"type":"image","data":{"uuid":"28d75f76-a7e6-5fae-b7d9-d3145d5b8b87","width":466,"height":558,"size":19126,"type":"jpg","color":"a9a6a7","hash":"07332b297064e4c1","external_service":[]}},"cover":null,"achievements":[{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 31 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":5455236,"userId":1259896,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5455236"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4187613,"userId":1259896,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4187613"}],"lastModificationDate":1764917438,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":["box","css","frontend","frontenddeveloper","html","it","itтехнологии","javascript","карьера","программирование","разработчики"],"media":null,"customCover":null,"robotsTag":null,"categories":[],"isAnonymized":true}};