Stellen Sie sich vor, Sie haben eine Liste von Elementen. Sagen wir, Obst: Banane, Apfel, Orange, Birne, Nektarine
Wir könnten diese Kommas (,) in den HTML-Code einfügen, aber schauen wir uns stattdessen an, wie wir das mit CSS machen könnten, was uns eine zusätzliche Kontrollebene gibt. Wir werden sicherstellen, dass das letzte Element dabei kein Komma hat.
Ich brauchte das kürzlich für ein echtes Projekt, und ein Teil der Anforderungen war, dass jedes Element in der Liste per JavaScript ein- und ausgeblendet werden konnte. Die Kommas mussten unabhängig davon, welche Elemente gerade angezeigt wurden, korrekt funktionieren.
Eine Lösung, die ich ziemlich elegant fand, ist die Verwendung des allgemeinen Geschwisterkombinators. Dazu kommen wir gleich. Beginnen wir mit einem Beispiel-HTML. Nehmen wir an, Sie beginnen mit einer Liste von Früchten
<ul class="fruits">
<li class="fruit on">Banana</li>
<li class="fruit on">Apple</li>
<li class="fruit on">Orange</li>
<li class="fruit on">Pear</li>
<li class="fruit on">Nectarine</li>
</ul>
Und etwas grundlegendem CSS, damit sie als Liste erscheinen
.fruits {
display: flex;
padding-inline-start: 0;
list-style: none;
}
.fruit {
display: none; /* hidden by default */
}
.fruit.on { /* JavaScript-added class to reveal list items */
display: inline-block;
}
Nun passieren Dinge innerhalb dieser Benutzeroberfläche, wie z. B. dass ein Benutzer Steuerelemente umschaltet, die alle Früchte herausfiltern, die in kalten Klimazonen wachsen. Nun wird eine andere Auswahl an Früchten angezeigt, so dass die Klasse fruit.on mit der classList API manipuliert wird.
Bisher würden unser HTML und CSS eine Liste wie diese erstellen
BananaOrangeNectarine
Jetzt können wir zu diesem allgemeinen Geschwisterkombinator greifen, um ein Komma und ein Leerzeichen zwischen zwei beliebigen on-Elementen anzuwenden
.fruit.on ~ .fruit.on::before {
content: ', ';
}
Schön!
Sie denken vielleicht: Warum nicht einfach allen Listenelementen Kommas hinzufügen und das letzte mit etwas wie :last-child oder :last-of-type entfernen. Das Problem dabei ist, dass das letzte Element zu jeder Zeit "aus" sein kann. Was wir wirklich wollen, ist das letzte sichtbare Element, was in CSS nicht einfach möglich ist, da es kein "letztes der Klasse" gibt. Daher der Trick mit dem allgemeinen Geschwisterkombinator!
In der Benutzeroberfläche habe ich max-width anstelle von display verwendet und diesen zwischen 0 und einem angemessenen Maximalwert umgeschaltet, damit ich Übergänge verwenden konnte, um Elemente natürlicher ein- und auszublenden, was es dem Benutzer erleichterte, zu sehen, welche Elemente hinzugefügt oder entfernt werden. Diesen Effekt können Sie auch auf das Pseudoelement anwenden, um ihn noch geschmeidiger zu gestalten.
Hier ist eine Demo mit einigen Beispielen, die alle leichte Variationen darstellen. Das Obstbeispiel verwendet eine hidden-Klasse anstelle von on, und das Gemüsebeispiel hat die Animationen. Hier wird auch SCSS für die Verschachtelung verwendet
Ich hoffe, das hilft anderen, die etwas Ähnliches suchen!
Warum so kompliziert? Warum nicht etwas wie das hier verwenden
Hallo Vladislav! Ich hatte denselben Gedanken, aber das funktioniert nicht, wenn das letzte Element in der Liste verborgen ist. (display: none). Der spezifische Fall, für den ich entwickelte, erforderte, dass alle Elemente im DOM vorhanden waren und Klassen verwendet wurden, um sie ein- oder auszublenden. Daher bezieht sich :last-child nicht immer auf das letzte sichtbare Kind.
Nach Ihrer Logik könnten Sie jedoch alle nicht versteckten Elemente auswählen und den after-Selektor verwenden, um Kommas zu allen hinzuzufügen, außer dem letzten sichtbaren Kind. Danke für den Vorschlag!
Ihre Variante funktioniert auf iOS nicht...
Eigentlich, Llull, ich glaube, Vlad hat die Klassen, die ich zum Verstecken von Objekten verwendet habe, übersehen. Ich habe sie hier neu erstellt: https://codepen.io/DaveSeidman/pen/vYXVjPM
Es schlägt immer noch fehl, wenn das letzte sichtbare Element nicht das letzte tatsächliche Element ist. Ich werde mir das morgen ansehen :)
Wenn die Früchte aufgrund von Überlauf auf die nächste Zeile umbrechen, bleiben die Kommas in der oberen Zeile, und der Text befindet sich darunter.
Dasselbe scheint bei Gemüse nicht zu passieren.
Gute Beobachtung! Mir fehlte flex-wrap. Hier ist ein neuer Stift mit einer teilweisen Lösung
Das einzige Problem ist, dass die Kommas am Anfang (:before) des zweiten Elements statt am Ende (:after) des ersten angehängt sind, so dass die Kommas falsch umbrechen.
Ja, besonders auf Mobilgeräten.
Ich schätze, :nth-child(n of selector) wäre hier auch nützlich (obwohl derzeit nur in Safari unterstützt).
Funktioniert nicht, wenn Sie 2+ Textzeilen haben
Ich bin mir nicht sicher, ob ich das Problem sehe, können Sie ein Beispiel geben?
Wenn Sie eine andere grammatikalische Regel beachten möchten, z. B. ein Oxford-Komma, versuchen Sie es wie folgt:
.fruit:last-child::before { content: ', und '; }Das Ergebnis wäre also;
Banane, Birne, Pfirsich und Blaubeere
Ich glaube, es könnte dort ein Problem geben, da die zuletzt sichtbare Frucht nicht unbedingt das letzte Kind ist.
Tolle Idee, und ja, Sie müssen den Selektor wahrscheinlich ein wenig anpassen. Er sollte nur das letzte sichtbare Element auswählen:
.onoder:not(.hidden)Sie möchten auch verhindern, dass "und" hinzugefügt wird, wenn nur noch ein Element in der Liste vorhanden ist. Wahrscheinlich gibt es eine Möglichkeit, dies zu tun, indem Sie prüfen, ob
:first-of-type(.on)nicht dasselbe Element ist wie:last-of-type(.on)Ein Nachteil der Verwendung der content-Eigenschaft bei Pseudoelementen ist, dass der Inhalt normalerweise nicht auswählbar ist, was zu einer verwirrenden Erfahrung führen kann, wenn der Benutzer versucht zu kopieren und einzufügen.
So sieht es aus, wenn es in die Zwischenablage kopiert und als reiner Text eingefügt wird (auf meinem Android-Telefon; ich erwarte ein ähnliches Verhalten unter Windows)
Zufällige Früchte
Banane
Orange
Birne
Zufälliges Gemüse
Brokkoli
Karotten
Kartoffeln
Spinat
Nicht ideal, dass die Kommas wegfallen, aber die Zeilenumbrüche machen es zumindest lesbar.
Beide Beispiele schaffen eine schlechte Erfahrung für Benutzer von assistiver Technologie. Das Beispiel mit einer ungeordneten Liste war zumindest in VoiceOver etwas besser, da es sich als Liste ankündigt. Das erste Beispiel überspringt die Kommas komplett, und dann kündigt das zweite Beispiel eine Liste an und liest jedes Element einzeln vor, einschließlich der Kommas als eigene Elemente. Persönlich, basierend auf dem, was ich über CSS-Inhalt gelesen habe, sollten Sie ihn nur für rein dekorative Zwecke verwenden, da die Unterstützung für Screenreader nicht gut ist. Siehe Link: https://accessibleweb.com/question-answer/how-is-css-pseudo-content-treated-by-screen-readers/
Danke fürs Nachschauen! Ich habe keine Screenreader darauf getestet, aber ich habe in der Vergangenheit mit Vox und VoiceOver experimentiert. Vielleicht würde die Einstellung des "role"-Attributs des Kommas in der <ul> auf etwas anderes eine bessere Erfahrung schaffen?
Das ist nützlich, aber ich frage mich, warum das Beispiel Kommas verwendet (etwas, das als tatsächlicher Teil des Textes missverstanden werden könnte) anstelle eines anderen Trennzeichens wie einem Balken oder einem Aufzählungszeichen (was offensichtlicher als Listentrennzeichen wäre und viel wahrscheinlicher ein tatsächlicher Anwendungsfall ist).
Gute Frage, und ja, jedes Trennzeichen sollte funktionieren!
In meinem speziellen Fall hatte ich mehrere Arrays von Elementen, die in JavaScript verwendet wurden, um für jedes Element einen <button> und einen <span> zu erstellen. Die Schaltflächen hatten einen aktiven und einen normalen Zustand, mussten aber jederzeit sichtbar bleiben, während die Spans je nach Zustand ihrer jeweiligen Schaltfläche ein- und ausgeblendet werden mussten. Ich hätte JavaScript verwenden können, um jedes Mal eine neue kommaseparierte Zeichenfolge von Elementen zu generieren, aber ich fand es eleganter, sie im DOM zu belassen und ihre classList umzuschalten.
Kreative Art, CSS zu verwenden!
Wie bei Saras Kommentar ist meine Sorge bei diesem Ansatz jedoch die Webzugänglichkeit. Es gilt als Fehler, Pseudoinhalt für etwas anderes als dekorative Inhalte zu verwenden, da Benutzer, die Stilinformationen anpassen oder deaktivieren müssen, den Inhalt möglicherweise nicht lesen und verstehen können.
Das war super hilfreich und einfach. Danke!