DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!
Die CSS-Eigenschaft grid-row-end ist Teil der CSS Grid Layout Spezifikation und wird verwendet, um die Zeilenrasterlinie anzugeben, an der ein Gitterelement in einem Gitterlayout endet. Diese Eigenschaft – neben anderen linienbasierten Platzierungs-Gitter-Eigenschaften – steuert die Größe eines Gitterelements und dessen Position auf dem Gitter.
.grid-container {
display: grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 1fr 1fr 1fr;
}
.grid-item:nth-child(2) {
grid-row-end: 3; /* Item ends on the third row line */
}
Basierend auf dem standardmäßigen Auto-Placement-Verhalten von CSS Grid sollte das zweite Kindelement des Gitters in diesem Beispiel in der ersten Zeile und der zweiten Spalte platziert werden. Wir haben jedoch eine grid-row-end-Position an der Rasterlinie der zweiten Zeile deklariert, wodurch das Gitterelement in die zweite Zeile verschoben und seine Endkante mit der Rasterlinie der dritten Zeile ausgerichtet wird.

grid-row-end.Syntax
grid-row-end: <grid-line>
Vollständige Definition
where
<grid-line> =
auto |
<custom-ident> |
[ [ <integer [−∞,−1]> | <integer [1,∞]> ] && <custom-ident>? ] |
[ span && [ <integer [1,∞]> || <custom-ident> ] ]
- Anfangswert:
auto - Gilt für: Gitterelemente und absolut positionierte Boxen, deren enthaltender Block ein Gittercontainer ist.
- Vererbt: nein
- Berechneter Wert: wie angegeben
- Animationstyp: diskret
Werte
/* Keyword value */
grid-row-end: auto;
/* <custom-ident> value */
grid-row-end: myLineName;
grid-row-end: myGridArea;
/* <integer> + <custom-ident> values */
grid-row-end: 3;
grid-row-end: -2;
grid-row-end: main-area 2;
grid-row-end: 3 product-end;
/* span + <integer> + <custom-ident> values */
grid-row-end: span 3;
grid-row-end: span main;
grid-row-end: span myarea 5;
/* Global values */
grid-row-end: inherit;
grid-row-end: initial; /* same as `auto` */
grid-row-end: revert;
grid-row-end: revert-layer;
grid-row-end: unset;
auto
Dies ist der Standardwert. Er gibt die standardmäßige Spanne (1) und das automatische Platzierungsverhalten an, was bedeutet, dass das Gitterelement automatisch in der nächsten freien Gitterzelle platziert wird.
<custom-ident>
Diese Syntax ermöglicht es Ihnen, entweder eine Ganzzahl zu verwenden, um auf eine nummerierte Rasterlinie zu verweisen, oder einen String, um auf eine benannte Rasterlinie oder einen benannten Rasterbereich zu verweisen. Mit anderen Worten, Sie können eine Rasterlinie durch ihren numerischen Index oder Namen für die Endkante eines Gitterelements angeben.
Positionierung von Elementen nach Zeilennummern
Zwischen jedem Gittertrack befinden sich zwei Gitterlinien, denen automatisch eine fortlaufende Nummer ab eins zugewiesen wird.

Im ersten Beispiel dieses Artikels haben wir diese Syntax verwendet, um auf die dritte Rasterlinie nach ihrem Index (3) zu verweisen, um die Endkante des Gitterelements mit der Endkante der zweiten Zeile mithilfe der <custom-ident>-Syntax auszurichten.
.grid-item:nth-child(2) {
grid-row-end: 3;
}
Beachten Sie, dass Sie auch eine negative Zahl (z. B. -1) verwenden können, um auf eine Rasterlinie zu verweisen. Denken Sie jedoch daran, dass sie ab dem Ende des Rasters gezählt wird. Der folgende Code verweist auf dieselbe Rasterlinie wie im vorherigen Beispiel, zählt aber rückwärts.
.grid-item:nth-child(2) {
grid-row-end: -2; /* same as 3 */
}
Beachten Sie, dass den Spalten unseres Gitters negative und positive ganze Zahlen zugewiesen wurden.

