Ich liebe CSS Grid. Ich liebe, wie wir mit nur wenigen Codezeilen vollständig responsive Grid-Layouts erzielen können, oft ganz ohne Media Queries. Ich fühle mich ziemlich wohl dabei, CSS Grid zu nutzen, um interessante Layouts zu erstellen und dabei den HTML-Markup sauber und einfach zu halten.
Aber kürzlich wurde ich mit einem einzigartigen UI-Dilemma konfrontiert, das es zu lösen galt. Im Wesentlichen könnte jede gegebene Grid-Zelle einen Button haben, der einen anderen, größeren Bereich öffnet, der ebenfalls Teil des Grids ist. Aber diese neue, größere Grid-Zelle musste
- direkt unter der Zelle liegen, die sie geöffnet hat, und
- eine volle Breite haben.
Es stellt sich heraus, dass es dafür eine schöne Lösung gibt, und im Geiste von CSS Grid selbst, erfordert sie nur ein paar Codezeilen. In diesem Artikel werde ich drei einzeilige CSS Grid "Tricks" kombinieren, um dies zu lösen. Kein JavaScript nötig.
Eine Erklärung des eigentlichen Problems, das ich lösen muss
Hier ist ein minimalistisches UI-Beispiel dessen, was ich tun musste
Dies ist unser tatsächliches Produktkarten-Grid, wie es in unserer Storybook-Komponentenbibliothek gerendert wird

Jede Produktkarte musste eine neue „Schnellansicht“-Schaltfläche erhalten, die beim Klicken
- dynamisch eine neue Vollbildkarte (mit detaillierteren Produktinformationen) direkt unter der angeklickten Produktkarte „einfügt“,
- ohne das bestehende Kartenraster zu stören (d. h. die DOM-Quellenreihenfolge und die visuelle Reihenfolge der gerenderten Karten im Browser beizubehalten) und
- immer noch vollständig responsiv zu sein.
Hmm... war das mit unserer aktuellen CSS Grid-Implementierung überhaupt möglich?
Sicherlich müsste ich auf JavaScript zurückgreifen, um die Positionen der Karten neu zu berechnen und sie zu verschieben, besonders bei Browser-Resizes? Richtig?
Google war keine Hilfe. Ich konnte nichts finden, was mir geholfen hätte. Selbst die Suche nach „Schnellansicht“-Implementierungen ergab nur Beispiele, die Modals oder Overlays zur Darstellung der eingefügten Karte verwendeten. Schließlich ist ein Modal oft die einzige Wahl in Situationen wie dieser, da es den Benutzer auf die neuen Inhalte konzentriert, ohne den Rest der Seite stören zu müssen.
Ich habe über das Problem nachgedacht und schließlich eine funktionierende Lösung gefunden, indem ich einige der leistungsfähigsten und nützlichsten Funktionen von CSS Grid kombiniert habe.
CSS Grid Trick #1
Ich habe den ersten Trick bereits für unser Standard-Grid-System verwendet, und das Produktkarten-Grid ist eine spezielle Instanz dieses Ansatzes. Hier ist ein (vereinfachter) Code
.grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, 20rem);
}
Die „Geheimzutat“ in diesem Code ist grid-template-columns: repeat(auto-fit, 20rem);, was uns ein Grid mit Spalten (in diesem Beispiel 20rem breit) gibt, die automatisch im verfügbaren Platz angeordnet werden und in die nächste Zeile umbrechen, wenn nicht genug Platz ist.
Neugierig auf auto-fit vs. auto-fill? Sara Soueidan hat eine wunderbare Erklärung gegeben, wie das funktioniert. Sara erklärt auch, wie Sie minmax() einbinden können, um die Spaltenbreiten „flexibel“ zu machen, aber für die Zwecke dieses Artikels wollte ich aus Gründen der Einfachheit feste Spaltenbreiten definieren.
CSS Grid Trick #2
Als Nächstes musste ich eine neue Vollbildkarte in das Raster aufnehmen
.fullwidth {
grid-column: 1 / -1;
}
Dieser Code funktioniert, weil grid-template-columns in Trick #1 ein „explizites“ Grid erstellt, sodass es möglich ist, Start- und Endspalten für die .fullwidth-Karte zu definieren, wobei 1 / -1 bedeutet: „beginne in Spalte 1 und spanne alle Spalten bis zur allerletzten“.
Großartig. Eine Vollbildkarte wurde in das Raster eingefügt. Aber… jetzt gibt es Lücken oberhalb der Vollbildkarte.

