试一试
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.org.cn/en-US/docs/Web/CSS/CSS_Animations/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% |
正式定义
注意: 除了根 <svg> 元素和直接作为 foreignObject 子元素的 <svg> 元素(其 transform-origin 为 50% 50%,与其他 CSS 元素一样)之外,所有 SVG 元素的 transform-origin 初始值均为 0 0。有关更多信息,请参阅 SVG transform-origin 属性。
正式语法
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>
示例
各种变形值的演示
此示例展示了为各种变形函数选择不同的 transform-origin 值所产生的影响。
规范
| 规范 |
|---|
| CSS 变换模块级别 1 # transform-origin 属性 |
浏览器兼容性
加载中…