Что делает transform
transform меняет то, как элемент рисуется: сдвинутым, увеличенным, повернутым или наклоненным. Пунктирные контуры ниже показывают, где был бы каждый блок без трансформации:
translate(20px, 10px) сдвигает синий блок на 20px вбок и на 10px вниз. scale(1.3) увеличивает зеленый на 30% вокруг его центра. rotate(20deg) поворачивает янтарный по часовой стрелке, а skewX(-20deg) наклоняет темный. Во всех случаях пунктирное место, то есть пространство, которое элемент занимает в раскладке, остается ровно там же.
Функции transform
| Функция | Что делает | Пример |
|---|---|---|
translate(x, y) | сдвигает | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | сдвигает по одной оси | translateY(-4px) |
scale(s) / scale(x, y) | меняет размер (1 = исходный, 0.5 = половина, отрицательное отражает) | scale(1.1), scale(-1, 1) |
scaleX(s) / scaleY(s) | меняет размер по одной оси | scaleX(0.5) |
rotate(angle) | поворачивает по часовой стрелке (отрицательное = против) | rotate(45deg), rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | наклоняет | skewX(-15deg) |
matrix(a, b, c, d, e, f) | все перечисленное одной матрицей, чаще всего это то, что возвращает браузер | |
none | без трансформации |
Проценты в translate() считаются от собственного размера элемента, а не от родителя. У поворота своя страница с градусами, оборотами и вращением: поворот rotate в CSS.
Песочница transform
Двигайте ползунки. Первая строка это собранное значение transform; вторая это матрица, которую из него вычислил браузер, именно ее getComputedStyle возвращает для любой трансформации:
Трансформации не сдвигают раскладку
Трансформированный элемент рисуется в другом месте, но страница раскладывается так, будто трансформации нет. Его соседи сохраняют свои позиции. Поэтому трансформации хороши для эффектов наведения и анимации: вокруг них ничего не перестраивается.
Оба средних блока выглядят в 1.5 раза больше. Увеличенный через scale перекрывает соседей, и C остается на месте; увеличенный через width и height отодвигает C на 40px дальше.
Несколько трансформаций и их порядок
Поместите несколько функций в один transform через пробел. Порядок меняет результат, потому что, если читать слева направо, каждая функция работает в системе координат, которую оставили предыдущие:
Синий блок сдвинулся на 120px прямо и затем повернулся на месте. Зеленый сначала повернулся, поэтому его «ось x» смотрит по диагонали, и translateX(120px) сдвигает его вниз по диагонали. Те же функции, другое место.
Вторая ловушка: второе объявление transform заменяет первое. Если у карточки transform: rotate(-2deg), а в правиле наведения transform: scale(1.05), при наведении поворот исчезает. Повторите обе функции (rotate(-2deg) scale(1.05)) или используйте отдельные свойства ниже.
transform-origin
Масштабирование, поворот и наклон происходят вокруг неподвижной точки, точки трансформации, по умолчанию это центр. Ее меняют ключевыми словами, длинами или процентами:
Все три блока поворачиваются на 25 градусов. Первый вращается вокруг середины, второй держит левый верхний угол прикрепленным к углу своего места, третий правый нижний. Выпадающее меню, которое вырастает из своей кнопки, использует transform-origin: top вместе со scale().
Свойства translate, scale и rotate
В современных браузерах есть еще три отдельных свойства, которые делают то же, что функции, но их можно задавать и анимировать независимо:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
Они всегда объединяются так, будто записаны как transform: translate(...) rotate(...) scale(...) перед любым значением transform, в каком бы порядке вы их ни объявили. Обратите внимание на синтаксис: translate: 10px 20px и scale: 1.2 принимают значения без скобок функции.
Центрирование через translate(-50%, -50%)
Проценты в translate() считаются от собственного размера элемента, поэтому top: 50%; left: 50%; transform: translate(-50%, -50%) центрирует абсолютно позиционированный элемент любого размера в родителе. На странице выравнивание div по центру этот способ сравнивается с flexbox и grid.
Частые ошибки
- Два объявления
transform. Более позднее побеждает целиком. Объединяйте функции или используйте свойстваrotate,scaleиtranslate. - Трансформация строчного элемента. Простой
<span>или<a>игнорируетtransform. Сделайте егоinline-block. - Ожидание, что соседи сдвинутся. Трансформации никогда не меняют раскладку. Чтобы освободить место, меняйте
width,marginилиgap. - Неправильный порядок функций.
rotate()передtranslate()сдвигает вдоль повернутой оси. - Сюрпризы с дочерними элементами
position: fixed. Трансформированный элемент становится содержащим блоком для фиксированных потомков, поэтому фиксированная шапка внутри него прокручивается вместе с ним. Он также создает новый контекст наложения дляz-index.
Часто задаваемые вопросы
Что делает transform в CSS?
Меняет то, как элемент рисуется: сдвигает (translate), меняет размер (scale), поворачивает (rotate) или наклоняет (skew). Элемент сохраняет исходное место в раскладке, поэтому элементы вокруг не сдвигаются.
Как применить несколько трансформаций в CSS?
Перечислите их в одном значении transform через пробел: transform: translateX(50px) rotate(20deg) scale(1.2);. Второе объявление transform заменяет первое, а не добавляется к нему.
Важен ли порядок функций transform?
Да. Если читать слева направо, каждая функция работает в осях, которые оставили предыдущие, поэтому rotate(45deg) translateX(100px) сдвигает элемент вдоль повернутой оси, а translateX(100px) rotate(45deg) сдвигает прямо и затем поворачивает.
Что такое transform-origin?
Неподвижная точка, вокруг которой происходят масштабирование, поворот и наклон. По умолчанию это центр (50% 50%). transform-origin: top left заставляет элемент расти из левого верхнего угла или поворачиваться вокруг него.
Почему transform не работает на span?
Трансформации не применяются к незамещаемым строчным элементам вроде простого <span> или <a>. Задайте элементу display: inline-block или block, и трансформация заработает.