CSS Grid Trick #3
Füllen der Lücken – das habe ich schon einmal mit einem Pseudo-Masonry-Ansatz gemacht
.grid {
grid-auto-flow: dense;
}
Das war's! Das gewünschte Layout ist erreicht.
Die Eigenschaft grid-auto-flow steuert, wie der CSS Grid Auto-Placement-Algorithmus funktioniert. In diesem Fall versucht der dense Packing-Algorithmus, Löcher früher im Grid zu füllen.
- Alle unsere Grid-Spalten haben die **gleiche Breite**. Dense Packing funktioniert auch, wenn die Spaltenbreiten flexibel sind, z. B. durch die Verwendung von
minmax(20rem, 1f). - Alle unsere Grid-„Zellen“ haben die **gleiche Höhe** in jeder Zeile. Dies ist das Standardverhalten von CSS Grid. Der Grid-Container hat implizit
align-items: stretch, wodurch Zellen 100% der verfügbaren Zeilenhöhe einnehmen.
Das Ergebnis all dessen ist, dass die Lücken in unserem Grid gefüllt sind – und das Schöne daran ist, dass die **ursprüngliche Quellenreihenfolge** in der gerenderten Ausgabe erhalten bleibt. Dies ist aus Gründen der Barrierefreiheit wichtig.
Siehe MDN für eine vollständige Erklärung von wie CSS Grid Auto-Placement funktioniert.
Die vollständige Lösung
Diese drei kombinierten Tricks bieten eine einfache Layout-Lösung, die nur sehr wenig CSS erfordert. Keine Media Queries und kein JavaScript notwendig.
Aber… wir brauchen doch immer noch JavaScript?
Ja, das tun wir. Aber nicht für Layout-Berechnungen. Es ist rein **funktional** für die Verwaltung von Klickereignissen, dem Fokusstatus, der Anzeige der eingefügten Karte usw.
Zu Demozwecken im Prototyp wurden die Vollbildkarten im HTML an den richtigen Stellen im DOM hartcodiert, und das JavaScript schaltet einfach ihre Anzeigeeigenschaften um.
In einer Produktionsumgebung würde die eingefügte Karte jedoch wahrscheinlich per JavaScript abgerufen und an der richtigen Stelle platziert werden. Grid-Layouts für etwas wie Produkte auf einer E-Commerce-Website haben tendenziell sehr umfangreiche DOMs, und wir möchten eine unnötige Vergrößerung des Seitenumfangs durch viele zusätzliche „versteckte“ Inhalte vermeiden.
Schnellansichten sollten als **progressive enhancement** betrachtet werden. Wenn JavaScript also nicht geladen wird, wird der Benutzer einfach zur entsprechenden Produktdetailseite weitergeleitet.
Barrierefreiheitsaspekte
Ich setze mich leidenschaftlich dafür ein, korrekte semantische HTML-Markups zu verwenden, aria-Eigenschaften hinzuzufügen, wenn sie absolut notwendig sind, und sicherzustellen, dass die Benutzeroberfläche sowohl mit der Tastatur als auch mit einem Screenreader funktioniert.
Hier ist also eine Zusammenfassung der Überlegungen, die in die möglichst barrierefreie Gestaltung dieses Musters eingeflossen sind
- Das Produktkartenraster verwendet eine
<ul><li>-Konstruktion, da wir eine Liste von Produkten anzeigen. Assistive Technologien (z. B. Screenreader) verstehen daher, dass es eine Beziehung zwischen den Karten gibt, und Benutzer werden über die Anzahl der Elemente in der Liste informiert. - Die Produktkarten selbst sind
<article>-Elemente mit entsprechenden Überschriften usw. - Die HTML-Quellenreihenfolge wird für die Karten beibehalten, wenn die
.fullwidth-Karte eingefügt wird, was eine gute natürliche Tabulatorreihenfolge in die eingefügten Inhalte und wieder hinaus zur nächsten Karte ergibt. Das gesamte Kartenraster ist in eine.aria-live-Region eingebettet, damit DOM-Änderungen für Screenreader angekündigt werden.- Das Fokusmanagement stellt sicher, dass die eingefügte Karte
den Tastaturfokus erhältund nach dem Schließen der Karte der Tastaturfokus auf den Button zurückgesetzt wird, der ursprünglich die Sichtbarkeit der Karte ausgelöst hat.
Obwohl dies im Prototyp nicht demonstriert wird, könnten diese zusätzlichen Verbesserungen in jede Produktionsimplementierung integriert werden
- Stellen Sie sicher, dass die eingefügte Karte bei Fokus einen entsprechenden Bezeichner hat. Dies kann so einfach sein wie eine Überschrift als erstes Element im Inhalt.
- Binden Sie die ESC-Taste, um die eingefügte Karte zu schließen.
- Scrollen Sie das Browserfenster, damit die eingefügte Karte vollständig im Viewport sichtbar ist.
Zusammenfassung
Also, was denkst du?
Dies könnte eine nette Alternative zu Modals sein, wenn wir zusätzliche Inhalte offenlegen möchten, ohne dabei den gesamten Viewport zu kapern. Dies könnte auch in anderen Situationen interessant sein – denken Sie an Bildunterschriften in einem Bildraster, Hilfetexte usw. Es könnte sogar eine Alternative zu einigen Fällen sein, in denen wir normalerweise auf <details>/<summary> zurückgreifen würden (da wir wissen, dass diese nur in bestimmten Kontexten am besten geeignet sind).
Auf jeden Fall bin ich daran interessiert, wie Sie dies nutzen könnten oder wie Sie es anders angehen würden. Lassen Sie es mich in den Kommentaren wissen!
Aktualisierungen
Erstens freue ich mich sehr, dass dieser Artikel für andere Front-End-Entwickler hilfreich war. Ich wusste, dass ich nicht der Einzige sein konnte, der vor einem ähnlichen Dilemma stand.
Zweitens habe ich nach konstruktivem Feedback einige der spezifischen Zugänglichkeitsüberlegungen durchgestrichen und meine CodePen-Demo mit folgenden Änderungen aktualisiert:
- Es ist nicht notwendig, das Kartenraster in eine
aria-live-Region einzubetten. Stattdessen habe ich die Schaltflächen zum Öffnen und Schließen der Schnellansicht als „Umschaltflächen“ fungieren lassen, mit entsprechendenaria-expanded- undaria-controls-Attributen. Ich verwende dieses Muster zwar für Offenlegungs-Widgets (Anzeigen/Verbergen, Tabs, Akkordeons), aber in diesem Fall stellte ich mir ein Verhalten vor, das eher einem Modal-Interface ähnelt, wenn auch inline statt eines Overlays. (Danke an Adrian für den Tipp!) - Ich konzentriere mich nicht mehr programmatisch auf die eingefügte Karte. Stattdessen füge ich einfach ein
tabindex="0"hinzu, sodass ein Tastaturnutzer wählen kann, ob er zur eingefügten Karte wechselt oder einfach wieder auf die „Umschaltfläche“ klickt, um sie zu schließen. - Ich glaube immer noch, dass die Verwendung einer
<ul><li>-Konstruktion für das Raster ein geeigneter Ansatz für eine **Liste** von Produkt**karten** ist. Die gewährten Semantiken weisen auf eine explizite Beziehung zwischen den Karten hin.
Heilige Scheiße, ich habe gerade etwas genau dergleichen mit Grid fertiggestellt… auf eine Weise, die mehr auf Media-Queries mit negativem Margin und SCSS-Funktionen setzt. Es funktioniert, ist aber nicht so sauber. Ich werde es ausprobieren…
Viel Erfolg! Es ist der
auto-fit-Teil von Trick #1, der es ermöglicht, dass dieses Grid-Layout ohne Media-Queries funktioniert.Toller Artikel, Kev. Lustigerweise habe ich mir etwas Ähnliches für eine neue PLP angesehen – das ist also extrem nützlich!
Danke… froh, dass ich nützlich sein konnte! ;)
Das ist eine clevere Lösung! Vielen Dank.
Bezüglich der Verwendung von
article-Elementen mit ordnungsgemäßen Überschriften usw. wies die Spezifikation darauf hin, dassDaher könnten geeignetere Elemente zur Kennzeichnung des Grids vorhanden sein.
Danke Ian.
Was das
<ul><li>-Konstrukt angeht, habe ich den Artikel aktualisiert.Wir verwenden
<article>-Elemente für alle unsere Kartenkomponenten (Produkt/Nachrichten/usw.), da sie in anderen Kontexten verwendet oder syndiziert werden können. Ja, es ist schade, wenn die Semantik der Karte nicht korrekt vermittelt wird, aber ich denke, die Semantik der Liste ist für diesen Anwendungsfall wichtiger.Wirklich guter Artikel! Für zukünftige Referenz gespeichert.
Respekt. Das ist ziemlich cool.
Der CSS Grid-Layout-Ansatz ist raffiniert. Die Lese- und Fokusreihenfolge sind beide entscheidend zu beachten, und ich bin sehr froh, dass Sie darüber nachdenken.
Es gibt jedoch einige Barrierefreiheitsaspekte, die angepasst werden müssen
region-Rolle aus dem Wrapper entfernen, da sie sich für Screenreader nicht mit einem zugänglichen Namen offenbart;aria-expanded-Attribut haben, um ihren Zustand anzuzeigen, was auch bedeutet, dass sie als Umschalter fungieren können, was auch bedeutet, dass Sie den Schließen-Button nicht benötigen, was auch bedeutet, dass Sie den Fokus nicht verwalten müssen (da Ihre Lesereihenfolge gut ist).Ich habe Ihren Pen geforkt, um all dies in Aktion zu zeigen
Ich habe nur schnelle Tests in JAWS 2021 / Chrome 94 durchgeführt, da es spät ist, werde es aber nach einer genaueren Durchsicht verfeinern (und mit Notizen aktualisieren).
Vielen Dank, Adrian, für Ihr fachkundiges Feedback. Ich habe nun den Artikel und das Codepen-Beispiel aktualisiert, um „Umschaltflächen“ zu verwenden und die Live-Region zu entfernen.
Als ich diese Lösung zum ersten Mal prototypisierte, dachte ich an sie als eine „Inline-Modal“, und berücksichtigte daher nicht, ein „Disclosure-Widget“-Muster zu übernehmen, das ich bereits anderswo in unserer UI für Tabs/Akkordeons/etc. verwende.
Ich behalte immer noch das Verhalten bei, „nur 1 eingefügte Karte gleichzeitig anzuzeigen“ … das ist eine Geschäftsanforderung. Ebenso der „Schließen“-Button innerhalb der eingefügten Karte, die viele Produktdetails und andere interaktive Elemente (z. B. Teilen & Speichern-Buttons) enthalten wird.
Kev, Sie waren auf dem richtigen Weg, aber ohne selbst Screenreader-Benutzer / Tester zu sein, kann es schwierig sein, einige der Stolperfallen zu kennen.
Das Beibehalten des Schließen-Buttons ergibt im von Ihnen gezeigten Kontext Sinn. Ich habe ihn nur entfernt, um die Nützlichkeit des
aria-expanded-Steuerelements zu demonstrieren.Ich bin immer noch ein Fan des Grid-Ansatzes und freue mich darauf, einen Grund zu haben, ihn anzuwenden. Danke!
Ich sehe
li {list-style-type: none; }im CSS, was solche Semantiken für einige ATs angeblich streicht. [1]Ist es in diesem Fall nicht empfohlen, explizit
<ul role="list">zu verwenden?[1] https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
Danke für die Veröffentlichung dieses Artikels über Listen-Semantik. Ich war mir dieses spezifischen Voice-Over/Safari-„Bugs“ nicht bewusst.
Ich muss zugeben, dass ich nur ungern
role="list"zu einer echten Liste hinzufüge, um 1 Screenreader zufriedenzustellen. ;)Meiner Meinung nach, wenn ein Screenreader nicht „Liste von N Elementen“ ankündigt, gibt es meiner Meinung nach immer noch genügend Semantik im Markup, um Benutzern bei der Navigation durch die Produkte zu helfen.
Oh… die „Freuden“ eines Front-End-Entwicklers!!!
Fügen Sie die
list-Rolle nicht standardmäßig hinzu. Wie ich im zitierten Beitrag zitiert werde: Der Mangel an Listen-Semantik „ist möglicherweise keine große Sache, es sei denn, Benutzertests ergeben, dass Sie wirklich eine Liste benötigen“. Oft ist das nicht der Fall.Wow! Einfach wow! Ich habe genau diese Funktionalität früher mit einer riesigen Menge JavaScript gebaut. https://yspisfy.com
…nächstes Mal werde ich diesen Ansatz verwenden. Danke, dass Sie für uns alle denken!
Danke… ich dachte ehrlich gesagt, ich müsste auch eine Tonne JS dafür aufwenden! Das zeigt einfach, wie großartig CSS Grid ist!
Vielen Dank, dass Sie Standardeigenschaften des Grids erwähnt haben. Und danke, dass Sie veranschaulicht haben, wie sich das Grid mit jeder Änderung Ihres Codes verändert. Sehr leicht verständlich, ohne Dinge im Kopf visualisieren zu müssen.
Danke. Ich muss den erstaunlichen Entwicklern wirklich Anerkennung zollen, die detailliert dokumentiert haben, wie CSS Grid funktioniert… sowohl hier auf CSS Tricks als auch auf MDN.
Ich habe genau diese Art von Anzeige mit JS ohne Grid oder Flexbox gemacht, und obwohl es funktioniert und gut aussieht, war es eine Qual zu implementieren.
Siehe
http://portal2web.biz/webs/a15_sfcb/our-brands/
Ich musste die Klassen kontinuierlich zu den Elementen hinzufügen oder entfernen, wenn der Browser vergrößert wurde, um zu wissen, welche Elemente eine Zeile bildeten, dann musste ich ein Objekt einfügen, um den Inhalt zu halten, es nach dem Schließen entfernen usw.
Ich habe mit CSS Grid experimentiert, bin aber nur so weit gekommen, habe sogar auf Reddit im /r/web_dev-Board danach gefragt, ohne Erfolg von dieser Seite.
Vielen Dank, dass Sie diese sehr subtile Lösung entwickelt haben, die einfach funktioniert, und vielen Dank, dass Sie sie geteilt haben. Das hat mir wirklich den Tag gerettet!
Gern geschehen! Wie Sie, habe ich gegoogelt, aber keine Antwort gefunden. Ich bin ehrlich überrascht, dass die Kombination von 3 „Tricks“ das Problem gelöst hat!
Schön! Genau das, was ich brauche. Gibt es eine Möglichkeit, Grid-Elemente horizontal zu strecken? Danke.
OK, ich glaube, ich habe es verstanden ;)
grid-template-columns: repeat(auto-fill, minmax(20em, 1fr));Das ist Gold wert, danke
Schöne Abhandlung. Ich hatte den Designer eines Kunden genau das gefragt, und ich konnte mir keine schöne Methode dafür ausdenken (die nicht viel Layout-JS beinhaltete), also mussten wir uns für einen völlig anderen Ansatz entscheiden – ein Modal. Und ich denke, ich kenne mich ziemlich gut mit CSS Grid aus! D’oh. Das werde ich mir merken.
Vielen Dank!!
Großartig und sehr nützlich, dieser Artikel erweitert mein Gehirn :-)
Als bekennender JavaScript-Vermeider bevorzuge ich immer Lösungen, die komplett JS-frei sind. Und – es ist ohne viel unsichtbaren Overhead möglich. Meine Lösung beinhaltet eine Reihe unsichtbarer Radio-Buttons, einige Labels mit dem ‚for‘-Attribut und den Geschwister-Selektor von CSS. Jemand interessiert?
Auch ich vermeide JavaScript, wo es angebracht ist, und greife als progressive Verbesserung darauf zurück.
Schnellansichten werden normalerweise in Modals gerendert. JavaScript ist dafür erforderlich.
Bei dieser spezifischen „Inline“-Implementierung passt das ARIA Disclosure Pattern, und erfordert ein winziges bisschen JavaScript zum Umschalten von
aria-expandedund zur Verwaltung vonfocus().Ich habe zuvor Radio-Buttons für Disclosure Widgets (z. B. Tabs) gesehen, aber ich finde, dass das Feedback in einem Screenreader nicht optimal ist. Ein explizites Feedback, dass ein Button erweitert ist, ist meiner Meinung nach besser.
Ich rate davon ab. Benutzer assistiver Technologien (AT) verlassen sich tendenziell darauf, dass Steuerelemente bestimmte Dinge tun. Ein Radiobutton dient zur Übermittlung von Informationen in einem Formular, nicht zum Umschalten der Sichtbarkeit. Dies kann für Sprach- und Screenreader-Benutzer verwirrende Steuerelemente bedeuten.
Ein Disclosure-Widget gibt seinen Zustand an (erweitert oder zusammengeklappt). Eine Checkbox identifiziert nur, ob sie angekreuzt ist oder nicht.
JavaScript ist für die Darstellung von Zuständen notwendig und ist eine gültige Anwendung von JS, auch wenn man es sonst überall vermeiden kann.
Danke für den tollen Artikel
Ich frage mich, wo ich den Pen für das erwähnte Produktkartenraster finden kann
Der Screenshot des Storybook-Produktkartenrasters stammt aus einem privaten Repository bei der Arbeit.
Es ist ein „Vorher“-Screenshot, der unser bestehendes Produktraster zeigt, bevor die „Schnellansicht“-Funktionalität hinzugefügt wurde.
Für die Zwecke des im Artikel verlinkten Codepen-Prototyps habe ich die „Karten“ vereinfacht, damit der Fokus auf dem CSS Grid-Verhalten und dem „Umschalten“ der eingefügten Schnellansichtskarte liegt.
Ich weiß, dass es hier hauptsächlich um die Verwendung von Grid geht. Aber da Ihre tatsächlichen Karten (und möglicherweise Ihre Schnellansichten) Bilder enthalten, wäre es interessant gewesen, sie in die Beispiele aufzunehmen. Wo stehen Bilder bei diesem visuellen Kartenlayout in der Quellenreihenfolge?
Gute Frage.
Wir haben eine Reihe von „Karten“-Komponenten in unserer Storybook-Bibliothek.
Produktkarten sind ziemlich komplex und haben diese allgemeine Struktur
Bilder stehen an erster Stelle in der Quellenreihenfolge, sind aber KEINE Links.
Je mehr ich über die Möglichkeiten des Grid-Layouts lerne, desto mehr bin ich erstaunt, danke für Ihre Demo.
Ich habe im JavaScript-Teil bemerkt, dass Sie die Klammern für die data-Attribut-Abfrage nicht schließen (in den Zeilen 2, 42 und 60).
Ist das nur ein Tippfehler oder ist mir der Zweck dessen nicht bewusst?
Ah, gut erkannt!
Tippfehler… alles behoben. :)
Hallo,
Kann dieser Ansatz verwendet werden, um eine tabbed interface zu implementieren, bei der das Klicken auf einen Tab den entsprechenden Inhalt darunter öffnet?
Der Bildschirm muss anfangs einen der Tabs geöffnet haben.
Meiner Meinung nach sind tabbed interfaces keine gute Ergänzung für diese CSS Grid-Implementierung.
Wenn JavaScript deaktiviert oder „kaputt“ ist, sollte eine tabbed interface den gesamten Inhalt anzeigen, der sonst versteckt wäre. Ich bin mir nicht sicher, wie Sie das handhaben würden, wenn das Layout von Grid verwaltet würde? Würden alle Inhaltsblöcke nacheinander im Grid gerendert?
Zweitens, was passiert auf kleineren Bildschirmen mit den Tabs, die nach dem angezeigten Inhalt kommen? Sie würden unter dem Inhalt gerendert. So sollten tabbed interfaces nicht funktionieren.
Dieser zweite Punkt führt zu einer weiteren interessanten Frage… wie sollten tabbed interfaces auf kleinen Bildschirmen gerendert werden?
Ich übernehme die gleiche Lösung, die Hayden Pickering in seinen Inclusive Components beschreibt. Ich verwandle die Tabs in ein Akkordeon.
Vielen Dank und herzlichen Glückwunsch zu diesem hervorragenden Artikel, der eine Frage beantwortet, die ich mir gestellt habe.
Frage: Wäre es möglich, ohne den BUTTON auszukommen und den Zoom nur durch Klicken auf die LI zu öffnen und zu schließen?
Codebeispiel …
…
Vielen Dank im Voraus
Pascal
Danke. Ich bin froh, dass Sie den Artikel nützlich fanden.
Um Ihre Frage zu beantworten…
Ich würde nicht empfehlen, die
<li>anklickbar zu machen, um die Schnellansicht zu öffnen. Sie müssten alle nativen Browser-Verhaltensweisen und Barrierefreiheitsfunktionen des<button>-Elements implementieren. Zum Beispiel Tastaturfokus, Binden derLeertasteund derEnter-Taste zum Auslösen der Aktion, ARIArole="button"usw.Es gibt viele Artikel im Web, die erklären, warum die Verwendung eines nativen
<button>in solchen Situationen immer die beste Vorgehensweise ist.Außerdem habe ich in meiner spezifischen Implementierung ein Raster von Produktkarten, bei dem jede Karte bereits mehrere
<a>- oder<button>-Elemente enthält (die entweder zur Produktseite verlinken oder das Produkt speichern/teilen). Daher musste ich einen zusätzlichen<button>hinzufügen, um speziell das Verhalten der Schnellansicht auszulösen.FYI, wenn Sie die Anzeigeeigenschaft eines Listenelements auf Grid/Flex setzen, ignorieren viele Screenreader die Listen-Semantik nicht mehr.
Sie müssten sie wiederherstellen, z. B. mit
role="list"undrole="listitem"Hallo Grace… danke für deinen Kommentar. Dies wurde bereits in früheren Kommentaren diskutiert – siehe https://css-tricks.de/expandable-sections-within-a-css-grid/#comment-1783940
Das ist erstaunlich. Ich habe überall nach einer Möglichkeit gesucht, ein responsives Grid mit einem Akkordeon-ähnlichen Layout genau so zu kombinieren, wie Sie es getan haben, und endlich habe ich die richtige Kombination von Suchbegriffen gefunden, um dies zu finden. Es stellt sich heraus, dass mir nur eine Zeile fehlte – grid-auto-flow:dense. Ich habe sogar ChatGPT um Hilfe gebeten und es konnte es nicht richtig hinbekommen!