grid-row-end.Positionierung von Elementen anhand von Liniennamen
Sie können einer Rasterlinie einen benutzerdefinierten Namen mit grid-template-columns und grid-template-rows zuweisen und linienbasierte Platzierungs-Gitter-Eigenschaften verwenden, um auf diese Linie nach ihrem Namen zu verweisen.
Kehren wir zu unserem Beispiel zurück und benennen alle seine Zeilenspurlinien wie in der folgenden Deklaration
.grid {
display: grid;
grid-template-rows: [first] 100px [second] 100px [third] 100px [last];
grid-template-columns: 1fr 1fr 1fr;
}
Wir können uns an die dritte Linie mit unserem benutzerdefinierten Namen anstelle ihres Index wenden
.grid-item:nth-child(2) {
grid-row-end: third; /* same as index number 3 */
}
Beachten Sie, dass <custom-ident> nicht den Wert span annehmen kann, da span ein reserviertes Schlüsselwort für Gitterplatzierungs-Eigenschaften ist (z. B. grid-column: 1 / span 2).
Positionierung von Elementen anhand von Gitterbereichen
Wenn Sie Gitterbereiche mit der Eigenschaft grid-template-areas definieren, erhalten Sie kostenlos implizite Zeilennamen, basierend auf dem Namen der Bereiche. Zum Beispiel generiert ein Gitterbereich mit dem Namen header davor eine Zeilennamen header-start und danach eine header-end. Sie können auf diese Linien verweisen, um die Position eines Gitterelements festzulegen.
.grid-item:nth-child(2) {
grid-row-end: header-end;
}
Alternativ können Sie auf den Namen des Bereichs verweisen, um ein Element an der Endlinie des benannten Bereichs header zu positionieren.
.grid-item:nth-child(2) {
grid-row-end: header;
}
Da Sie in diesem Beispiel die Eigenschaft grid-row-end verwenden, versteht der Browser, dass Sie die Zeile header-end des Bereichs header meinen; daher wird die Endkante des Gitterelements mit der Endkante des Gitterbereichs ausgerichtet.
Hier ist ein vollständiges Beispiel.
<body>
<header></header>
<main></main>
<footer></footer>
</body>
body {
display: grid;
grid-template-rows: min-content 1fr min-content;
grid-template-areas:
"header"
"main"
"footer";
}
header {
grid-row-end: header;
}
Dies legt die Position des <header>-Elements auf den header-Bereich in unserem Gitter fest.
<integer> && <custom-ident>?
Diese Syntaxvariante ermöglicht es Ihnen, Gitterelemente anhand von Gitterlinien zu positionieren, wenn es wiederholte Namen gibt. Wenn Gitterlinien denselben Namen haben, hilft diese Syntax dabei, anzugeben, auf welche dieser Linien Sie sich beziehen.
.grid {
display: grid;
grid-template-rows: [bar] 100px [foo] 100px [bar] 150px [bar];
}
Nehmen wir an, Sie möchten die vierte Linie auswählen, aber diese Linie hat denselben Namen wie die erste und die dritte Gitterlinie – alle heißen bar. Da die *dritte* Linie mit dem Namen bar die vierte Gitterlinie ist, können Sie 3 verwenden, um sie als Endpunkt auszuwählen.
.grid-item:nth-child(2) {
grid-row-end: 3 bar; /* The third `bar` named line which is the fourth line */
}

Beachten Sie, dass die Reihenfolge keine Rolle spielt, sodass der vorherige Code auch so geschrieben werden kann:
.grid-item:nth-child(2) {
grid-row-end: bar 3;
}
Wie bei der vorherigen Syntax können Sie auch einen negativen ganzzahligen Wert verwenden, um die Gitterlinien vom Ende des Gitters aus zu zählen. In unserem Beispiel, wenn wir uns auf die erste bar beziehen möchten, können wir vom Ende unseres Gitters aus zählen und es so schreiben:
.grid-item:nth-child(2) {
grid-row-end: -3 bar;
}
Beachten Sie, dass der Ganzzahlwert nicht Null sein kann, da Linien Nicht-Null-Werte zugewiesen bekommen.
span && [ <integer> || <custom-ident> ]
Diese Syntax ermöglicht es einem Gitterelement, sich über Gittertracks zu erstrecken. Dies kann auf drei verschiedene Arten angegeben werden.
Wenn die Ganzzahl in dieser Syntax nirgends angegeben ist, ist der Standardwert 1.
span <integer>
Die Verwendung des Schlüsselworts span gefolgt von einer Ganzzahl gibt die Anzahl der Spuren an, über die sich ein Gitterelement erstreckt, beginnend von einer bestimmten Gitterlinie. Wenn wir beispielsweise möchten, dass sich ein Gitterelement über drei Zeilenspuren zu seiner Endkante erstreckt, können wir den folgenden Wert anwenden.
.grid-item:nth-child(2) {
grid-row-end: span 3;
}

