Wie kann ich auf eine bestimmte Spalte oder Zeile in einem CSS-Rasterlayout abzielen?
Lesezeit: 12 Minuten
Diode Dan
Ist es möglich, eine bestimmte Rasterspalte oder -zeile mit CSS auszuwählen?
Angenommen, ich habe ein CSS-Rasterlayout mit 3 Zeilen und 2 Spalten: grid-template-rows: 1fr 1fr 1fr; grid-template-columns: 1fr 1fr;. Wie würde ich alle Elemente aus der 2. Spalte auswählen? Zum Beispiel: grid:nth-child(column:2) (nur meine Idee, kein gültiger Code).
Ich habe versucht nth-child Selektoren auf der div Elemente, aber dies erlaubt mir nicht, Zeile oder Spalte anzugeben, wenn die Elemente automatisch von der CSS-Grid-Layout-Engine platziert werden.
<div class="item">
<p>Customer Name</p>
<p>Element 1 | Element 2</p>
</div>
<div class="item">
<p>Right Justify</p>
<p>Element 1 | Element 2</p>
</div>
<div class="item">
<p>Customer Name</p>
<p>Element 1 | Element 2</p>
</div>
<div class="item">
<p>Customer Name</p>
<p>Element 1 | Element 2</p>
</div>
<div class="item">
<p>Customer Name</p>
<p>Element 1 | Element 2</p>
</div>
<div class="item">
<p>Customer Name</p>
<p>Element 1 | Element 2</p>
</div>
<div class="item">
<p>Customer Name</p>
<p>Element 1 | Element 2</p>
</div>
Verwendung von CSS-Selektoren in Javascript: stackoverflow.com/q/56069793
– djvg
7. März um 22:00 Uhr
chipit24
Um eine beliebige Zeile zu formatieren, könnten Sie ein Wrapper-Element mit seinem verwenden display einstellen contents. Siehe das Code-Snippet unten:
Wie bei allen Implementierungen sollten Sie überprüfen, ob es in Ihrer/Ihren Zielumgebung(en) funktioniert. Sie können die Kompatibilitätstabelle auf überprüfen MDN oder Kann ich benutzen zur Unterstützung für display: contents:
Dies sollte die richtige Antwort sein. Die Browserunterstützung ist aber nicht perfekt display: contents; wurde entwickelt, um dieses Problem ohne Hack zu lösen. Es ist großartig für DOM-Stepping, um die richtige Zeile zu stylen, aber gleichzeitig unsichtbar zu sein und vom Grid-Rendering übersprungen zu werden (es bringt nichts durcheinander).
– Jens Törnell
10. Juni 2019 um 7:46 Uhr
Sehr schöne Lösung, aber die Browserunterstützung fehlt ab Januar 2021 immer noch schmerzlich
– Julian Suggate
26. Januar 2021 um 5:38 Uhr
Nein, das ist KEINE gültige Antwort. Das Gestalten von Zeilen und Spalten mit statischem Raster ist nie ein Problem, da Sie immer wissen, wo genau jedes Element vorkommen wird. Die anfänglich gestellte Frage war, wie bestimmte Elemente, die automatisch in einer bestimmten Zeile/Spalte platziert wurden, durch ein dynamisches Raster gezielt anvisiert werden können.
– Mesqalito
12. Mai 2022 um 15:49 Uhr
Ja, das ist eine gültige Antwort! Sie können die hinzufügen grid-row-wrapper Element dynamisch.
– chipit24
16. Mai 2022 um 17:52 Uhr
Dies würde mit einem responsiven Design nicht funktionieren, wenn Sie die Anzahl der Spalten mit einer Medienabfrage ändern würden. Wenn Sie beispielsweise auf einem kleineren Bildschirm von 5 Spalten auf 3 Spalten wechseln, würden die Stile in eine andere Zeile überlaufen.
– Christian Pavilonis
9. September 2022 um 18:02 Uhr
Mateusz
Es gibt keine Spalten- oder Zeilenelemente, auf die Sie abzielen können, aber wenn das Raster einheitlich ist (gleiche Anzahl von Zellen in jeder Zeile), können Sie Zellen auswählen. Hier sind einige Beispiele.
1. Spalten
Letzte Spalte in einem 5-Spalten-Raster:
.item:nth-child(5n) { /* ... */ }
Vierte (vorletzte) Spalte in einem 5-Spalten-Raster:
.item:nth-child(5n-1) { /* ... */ }
Erste (fünftletzte) Spalte in einem 5-Spalten-Raster:
.item:nth-child(5n-4) { /* ... */ }
2. Reihen
Erste Zeile in einem 5-Spalten-Raster (erste fünf Zellen):
.item:nth-child(-n+5) { /* ... */ }
Zweite Zeile in einem 5-Spalten-Raster (Zellen von 6 bis 10):
Letzte Zeile in einem 5-Spalten-Raster mit 20 Zellen (Zellen ab 16):
.item:nth-child(n+16) { /* ... */ }
funktioniert statisch, aber nicht dynamisch
– Royer Adames
5. Juli 2022 um 20:42 Uhr
Um es dynamisch zu machen, können Sie eine Klasse hinzufügen, wenn die gewünschte Gruppe von Elementen durchlaufen wird. Beispielsweise können Sie in Angular die *ngFor-Schleife ungerade oder gerade verwenden, um Ihrer Zellenreihe eine dynamische Klasse zuzuweisen und sie dann auszuwählen und zu formatieren
– Royer Adames
5. Juli 2022 um 21:29 Uhr
Ich glaube nicht, dass dies funktioniert, wenn Sie eine Zelle oder Zellen haben, die sich über mehrere Spalten erstrecken
– JeffreyPia
24. Oktober 2022 um 15:54 Uhr
Michael Benjamin
Mit CSS ist das nicht möglich.
CSS zielt auf HTML-Elemente, Attribute und Attributwerte ab.
Gitterspalten und -zeilen haben keinen dieser “Haken”.
Sie müssen die Rasterelemente direkt anvisieren.
Sie schrieben:
Angenommen, ich habe ein CSS-Grid-Layout mit 3 Zeilen und 2 Spalten: grid-template-rows: 1fr 1fr 1fr; grid-template-columns: 1fr 1fr;. Wie würde ich alle Elemente aus der 2. Spalte auswählen?
Diese “Lösung” ist an die Anzahl der Artikel gekoppelt und berücksichtigt auch keine Zeilenumbrüche (AKA wickeln), daher ist es nicht so nützlich.
– vsync
12. August 2018 um 16:34 Uhr
@vsync: Dies ist keine Flexbox, es gibt keinen Umbruch/Zeilenumbruch. Im Raster haben Sie ein festes Layout und können diesen Elementen ein festes Styling zuweisen.
– Domenik Reitzner
13. August 2018 um 18:15 Uhr
aber Sie können beispielsweise kein Hintergrundbild formatieren, das sich über eine ganze Zeile erstreckt, was Sie in css display: table können
Die doppelte Zuordnung einer Zelle in einem 2D-Gitter (zu ihrer Zeile und Spalte) kann nicht durch Abstammung in einer hierarchischen Auszeichnungssprache dargestellt werden. Nur eine dieser Assoziationen kann hierarchisch dargestellt werden: die andere muss explizit oder implizit in der Dokumentsprachensemantik definiert werden. Sowohl in HTML als auch in DocBook, zwei der gebräuchlichsten hierarchischen Auszeichnungssprachen, ist das Markup zeilenprimär (das heißt, die Zeilenzuordnungen werden hierarchisch dargestellt); die Spalten müssen impliziert werden. Um solche impliziten spaltenbasierten Beziehungen darstellen zu können, müssen die Spaltenkombinator und das :nth-col() Und :nth-last-col() Pseudoklassen sind definiert. In einem primären Spaltenformat stimmen diese Pseudoklassen stattdessen mit Zeilenzuordnungen überein.
Das, was Sie hier brauchen, ist :nth-col() die sich genauso verhalten wie :nth-child()
Der :nth-col(An+B) Die Pseudoklassen-Notation stellt ein Zellenelement dar, das zu einer Spalte gehört, die hat An+B-1 Spalten davor Ref
Diese “Lösung” ist an die Anzahl der Artikel gekoppelt und berücksichtigt auch keine Zeilenumbrüche (AKA wickeln), daher ist es nicht so nützlich.
– vsync
12. August 2018 um 16:34 Uhr
@vsync: Dies ist keine Flexbox, es gibt keinen Umbruch/Zeilenumbruch. Im Raster haben Sie ein festes Layout und können diesen Elementen ein festes Styling zuweisen.
– Domenik Reitzner
13. August 2018 um 18:15 Uhr
aber Sie können beispielsweise kein Hintergrundbild formatieren, das sich über eine ganze Zeile erstreckt, was Sie in css display: table können
– James Katze
26. Oktober 2020 um 9:53 Uhr
Ich werde eine weitere Antwort hinzufügen, sie basiert auf dynamisch aktualisiertcss rules. Hierauf müssen wir leider zurückgreifen, da es keine Einstellmöglichkeit gibt nth-child über css variables.
const data =[{"Name":"John","Age":25,"Gender":"Male"},{"Name":"Emily","Age":33,"Gender":"Female"},{"Name":"Michael","Age":42,"Gender":"Male"},{"Name":"Sarah","Age":29,"Gender":"Female"},{"Name":"William","Age":37,"Gender":"Male"},{"Name":"Samantha","Age":26,"Gender":"Female"},{"Name":"Benjamin","Age":48,"Gender":"Male"},{"Name":"Elizabeth","Age":31,"Gender":"Female"},{"Name":"David","Age":45,"Gender":"Male"},{"Name":"Olivia","Age":28,"Gender":"Female"}]
const colors = ['255,0,0', '0,255,0', '0,0,255']
const COLUMNS = 3
let rows = 2
const wp = document.querySelector('.wrapper')
let lastSelectedColumn = null
document.querySelector('button').onclick = function(){
if (rows > data.length -1) return
Object.values(data[rows++])
.map(e => Object.assign(document.createElement('div'),{textContent: e}))
.forEach(e => wp.appendChild(e))
selectColumn(lastSelectedColumn)
}
wp.onclick = function({target}){
if (target.className !== "") return
const index = Array.from(wp.children).indexOf(target)
selectColumn(lastSelectedColumn = index % COLUMNS)// console.log(lastSelectedColumn)
}
function getRules(column, columns, rows, color){
const index = (column + 1) % columns
const i = index ? `+ ${index}` : ''
return [
`.wrapper div:nth-child(${columns}n${i}){
border-width: 0px 3px 0 3px;
border-color: rgb(${color});
border-style: solid;
background: rgba(${color},.1);
}`, /* top cell */
`.wrapper div:nth-child(${column + 1}) {
border-width: 3px 3px 0 3px;
/* font-weight: bold; */
}`, /* bottom cell */
`.wrapper div:nth-child(${(rows-1) * columns + column + 1}) {
border-width: 0 3px 3px 3px;
}`
]
}
function cleanupRules(stylesheet){
let newRuleIndex = stylesheet.sheet.cssRules.length
for (; newRuleIndex > 2; newRuleIndex--)
stylesheet.sheet.deleteRule(newRuleIndex - 1)
return newRuleIndex
}
function selectColumn(column){
const stylesheet = document
.querySelector('style[title="grid-wrapper"]')
if (!stylesheet || column === null) return
const rules = getRules(column, COLUMNS,
wp.children.length / COLUMNS, colors[column])
let newRuleIndex = cleanupRules(stylesheet)
for (const rule of rules){
stylesheet.sheet.insertRule(rule, newRuleIndex++)
} // console.log(stylesheet.sheet.cssRules)
}
Verwendung von CSS-Selektoren in Javascript: stackoverflow.com/q/56069793
– djvg
7. März um 22:00 Uhr