Menu

Transform в CSS: translate, scale, skew и transform-origin

Свойство transform перемещает, масштабирует, поворачивает и наклоняет элемент, не меняя раскладку вокруг него. Разберем все функции transform, почему важен порядок функций, transform-origin, отдельные свойства translate, scale и rotate и прием центрирования translate(-50%, -50%).

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

Что делает 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, и трансформация заработает.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