grid-row-end.span <custom-ident>
Sie können span mit einem Namen einer Gitterlinie kombinieren, damit sich das Gitterelement ausdehnt, bis es diese angegebene Gitterlinie erreicht.
.grid-item:nth-child(2) {
grid-row-start: 3;
grid-row-end: span lastline;
}
Da die Startlinie des Gitterelements bekannt ist (3), können wir das Element in Richtung der Endlinie spannen, bis es eine Gitterlinie namens lastline erreicht.

grid-row-end erreicht.span <custom-ident> <integer>
Wenn der angegebene Gitterlinienname mehr als einer Gitterlinie zugewiesen ist – mit anderen Worten, wenn wir wiederholte benannte Gitterlinien haben – müssen wir angeben, welche wir ansprechen möchten. Dazu können wir unserer Wert eine Ganzzahl hinzufügen, die angibt, auf welche Gitterlinie wir uns beziehen.
Nehmen wir das folgende Gitter als Beispiel.
.grid-container {
display: grid;
grid-template-rows: [y] 50px [x] 50px [x] 50px [y] 50px [x] 50px [x];
}
.grid-item:nth-child(2) {
grid-row-start: 2;
grid-row-end: span x 2; /* equivalent to grid-row-end: 5; */
}
Wir setzen die Startlinie des Gitterelements auf die zweite Linie. Dann möchten wir, dass es nach unten gespannt wird, bis es eine Gitterlinie namens x erreicht. Und da wir möchten, dass es die zweite x-Gitterlinie ist, erhalten wir grid-row-end: span x 2.
Als Ergebnis beginnt unser Gitterelement, sich von der zweiten Linie in Richtung der Endlinie zu spannen, wie unten dargestellt. Die erste Linie, auf die es trifft, ist die erste x, dann folgt eine mit dem Namen y, und schließlich trifft es die gewünschte zweite Linie namens x.

x mit der CSS Grid-Eigenschaft grid-row-end.Diese Syntax ist hilfreich, wenn Sie ein Gitterelement über eine Gitterlinie mit ihrem Namen spannen möchten, aber wissen, dass es mehr als eine Gitterlinie mit diesem Namen gibt. Daher fügen wir eine Ganzzahl hinzu, um anzugeben, dass wir die N dieser Gitterlinie möchten.
Positionierung von Gitterelementen kann implizite Spuren erzeugen
Die Positionierung eines Gitterelements auf eine Gitterlinien-Index oder einen Gitterlinien-Namen, der in einem expliziten Gitter nicht existiert, zwingt das Gitter, implizite Spuren zu erstellen, um diese Position zum Gitter hinzuzufügen.
Erstellen wir ein Gitter mit zwei Zeilen und positionieren dessen Element auf nicht existierende Linien. Im folgenden Beispiel haben wir nur zwei Zeilen und keine unserer Gitterlinien benannt. Es gibt also keine Linie mit dem Index 5 und keine Linie mit dem Namen test, aber wir setzen diese Werte in unsere Eigenschaften.
.grid {
display: grid;
grid-template-rows: 100px 100px;
grid-auto-rows: 100px;
}
.grid-item {
grid-row-start: span test;
grid-row-end: 5;
}
Da wir wissen, dass es implizite Spuren in unserem Gitter gibt und wir möchten, dass sie eine Größe haben, damit wir sie sehen können, fügen wir die Eigenschaft grid-auto-rows unserem Code hinzu.
Jetzt, da wir alles eingerichtet haben, sehen wir, was mit unserem Gitter passiert.

