Wir bauen ein buchstäbliches Raster aus Quadraten, und wir platzieren die Logos einiger Zeitschriften zentriert in jedem Quadrat. Ich stelle mir vor, dass viele von Ihnen schon einmal ein Logo-Raster erstellen mussten. Sie können es sich wahrscheinlich schon vorstellen: ein Bereich einer Website, der Spender, Sponsoren auflistet oder der all die großen, schicken Unternehmen zeigt, die ein bestimmtes Produkt verwenden. Die Logos in Quadrate zu setzen, ist eine gute Methode, um damit umzugehen, da es eine klare Struktur erzwingt, wenn Logos unterschiedliche Größen, Seitenverhältnisse und visuelle Gewichte haben, was umständlich und unordentlich aussehen kann.
Mit "Raster" meine ich CSS-Grid. Das Einrichten eines Rasters aus (flexiblen) Quadraten ist ein kleiner Trick für sich. Dann werden wir diese Logos so hineinlegen, dass sie die richtige Größe haben und zentriert sind. Am Ende werden wir uns eine kleine Eigenart ansehen.
1) Raster-Markup
Haben Sie das schon einmal in einem Editor ausprobiert, der Emmet unterstützt?
.grid>div*5>img
Drücken Sie dann **Tab**. Es wird erweitert zu
<div class="grid">
<div><img src="" alt=""></div>
<div><img src="" alt=""></div>
<div><img src="" alt=""></div>
<div><img src="" alt=""></div>
<div><img src="" alt=""></div>
</div>
Nur ein kleiner Trick, um schnell zu arbeiten.
2) CSS Grid-Grundlagen
Wir verwenden die berüchtigte Technik der flexiblen Spalten
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-gap: 1rem;
}
Dies gibt uns nicht nur flexible Spalten, sondern auch eine flexible *Anzahl* von Spalten. Denken Sie daran, dass uns die Anzahl der Spalten egal ist – wir bauen nur ein Raster aus Logos zur Anzeige.
Wenn wir jedem dieser Grid-Item-Divs einen Hintergrund und eine erzwungene Höhe geben, würden wir so etwas sehen wie

2) Echte Quadrate erstellen
Anstatt die Grid-Elemente auf eine bestimmte Höhe zu zwingen, verwenden wir einen Trick mit dem Seitenverhältnis. Wir fügen ein leeres Pseudo-Element hinzu mit padding-bottom: 100%;, was bedeutet, dass die Höhe mindestens so groß wie die Breite sein wird.
.grid > div {
background: black;
padding: 1rem;
}
.grid > div::before {
content: "";
padding-bottom: 100%;
display: block;
}
Wenn wir die Bilder vorübergehend ausblenden, sehen wir, dass das Raster aus Rechtecken zu einem Raster aus perfekten Quadraten geworden ist

3) Bilder überlagern
Aber *mit* den Bildern darin werden sie ein wenig länglich, weil das Bild im Pseudo-Element sitzt.

Wir brauchen eine Möglichkeit, sie übereinander zu legen. Normalerweise greifen wir bei Techniken mit Seitenverhältnis auf absolute Positionierung zurück, um den Innen-Container zu platzieren und die jetzt seitenverhältnis-getreue Form abzudecken. Da wir aber sowieso schon Grid verwenden, nutzen wir Grid noch einmal, um die Elemente in denselben Bereich zu platzieren
.grid > div {
/* ... */
display: grid;
}
.grid > div::before,
.grid > div > img {
grid-area: 1 / 1 / 2 / 2;
}
Das besagt, dass die Grid-Elemente des Haupt-Grids ebenfalls zu Grid-Containern werden, ohne explizite Zeilen und Spalten, und dann sowohl das Pseudo-Element als auch das Bild in die erste Zeile und Spalte dieses Grids platziert werden. Dies zwingt sie zur Überlagerung und ergibt wieder ein schönes Raster aus Quadraten.

4) Bilder platzieren
Wir fügen für jedes Bild eine ordentliche src ein. Wenn wir sicherstellen, dass die Bilder den Platz ausfüllen (und sich selbst einschränken) mit width: 100%;, sehen wir sie am oberen Rand der Grid-Elemente

