Lösung
Der einfachste Weg, um dieses Problem zu beheben, besteht darin, den Wert für die background-origin
Eigenschaft als festzulegen border-box
.
.colors {
width: 100px;
border: 10px solid rgba(0, 0, 0, 0.2);
height: 50px;
background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5);
background-origin: border-box;
}
<div class="colors"></div>
Grund für das fragliche Verhalten
Die folgenden relevanten background
Eigenschaften bestimmen, wie der Hintergrundverlauf für diesen Fall angezeigt wird:
background-origin
- Der Standardwert ist padding-box
. Dies bedeutet, dass der Hintergrund tatsächlich in Bezug auf die Polsterbox positioniert ist und daher nach dem beginnt border
.
background-repeat
- Der Standardwert hierfür ist repeat
. Dies bedeutet, dass das Bild so oft wie nötig wiederholt werden sollte, um den gesamten Hintergrundmalbereich abzudecken.
background-clip
- Der Standardwert hierfür ist border-box
. Dies bedeutet, dass das Bild auch unter dem Bereich vorhanden sein sollte, der von den Rändern der Box eingenommen wird.
Wenn wir nun alle drei kombinieren, können wir sehen, dass der Rand so oft wie möglich wiederholt werden muss, damit er auch unter den Rändern vorhanden ist, und dass seine Startposition hinter dem Rand der Box liegt. Dies bedeutet, dass der Hintergrund zyklisch wiederholt werden muss, um den Bereich unter dem Rand auf der linken Seite auszufüllen. Aus diesem Grund hat der linke Rand die Farbe als rechtes Ende des Verlaufs und umgekehrt.
Durch Ändern in border-box
wird der Hintergrund in Bezug auf das Rahmenfeld positioniert. Diese Einstellung wirkt sich auch auf die Größe des Hintergrundbilds aus, und der Grund dafür wird nachstehend ausführlich beschrieben.
Warum funktioniert das box-sizing: border-box
nicht?
Die Einstellung box-sizing
als border-box
bewirkt keine Änderung, da diese Eigenschaft nur die Größe der Box beeinflusst. Es hat absolut keine Auswirkungen auf Folgendes:
- Die Größe des Gradientenbildes (die tatsächliche Berechnungslogik wird unten beschrieben)
- Der Startpunkt (oder die Position) des Verlaufsbildes
- Die Wiederholung des Hintergrundbildes
Wie berechnet sich die Größe des Gradienten?
Gemäß der W3C-Spezifikation werden im Folgenden die Abmessungen des Bildes berechnet, wenn keine explizite Größe angegeben ist (Standardwert ist auto
).
Wenn das Bild weder eine Eigenbreite noch eine Eigenhöhe hat, wird seine Größe wie für "Enthalten" bestimmt.
Beachten Sie, wie es um die Größe des Bildes und nicht um die der Box geht. Unabhängig von der Größe des Felds würde die Größe des Hintergrundbilds im Wesentlichen basierend auf der Definition für das Schlüsselwort berechnet, contain
wenn das Bild selbst keine intrinsische Höhe hat ( die CSS-Verläufe im Gegensatz zu Bildern nicht haben ).
Die Definition fürcontain
lautet wie folgt:
Skalieren Sie das Bild unter Beibehaltung seines intrinsischen Seitenverhältnisses (falls vorhanden) auf die größte Größe, sodass sowohl seine Breite als auch seine Höhe in den Hintergrundpositionierungsbereich passen .
Der Hintergrundpositionierungsbereich ist wie folgt definiert (unter background-origin
Eigenschaftsdefinition):
Gibt für Elemente, die als einzelnes Feld gerendert werden, den Hintergrundpositionierungsbereich an
Wenn das Bild keine intrinsische Höhe hat (und in diesem Fall auch keine background-size
), wäre die Größe des Bildes gleich der des background-origin
Wertes von (was in unserem Fall der Fall ist padding-box
).
Aus diesem Grund hat auch das Einstellen des box-sizing
as border-box
keine Auswirkung.
Hinweis: Die Betonung in den zitierten Texten liegt ausschließlich bei mir
Wenn Sie explizit background-size
die Größe des Felds festlegen , werden Sie feststellen, wie das Problem auf der rechten Seite, jedoch nicht auf der linken Seite behoben wird. Dies liegt daran, dass das Bild jetzt groß genug ist, um nicht unter dem rechten Rand wiederholt zu werden, aber sein Startpunkt immer noch hinter dem linken Rand liegt.
.colors {
width: 100px;
border: 10px solid rgba(0, 0, 0, 0.2);
height: 50px;
background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5);
background-size: 110px 60px;
}
.colors-2 {
width: 100px;
border: 10px solid rgba(0, 0, 0, 0.2);
height: 50px;
background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5);
box-sizing: border-box;
background-size: 100px 50px;
}
<div class="colors">
</div>
<div class="colors-2">
</div>