Wir setzen grid-row-end auf 5, aber der letzte Index unseres expliziten Gitters ist 3. Aus diesem Grund werden zwei implizite Spuren am Ende des Gitters erstellt, um uns implizite Linien mit den Indizes 4 bzw. 5 zu geben, an denen sich das Element ausrichten kann.
Auf der anderen Seite, sagen wir, wir setzen grid-row-end auf eine Gitterlinie namens test. Da wir keinen solchen Namen in unserem Gitter haben und wir möchten, dass diese Gitterlinie an der Startkante unseres Gitterelements ausgerichtet wird, wird eine implizite Zeilenspur auf der Startseite des expliziten Gitters in Blockrichtung erstellt, und ihre Linie wird test genannt.
Positionierung von Gitterelementen kann Lücken in der Darstellung verursachen
Wie Sie in den vorherigen Beispielen gesehen haben, kann die linienbasierte Platzierung leere Räume zwischen Gitterelementen verursachen. Sie können diese vermeiden, indem Sie die Eigenschaft grid-auto-flow mit dem Wert dense auf den Gittercontainer anwenden.

grid-auto-flow kann durch linienbasierte Platzierung entstandene Lücken füllen.Stapeln von Gitterelementen
Beim Positionieren von Elementen im Gitter können wir sie stapeln oder übereinander legen. Dies gibt uns die Möglichkeit, CSS Grid manchmal als Alternative zur absoluten Positionierung zu verwenden. Zum Beispiel können wir eine Beschriftungsebene über ein Bild legen, ohne die Eigenschaft position zu verwenden, wie unten gezeigt.
<figure>
<img src="image.png" alt="how dare you leave alt empty?">
<figcaption>The caption of our image</figcaption>
</figure>
figure {
display: grid;
}
img,
figcaption {
grid-column-start: 1;
grid-column-end: -1;
grid-row-start: 1;
grid-row-end: -1;
}
Hier ist, was wir bekommen

Standardmäßig werden Gitterelemente in der Quellreihenfolge gestapelt, aber Sie können ihre Ebene mit der Eigenschaft z-index steuern. Im folgenden Beispiel überlappen wir einige Elemente und verwenden die Eigenschaft z-index, um das zweite Element auf die höchste Ebene zu bringen.
.item:nth-child(2) {
grid-row-start: 2;
grid-row-end: 4;
grid-column-start: 2;
grid-column-end: 4;
z-index: 1;
}

z-index an den Anfang des Stapels bringen.Verwendung eines negativen Index für mehr Flexibilität
Es gibt Fälle, in denen Sie ein Element mit voller Höhe in Ihrem Gitter wünschen, was bedeutet, dass es von der ersten Gitterlinie ausgeht und bis zur letzten reicht. Zum Beispiel ist bei einem Gitter mit vier Zeilen der Index der Endlinie 5. Sie können also den folgenden Code schreiben, um Ihr Element mit voller Höhe zu erhalten.
.grid-container {
display: grid;
grid-template-rows: repeat(4, min-content);
}
.grid-item.full-height {
grid-row-start: 1;
grid-row-end: 5;
}
Das funktioniert wie erwartet, aber was ist, wenn sich die Anzahl der Zeilen auf sechs ändert? In diesem Fall müssen wir den Indexwert für die Platzierungseigenschaft aktualisieren.
.grid-container {
display: grid;
grid-template-rows: repeat(5, min-content);
}
.grid-item.full-height {
grid-row-start: 1;
grid-row-end: 6;
}
Die flexiblere Lösung ist jedoch die Verwendung des negativen Index!
.grid-item.full-height {
grid-row-start: 1;
grid-row-end: -1;
}
Nun erstreckt sich das Gitterelement mit der Klasse .full-height immer über das Gitter, unabhängig davon, wie viele Zeilen wir zum Gittercontainer hinzufügen oder daraus entfernen.
Benannter Bereich hat Vorrang vor benannter Linie
Wenn ein benannter Gitterbereich denselben Namen wie eine Linienname hat, bevorzugt der Platzierungsalgorithmus die Linien des benannten Gitterbereichs.
Betrachten Sie das folgende Beispiel
.grid {
display: grid;
grid-template-rows: 80px [y] 80px 80px 80px 80px;
grid-template-areas:
"x"
"x"
"x"
"y"
"y";
}
Die zweite Gitterlinie heißt y, und die letzten beiden Zeilen sind als Bereich mit demselben Namen definiert. Nun weisen wir zur Positionierung des ersten Gitterelements y als Wert für grid-row-end zu. Sehen wir uns an, auf welche Linie verwiesen wird.
.grid-item:first-child {
grid-row-end: y;
}
Wie Sie im nächsten Bild sehen können, hat der Browser zwar die Linie y näher am ersten Element gewählt, aber die Kante des Gitterbereichs, um die Endkante des Elements zu platzieren.

