Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

ellipse() CSS-Funktion

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.

Die ellipse() CSS Funktion ist einer der <basic-shape> Datentypen.

Probieren Sie es aus

clip-path: ellipse(20px 50px);
clip-path: ellipse(4rem 50% at right center);
clip-path: ellipse(closest-side closest-side at 5rem 6rem);
clip-path: ellipse(closest-side farthest-side);
clip-path: ellipse(closest-corner closest-corner at 25% 25%);
clip-path: ellipse(closest-side closest-corner at 25% 25%);
clip-path: ellipse(closest-side farthest-corner at 25% 25%);
<section class="default-example" id="default-example">
  <div class="transition-all" id="example-element"></div>
</section>
#default-example {
  background: #ffee99;
}

#example-element {
  background: linear-gradient(to bottom right, #ff5522, #0055ff);
  width: 100%;
  height: 100%;
}

Syntax

css
shape-outside: ellipse(40% 50% at left);
shape-outside: ellipse(closest-side farthest-side at 30%);
border-shape: ellipse(50% 40%);

Eine Ellipse ist im Wesentlichen ein verzerrter Kreis, und daher funktioniert ellipse() sehr ähnlich wie circle(), außer dass wir zwei Radien x und y angeben müssen.

Werte

<shape-radius>

Zwei Radien, x und y, in dieser Reihenfolge. Diese können eine Länge, ein Prozentsatz oder einer der folgenden Schlüsselwortwerte sein:

closest-side

Der Radius ist die Länge vom Zentrum der Ellipse zur nächsten Seite des Referenzrahmens in der gegebenen Richtungsrichtung, sodass die Grenze der Ellipse diese Seite gerade berührt.

farthest-side

Der Radius ist die Länge vom Zentrum der Ellipse zur entferntesten Seite des Referenzrahmens in der gegebenen Richtungsrichtung, sodass die Grenze der Ellipse diese Seite gerade berührt.

closest-corner

Der Radius ist die Länge vom Zentrum der Ellipse zur nächsten Ecke des Referenzrahmens in der gegebenen Richtungsrichtung.

farthest-corner

Der Radius ist die Länge vom Zentrum der Ellipse zur entferntesten Ecke des Referenzrahmens in der gegebenen Richtungsrichtung.

<position>

Verschiebt das Zentrum der Ellipse. Kann eine Länge, ein Prozentsatz oder ein Wert wie left sein. Der <position> Wert ist standardmäßig zentriert, wenn er weggelassen wird.

Formale Syntax

<ellipse()> = 
ellipse( <radial-size>? [ at <position> ]? )

<radial-size> =
<radial-extent> |
<length [0,∞]> |
<length-percentage [0,∞]>{2}

<position> =
<position-one> |
<position-two> |
<position-four>

<radial-extent> =
closest-corner |
closest-side |
farthest-corner |
farthest-side

<length-percentage> =
<length> |
<percentage>

<position-one> =
left |
center |
right |
top |
bottom |
x-start |
x-end |
y-start |
y-end |
block-start |
block-end |
inline-start |
inline-end |
<length-percentage>

<position-two> =
[ left | center | right | x-start | x-end ] && [ top | center | bottom | y-start | y-end ] |
[ left | center | right | x-start | x-end | <length-percentage> ] [ top | center | bottom | y-start | y-end | <length-percentage> ] |
[ block-start | center | block-end ] && [ inline-start | center | inline-end ] |
[ start | center | end ]{2}

<position-four> =
[ [ left | right | x-start | x-end ] <length-percentage> ] && [ [ top | bottom | y-start | y-end ] <length-percentage> ] |
[ [ block-start | block-end ] <length-percentage> ] && [ [ inline-start | inline-end ] <length-percentage> ] |
[ [ start | end ] <length-percentage> ]{2}

Beispiele

Einfaches ellipse() Beispiel

Dieses Beispiel zeigt eine Ellipse, die links ausgerichtet ist und einen horizontalen Radius von 40%, einen vertikalen Radius von 50% und eine linke Position hat. Dies bedeutet, dass das Zentrum der Ellipse an der linken Kante des Rahmens liegt und uns eine halbe Ellipsenform gibt, um unseren Text darum herum zu platzieren. Klicken Sie im Codeblock auf "Play", um diese Werte zu ändern und zu sehen, wie sich die Ellipse verändert:

html
<div class="box">
  <div class="shape"></div>
  <p>
    One November night in the year 1782, so the story runs, two brothers sat
    over their winter fire in the little French town of Annonay, watching the
    grey smoke-wreaths from the hearth curl up the wide chimney. Their names
    were Stephen and Joseph Montgolfier, they were papermakers by trade, and
    were noted as possessing thoughtful minds and a deep interest in all
    scientific knowledge and new discovery. Before that night—a memorable night,
    as it was to prove—hundreds of millions of people had watched the rising
    smoke-wreaths of their fires without drawing any special inspiration from
    the fact.
  </p>
