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
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 wieleftsein. 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:
<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>
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.
<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>
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.
<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.
<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).
.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.
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.
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.
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
- Eigenschaften, die diesen Datentyp verwenden:
border-shape,clip-path,shape-outside - Leitfaden zu Basic Shapes