y, und der Browser wählt die Gitterbereichslinie anstelle der benannten Gitterlinie, wenn dieser Name für Gitterplatzierungs-Eigenschaften zugewiesen wird.Beachten Sie, dass dies nicht gilt, wenn Sie die implizite Linienbezeichnung eines Gitterbereichs verwenden. Ändern wir zum Beispiel den Namen der Gitterlinie im vorherigen Beispiel in y-end. Wir wissen auch, dass der Bereich mit dem Namen y eine implizite Gitterlinie y-end zugewiesen hat. Wenn wir nun y-end für grid-row-end festlegen, gewinnt diesmal die benannte Gitterlinie.
.grid {
display: grid;
grid-template-rows: 50px [y-end] 50px 50px 50px 50px;
grid-template-areas:
"x"
"x"
"x"
"y"
"y";
}
.grid-item:first-child {
grid-row-end: y-end;
}

y. Der Browser wählt die Gitterbereichslinie anstelle der benannten Gitterlinie, wenn dieser Name für Gitterplatzierungs-Eigenschaften zugewiesen wird.Barrierefreiheit (Accessibility)
Ein wichtiger Hinweis bei der Verwendung der Gitterplatzierungseigenschaften ist das Problem, das durch das Ändern der Reihenfolge der Elemente entsteht. Wenn Sie die Position eines Elements ändern, ändert sich nur die visuelle Reihenfolge der Gitterelemente, und diese Reihenfolge stimmt möglicherweise nicht mit der ursprünglichen Dokumentreihenfolge überein. Dies kann zu einer sehr schlechten Erfahrung für jemanden führen, der mit der Tastatur durch das Dokument tabliert oder einen Screenreader verwendet, der den Inhalt in der gleichen Reihenfolge wie das HTML liest.
Vermeiden Sie es daher, die Reihenfolge von Gitterelementen zu ändern, wenn die HTML-Reihenfolge der Elemente wichtig ist. Zum Beispiel kann dies für eine zufällige Bildergalerie gut sein, aber vielleicht nicht so sehr für Ihre Formulareingaben.
Zum Zeitpunkt der Verfassung dieses Textes gibt es einen Vorschlag, dieses Problem anzugehen, der dieses Problem hoffentlich in Zukunft lösen wird.
Demo
Sie können den Wert der Gitterplatzierungseigenschaften in der Demo ändern, um zu sehen, was mit dem dritten Gitterelement passiert.
Browser-Unterstützung
Weitere Informationen
Eine Sammlung interessanter Fakten über CSS Grid Layout
Akkordeon-Reihen in CSS Grid
Eine weitere Sammlung interessanter Fakten über CSS Grid
Ein sich automatisch füllendes CSS-Grid mit maximalen Spalten einer Mindestgröße
Erstellen eines CSS Grid Overlays
Ein hexagonales Gitter mit CSS Grid erstellen
Erweiterbare Abschnitte innerhalb eines CSS Grid
Erkundung der impliziten Grid- und Auto-Platzierungsfähigkeiten von CSS Grid
Vollbreite Elemente durch Verwendung eines Gitter von Kante zu Kante
grid-auto-flow : CSS Grid :: flex-direction : Flexbox
Kleiner Tipp: Zeichnen Sie Ihr Gitter in ASCII in Ihre CSS-Kommentare für eine schnelle Referenz
Native CSS Masonry Layout in CSS Grid
Was ich über CSS Grid Layout gelernt habe
Verwandt
display
.element { display: inline-block; }
gap
.element { gap: 20px 30px; }
grid-template-areas
.element { grid-template-areas: "header header" "sidebar main"; }
grid-template-columns
.element { grid-template-columns: 300px 1fr; }
grid-template-rows
.element { grid-template-rows: minmax(auto, 1fr) 3fr; }
grid-auto-columns
.element { grid-auto-columns: minmax(100px, 200px); }
grid-auto-flow
.element { grid-auto-flow: dense; }
grid-auto-rows
.element { grid-auto-rows: minmax(1fr, 500px) 3fr; }
grid-column-end
.element { grid-column-end: 4; }
grid-column-start
.element { grid-column-start: 3; }
grid-row-start
.element { grid-row-start: 2; }
row-gap
.element { row-gap: 2rem; }