HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>2 окт 2025</li>
2 <ul><li>2 окт 2025</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Оживляем веб-страницы без скриптов с помощью CSS.</p>
4 </ul><p>Оживляем веб-страницы без скриптов с помощью CSS.</p>
5 <p>Иллюстрация: Polina Vari для Skillbox Media</p>
5 <p>Иллюстрация: Polina Vari для Skillbox Media</p>
6 <p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
6 <p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
7 <p>CSS-анимации помогают сделать интерфейс живым: кнопки плавно меняют цвет, тексты появляются с эффектом прозрачности, картинки двигаются. Для этого не нужен JavaScript - всё можно описать на чистом CSS.</p>
7 <p>CSS-анимации помогают сделать интерфейс живым: кнопки плавно меняют цвет, тексты появляются с эффектом прозрачности, картинки двигаются. Для этого не нужен JavaScript - всё можно описать на чистом CSS.</p>
8 <p>В этой статье мы создадим первую анимацию с нуля, разберём, как работают ключевые кадры и свойства animation, научимся настраивать скорость, задержку и повторение. Всё будет работать прямо в браузере: достаточно открыть HTML‑файл и посмотреть результат.</p>
8 <p>В этой статье мы создадим первую анимацию с нуля, разберём, как работают ключевые кадры и свойства animation, научимся настраивать скорость, задержку и повторение. Всё будет работать прямо в браузере: достаточно открыть HTML‑файл и посмотреть результат.</p>
9 <p><strong>Содержание</strong></p>
9 <p><strong>Содержание</strong></p>
10 <ul><li><a>Что такое CSS-анимации и в чём их преимущество</a></li>
10 <ul><li><a>Что такое CSS-анимации и в чём их преимущество</a></li>
11 <li><a>Три кита CSS-анимаций: transition, animation, @keyframes</a></li>
11 <li><a>Три кита CSS-анимаций: transition, animation, @keyframes</a></li>
12 <li><a>Создание простой CSS-анимации с нуля</a></li>
12 <li><a>Создание простой CSS-анимации с нуля</a></li>
13 <li><a>Длительность, задержка, плавность и повторение анимации</a></li>
13 <li><a>Длительность, задержка, плавность и повторение анимации</a></li>
14 <li><a>Какие свойства можно анимировать, а какие нельзя</a></li>
14 <li><a>Какие свойства можно анимировать, а какие нельзя</a></li>
15 <li><a>Применение анимаций к псевдоклассам</a></li>
15 <li><a>Применение анимаций к псевдоклассам</a></li>
16 <li><a>Типичные ошибки новичков при работе с CSS-анимациями</a></li>
16 <li><a>Типичные ошибки новичков при работе с CSS-анимациями</a></li>
17 <li><a>Когда лучше использовать CSS-анимации, а когда JavaScript</a></li>
17 <li><a>Когда лучше использовать CSS-анимации, а когда JavaScript</a></li>
18 </ul><p>CSS-анимации позволяют добавлять движение и эффекты к любым элементам на странице - тексту, картинкам, кнопкам и даже формам: элементы могут плавно появляться, исчезать, менять цвет или двигаться.</p>
18 </ul><p>CSS-анимации позволяют добавлять движение и эффекты к любым элементам на странице - тексту, картинкам, кнопкам и даже формам: элементы могут плавно появляться, исчезать, менять цвет или двигаться.</p>
19 <p>Любая анимация состоит из двух частей. Сначала мы задаём, что именно будет происходить с элементом. Например, он станет прозрачным, повернётся или увеличится. Потом описываем ключевые кадры - точки во времени, в которых элемент меняет состояние. Браузер сам плавно воспроизводит переходы между этими кадрами.</p>
19 <p>Любая анимация состоит из двух частей. Сначала мы задаём, что именно будет происходить с элементом. Например, он станет прозрачным, повернётся или увеличится. Потом описываем ключевые кадры - точки во времени, в которых элемент меняет состояние. Браузер сам плавно воспроизводит переходы между этими кадрами.</p>
20 <p>CSS-анимации можно применять почти ко всем HTML-тегам:</p>
20 <p>CSS-анимации можно применять почти ко всем HTML-тегам:</p>
21 <ul><li><strong>Блочным:</strong><a>&lt;div&gt;</a>, &lt;section&gt;,<a>&lt;header&gt;</a>,<a>&lt;footer&gt;</a>,<a>&lt;article&gt;</a>, &lt;main&gt;, &lt;nav&gt;, &lt;aside&gt;,<a>&lt;h1&gt; - &lt;h6&gt;</a>.</li>
21 <ul><li><strong>Блочным:</strong><a>&lt;div&gt;</a>, &lt;section&gt;,<a>&lt;header&gt;</a>,<a>&lt;footer&gt;</a>,<a>&lt;article&gt;</a>, &lt;main&gt;, &lt;nav&gt;, &lt;aside&gt;,<a>&lt;h1&gt; - &lt;h6&gt;</a>.</li>
22 <li><strong>Строчным:</strong>&lt;span&gt;,<a>&lt;a&gt;</a>, &lt;strong&gt;, &lt;em&gt;,<a>&lt;b&gt;</a>, &lt;i&gt;, &lt;small&gt;, &lt;mark&gt;, &lt;code&gt;, &lt;abbr&gt;, &lt;del&gt;, &lt;ins&gt;, &lt;sub&gt;, &lt;sup&gt;, &lt;u&gt;.</li>
22 <li><strong>Строчным:</strong>&lt;span&gt;,<a>&lt;a&gt;</a>, &lt;strong&gt;, &lt;em&gt;,<a>&lt;b&gt;</a>, &lt;i&gt;, &lt;small&gt;, &lt;mark&gt;, &lt;code&gt;, &lt;abbr&gt;, &lt;del&gt;, &lt;ins&gt;, &lt;sub&gt;, &lt;sup&gt;, &lt;u&gt;.</li>
23 <li><strong>Формам:</strong>&lt;input&gt;, &lt;button&gt;, &lt;label&gt;, &lt;textarea&gt;, &lt;select&gt;, &lt;option&gt;.</li>
23 <li><strong>Формам:</strong>&lt;input&gt;, &lt;button&gt;, &lt;label&gt;, &lt;textarea&gt;, &lt;select&gt;, &lt;option&gt;.</li>
24 <li><strong>Медиа:</strong><a>&lt;img&gt;</a>, &lt;video&gt;, &lt;audio&gt;, &lt;picture&gt;.</li>
24 <li><strong>Медиа:</strong><a>&lt;img&gt;</a>, &lt;video&gt;, &lt;audio&gt;, &lt;picture&gt;.</li>
25 <li><a><strong>Спискам</strong></a><strong>:</strong>&lt;ul&gt;, &lt;ol&gt;, &lt;li&gt;.</li>
25 <li><a><strong>Спискам</strong></a><strong>:</strong>&lt;ul&gt;, &lt;ol&gt;, &lt;li&gt;.</li>
26 <li><a><strong>Таблицам</strong></a>(ограниченные возможности): &lt;table&gt;, &lt;tr&gt;, &lt;td&gt;, &lt;th&gt;.</li>
26 <li><a><strong>Таблицам</strong></a>(ограниченные возможности): &lt;table&gt;, &lt;tr&gt;, &lt;td&gt;, &lt;th&gt;.</li>
27 </ul><p>CSS-анимации прописываются в отдельном CSS-файле, который потом подключается в блоке &lt;head&gt; в HTML, либо весь код CSS-анимации прописывается в теге &lt;style&gt; так же в HTML.</p>
27 </ul><p>CSS-анимации прописываются в отдельном CSS-файле, который потом подключается в блоке &lt;head&gt; в HTML, либо весь код CSS-анимации прописывается в теге &lt;style&gt; так же в HTML.</p>
28 <p>Вот так выглядит код CSS-анимации в HTML файле в теге &lt;style&gt;:</p>
28 <p>Вот так выглядит код CSS-анимации в HTML файле в теге &lt;style&gt;:</p>
29 &lt;!DOCTYPE html&gt; &lt;html lang="ru"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;CSS-анимации&lt;/title&gt; &lt;style&gt; /* Определяем ключевую анимацию: элемент появляется снизу и становится видимым */ @keyframes fadeIn { 0% { opacity: 0; /* Элемент полностью прозрачный в начале */ transform: translateY(20px); /* Смещён вниз на 20px */ } 100% { opacity: 1; /* Полностью видимый */ transform: translateY(0); /* Возвращается на своё место */ } } .intro { /* Применяем анимацию fadeIn */ animation: fadeIn 3s ease-out; /* Стили текста */ font-family: Arial, sans-serif; font-size: 2em; text-align: center; margin-top: 100px; color: #333; } body { background-color: #f5f5f5; /* Светлый фон страницы */ margin: 0; padding: 0; } &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;!-- Элемент с классом .intro, к которому применяется анимация --&gt; &lt;h1 class="intro"&gt;CSS-анимации!&lt;/h1&gt; &lt;/body&gt; &lt;/html&gt;<p>Если открыть эту страницу в браузере, вы увидите, как воспроизводится CSS-анимация появления элемента &lt;h1&gt; на HTML-странице:</p>
29 &lt;!DOCTYPE html&gt; &lt;html lang="ru"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;CSS-анимации&lt;/title&gt; &lt;style&gt; /* Определяем ключевую анимацию: элемент появляется снизу и становится видимым */ @keyframes fadeIn { 0% { opacity: 0; /* Элемент полностью прозрачный в начале */ transform: translateY(20px); /* Смещён вниз на 20px */ } 100% { opacity: 1; /* Полностью видимый */ transform: translateY(0); /* Возвращается на своё место */ } } .intro { /* Применяем анимацию fadeIn */ animation: fadeIn 3s ease-out; /* Стили текста */ font-family: Arial, sans-serif; font-size: 2em; text-align: center; margin-top: 100px; color: #333; } body { background-color: #f5f5f5; /* Светлый фон страницы */ margin: 0; padding: 0; } &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;!-- Элемент с классом .intro, к которому применяется анимация --&gt; &lt;h1 class="intro"&gt;CSS-анимации!&lt;/h1&gt; &lt;/body&gt; &lt;/html&gt;<p>Если открыть эту страницу в браузере, вы увидите, как воспроизводится CSS-анимация появления элемента &lt;h1&gt; на HTML-странице:</p>
30 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Вот три ключевых элемента для создания CSS-анимаций:</p>
30 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Вот три ключевых элемента для создания CSS-анимаций:</p>
31 <ul><li><strong>transition</strong> - свойство для плавного анимирования двух состояний, например, при наведении мыши.</li>
31 <ul><li><strong>transition</strong> - свойство для плавного анимирования двух состояний, например, при наведении мыши.</li>
32 <li><strong>@keyframes</strong> - описывает пошаговое поведение анимации, состояния во времени, создавая эффект движения.</li>
32 <li><strong>@keyframes</strong> - описывает пошаговое поведение анимации, состояния во времени, создавая эффект движения.</li>
33 <li><strong>animation</strong> - позволяет воспроизводить заранее описанную сложную анимацию с ключевыми кадрами, используя разные настройки: задержку, направление, продолжительность и так далее.</li>
33 <li><strong>animation</strong> - позволяет воспроизводить заранее описанную сложную анимацию с ключевыми кадрами, используя разные настройки: задержку, направление, продолжительность и так далее.</li>
34 </ul><p>transition - работает только между двумя состояниями: что было и что стало.</p>
34 </ul><p>transition - работает только между двумя состояниями: что было и что стало.</p>
35 <p>Применяем transition к кнопке на веб-странице:</p>
35 <p>Применяем transition к кнопке на веб-странице:</p>
36 /* Класс кнопки */ .button { /* Плавный переход для изменения фона */ transition: background-color 1s ease; } /* Состояние при наведении */ .button:hover { /* Новый цвет фона при наведении курсора */ background-color: #f87171; /* Мягкий красно-розовый (Tailwind-стиль) */ }<p>Свойство transition применяется для реактивных эффектов - появляющихся, например, при наведении курсора, фокусе или клике по элементу. Анимация с его использованием на кнопке выглядит так:</p>
36 /* Класс кнопки */ .button { /* Плавный переход для изменения фона */ transition: background-color 1s ease; } /* Состояние при наведении */ .button:hover { /* Новый цвет фона при наведении курсора */ background-color: #f87171; /* Мягкий красно-розовый (Tailwind-стиль) */ }<p>Свойство transition применяется для реактивных эффектов - появляющихся, например, при наведении курсора, фокусе или клике по элементу. Анимация с его использованием на кнопке выглядит так:</p>
37 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>С помощью @keyframes и animation задаём последовательность действий. В @keyframes задаются ключевые моменты движения элемента, а в animation указываются имя анимации, скорость, длительность и тип переходов между ключевыми кадрами.</p>
37 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>С помощью @keyframes и animation задаём последовательность действий. В @keyframes задаются ключевые моменты движения элемента, а в animation указываются имя анимации, скорость, длительность и тип переходов между ключевыми кадрами.</p>
38 /* Анимация "пульсация" */ @keyframes pulse { 0% { transform: scale(2); } /* Начинаем с увеличенного размера */ 50% { transform: scale(1); } /* Сжимаем до исходного */ 100% { transform: scale(2); } /* Возвращаемся к увеличенному */ } .icon { /* Применяем анимацию pulse */ animation: pulse 1s infinite ease-in-out; /* 1s - длительность одного цикла infinite - бесконечное повторение ease-in-out - сглаженное ускорение/замедление */ }<p>Связка @keyframes и animation используется, если нужна полноценная настраиваемая и гибкая анимация.</p>
38 /* Анимация "пульсация" */ @keyframes pulse { 0% { transform: scale(2); } /* Начинаем с увеличенного размера */ 50% { transform: scale(1); } /* Сжимаем до исходного */ 100% { transform: scale(2); } /* Возвращаемся к увеличенному */ } .icon { /* Применяем анимацию pulse */ animation: pulse 1s infinite ease-in-out; /* 1s - длительность одного цикла infinite - бесконечное повторение ease-in-out - сглаженное ускорение/замедление */ }<p>Связка @keyframes и animation используется, если нужна полноценная настраиваемая и гибкая анимация.</p>
39 <p>Применим этот код к HTML-элементу &lt;div&gt;, внутри которого содержится специальный символ:</p>
39 <p>Применим этот код к HTML-элементу &lt;div&gt;, внутри которого содержится специальный символ:</p>
40 &lt;body&gt; &lt;div class="icon"&gt;🔵&lt;/div&gt; &lt;/body&gt;<p>Если мы откроем браузер, то анимация будет выглядеть вот так:</p>
40 &lt;body&gt; &lt;div class="icon"&gt;🔵&lt;/div&gt; &lt;/body&gt;<p>Если мы откроем браузер, то анимация будет выглядеть вот так:</p>
41 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Создадим простую CSS-анимацию появления надписи, используя @keyframes и animation.</p>
41 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Создадим простую CSS-анимацию появления надписи, используя @keyframes и animation.</p>
42 <p>Создадим файл index.html и оформим его следующим образом:</p>
42 <p>Создадим файл index.html и оформим его следующим образом:</p>
43 &lt;!DOCTYPE html&gt; &lt;html lang="ru"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Создание простой CSS-анимации&lt;/title&gt; &lt;style&gt; /* Здесь будет код нашей будущей CSS-анимации */ &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;div class="title"&gt;Привет, CSS-анимация!&lt;/div&gt; &lt;/body&gt; &lt;/html&gt;<p>Мы будем анимировать элемент &lt;div&gt;, содержащий надпись "Привет, CSS-анимация!". Код анимации разместим между открывающим и закрывающим тегом &lt;style&gt;.</p>
43 &lt;!DOCTYPE html&gt; &lt;html lang="ru"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Создание простой CSS-анимации&lt;/title&gt; &lt;style&gt; /* Здесь будет код нашей будущей CSS-анимации */ &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;div class="title"&gt;Привет, CSS-анимация!&lt;/div&gt; &lt;/body&gt; &lt;/html&gt;<p>Мы будем анимировать элемент &lt;div&gt;, содержащий надпись "Привет, CSS-анимация!". Код анимации разместим между открывающим и закрывающим тегом &lt;style&gt;.</p>
44 <p>Вернёмся к @keyframes. В этом элементе каждый шаг анимации задаётся в процентах, представляя собой шкалу времени от 0 до 100%. Этот подход хорошо виден в предыдущем примере.</p>
44 <p>Вернёмся к @keyframes. В этом элементе каждый шаг анимации задаётся в процентах, представляя собой шкалу времени от 0 до 100%. Этот подход хорошо виден в предыдущем примере.</p>
45 <em>Инфографика: Skillbox Media</em><p>Если анимация состоит всего из двух шагов - начального и конечного ключевых моментов, то можно использовать ключевые слова from и to:</p>
45 <em>Инфографика: Skillbox Media</em><p>Если анимация состоит всего из двух шагов - начального и конечного ключевых моментов, то можно использовать ключевые слова from и to:</p>
46 @keyframes fadeIn { from { opacity: 0; } /* Начальное состояние - полностью прозрачный */ to { opacity: 1; } /* Конечное состояние - полностью видимый */ }<p>После ключевого слова @keyframes указывают имя анимации. В фигурных скобках после ключевых слов from и to задают изменения свойств: opacity отвечает за прозрачность, и изменяем мы её от 0 к 1.</p>
46 @keyframes fadeIn { from { opacity: 0; } /* Начальное состояние - полностью прозрачный */ to { opacity: 1; } /* Конечное состояние - полностью видимый */ }<p>После ключевого слова @keyframes указывают имя анимации. В фигурных скобках после ключевых слов from и to задают изменения свойств: opacity отвечает за прозрачность, и изменяем мы её от 0 к 1.</p>
47 <p>Далее анимацию нужно применить к элементу &lt;div&gt;. Для этого объявляем селектор .title и используем второй компонент (в данном случае свойство) для создания анимаций animation. В нём через пробел мы прописываем имя анимации (в нашем примере - fadeIn), далее её продолжительность 3s (3 секунды) и параметр ease-out - плавное замедление к концу.</p>
47 <p>Далее анимацию нужно применить к элементу &lt;div&gt;. Для этого объявляем селектор .title и используем второй компонент (в данном случае свойство) для создания анимаций animation. В нём через пробел мы прописываем имя анимации (в нашем примере - fadeIn), далее её продолжительность 3s (3 секунды) и параметр ease-out - плавное замедление к концу.</p>
48 /* Стили для заголовка с анимацией */ .title { animation: fadeIn 3s ease-out; /* Применяем анимацию */ font-family: Arial, sans-serif; font-size: 2em; text-align: center; margin-top: 100px; color: #333; }<p>Сохраним index.html и запустим его в браузере:</p>
48 /* Стили для заголовка с анимацией */ .title { animation: fadeIn 3s ease-out; /* Применяем анимацию */ font-family: Arial, sans-serif; font-size: 2em; text-align: center; margin-top: 100px; color: #333; }<p>Сохраним index.html и запустим его в браузере:</p>
49 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Так мы создали простую анимацию с использованием связки @keyframes и animation.</p>
49 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Так мы создали простую анимацию с использованием связки @keyframes и animation.</p>
50 <p>CSS-анимации управляются свойствами animation, которые отвечают за длительность, задержку, плавность и другие функции.</p>
50 <p>CSS-анимации управляются свойствами animation, которые отвечают за длительность, задержку, плавность и другие функции.</p>
51 <p>Вот таблица основных таких свойств и их описание:</p>
51 <p>Вот таблица основных таких свойств и их описание:</p>
52 <strong>Свойство</strong><strong>Описание</strong><strong>Пример значения</strong>animation-nameИмя анимацииanimNameanimation-durationДлительность анимации1s, 0.5sanimation-delayЗадержка перед началом0.2, 1sanimation-timing-functionПлавность переходаease, linear, ease-in-outanimation-iteration-countКоличество повторений1, infiniteanimation-directionНаправление анимации: вперёд или назадnormal, alternateanimation-fill-modeОставляет ли финальное состояниеforwards, bothanimation-play-stateСостояние анимацииpaused, -running<p>Свойство animation - это сокращённая запись, которая может включать в себя эти свойства через пробел:</p>
52 <strong>Свойство</strong><strong>Описание</strong><strong>Пример значения</strong>animation-nameИмя анимацииanimNameanimation-durationДлительность анимации1s, 0.5sanimation-delayЗадержка перед началом0.2, 1sanimation-timing-functionПлавность переходаease, linear, ease-in-outanimation-iteration-countКоличество повторений1, infiniteanimation-directionНаправление анимации: вперёд или назадnormal, alternateanimation-fill-modeОставляет ли финальное состояниеforwards, bothanimation-play-stateСостояние анимацииpaused, -running<p>Свойство animation - это сокращённая запись, которая может включать в себя эти свойства через пробел:</p>
53 animation: &lt;name&gt; &lt;duration&gt; &lt;timing-function&gt; &lt;delay&gt; &lt;iteration-count&gt; &lt;direction&gt; &lt;fill-mode&gt; &lt;play-state&gt;;<p>Но чтобы не запутаться, лучше прописывать эти параметры отдельно.</p>
53 animation: &lt;name&gt; &lt;duration&gt; &lt;timing-function&gt; &lt;delay&gt; &lt;iteration-count&gt; &lt;direction&gt; &lt;fill-mode&gt; &lt;play-state&gt;;<p>Но чтобы не запутаться, лучше прописывать эти параметры отдельно.</p>
54 <p>Применим тонкую настройку CSS-анимаций к элементу &lt;h1&gt; с надписью "CSS умеет всё!":</p>
54 <p>Применим тонкую настройку CSS-анимаций к элементу &lt;h1&gt; с надписью "CSS умеет всё!":</p>
55 /* Анимация: поворот и смена цвета */ @keyframes spinAndColor { 0% { transform: rotate(0deg); color: #ef4444; /* Красный */ } 50% { transform: rotate(180deg); color: #3b82f6; /* Синий */ } 100% { transform: rotate(360deg); color: #22c55e; /* Зелёный */ } } .animated-title { animation-name: spinAndColor; /* Имя анимации */ animation-duration: 4s; /* Длительность: 4 секунды */ animation-delay: 1s; /* Задержка: 1 секунда */ animation-timing-function: ease-in-out; /* Плавность - мягкий старт и финиш */ animation-iteration-count: infinite; /* Бесконечное повторение */ animation-direction: alternate; /* Туда и обратно */ animation-fill-mode: both; /* Сохраняет стили в начале и в конце */ animation-play-state: running; /* Анимация активна */ }<p>Эта CSS-анимация будет выглядеть так:</p>
55 /* Анимация: поворот и смена цвета */ @keyframes spinAndColor { 0% { transform: rotate(0deg); color: #ef4444; /* Красный */ } 50% { transform: rotate(180deg); color: #3b82f6; /* Синий */ } 100% { transform: rotate(360deg); color: #22c55e; /* Зелёный */ } } .animated-title { animation-name: spinAndColor; /* Имя анимации */ animation-duration: 4s; /* Длительность: 4 секунды */ animation-delay: 1s; /* Задержка: 1 секунда */ animation-timing-function: ease-in-out; /* Плавность - мягкий старт и финиш */ animation-iteration-count: infinite; /* Бесконечное повторение */ animation-direction: alternate; /* Туда и обратно */ animation-fill-mode: both; /* Сохраняет стили в начале и в конце */ animation-play-state: running; /* Анимация активна */ }<p>Эта CSS-анимация будет выглядеть так:</p>
56 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Не все свойства, которые кажутся "движущимися", можно анимировать. Некоторые легко поддаются плавным переходам, а другие просто не реагируют на анимацию.</p>
56 <em>Инфографика: CSS-анимация. Skillbox Media</em><p>Не все свойства, которые кажутся "движущимися", можно анимировать. Некоторые легко поддаются плавным переходам, а другие просто не реагируют на анимацию.</p>
57 <p>Свойства, которые<strong>можно</strong>анимировать:</p>
57 <p>Свойства, которые<strong>можно</strong>анимировать:</p>
58 <ul><li><strong>opacity</strong>- прозрачность;</li>
58 <ul><li><strong>opacity</strong>- прозрачность;</li>
59 <li><strong>transform</strong>- трансформация: перемещение, масштаб, поворот, наклон;</li>
59 <li><strong>transform</strong>- трансформация: перемещение, масштаб, поворот, наклон;</li>
60 <li><strong>color</strong>- цвет;</li>
60 <li><strong>color</strong>- цвет;</li>
61 <li><strong>background-color</strong> - цвет фона;</li>
61 <li><strong>background-color</strong> - цвет фона;</li>
62 <li><strong>margin</strong>/<strong>padding</strong>- внешние и внутренние отступы;</li>
62 <li><strong>margin</strong>/<strong>padding</strong>- внешние и внутренние отступы;</li>
63 <li><strong>width</strong>/<strong>height</strong>- высота и ширина элемента;</li>
63 <li><strong>width</strong>/<strong>height</strong>- высота и ширина элемента;</li>
64 <li><strong>box-shadow</strong>- тень от блока;</li>
64 <li><strong>box-shadow</strong>- тень от блока;</li>
65 <li><strong>border-radius</strong> - округление углов;</li>
65 <li><strong>border-radius</strong> - округление углов;</li>
66 </ul><p>Свойства, которые<strong>нельзя</strong>анимировать:</p>
66 </ul><p>Свойства, которые<strong>нельзя</strong>анимировать:</p>
67 <ul><li><strong>display</strong>- включает и выключает элемент;</li>
67 <ul><li><strong>display</strong>- включает и выключает элемент;</li>
68 <li><strong>position</strong>- изменяет тип позиционирования;</li>
68 <li><strong>position</strong>- изменяет тип позиционирования;</li>
69 <li><strong>z-index</strong>- определяет порядок наложения элементов.</li>
69 <li><strong>z-index</strong>- определяет порядок наложения элементов.</li>
70 </ul><p>Единственная проблема CSS-анимаций в том, что они много весят и могут привести к тормозам и медленной загрузке страницы.</p>
70 </ul><p>Единственная проблема CSS-анимаций в том, что они много весят и могут привести к тормозам и медленной загрузке страницы.</p>
71 <p>Для анимирования лучше всего подходят свойства transform и opacity. Они обрабатываются видеокартой с помощью аппаратного ускорения, это повышает производительность.</p>
71 <p>Для анимирования лучше всего подходят свойства transform и opacity. Они обрабатываются видеокартой с помощью аппаратного ускорения, это повышает производительность.</p>
72 <p>Анимирование свойств width, height, top, left, margin, padding более ресурсоёмкое. Браузеру приходится пересчитывать размеры и координаты элементов, нагрузка на процессор растёт.</p>
72 <p>Анимирование свойств width, height, top, left, margin, padding более ресурсоёмкое. Браузеру приходится пересчитывать размеры и координаты элементов, нагрузка на процессор растёт.</p>
73 <p>Псевдоклассы в CSS - это специальные состояния элементов, которые позволяют добавлять реакции на действия пользователя, например, при наведении курсора, фокусировке на элементе или нажатии.</p>
73 <p>Псевдоклассы в CSS - это специальные состояния элементов, которые позволяют добавлять реакции на действия пользователя, например, при наведении курсора, фокусировке на элементе или нажатии.</p>
74 <p>Список псевдоклассов:</p>
74 <p>Список псевдоклассов:</p>
75 <ul><li>: hover - срабатывает при наведении на элемент;</li>
75 <ul><li>: hover - срабатывает при наведении на элемент;</li>
76 <li>: focus - активен, когда элемент в фокусе (клик мышью или с клавиатуры);</li>
76 <li>: focus - активен, когда элемент в фокусе (клик мышью или с клавиатуры);</li>
77 <li>: active - срабатывает, пока элемент нажат;</li>
77 <li>: active - срабатывает, пока элемент нажат;</li>
78 <li>: checked - применяется к выбранным чекбоксам или радиокнопкам;</li>
78 <li>: checked - применяется к выбранным чекбоксам или радиокнопкам;</li>
79 <li>: disabled - когда элемент недоступен;</li>
79 <li>: disabled - когда элемент недоступен;</li>
80 <li>: nth-child () - срабатывает по порядку внутри родителя.</li>
80 <li>: nth-child () - срабатывает по порядку внутри родителя.</li>
81 </ul><p>Пример с псевдоклассом : focus, CSS-код анимации:</p>
81 </ul><p>Пример с псевдоклассом : focus, CSS-код анимации:</p>
82 input { padding: 8px 12px; border: 2px solid lightgray; border-radius: 4px; outline: none; transition: border-color 0.3s, box-shadow 0.3s; } input:focus { border-color: dodgerblue; box-shadow: 0 0 5px dodgerblue; }<p>Когда пользователь кликает по полю ввода, то есть фокусируется на нём, срабатывает CSS-анимация с нашим псевдоклассом : focus: поле подсвечивается синим, и появляется лёгкая тень:</p>
82 input { padding: 8px 12px; border: 2px solid lightgray; border-radius: 4px; outline: none; transition: border-color 0.3s, box-shadow 0.3s; } input:focus { border-color: dodgerblue; box-shadow: 0 0 5px dodgerblue; }<p>Когда пользователь кликает по полю ввода, то есть фокусируется на нём, срабатывает CSS-анимация с нашим псевдоклассом : focus: поле подсвечивается синим, и появляется лёгкая тень:</p>
83 <em>Инфографика: CSS-анимация. Skillbox Media</em><ul><li>Попытка анимировать display или position - они не поддерживают плавность:</li>
83 <em>Инфографика: CSS-анимация. Skillbox Media</em><ul><li>Попытка анимировать display или position - они не поддерживают плавность:</li>
84 </ul>div { transition: display 1s ease; display: none; }<p><strong>Решение:</strong>лучше использовать opacity, transform или visibility:</p>
84 </ul>div { transition: display 1s ease; display: none; }<p><strong>Решение:</strong>лучше использовать opacity, transform или visibility:</p>
85 div { transition: opacity 0.5s ease; opacity: 0; }<ul><li>Отсутствие transition при : hover - без него изменения происходят резко:</li>
85 div { transition: opacity 0.5s ease; opacity: 0; }<ul><li>Отсутствие transition при : hover - без него изменения происходят резко:</li>
86 </ul>button:hover { background-color: red; }<p><strong>Решение:</strong>добавить transition:</p>
86 </ul>button:hover { background-color: red; }<p><strong>Решение:</strong>добавить transition:</p>
87 button { transition: background-color 0.3s ease }<ul><li>Анимация "в никуда" - забывают задать animation-name или @keyframes:</li>
87 button { transition: background-color 0.3s ease }<ul><li>Анимация "в никуда" - забывают задать animation-name или @keyframes:</li>
88 </ul>div { animation: 1.5s ease-in-out; }<p><strong>Решение:</strong>начинать создание CSS-анимации с @keyframes и animation-name:</p>
88 </ul>div { animation: 1.5s ease-in-out; }<p><strong>Решение:</strong>начинать создание CSS-анимации с @keyframes и animation-name:</p>
89 @keyframes animName { from: { opacity: 0; } to: { opacity: 1; } } div { animation: animName 1.5s ease-in-out; }<ul><li>Слишком долгая или резкая анимация - делает интерфейс неудобным:</li>
89 @keyframes animName { from: { opacity: 0; } to: { opacity: 1; } } div { animation: animName 1.5s ease-in-out; }<ul><li>Слишком долгая или резкая анимация - делает интерфейс неудобным:</li>
90 </ul>.menu { transition: all 60s linear; }<p><strong>Решение:</strong>рассчитывать адекватное время, учитывая как производительность, так и интерфейс, не заставляющий пользователя ожидать.</p>
90 </ul>.menu { transition: all 60s linear; }<p><strong>Решение:</strong>рассчитывать адекватное время, учитывая как производительность, так и интерфейс, не заставляющий пользователя ожидать.</p>
91 .menu { transition: all 0.6s linear; }<ul><li>Нерациональное использование infinite - бесконечная анимация там, где не нужна.</li>
91 .menu { transition: all 0.6s linear; }<ul><li>Нерациональное использование infinite - бесконечная анимация там, где не нужна.</li>
92 </ul>.logo { animation: load 1.3s linear infinite; }<p><strong>Решение:</strong>будьте аккуратны с бесконечностью.</p>
92 </ul>.logo { animation: load 1.3s linear infinite; }<p><strong>Решение:</strong>будьте аккуратны с бесконечностью.</p>
93 <p>CSS-анимации - это быстрый, лёгкий и эффективный способ придать интерфейсу живость и выразительность без использования JavaScript. Однако у них есть свои границы. Чтобы анимации работали правильно и не мешали пользователю, важно понимать, где CSS справится сам, а где нужен JavaScript.</p>
93 <p>CSS-анимации - это быстрый, лёгкий и эффективный способ придать интерфейсу живость и выразительность без использования JavaScript. Однако у них есть свои границы. Чтобы анимации работали правильно и не мешали пользователю, важно понимать, где CSS справится сам, а где нужен JavaScript.</p>
94 <p><strong>Используйте CSS</strong>, если:</p>
94 <p><strong>Используйте CSS</strong>, если:</p>
95 <ul><li>Анимация простая и декоративная - например, появление, затухание, движение, наведение.</li>
95 <ul><li>Анимация простая и декоративная - например, появление, затухание, движение, наведение.</li>
96 <li>Нужно добиться высокой производительности и плавности.</li>
96 <li>Нужно добиться высокой производительности и плавности.</li>
97 <li>Анимация не требует сложной логики или взаимодействия с данными.</li>
97 <li>Анимация не требует сложной логики или взаимодействия с данными.</li>
98 <li>Вы хотите, чтобы анимация работала автоматически, как часть дизайна.</li>
98 <li>Вы хотите, чтобы анимация работала автоматически, как часть дизайна.</li>
99 </ul><p><strong>Используйте JavaScript</strong>, если:</p>
99 </ul><p><strong>Используйте JavaScript</strong>, если:</p>
100 <ul><li>Анимация должна зависеть от событий, условий или пользовательских данных.</li>
100 <ul><li>Анимация должна зависеть от событий, условий или пользовательских данных.</li>
101 <li>Нужно контролировать воспроизведение: остановка, пауза, отмена, обратная перемотка.</li>
101 <li>Нужно контролировать воспроизведение: остановка, пауза, отмена, обратная перемотка.</li>
102 <li>Требуется синхронизация с другими процессами или элементами интерфейса.</li>
102 <li>Требуется синхронизация с другими процессами или элементами интерфейса.</li>
103 <li>Нужна интерактивность: свайпы, клики, drag &amp; drop и так далее.</li>
103 <li>Нужна интерактивность: свайпы, клики, drag &amp; drop и так далее.</li>
104 </ul><a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>
104 </ul><a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>