</div>
css
body {
  font: 1.2em / 1.5 sans-serif;
}
.shape {
  float: left;
  shape-outside: ellipse(40% 50% at left);
  margin: 20px;
  width: 100px;
  height: 200px;
}

Verwendung von closest-side / farthest-side Werten

Die Schlüsselwortwerte closest-side und farthest-side sind nützlich, um schnell eine Ellipse basierend auf der Größe des umflossenen Element-Referenzrahmens zu erstellen.

html
<div class="box">
  <div class="shape"></div>
  <p>
    One November night in the year 1782, so the story runs, two brothers sat
    over their winter fire in the little French town of Annonay, watching the
    grey smoke-wreaths from the hearth curl up the wide chimney. Their names
    were Stephen and Joseph Montgolfier, they were papermakers by trade, and
    were noted as possessing thoughtful minds and a deep interest in all
    scientific knowledge and new discovery. Before that night—a memorable night,
    as it was to prove—hundreds of millions of people had watched the rising
    smoke-wreaths of their fires without drawing any special inspiration from
    the fact.
  </p>
</div>
css
body {
  font: 1.2em / 1.5 sans-serif;
}
.shape {
  float: left;
  shape-outside: ellipse(closest-side farthest-side at 30%);
  margin: 20px;
  width: 100px;
  height: 140px;
}

Interaktives Beispiel für Radius-Schlüsselwörter

Dieses Beispiel ermöglicht es Ihnen, die Wirkung der Verschiebung des Mittelpunktes der Ellipse zu testen, wenn jedes der vier <shape-radius> Schlüsselwörter – unabhängig für den x-Radius und den y-Radius ausgewählt – verwendet wird.

Da closest-corner und farthest-corner neuere Ergänzungen zu ellipse() sind, testet das Skript jedes Schlüsselwort mit CSS.supports(), bevor es aktiviert wird. Jedes Schlüsselwort, das Ihr Browser noch nicht unterstützt, wird in beiden Dropdowns deaktiviert (und als "nicht unterstützt" gekennzeichnet).

HTML

Das HTML definiert zunächst Steuerelemente zum Auswählen der x-Radius- und y-Radius-Schlüsselwörter und zum Festlegen der Position, an der die Ellipse angezeigt werden soll, gefolgt von einem <pre> Element zur Anzeige des clip-path, das die Steuerungswerte auswählen. Danach wird ein #support-note Element bereitgestellt, um anzuzeigen, wann bestimmte Radius-Schlüsselwörter nicht unterstützt werden.

html
<div class="controls">
  <div class="controls-row">
    <label>
      X radius:
      <select id="radius-x-keyword">
        <option value="closest-side">closest-side</option>
        <option value="closest-corner">closest-corner</option>
        <option value="farthest-side">farthest-side</option>
        <option value="farthest-corner" selected>farthest-corner</option>
      </select>
    </label>
    <label>
      Y radius:
      <select id="radius-y-keyword">
        <option value="closest-side">closest-side</option>
        <option value="closest-corner">closest-corner</option>
        <option value="farthest-side" selected>farthest-side</option>
        <option value="farthest-corner">farthest-corner</option>
      </select>
    </label>
  </div>
  <div class="controls-row">
    <label>
      Position X:
      <input type="range" id="pos-x" min="0" max="200" value="120" />
    </label>
    <label>
      Position Y:
      <input type="range" id="pos-y" min="0" max="120" value="40" />
    </label>
  </div>
</div>

<pre id="declaration"></pre>

<p id="support-note"></p>

