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.

Die transform-origin CSS-Eigenschaft legt den Ursprung für die Transformationen eines Elements fest.

Probieren Sie es aus

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);
  }

  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: #000000;
  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;
}
"use strict";

window.addEventListener("load", () => {
  function update() {
    const selected = document.querySelector(".selected");

    /* Restart the animation
           https://developer.mozilla.org/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 crosshair = document.getElementById("crosshair");
  const el = document.getElementById("example-element");

  const observer = new MutationObserver(() => {
    update();
  });

  observer.observe(el, {
    attributes: true,
    attributeFilter: ["style"],
  });

  update();
  crosshair.style.opacity = "1";
});

Der Transformationsursprung ist der Punkt, um den eine Transformation angewendet wird. Zum Beispiel ist der Transformationsursprung der rotate()-Funktion das Zentrum der Rotation.

In der Praxis umgibt diese Eigenschaft ein Paar von Übersetzungen um die anderen Transformationen des Elements. Die erste Übersetzung verschiebt den Transformationsursprung zum tatsächlichen Ursprung bei (0,0). Dann werden die anderen Transformationen angewendet, und da der Transformationsursprung bei (0,0) liegt, wirken diese Transformationen um den Transformationsursprung. Schließlich wird die entgegengesetzte Übersetzung angewendet, die den Transformationsursprung an seinen ursprünglichen Ort zurückbringt. Folglich ergibt diese Definition

css
transform-origin: -100% 50%;
transform: rotate(45deg);

die gleiche Transformation wie

css
transform-origin: 0 0;
transform: translate(-100%, 50%) rotate(45deg) translate(100%, -50%);

Von rechts nach links gelesen, ist translate(100%, -50%) die Übersetzung, um den Transformationsursprung zum tatsächlichen Ursprung zu bringen, rotate(45deg) ist die ursprüngliche Transformation, und translate(-100%, 50%) ist die Übersetzung, um den Transformationsursprung an seinen ursprünglichen Ort zurückzubringen.

Standardmäßig ist der Ursprung einer Transformation center.

Syntax

css
/* 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;

Die transform-origin-Eigenschaft kann mit einem, zwei oder drei Werten angegeben werden, wobei jeder Wert ein Offset darstellt. Offsets, die nicht explizit definiert sind, werden auf ihre entsprechenden anfänglichen Werte zurückgesetzt.

Wenn ein einzelner <length>- oder <percentage>-Wert definiert ist, repräsentiert er das horizontale Offset.

Wenn zwei oder mehr Werte definiert sind und entweder kein Wert ein Schlüsselwort ist oder das einzige verwendete Schlüsselwort center ist, dann repräsentiert der erste Wert das horizontale und der zweite das vertikale Offset.

  • Ein-Wert-Syntax:

    • Der Wert muss ein <length>, ein <percentage> oder eines der Schlüsselwörter left, center, right, top und bottom sein.
  • Zwei-Wert-Syntax:

    • Ein Wert muss ein <length>, ein <percentage> oder eines der Schlüsselwörter left, center und right sein.
    • Der andere Wert muss ein <length>, ein <percentage> oder eines der Schlüsselwörter top, center und bottom sein.
  • Drei-Wert-Syntax:

    • Die ersten beiden Werte sind wie bei der Zwei-Wert-Syntax.
    • Der dritte Wert muss ein <length> sein. Er repräsentiert immer das Z-Offset.

Werte

x-offset

Ist ein <length> oder ein <percentage>, das beschreibt, wie weit vom linken Rand der Box der Transformationsursprung gesetzt ist.

offset-keyword

Ist eines der Schlüsselwörter left, right, top, bottom oder center, das das entsprechende Offset beschreibt.

y-offset

Ist ein <length> oder ein <percentage>, das beschreibt, wie weit vom oberen Rand der Box der Transformationsursprung gesetzt ist.

x-offset-keyword

Ist eines der Schlüsselwörter left, right oder center, das beschreibt, wie weit vom linken Rand der Box der Transformationsursprung gesetzt ist.

y-offset-keyword

Ist eines der Schlüsselwörter top, bottom oder center, das beschreibt, wie weit vom oberen Rand der Box der Transformationsursprung gesetzt ist.

z-offset

Ist ein <length> (und niemals ein <percentage>, da dies die Anweisung ungültig machen würde), das beschreibt, wie weit vom Betrachter das z=0 Ursprung gesetzt ist.

Die Schlüsselwörter sind bequeme Kurzformen und entsprechen den folgenden <percentage>-Werten:

Schlüsselwort Wert
left 0%
center 50%
right 100%
top 0%
bottom 100%

Formaldefinition

Anfangswert50% 50% 0
Anwendbar auftransformierbare Elemente
VererbtNein
Prozentwertebezieht sich auf die Größe der äußeren Box
Berechneter Wertfor <length> the absolute value, otherwise a percentage
Animationstypsimple list of length, percentage, or calc

Hinweis: Der Anfangswert von transform-origin ist 0 0 für alle SVG-Elemente außer für die Wurzel-<svg>-Elemente und <svg>-Elemente, die ein direkter Nachfahre eines foreignObject sind, und deren transform-origin ist 50% 50%, wie andere CSS-Elemente. Siehe das SVG transform-origin Attribut für weitere Informationen.

Formale Syntax

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>

Beispiele

Eine Demonstration verschiedener Transformationswerte

Dieses Beispiel zeigt die Wirkung der Wahl unterschiedlicher transform-origin-Werte für eine Vielzahl von Transformationsfunktionen.

Spezifikationen

Specification
CSS Transforms Module Level 1
# transform-origin-property

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch