transform-origin
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.
Thuộc tính transform-origin của CSS đặt điểm gốc cho các biến đổi của một phần tử.
Try it
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://mdn.go-mizu.dev/vi/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";
Điểm gốc transform là điểm xung quanh đó một biến đổi được áp dụng. Ví dụ, điểm gốc transform của hàm rotate() là tâm xoay.
Về thực chất, thuộc tính này bọc một cặp dịch chuyển xung quanh các biến đổi khác của phần tử. Dịch chuyển đầu tiên di chuyển điểm gốc transform đến gốc thực tại . Sau đó các biến đổi khác được áp dụng, và vì điểm gốc transform đang ở , các biến đổi đó hoạt động quanh điểm gốc transform. Cuối cùng, dịch chuyển ngược được áp dụng, di chuyển điểm gốc transform trở lại vị trí ban đầu của nó. Do đó, định nghĩa này
transform-origin: -100% 50%;
transform: rotate(45deg);
cho kết quả cùng biến đổi như
transform-origin: 0 0;
transform: translate(-100%, 50%) rotate(45deg) translate(100%, -50%);
Đọc từ phải sang trái, translate(100%, -50%) là dịch chuyển đưa điểm gốc transform về gốc thực, rotate(45deg) là biến đổi gốc và translate(-100%, 50%) là dịch chuyển khôi phục điểm gốc transform về vị trí ban đầu.
Theo mặc định, điểm gốc của một biến đổi là center.
Cú pháp
/* Cú pháp một giá trị */
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;
/* Giá trị toàn cục */
transform-origin: inherit;
transform-origin: initial;
transform-origin: revert;
transform-origin: revert-layer;
transform-origin: unset;
Thuộc tính transform-origin có thể được chỉ định bằng một, hai hoặc ba giá trị, mỗi giá trị đại diện cho một độ lệch. Các độ lệch không được định nghĩa rõ ràng sẽ được đặt lại về giá trị khởi tạo tương ứng.
Nếu một giá trị <length> hoặc <percentage> duy nhất được định nghĩa, nó đại diện cho độ lệch ngang.
Nếu hai hoặc nhiều giá trị được định nghĩa và không có giá trị nào là từ khóa, hoặc từ khóa duy nhất được sử dụng là center, thì giá trị đầu tiên đại diện cho độ lệch ngang và giá trị thứ hai đại diện cho độ lệch dọc.
-
Cú pháp một giá trị:
- Giá trị phải là
<length>, một<percentage>, hoặc một trong các từ khóaleft,center,right,topvàbottom.
- Giá trị phải là
-
Cú pháp hai giá trị:
- Một giá trị phải là
<length>, một<percentage>, hoặc một trong các từ khóaleft,centervàright. - Giá trị còn lại phải là
<length>, một<percentage>, hoặc một trong các từ khóatop,centervàbottom.
- Một giá trị phải là
-
Cú pháp ba giá trị:
- Hai giá trị đầu giống như trong cú pháp hai giá trị.
- Giá trị thứ ba phải là
<length>. Nó luôn đại diện cho độ lệch theo trục Z.
Giá trị
- x-offset
-
Là
<length>hoặc<percentage>mô tả khoảng cách từ cạnh trái của hộp đến điểm gốc của biến đổi. - offset-keyword
-
Là một trong các từ khóa
left,right,top,bottomhoặccentermô tả độ lệch tương ứng. - y-offset
-
Là
<length>hoặc<percentage>mô tả khoảng cách từ cạnh trên của hộp đến điểm gốc của biến đổi. - x-offset-keyword
-
Là một trong các từ khóa
left,righthoặccentermô tả khoảng cách từ cạnh trái của hộp đến điểm gốc của biến đổi. - y-offset-keyword
-
Là một trong các từ khóa
top,bottomhoặccentermô tả khoảng cách từ cạnh trên của hộp đến điểm gốc của biến đổi. - z-offset
-
Là
<length>(và không bao giờ là<percentage>vì điều đó sẽ làm cho câu lệnh không hợp lệ) mô tả khoảng cách từ mắt người dùng đến gốc z=0.
Các từ khóa là viết tắt tiện lợi và tương ứng với các giá trị <percentage> sau:
| Từ khóa | Giá trị |
|---|---|
left |
0% |
center |
50% |
right |
100% |
top |
0% |
bottom |
100% |
Định nghĩa chính thức
| Initial value | 50% 50% 0 |
|---|---|
| Applies to | transformable elements |
| Inherited | no |
| Percentages | refer to the size of bounding box |
| Computed value | for <length> the absolute value, otherwise a percentage |
| Animation type | simple list of length, percentage, or calc |
Note:
Giá trị khởi tạo của transform-origin là 0 0 đối với tất cả các phần tử SVG ngoại trừ phần tử gốc <svg> và các phần tử <svg> là con trực tiếp của foreignObject, với transform-origin là 50% 50%, giống như các phần tử CSS khác. Xem thuộc tính SVG transform-origin để biết thêm thông tin.
Cú pháp chính thức
transform-origin =
[ left | center | right | top | bottom | <length-percentage> ] |
[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] <length>? |
[ [ center | left | right ] && [ center | top | bottom ] ] <length>?
<length-percentage> =
<length> |
<percentage>
Ví dụ
>Minh họa các giá trị transform khác nhau
Ví dụ này cho thấy hiệu lực của việc chọn các giá trị transform-origin khác nhau cho nhiều hàm biến đổi.
Thông số kỹ thuật
| Specification |
|---|
| CSS Transforms Module Level 1> # transform-origin-property> |