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 2015å¹´9æ.
transform-origin 㯠CSS ã®ããããã£ã§ãè¦ç´ ã®åº§æ¨å¤æ (transform) ã«ãããåç¹ãè¨å®ãã¾ãã
試ãã¦ã¿ã¾ããã
transform-origin: center;
transform-origin: top left;
transform-origin: 50px 50px;
/* Z 軸ãåç¹ã¨ãã 3D å転 */
transform-origin: bottom right 60px;
<section id="default-example">
<div id="example-container">
<div id="example-element">å転ãã¾ãï¼</div>
<img
alt=""
id="crosshair"
src="/proxy/developer.mozilla.org/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");
/* ã¢ãã¡ã¼ã·ã§ã³ãåã¹ã¿ã¼ã
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 ã§ãã
æ§æ
/* å¤ï¼ã¤ã®æ§æ */
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;
/* ã°ãã¼ãã«å¤ */
transform-origin: inherit;
transform-origin: initial;
transform-origin: revert;
transform-origin: revert-layer;
transform-origin: unset;
transform-origin ããããã£ã¯ããªãã»ããã表ã 1 ï½ 3 ã¤ã®å¤ã使ç¨ãã¦æå®ãããã¨ãã§ãã¾ããæç¤ºçã«å®ç¾©ãããªãã£ããªãã»ããã¯ãããããã®å¯¾å¿ããåæå¤ã«ãªã»ããããã¾ãã
åä¸ã® <length> ã¾ã㯠<percentage> ãå®ç¾©ãããå ´åãããã¯æ°´å¹³æ¹åã®ãªãã»ããã表ãã¾ãã
2 ã¤ä»¥ä¸ã®å¤ãå®ç¾©ãããã©ã¡ããã®å¤ããã¼ã¯ã¼ãã§ãªãå ´åãã¾ãã¯ä½¿ããã¦ãããã¼ã¯ã¼ãã center ã ãã§ãã£ãå ´åãæåã®å¤ã¯æ°´å¹³æ¹åã®ãªãã»ããã§ãããäºçªç®ã®å¤ã¯åç´æ¹åã®ãªãã»ããã§ãã
-
å¤ 1 ã¤ã®æ§æ:
- å¤ã¯
<length>,<percentage>, ã¾ãã¯left,center,right,top,bottomã®ããããã§ãªããã°ãªãã¾ããã
- å¤ã¯
-
å¤ 2 ã¤ã®æ§æ:
- 䏿¹ã®å¤ã¯
<length>,<percentage>, ã¾ãã¯ãã¼ã¯ã¼ãã®left,center,rightã®ããããã§ãªããã°ãªãã¾ããã - ãã䏿¹ã®å¤ã¯ã
<length>,<percentage>, ã¾ãã¯ãã¼ã¯ã¼ãã®top,center,bottomã®ããããã§ãªããã°ãªãã¾ããã
- 䏿¹ã®å¤ã¯
-
å¤ 3 ã¤ã®æ§æ:
- 1 çªç®ã¨ 2 çªç®ã®å¤ã¯ãå¤ 2 ã¤ã®æ§æã¨åãã§ãã
- 3 çªç®ã®å¤ã¯
<length>ã§ãªããã°ãªãã¾ãããããã¯å¸¸ã« Z ãªãã»ããã表ãã¾ãã
å¤
- x-offset
-
<length>ã¾ãã¯<percentage>ã®ãããã¯ã¹ã®å·¦ç«¯ãã座æ¨å¤æã®åç¹ã¾ã§ã®è·é¢ã示ãå¤ã§ãã - offset-keyword
-
left,right,top,bottom,centerã®ããããã®ãã¼ã¯ã¼ãã§ã対å¿ãããªãã»ããã表ãã¾ãã - y-offset
-
<length>ã¾ãã¯<percentage>ã®ãããã¯ã¹ã®å³ç«¯ãã座æ¨å¤æã®åç¹ã¾ã§ã®è·é¢ã示ãå¤ã§ãã - x-offset-keyword
-
left,right,centerã®ããããã®ãã¼ã¯ã¼ãã§ãããã¯ã¹ã®å·¦ç«¯ãã座æ¨å¤æã®åç¹ã¾ã§ã®è·é¢ã示ãã¾ãã - y-offset-keyword
-
top,bottom,centerã®ããããã®ãã¼ã¯ã¼ãã§ãããã¯ã¹ã®ä¸ç«¯ãã座æ¨å¤æã®åç¹ã¾ã§ã®è·é¢ã示ãã¾ãã - z-offset
-
<length>å¤ (<percentage>ãæå®ããã¨æãç¡å¹ã«ãªãã¾ã) ã§ãã¦ã¼ã¶ã¼ã®è¦ç¹ã¨ z=0 åç¹ã®è·é¢ã示ãã¾ãã
ãã¼ã¯ã¼ãã¯ä¾¿å©ãªéè¨å½¢ã§ãããæ¬¡ã® <percentage> å¤ã«ç¸å½ãã¾ãã
| ãã¼ã¯ã¼ã | å¤ |
|---|---|
left |
0% |
center |
50% |
right |
100% |
top |
0% |
bottom |
100% |
å ¬å¼å®ç¾©
| åæå¤ | 50% 50% 0 |
|---|---|
| é©ç¨å¯¾è±¡ | 座æ¨å¤æå¯è½è¦ç´ |
| ç¶æ¿ | ãªã |
| ãã¼ã»ã³ãå¤ | å²ã¿ããã¯ã¹ã®å¯¸æ³ã«å¯¾ããç¸å¯¾å¤ |
| è¨ç®å¤ | <length> ã®å ´åã¯çµ¶å¯¾çãªå¤ããã以å¤ã®å ´åã¯ãã¼ã»ã³ãå¤ |
| ã¢ãã¡ã¼ã·ã§ã³ã®ç¨®é¡ | é·ãããã¼ã»ã³ãå¤ã calc ã®åç´ãªãªã¹ã |
ã¡ã¢:
transform-origin ã®åæå¤ã¯ãã«ã¼ãã® <svg> è¦ç´ 㨠foreignObject ã®ç´æ¥ã®åã§ãã <svg> è¦ç´ ãé¤ãããã¹ã¦ã® SVG è¦ç´ ã§ã¯ 0 0 ã§ããã¾ãã transform-origin ã¯ä»ã® CSS è¦ç´ ã¨åæ§ã« 50% 50% ã§ãã詳ãã㯠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>
ä¾
>æ§ã ãªåº§æ¨å¤æå¤ã®ãã¢
ãã®ä¾ã¯ãæ§ã
ãªåº§æ¨å¤æé¢æ°ã§æ§ã
ãªt transform-origin ã®å¤ã鏿ããå ´åã®å¹æã表ãã¾ãã
仿§æ¸
| Specification |
|---|
| CSS Transforms Module Level 1> # transform-origin-property> |