Справочник · CSS
transform: сдвиг, поворот и масштаб
Свойство transform визуально сдвигает, поворачивает, масштабирует или наклоняет элемент: transform: translateY(-4px) rotate(5deg). Место элемента в раскладке при этом не меняется — соседи стоят так, будто он не двигался. Поэтому transform идеален для анимаций и эффектов при наведении.
translateсдвигает,scaleмасштабирует,rotateповорачивает.- Соседи не сдвигаются: место в раскладке остаётся прежним.
- Функции применяются по порядку — порядок меняет результат.
transform-originзадаёт точку поворота и масштаба.- transform создаёт новый контекст наложения и контейнер для fixed-детей.
Минимальный пример
.card { transition: transform .2s ease; }
.card:hover { transform: translateY(-4px) scale(1.02); }
.arrow { transition: transform .2s ease; }
.is-open .arrow { transform: rotate(180deg); }Карточка при наведении приподнимается и чуть увеличивается, стрелка в раскрытом блоке поворачивается. Текст рядом не прыгает: transform меняет только отрисовку.
Функции transform
| Функция | Что делает | Пример |
|---|---|---|
translate(x, y) | сдвиг | translate(10px, -50%) |
translateX(), translateY() | сдвиг по одной оси | translateY(-4px) |
scale(n) | масштаб; 1 — исходный размер | scale(1.05) |
rotate(угол) | поворот по часовой стрелке | rotate(45deg), rotate(.25turn) |
skew(x, y) | наклон | skewX(-10deg) |
rotateY(), perspective() | 3D-повороты | perspective(600px) rotateY(30deg) |
Проценты в translate считаются от размеров самого элемента, а не родителя: translate(-50%, -50%) сдвигает элемент на половину его ширины и высоты — так центрируют абсолютно позиционированные блоки.
Порядок функций важен
.a { transform: translateX(100px) rotate(45deg); } /* сдвинуть, затем повернуть на месте */
.b { transform: rotate(45deg) translateX(100px); } /* повернуть оси, затем сдвинуть по диагонали */Каждая функция меняет систему координат для следующей. В первом случае элемент уезжает вправо и поворачивается вокруг себя. Во втором оси уже повёрнуты на 45°, и «вправо» означает по диагонали вниз. Если анимация ведёт себя странно, проверь порядок.
transform-origin: точка преобразования
.door { transform-origin: left center; transform: rotateY(-35deg); }
.badge { transform-origin: top right; transform: scale(1.2); }
.hand { transform-origin: 50% 100%; } /* стрелка часов вращается вокруг низа */По умолчанию поворот и масштаб идут вокруг центра элемента. transform-origin переносит эту точку: дверь открывается на петлях слева, бейдж растёт от своего угла, а не во все стороны.
Отдельные свойства translate, rotate и scale
.icon { rotate: 15deg; }
.icon:hover { scale: 1.1; } /* не затирает rotate */
.card { translate: 0 -4px; }Есть отдельные свойства translate, rotate и scale. В отличие от единого transform, они не затирают друг друга: если иконка повёрнута, а при наведении нужно увеличить её, достаточно задать только scale. С общим transform пришлось бы повторять и поворот. Отдельные свойства применяются в порядке translate → rotate → scale, затем transform.
Ловушка: transform перезаписывает целиком
.modal { transform: translate(-50%, -50%); } /* центрирование */
.modal.is-open { transform: scale(1); } /* центрирование потеряно! */
.modal.is-open { transform: translate(-50%, -50%) scale(1); } /* правильно */transform — одно свойство со списком функций. Новое значение заменяет весь список, а не добавляет функцию. Поэтому при изменении нужно повторять всё, что уже было, или использовать отдельные свойства translate и scale.
Побочные эффекты: слои и fixed
Элемент с transform (кроме none) создаёт новый контекст наложения: z-index его детей сравнивается только внутри него. Кроме того, он становится контейнером для потомков с position: fixed — «фиксированное» модальное окно внутри такого блока начнёт двигаться вместе с ним. Если z-index или fixed ведут себя странно, проверь, нет ли transform у предков.
Почему transform плавный
Изменение transform не заставляет браузер пересчитывать раскладку страницы — он перерисовывает только сам элемент, часто на видеокарте. Поэтому анимации через translate и scale плавнее, чем через top, left или width. Не злоупотребляй will-change: transform: подсказка резервирует память и нужна только для действительно тяжёлых анимаций.
transform или position
Визуальный сдвиг без влияния на раскладку. Для анимаций, эффектов наведения и центрирования.
Тоже сдвиг без влияния на соседей, но анимируется хуже: браузер пересчитывает положение на каждом кадре.
Частые ошибки
- Ждут, что соседи освободят место под увеличенный элемент.
- Задают новый transform и теряют уже применённое центрирование.
- Путают порядок функций и получают неожиданную траекторию.
- Случайно создают контекст наложения и ломают z-index выпадающего меню.
- Сильно увеличивают текст через scale — он становится размытым.
Доступность
Анимации на transform учитывай вместе с prefers-reduced-motion: крупные повороты и перемещения можно отключить. Не поворачивай и не наклоняй длинный текст — его трудно читать. Увеличение через scale не заменяет нормального размера шрифта: масштаб не влияет на раскладку, и увеличенный текст может наехать на соседей.
Поддержка браузерами
transform и 2D-функции поддерживаются всеми браузерами, 3D-функции — всеми актуальными. Отдельные свойства translate, rotate и scale работают в современных версиях браузеров.
Практика
Сделай кнопку, которая при наведении поднимается на 2 пикселя, стрелку, поворачивающуюся на 180° при раскрытии блока, и бейдж в углу карточки, который при наведении увеличивается от своего правого верхнего угла. Добавь плавность 200 мс.
Показать решение
.button { transition: transform .2s ease; }
.button:hover { transform: translateY(-2px); }
.arrow { transition: transform .2s ease; }
.is-open .arrow { transform: rotate(180deg); }
.badge { transform-origin: top right; transition: transform .2s ease; }
.card:hover .badge { transform: scale(1.15); }Частые вопросы
Почему соседние элементы не сдвигаются при transform?
transform меняет только отрисовку. В раскладке элемент занимает прежнее место, поэтому соседи стоят как раньше.
Как отцентровать элемент через transform?
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%). Проценты translate считаются от размеров самого элемента.
Почему пропало центрирование после hover?
Новое значение transform заменило весь список функций. Повтори translate в новом значении или используй отдельные свойства translate и scale.
Что такое transform-origin?
Точка, вокруг которой происходит поворот и масштабирование. По умолчанию — центр элемента.
Почему z-index перестал работать после transform?
transform создаёт новый контекст наложения. z-index детей теперь сравнивается только внутри этого элемента.