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 eine 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 zusammengedrückter Kreis und daher funktioniert ellipse() sehr ähnlich wie circle(), außer dass wir zwei Radien x und y festlegen müssen.

Werte

<shape-radius>

Zwei Radien, x und y, in dieser Reihenfolge. Diese können eine <length>, ein <percentage> oder einer der folgenden Schlüsselwortwerte sein:

closest-side

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

farthest-side

Der Radius ist die Länge vom Zentrum der Ellipse zur am weitesten entfernten Seite des Referenzrahmens in der gegebenen Radiusrichtung, sodass die Ellipsenbegrenzung diese Seite gerade berührt.

closest-corner

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

farthest-corner

Der Radius ist die Länge vom Zentrum der Ellipse zur am weitesten entfernten Ecke des Referenzrahmens in der gegebenen Radiusrichtung.

<position>

Bewegt das Zentrum der Ellipse. Kann eine <length>, ein <percentage> oder ein Wert wie left sein. Der <position>-Wert wird standardmäßig auf die Mitte gesetzt, 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 Beispiel für ellipse()

Dieses Beispiel zeigt eine Ellipse, die links schwebt und einen horizontalen Radius von 40%, einen vertikalen Radius von 50% und eine linke Position hat. Das bedeutet, dass das Zentrum der Ellipse am linken Rand des Rahmens liegt und uns eine halbe Ellipse gibt, um unseren Text herum zu wickeln. Klicken Sie auf "Play" in den Code-Blöcken, 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 von closest-side und farthest-side sind nützlich, um schnell eine Ellipse basierend auf der Größe des schwebenden 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 Auswirkung der Verschiebung des Mittelpunkts der Ellipse zu testen, wenn Sie jedes der vier <shape-radius>-Schlüsselwörter verwenden — unabhängig für den x-Radius und den y-Radius gewählt.

Da closest-corner und farthest-corner eine neuere Ergänzung zu ellipse() sind, testet das Skript jede Funktion mit CSS.supports(), bevor es aktiviert wird. Jedes Schlüsselwort, das Ihr Browser noch nicht unterstützt, ist 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 Steuerelemente auswählen. Danach wird ein #support-note-Element bereitgestellt, um anzuzeigen, wenn 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 verwendet werden, um die Ellipse, den Referenzrahmen und die Mittelpunktsmarkierung zu rendern. Die wichtigsten Elemente sind der Referenzrahmen (#refbox) und das .fill-Element, das er enthält und das den Verlauf definiert, der gezeichnet wird (wie im folgenden CSS-Abschnitt besprochen). Ein clipPath wird mit JavaScript auf den Referenzrahmen gesetzt, um diesen Verlauf in eine elliptische Form zu schneiden.

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 die .outline und .center-marker bereitgestellt werden, um es einfacher zu machen, den Referenzrahmen und das Zentrum der Clipping-Ellipse zu sehen, die sonst unsichtbar wären. Das .outline-Element muss nach #refbox im Markup platziert werden: da es selbst nicht geclippt wird, bedeutet das Malen nach dem Referenzrahmen, dass sein gestrichelter Rand immer oben auf dem .fill-Verlauf rendert, selbst wenn der Clipping-Ellipse über den Referenzrahmen hinausgeht.

CSS

Das CSS für das Canvas, den Referenzrahmen und die Füllelemente wird unten gezeigt. Beachten Sie, dass die .fill einen Verlauf definiert, der den Referenzrahmen überläuft und den größten Teil der Leinwand füllt. Dies ist der Verlauf, den wir mit der ellipse()-Funktion schneiden werden (wir tun dies, indem wir den CSS-Clip-Pfad dynamisch in unserem JavaScript-Code setzen).

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

.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 Steuerelemente 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 Elemente, die im Beispiel verwendet werden.

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 um die zugehörigen Optionen in beiden Dropdowns zu aktivieren/deaktivieren. Dazu wird die CSS.supports()-Methode verwendet, um die Unterstützung der Schlüsselwörter 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 Eingabesteuerelemente geändert werden. Diese setzt den Clip-Pfad auf dem Referenzrahmen basierend auf den ausgewählten x-Radius- und y-Radius-Schlüsselwörtern und der Position und bewegt die Mittelpunktsmarkierung 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 Mittelpunkts und das Schlüsselwort für jeden Radius, um deren relative Effekte zu sehen. Beachten Sie, dass der Referenzrahmen zusammen mit den ausgewählten x-Radius- und y-Radius-Schlüsselwörtern und der Position verwendet wird, um die Clipping-Ellipse zu berechnen. Diese Ellipse kann den Referenzrahmen überschreiten (zum Beispiel mit closest-corner oder farthest-corner); der .fill-Verlauf ist absichtlich größer als der Referenzrahmen dimensioniert, sodass er immer die geclippten Ellipse 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