Das HTML definiert dann mehrere <div> Elemente, die zur Darstellung der Ellipse, des Referenzrahmens und des Mittelpunktmarkers verwendet werden. Die wichtigsten Elemente sind der Referenzrahmen (#refbox) und das .fill Element, das es enthält, die den gezeichneten Verlauf definieren (wie im folgenden CSS-Abschnitt erläutert). Ein clipPath wird im JavaScript-Code auf den Referenzrahmen gesetzt, um diesen Verlauf an eine elliptische Form zu beschneiden.

html
<div class="canvas">
  <div class="refbox" id="refbox">
    <div class="fill"></div>
  </div>
  <div class="outline"></div>
  <div class="center-marker" id="center-marker"></div>
</div>

Beachten Sie, dass .outline und .center-marker bereitgestellt werden, um den Referenzrahmen und das Zentrum der Schnittellipse besser sichtbar zu machen, die sonst unsichtbar wären. Das .outline Element muss im Markup nach #refbox platziert werden: da es selbst nicht beschnitten wird, bedeutet das Zeichnen nach dem Referenzrahmen, dass seine gepunktete Grenze immer oben auf dem .fill Verlauf rendert, selbst wenn die Schnittellipse über den Referenzrahmen hinausgeht.

CSS

Das CSS für die Leinwand-, Referenzrahmen- und Füllelelemente wird unten gezeigt. Beachten Sie, dass .fill einen Verlauf definiert, der über den Referenzrahmen hinausläuft und den größten Teil der Leinwand ausfüllt. Dies ist der Verlauf, den wir mit der ellipse() Funktion zuschneiden werden (wir tun dies, indem wir den CSS-Clippfad dynamisch in unserem JavaScript-Code einstellen).

css
.canvas {
  position: relative;
  width: 640px;
  height: 480px;
  overflow: hidden;
  border: 1px solid #888888;
}

.refbox {
  position: absolute;
  top: 180px;
  left: 220px;
  width: 200px;
  height: 120px;
  box-sizing: border-box;
}

.fill {
  position: absolute;
  inset: -240px;
  background: linear-gradient(to bottom right, #ff5522, #0055ff);
}

Das CSS für die Steuerungen und andere Elemente wird nicht gezeigt, da es nicht notwendig ist, um die ellipse() Methode zu verstehen. Interessierte Leser können es im Beispielspielplatz einsehen.

JavaScript

Zuerst erhalten wir Verweise auf jedes der im Beispiel verwendeten Elemente.

js
const selectX = document.getElementById("radius-x-keyword");
const selectY = document.getElementById("radius-y-keyword");
const posX = document.getElementById("pos-x");
const posY = document.getElementById("pos-y");
const refbox = document.getElementById("refbox");
const declaration = document.getElementById("declaration");
const marker = document.getElementById("center-marker");
const supportNote = document.getElementById("support-note");

Dann definieren wir eine checkSupport() Funktion, um zu testen, ob jedes Radius-Schlüsselwort unterstützt wird, und die zugehörigen Optionen in beiden Dropdowns zu aktivieren/deaktivieren. Dies verwendet die Methode CSS.supports(), um die Unterstützung des Schlüsselworts zu überprüfen.

js
function checkSupport() {
  const unsupported = new Set();
  for (const option of selectX.options) {
    const test = `ellipse(${option.value} ${option.value} at 0px 0px)`;
    if (!CSS.supports("clip-path", test)) {
      unsupported.add(option.value);
    }
  }
  for (const select of [selectX, selectY]) {
    for (const option of select.options) {
      if (unsupported.has(option.value)) {
        option.disabled = true;
        option.textContent += " (not supported)";
      }
    }
    if (select.selectedOptions[0]?.disabled) {
      const firstSupported = [...select.options].find(
        (option) => !option.disabled,
      );
      if (firstSupported) {
        select.value = firstSupported.value;
      }
    }
  }
  if (unsupported.size > 0) {
    supportNote.textContent = `Your browser doesn't support: ${[...unsupported].join(", ")}.`;
  }
}

Als nächstes definieren wir eine update() Funktion, die immer dann aufgerufen wird, wenn die Eingabesteuerungen geändert werden. Diese setzt den Clippfad auf dem Referenzrahmen basierend auf den ausgewählten x-Radius- und y-Radius-Schlüsselwörtern und der Position und bewegt den Mittelpunktmarker entsprechend.

js
function update() {
  const xKeyword = selectX.value;
  const yKeyword = selectY.value;
  const x = Number(posX.value);
  const y = Number(posY.value);

  // Build the clip-path value and apply it to the reference box
  const value = `ellipse(${xKeyword} ${yKeyword} at ${x}px ${y}px)`;
  refbox.style.clipPath = value;

  // Update the displayed declaration text and marker position
  declaration.textContent = `clip-path: ${value};`;
  marker.style.left = `${refbox.offsetLeft + x}px`;
  marker.style.top = `${refbox.offsetTop + y}px`;
}

selectX.addEventListener("change", update);
selectY.addEventListener("change", update);
posX.addEventListener("input", update);
posY.addEventListener("input", update);
checkSupport();
update();

Ergebnis

Ändern Sie die Position des Zentrums und das Schlüsselwort für jeden Radius, um ihre relativen Effekte zu sehen. Beachten Sie, dass der Referenzrahmen zusammen mit den ausgewählten x-Radius- und y-Radius-Schlüsselwörtern sowie der Position verwendet wird, um die Schnittellipse zu berechnen. Diese Ellipse kann sich über den Referenzrahmen hinaus erstrecken (zum Beispiel mit closest-corner oder farthest-corner); der .fill Verlauf ist absichtlich größer als der Referenzrahmen dimensioniert, damit er die zugeschnittene Ellipse immer vollständig abdeckt, egal wie weit sie sich erstreckt.

Spezifikationen

Spezifikation
CSS Shapes Module Level 1
# funcdef-basic-shape-ellipse

Browser-Kompatibilität

Siehe auch