CSS-свойство `transform-origin`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.
transform-origin — это свойство CSS, задающее точку начала преобразований элемента.
Попробуйте
transform-origin: center;
transform-origin: top left;
transform-origin: 50px 50px;
/* 3D rotation with z-axis origin */ transform-origin: bottom right 60px;
<section id="default-example">
<div id="example-container">
<div id="example-element">Rotate me!</div>
<img
alt=""
id="crosshair"
src="/shared-assets/images/examples/crosshair.svg"
width="24px" />
<div id="static-element"></div>
</div>
</section>
@keyframes rotate {
from {
transform: rotate(0);
}
to {
transform: rotate(30deg);
}
}
@keyframes rotate3d {
from {
transform: rotate3d(0, 0, 0, 0);
}
to {
transform: rotate3d(1, 2, 0, 60deg);
}
}
#example-container {
width: 160px;
height: 160px;
position: relative;
}
#example-element {
width: 100%;
height: 100%;
display: flex;
position: absolute;
align-items: center;
justify-content: center;
background: #f7ebee;
color: black;
font-size: 1.2rem;
text-transform: uppercase;
}
#example-element.rotate {
animation: rotate 1s forwards;
}
#example-element.rotate3d {
animation: rotate3d 1s forwards;
}
#crosshair {
width: 24px;
height: 24px;
opacity: 0;
position: absolute;
}
#static-element {
width: 100%;
height: 100%;
position: absolute;
border: dotted 3px #ff1100;
}
const crosshair = document.getElementById("crosshair");
const el = document.getElementById("example-element");
function update() {
const selected = document.querySelector(".selected");
/* Restart the animation
https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API/Tips */
el.className = "";
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => {
el.className =
el.style.transformOrigin.split(" ")[2] === "60px"
? "rotate3d"
: "rotate";
});
});
const transformOrigin = getComputedStyle(el).transformOrigin;
const pos = transformOrigin.split(/\s+/);
crosshair.style.left = `calc(${pos[0]} - 12px)`;
crosshair.style.top = `calc(${pos[1]} - 12px)`;
}
const observer = new MutationObserver(() => {
update();
});
observer.observe(el, {
attributes: true,
attributeFilter: ["style"],
});
update();
crosshair.style.opacity = "1";
Начало преобразования — это точка, вокруг которой применяется преобразование. Например, начало преобразования функции rotate() — это центр вращения.
По сути, это свойство оборачивает остальные преобразования элемента парой перемещений. Первое перемещение переносит начало преобразования в истинное начало координат . Затем применяются остальные преобразования, и, поскольку начало преобразования находится в точке , они выполняются относительно начала преобразования. Наконец, применяется обратное перемещение, возвращающее начало преобразования в исходное положение. Таким образом, это определение
transform-origin: -100% 50%; transform: rotate(45deg);
даёт то же преобразование, что и
transform-origin: 0 0; transform: translate(-100%, 50%) rotate(45deg) translate(100%, -50%);
Если читать справа налево, translate(100%, -50%) — это перемещение начала преобразования в истинное начало координат, rotate(45deg) — исходное преобразование, а translate(-100%, 50%) — перемещение, возвращающее начало преобразования в исходное положение.
По умолчанию начало преобразования находится в точке center.
Синтаксис
/* One-value syntax */ transform-origin: 2px; transform-origin: bottom; /* x-offset | y-offset */ transform-origin: 3cm 2px; /* x-offset-keyword | y-offset */ transform-origin: left 2px; /* x-offset-keyword | y-offset-keyword */ transform-origin: right top; /* y-offset-keyword | x-offset-keyword */ transform-origin: top right; /* x-offset | y-offset | z-offset */ transform-origin: 2px 30% 10px; /* x-offset-keyword | y-offset | z-offset */ transform-origin: left 5px -3px; /* x-offset-keyword | y-offset-keyword | z-offset */ transform-origin: right bottom 2cm; /* y-offset-keyword | x-offset-keyword | z-offset */ transform-origin: bottom right 2cm; /* Global values */ transform-origin: inherit; transform-origin: initial; transform-origin: revert; transform-origin: revert-layer; transform-origin: unset;
Для свойства transform-origin можно задать одно, два или три значения, каждое из которых представляет собой смещение. Смещения, которые не заданы явно, сбрасываются к соответствующим начальным значениям.
Если задано одно значение <length> или <percentage>, оно представляет горизонтальное смещение.
Если задано два или более значений и ни одно из них не является ключевым словом либо используется только ключевое слово center, первое значение представляет горизонтальное смещение, а второе — вертикальное.
- Синтаксис с одним значением:
- Значение должно быть значением
<length>,<percentage>или одним из ключевых словleft,center,right,topиbottom.
- Значение должно быть значением
- Синтаксис с двумя значениями:
- Одно значение должно быть значением
<length>,<percentage>или одним из ключевых словleft,centerиright. - Другое значение должно быть значением
<length>,<percentage>или одним из ключевых словtop,centerиbottom.
- Одно значение должно быть значением
- Синтаксис с тремя значениями:
- Первые два значения такие же, как в синтаксисе с двумя значениями.
- Третье значение должно быть значением
<length>. Оно всегда представляет смещение по оси Z.
Значения
- смещение по оси x
- Значение
<length>или<percentage>, определяющее расстояние от левого края блока до начала преобразования. - ключевое слово смещения
- Одно из ключевых слов
left,right,top,bottomилиcenter, задающее соответствующее смещение. - смещение по оси y
- Значение
<length>или<percentage>, определяющее расстояние от верхнего края блока до начала преобразования. - ключевое слово смещения по оси x
- Одно из ключевых слов
left,rightилиcenter, определяющее расстояние от левого края блока до начала преобразования. - ключевое слово смещения по оси y
- Одно из ключевых слов
top,bottomилиcenter, определяющее расстояние от верхнего края блока до начала преобразования. - смещение по оси z
- Значение
<length>(но не<percentage>, которое сделало бы объявление недопустимым), определяющее расстояние от глаз пользователя до начала координат z=0.
Ключевые слова — это сокращённые варианты записи, которым соответствуют следующие значения <percentage>:
| Ключевое слово | Значение |
|---|---|
left | 0% |
center | 50% |
right | 100% |
top | 0% |
bottom | 100% |
Формальное определение
| Начальное значение | 50% 50% 0 |
|---|---|
| Применяется к | преобразуемым элементам |
| Наследуется | нет |
| Проценты | относительно размера ограничивающей рамки |
| Вычисленное значение | для <length> — абсолютное значение, в остальных случаях — процент |
| Тип анимации | простой список значений длины, процентов или calc |
Примечание: Начальное значение transform-origin равно 0 0 для всех элементов SVG, кроме корневых элементов <svg> и элементов <svg>, являющихся непосредственными потомками foreignObject и имеющих значение transform-origin, равное 50% 50%, как и у других элементов CSS. Дополнительные сведения см. в атрибуте SVG transform-origin.
Формальный синтаксис
transform-origin = [ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>? <length-percentage> = <length> | <percentage>
Примеры
Демонстрация различных значений преобразования
В этом примере показан эффект выбора разных значений transform-origin для различных функций преобразования.
<div class="container">
<div class="example">
<div class="box box1"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: none;
</pre>
<div class="example">
<div class="box box2"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: rotate(30deg);
</pre>
<div class="example">
<div class="box box3"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: rotate(30deg);
transform-origin: 0 0;
</pre>
<div class="example">
<div class="box box4"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: rotate(30deg);
transform-origin: 100% 100%;
</pre>
<div class="example">
<div class="box box5"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: rotate(30deg);
transform-origin: -1em -3em;
</pre>
<div class="example">
<div class="box box6"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: scale(1.7);
</pre>
<div class="example">
<div class="box box7"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: scale(1.7);
transform-origin: 0 0;
</pre>
<div class="example">
<div class="box box8"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: scale(1.7);
transform-origin: 100% -30%;
</pre>
<div class="example">
<div class="box box9"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: skewX(50deg);
transform-origin: 100% -30%;
</pre>
<div class="example">
<div class="box box10"> </div>
<div class="box original"> </div>
</div>
<pre>
transform: skewY(50deg);
transform-origin: 100% -30%;
</pre>
</div>
.container {
display: grid;
grid-template-columns: 200px 100px;
gap: 20px;
}
.example {
position: relative;
margin: 0 2em 4em 5em;
}
.box {
display: inline-block;
width: 3em;
height: 3em;
border: solid 1px;
background-color: palegreen;
}
.original {
position: absolute;
left: 0;
opacity: 20%;
}
.box1 {
transform: none;
}
.box2 {
transform: rotate(30deg);
}
.box3 {
transform: rotate(30deg);
transform-origin: 0 0;
}
.box4 {
transform: rotate(30deg);
transform-origin: 100% 100%;
}
.box5 {
transform: rotate(30deg);
transform-origin: -1em -3em;
}
.box6 {
transform: scale(1.7);
}
.box7 {
transform: scale(1.7);
transform-origin: 0 0;
}
.box8 {
transform: scale(1.7);
transform-origin: 100% -30%;
}
.box9 {
transform: skewX(50deg);
transform-origin: 100% -30%;
}
.box10 {
transform: skewY(50deg);
transform-origin: 100% -30%;
}
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
transform-origin |
36
1
|
12
12
|
16
49
3.5
|
23
15
12.1–15
10.5–15
|
9
2
|
36
18
|
16
49
4
|
24
15
12.1–15
11–14
|
9
1
|
3.0
1.0
|
37
4.4
|
9
1
|
bottom |
1 |
12 |
3.5 |
15 |
2 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
center |
1 |
12 |
3.5 |
15 |
2 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
left |
1 |
12 |
3.5 |
15 |
2 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
right |
1 |
12 |
3.5 |
15 |
2 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
svg_elements |
19 |
17 |
43Ключевые слова и проценты относятся к холсту, а не к самому объекту. См. ошибку 1209061. |
15 |
6Поддерживается только для преобразований, применённых с помощью свойства CSStransform (например, .className { transform: rotate(45deg); transform-origin: center; }). Не влияет на преобразования, применённые с помощью атрибута SVG transform (например, <rect style="transform-origin: center;" transform="rotate(45)" />). |
25 |
43Ключевые слова и проценты относятся к холсту, а не к самому объекту. См. ошибку 1209061. |
14 |
6Поддерживается только для преобразований, применённых с помощью свойства CSStransform (например, .className { transform: rotate(45deg); transform-origin: center; }). Не влияет на преобразования, применённые с помощью атрибута SVG transform (например, <rect style="transform-origin: center;" transform="rotate(45)" />). |
1.5 |
4.4 |
6Поддерживается только для преобразований, применённых с помощью свойства CSStransform (например, .className { transform: rotate(45deg); transform-origin: center; }). Не влияет на преобразования, применённые с помощью атрибута SVG transform (например, <rect style="transform-origin: center;" transform="rotate(45)" />). |
three_value_syntax |
12 |
12 |
10 |
15 |
5 |
18 |
10 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
top |
1 |
12 |
3.5 |
15 |
2 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
См. также
- Использование преобразований CSS
- Атрибут SVG
transform-origin - https://css-tricks.com/almanac/properties/t/transform-origin/
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/transform-origin