Nicht schlecht, aber wir würden sie gerne zentriert sehen. Hier ist ein Trick dafür. Zuerst geben wir ihnen auch height: 100%;, was sie verzerrt

Dann korrigieren wir das mit object-fit!
.grid > div > img {
width: 100%;
height: 100%;
object-fit: contain;
}
So ist es gut.

Das wird responsiv funktionieren.
5) Eigenartige Dragging-Größe
Das ist (wahrscheinlich) keine große Sache, aber bemerken Sie, wie die Logos aussehen, wenn Sie sie ziehen (wie es ein Benutzer tun könnte, wenn er versucht, eines zu speichern)
Die Bilder sehen so aus, als hätten sie width: 100%; height: 100%; ohne object-fit: contain;.
Hier ist die bisher funktionierende Demo, mit dieser Eigenart
6) Absolute Positionierung stattdessen verwenden
Wenn diese Dragging-Eigenart ein großes Problem darstellt, können wir die Bilder auch einfach absolut innerhalb der Grid-Kinder positionieren.
Hier ist eine Möglichkeit, vorausgesetzt, das Grid-Child-Div ist position: relative;
.grid > div > img {
position: absolute;
max-width: 100%;
top: 0;
bottom: 0;
right: 0;
left: 0;
margin: auto;
}
Und hier ist eine andere
.grid > div > img {
position: absolute;
max-width: 100%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Beides behebt diese Dragging-Eigenart. Hier ist eine Demo
Video
Wenn Sie eine Video-Walkthrough von all dem sehen möchten, hier entlang!
Großartig…. hat mir jedes Stück davon gefallen.
Ich habe den Bug mit dem Dehnen während des Ziehens in Firefox tatsächlich nicht. Könnte ein Chrome-Ding sein
Ich habe es auch im neuen Edge nicht. Seltsam
Bezgl. .grid>div*5>img
Schöner Trick!
Ich habe es ein wenig wackeln lassen und es von hinten beleuchtet beim Hover.
Das ist ein sehr interessanter Ansatz und eine sehr praktische Lösung.
Ich glaube jedoch, dass die von Ihnen erwähnte Dragging-Eigenart etwas ist, das spezifisch für Macs ist? Ich sehe keine Verzerrung unter Windows 10, sowohl in Firefox als auch in Chrome in den neuesten Versionen.
Vielen Dank fürs Teilen!
Ich weiß das wirklich zu schätzen, es ist wirklich cool
Technikartikel, die sich eingehend mit praktischen Problemen beschäftigen, machen viel Spaß. Ich würde nie daran denken, die Dragging-Funktionalität zu überprüfen, geschweige denn meinen Code dafür zu refaktorieren. Aber es ist diese Liebe zum Detail, die für wichtige Projekte mit vielen Benutzern erforderlich ist.
Warum haben Sie sich für eine absolute Positionierung der Bilder entschieden, wenn Sie dies mit nur zwei Zeilen Flexbox beheben können?
Sie könnten einfach 'display: flex; align-items: center;' auf die Kind-Divs anwenden, und die Bilder werden perfekt zentriert. Diese Lösung ist meiner Meinung nach viel sauberer.
Ich habe ein paar verschiedene Wege behandelt, besonders in dem Video. Absolute Positionierung ist eine davon. Grid ist eine andere. Da das Ganze Grid ist, bevorzuge ich die Grid-Lösung, aber Sie haben Recht, Flexbox kann auch schön zentrieren.
Das würde nicht funktionieren. Das Bild muss über dem Pseudo-Element liegen
Sehr schön und so nützlich!
In ähnlicher Weise habe ich im Februar einige Experimente durchgeführt (basierend auf Code von Piper Haywood), um das visuelle Gewicht von Logos mit unterschiedlichen Seitenverhältnissen zumindest teilweise zu normalisieren. Es skaliert die Bilder so, dass sie ungefähr vergleichbare Flächeninhalte in Quadratpixel haben. Sie können die Demo mit einer detaillierteren Erklärung hier sehen
https://nicksherman.com/size-by-area/
Ich frage mich nur nach der Verwendung von
<div>s hier. Wäre es nicht zweckmäßiger/semantischer, eine<ul>und<li>s für die Grid-Elemente zu verwenden?Außerdem ziehen sich die Bilder bei mir in Chrome (unter Windows) mit derselben Breite/Höhe, wie sie im Raster sind, also keine seltsam explodierenden Dimensionen. Sieht nach einer Browser-Eigenart aus.
Sie könnten sicherlich eine ungeordnete Liste verwenden! Ich schätze, das würde einem Screenreader-Benutzer mitteilen, wie viele Logos es gibt, wenn Sie denken, dass das wichtig ist. Wahrscheinlich besser wäre es, Ihre Screenreader-Benutzer zu fragen, ob sie denken, dass es wichtig ist, das zu wissen. Es erscheint mir nicht übermäßig wichtig, aber ich bin kein Screenreader-Benutzer. Wenn die Reihenfolge wichtig wäre, haben Sie auch geordnete Listen.
Sie sollten definitiv
<ul>s und<li>s verwenden. Was wir hier haben, ist eine Liste von Logos. Sie mögen als Raster angezeigt werden, aber es ist eindeutig eine Liste. Ein Benutzer, der sehen kann, wird sofort wissen, wie viele es gibt, da es visuell offensichtlich ist, und visuelle Informationen werden im Allgemeinen viel, viel schneller verarbeitet als Audioinformationen von Menschen. Ein Benutzer, der sich auf einen Screenreader verlässt, wird dies nicht tun, bis sein Reader am Ende angekommen ist und er mitgezählt hat.Außerdem, da es die visuelle Darstellung nicht beeinträchtigt, ist es ein Nullsummenspiel.
würde das mit SVGs genauso funktionieren? – Ich habe mich gefragt, warum Sie nicht sowieso SVGs als verlinkte Bilder (also nicht inline) anstelle von PNGs verwendet haben ;)
Cooler Artikel, ich habe nur eines vermisst (etwas, mit dem ich in der Vergangenheit zu tun hatte).
Diese Logos, die Sie verwendet haben, sind alle breit und kurz. Aber was, wenn Sie Logos mit unterschiedlichen Seitenverhältnissen in einem Raster platzieren müssen? Stellen Sie sich einfach ein paar quadratische Logos vor, vielleicht einige hohe?
Nur zur Information: Die eigenartige Art, wie die Bilder beim Ziehen aussehen, scheint in Firefox nicht aufzutreten, also ist es nicht unmöglich, dass es in Zukunft in Chrome behoben wird!
Das hat bei mir nicht funktioniert!
Meine Bilder werden groß und verdecken die Quadrate, anstatt sie auszufüllen
Hey, das ist großartig!
Danke, dass Sie sich die Zeit genommen haben, das zusammenzustellen.
Ich lese über CSS Grid, bin relativ neu in dieser Funktion.
Ist es möglich, dass das Grid und die Grid-Elemente sich dehnen, um einen gegebenen Bildschirm auszufüllen, anstatt den weißen leeren Raum am unteren Rand des Grids zu haben?
Das wäre so etwas wie ein Zoom-App-Bildschirm.
Wenn es zum Beispiel vier Logos gäbe, würden sie sich symmetrisch dehnen, um den gesamten Bildschirm auszufüllen, oder wenn es 1000 gäbe, würden sie dasselbe tun?
Sind die oben genannten Szenarien möglich?
Nochmals vielen Dank!
Marc
Hey Marc! Ja, wenn Sie die Eigenschaft
grid-gapvom Element.gridentfernen, dann rücken alle Logos ganz nah aneinander. Die geheime Zutat ist wirklich hierDas sagt dem Element, dass es sich in so viele Spalten aufteilt, wie den Platz ausfüllen, solange jede Spalte nicht kleiner als 200 Pixel ist. Alles über 200 Pixel und die Spalten teilen sich den Platz gleichmäßig (1fr).
Hallo, ich wollte das machen, aber ich wollte, dass die Bilder klickbar sind, um zu einem Link zu gehen. Als ich das a href Link-Tag vor das img-Tag setzte, schien es das Layout zu brechen und die Icons zu dehnen