Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Переходы

Когда стиль меняется, например при наведении мыши, браузер переключает его мгновенно. Переход (transition) растягивает эту смену во времени: цвет перетекает, кнопка плавно подрастает. Это самая простая анимация в CSS.

Первый переход

Свойство transition называет, что анимировать и сколько это длится. Наведите курсор на кнопку:

<style>
  .btn { padding: 10px 20px; border: none; background: steelblue; color: white; transition: background 0.4s; }
  .btn:hover { background: crimson; }
</style>
 
<button class="btn">Наведите на меня</button>

Без transition цвет сменился бы рывком. Время пишут в секундах (0.4s) или миллисекундах (400ms).

Части перехода

СвойствоЧто задаётПример
transition-propertyКакое свойство анимироватьbackground
transition-durationСколько длится0.4s
transition-timing-functionКак меняется скоростьease-in-out
transition-delayЗадержка перед стартом0.2s

Обычно всё пишут одной строкой: transition: background 0.4s ease-in-out 0.2s. Первое время — длительность, второе — задержка.

Функции плавности

Функция плавности описывает, как скорость меняется по ходу перехода. Наведите на серую полосу — квадраты поедут с разной манерой:

<style>
  .track { padding: 8px; background: whitesmoke; }
  .dot { width: 30px; height: 30px; margin: 4px 0; background: mediumpurple; transition: margin-left 1.5s; }
  .track:hover .dot { margin-left: calc(100% - 30px); }
  .linear { transition-timing-function: linear; }
  .in { transition-timing-function: ease-in; }
  .out { transition-timing-function: ease-out; }
</style>
 
<div class="track">
  <div class="dot linear"></div>
  <div class="dot in"></div>
  <div class="dot out"></div>
</div>

linear едет ровно, ease-in разгоняется, ease-out тормозит в конце. По умолчанию стоит ease — быстрый старт и мягкая остановка.

Несколько свойств

Чтобы анимировать несколько свойств, их перечисляют через запятую, у каждого своё время:

<style>
  .card { width: 180px; padding: 16px; background: white; border: 1px solid silver;
    transition: box-shadow 0.3s, border-color 0.6s; }
  .card:hover { box-shadow: 0 8px 20px rgb(0 0 0 / 0.2); border-color: steelblue; }
</style>
 
<div class="card">Карточка приподнимается</div>

Что анимируется

Плавно меняются свойства с промежуточными значениями: размеры, отступы, цвета, прозрачность opacity, transform. Свойства вроде display переключаются только целиком — между none и block нет середины. Для плавного появления используют opacity:

<style>
  .hint { opacity: 0; transition: opacity 0.5s; }
  .area:hover .hint { opacity: 1; }
  .area { padding: 12px; background: honeydew; }
</style>
 
<div class="area">Наведите сюда <span class="hint">— подсказка проявилась</span></div>

Частая ошибка

Если написать transition только в :hover, переход сработает при наведении, а при уходе курсора стиль вернётся рывком: без наведения у элемента перехода нет.

<style>
  .box { padding: 12px; margin-bottom: 8px; background: lightskyblue; }
  .bad:hover { background: gold; transition: background 1s; }
  .good { transition: background 1s; }
  .good:hover { background: gold; }
</style>
 
<div class="box bad">Назад рывком</div>
<div class="box good">Назад плавно</div>

Пишите transition в основном правиле элемента — тогда переход работает в обе стороны.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.