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 gestauchter Kreis und daher funktioniert ellipse() sehr ähnlich wie circle(), abgesehen davon, 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 <length>, ein <percentage> oder einer der folgenden Schlüsselwortwerte sein:

closest-side

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

farthest-side

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

closest-corner

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

farthest-corner

Der Radius ist die Länge vom Zentrum der Ellipse bis 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 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 Beispiel für ellipse()

Dieses Beispiel zeigt eine Ellipse, die links schwebt, mit einem horizontalen Radius von 40%, einem vertikalen Radius von 50% und einer linken Position. Dies bedeutet, dass sich das Zentrum der Ellipse an der linken Kante des Rahmens befindet und wir eine halbe Ellipsenform haben, um unseren Text darum herum zu platzieren. 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 Werten wie closest-side / farthest-side

Die Schlüsselwortwerte closest-side und farthest-side sind nützlich, um schnell eine Ellipse basierend auf der Größe des schwebenden Elementreferenzrahmens 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 Ellipsenzentrumpunkts bei Verwendung jedes der vier <shape-radius>-Schlüsselwörter zu testen — unabhängig für den x-Radius und den y-Radius ausgewählt.

Da closest-corner und farthest-corner eine neuere Ergänzung 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 mit "nicht unterstützt" gekennzeichnet).

HTML

Das HTML definiert zuerst Steuerungen zur Auswahl der x-Radius- und y-Radius-Schlüsselwörter und zur Einstellung der Position, an der die Ellipse angezeigt werden soll, gefolgt von einem <pre>-Element zur Anzeige des clip-path, das durch die Steuerungswerte ausgewählt wird. 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 zum Rendern der Ellipse, des Referenzrahmens und des Zentrum-Markers verwendet werden. Die wichtigsten Elemente sind der Referenzrahmen (#refbox) und das darin enthaltene .fill-Element, die den Gradienten definieren, der gezeichnet wird (wie im folgenden CSS-Abschnitt besprochen). Ein clipPath wird auf dem Referenzrahmen in JavaScript gesetzt, um diesen Gradienten auf 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 die .outline und .center-marker bereitgestellt werden, um es einfacher zu machen, den Referenzrahmen und das Zentrum der Beschnittellipse zu sehen, 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 gestrichelte Umrandung immer oben auf dem .fill-Gradienten gerendert wird, selbst wenn die Beschnittellipse über den Referenzrahmen hinausgeht.

CSS

Das CSS für die Leinwand, den Referenzrahmen und die Füllelemente wird unten gezeigt. Beachten Sie, dass die .fill einen Gradienten definiert, der den Referenzrahmen überdeckt und den größten Teil der Leinwand füllt. Dies ist der Gradient, den wir mit der ellipse()-Funktion bescheiden werden (wir machen dies, indem wir den CSS-Clippfad dynamisch in unserem JavaScript-Code setzen).

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 Beispiel-Playground ansehen.

JavaScript

Zuerst erhalten wir Griffe für jedes der von dem 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 nutzt die CSS.supports()-Methode, um die Unterstützung für 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 jedes Mal 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 verschiebt den Zentrum-Marker 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 deren relative Auswirkungen 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 Beschnittellipse zu berechnen. Diese Ellipse kann über den Referenzrahmen hinaus extendieren (zum Beispiel mit closest-corner oder farthest-corner); der .fill-Gradient ist absichtlich größer dimensioniert als der Referenzrahmen, sodass er immer vollständig die beschnittene Ellipse abdeckt, egal wie weit sie reicht.

Spezifikationen

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

Browser-Kompatibilität

Siehe auch