Abgesehen von Media Queries und modernen CSS-Layouts wie Flexbox und Grid, um responsive Websites zu erstellen, gibt es bestimmte übersehene Dinge, die wir gut tun können, um responsive Websites zu gestalten. In diesem Artikel befassen wir uns mit einer Reihe von Werkzeugen (rund um HTML und CSS), die uns zur Verfügung stehen, von responsive Bildern bis hin zu relativ neuen CSS-Funktionen, die natürlich funktionieren, egal ob wir Media Queries verwenden oder nicht.
Tatsächlich werden Media Queries bei der Verwendung mit diesen Funktionen eher zu einer Ergänzung als zu einem vollständigen Ansatz. Sehen wir uns an, wie das funktioniert.
Wirklich responsive Bilder
Erinnern Sie sich, als wir einfach width: 100% auf Bilder anwenden und es dabei belassen konnten? Das funktioniert natürlich immer noch und macht Bilder dehnbar, aber es hat eine Reihe von Nachteilen, von denen die bemerkenswertesten sind:
- Das Bild kann so stark gequetscht werden, dass es seinen Fokus verliert.
- Kleinere Geräte laden immer noch das Bild in voller Größe herunter.
Bei der Verwendung von Bildern im Web müssen wir sicherstellen, dass sie hinsichtlich Auflösung und Größe optimiert sind. Der Grund dafür ist, dass wir die richtige Bildauflösung für das richtige Gerät haben, damit wir nicht wirklich große und schwere Bilder für kleinere Bildschirme herunterladen, was die Leistung einer Website beeinträchtigen könnte.
Einfach ausgedrückt stellen wir sicher, dass größere, hochauflösende Bilder an größere Bildschirme gesendet werden, während kleinere, niedrigauflösende Variationen an kleinere Bildschirme gesendet werden, was sowohl die Leistung als auch die Benutzererfahrung verbessert.
HTML bietet das <picture>-Element, mit dem wir die exakte Bildressource angeben können, die basierend auf der von uns hinzugefügten Media Query gerendert wird. Wie bereits beschrieben, geben wir anstelle eines Bildes (normalerweise eine große, hochauflösende Version), das an alle Bildschirmgrößen gesendet und auf die Breite des Viewports skaliert wird, eine Reihe von Bildern an, die in bestimmten Situationen geladen werden sollen.
<picture>
<source media="(max-width:1000px)" srcset="picture-lg.png">
<source media="(max-width:600px)" srcset="picture-mid.png">
<source media="(max-width:400px)" srcset="picture-sm.png">
<img src="picture.png" alt="picture"">
</picture>
In diesem Beispiel ist picture.png das Vollbild. Von dort definieren wir die nächstgrößere Version des Bildes, picture-lg.png, und die Größe verringert sich absteigend bis zur kleinsten Version, picture-sm.png. Beachten Sie, dass wir bei diesem Ansatz immer noch Media Queries verwenden, aber es ist das <picture>-Element selbst, das das responsive Verhalten steuert, anstatt Breakpoints in CSS zu definieren.
Die Media Queries werden entsprechend hinzugefügt, um mit den Größen des Bildes zu skalieren
- Viewports von 1000 Pixel und mehr erhalten
picture.png. - Viewports zwischen 601 Pixel und 999 Pixel erhalten
picture-lg.png. - Viewports zwischen 401 Pixel und 600 Pixel erhalten
picture-sm.png. - Alles, was kleiner als 400 Pixel ist, erhält
picture-sm.png.
Interessanterweise können wir jedes Bild auch nach Bilddichte kennzeichnen — 1x, 2x, 3x und so weiter — nach der URL. Dies funktioniert, wenn wir die verschiedenen Bilder proportional zueinander erstellt haben (was wir getan haben). Dies ermöglicht es dem Browser, basierend auf der Pixeldichte des Bildschirms und der Viewport-Größe zu entscheiden, welche Version heruntergeladen werden soll. Aber beachten Sie, wie viele Bilder wir definieren
<picture>
<source media="(max-width:1000px)" srcset="picture-lg_1x.png 1x, picture-lg_2x.png 2x, picture-lg_3x.png 3x">
<source media="(max-width:600px)" srcset="picture-mid_1x.png 1x, picture-mid_2x.png 2x, picture-mid_3x.png 3x">
<source media="(max-width:400px)" srcset="picture-small_1x.png 1x, picture-small_2x.png 2x, picture-small_1x.png 3x">
<img src="picture.png" alt="picture"">
</picture>
Betrachten wir speziell die beiden Tags, die in das <picture>-Element verschachtelt sind: <source> und <img>.
Der Browser sucht nach dem ersten <source>-Element, bei dem die Media Query mit der aktuellen Viewport-Breite übereinstimmt, und zeigt dann das entsprechende Bild (im Attribut srcset angegeben) an. Das <img>-Element ist als letztes Kindelement des <picture>-Elements erforderlich und dient als Fallback-Option, wenn keiner der anfänglichen Quell-Tags übereinstimmt.

Wir können auch die Bilddichte verwenden, um responsive Bilder nur mit dem <img>-Element und dem srcset-Attribut zu handhaben.
<img
srcset="
flower4x.png 4x,
flower3x.png 3x,
flower2x.png 2x,
flower1x.png 1x
"
src="flower-fallback.jpg"
>
Eine weitere Möglichkeit besteht darin, Media Queries in CSS zu schreiben, die auf der **Bildschirmauflösung** (normalerweise in Dots per Inch oder DPI gemessen) **des Geräts selbst** und nicht nur auf dem Geräte-Viewport basieren. Das bedeutet, dass wir **anstelle** von
@media only screen and (max-width: 600px) {
/* Style stuff */
}
Jetzt haben wir
@media only screen and (min-resolution: 192dpi) {
/* Style stuff */
}
Dieser Ansatz ermöglicht es uns, zu bestimmen, welches Bild basierend auf der Bildschirmauflösung des Geräts selbst gerendert werden soll, was bei hochauflösenden Bildern hilfreich sein kann. Grundsätzlich können wir hochqualitative Bilder für Bildschirme anzeigen, die höhere Auflösungen unterstützen, und kleinere Versionen bei niedrigeren Auflösungen. Es ist erwähnenswert, dass mobile Geräte zwar kleine Bildschirme haben, diese aber normalerweise hochauflösend sind. Das bedeutet, dass es wahrscheinlich keine gute Idee ist, sich bei der Entscheidung, welches Bild gerendert werden soll, nur auf die Auflösung zu verlassen. Dies könnte dazu führen, dass große, hochauflösende Bilder auf sehr kleinen Bildschirmen angezeigt werden, was möglicherweise nicht die Version ist, die wir auf einem so kleinen Bildschirm tatsächlich anzeigen möchten.
body {
background-image : picture-md.png; /* the default image */
}
@media only screen and (min-resolution: 192dpi) {
body {
background-image : picture-lg.png; /* higher resolution */
}
}
Was <picture> uns bietet, ist im Grunde die Möglichkeit, Bilder künstlerisch zu gestalten. Und in diesem Sinne können wir CSS-Funktionen nutzen, wie die object-fit-Eigenschaft, die uns zusammen mit object-position ermöglicht, Bilder für bessere Fokuspunkte zuzuschneiden, während das Seitenverhältnis des Bildes beibehalten wird.
Um den Fokuspunkt eines Bildes zu ändern
@media only screen and (min-resolution: 192dpi) {
body {
background-image : picture-lg.png;
object-fit: cover;
object-position: 100% 150%; /* moves focus toward the middle-right */
}
}
Festlegen von Minimal- und Maximalwerten in CSS
Die Funktion min() gibt die absolut kleinste Größe an, auf die ein Element schrumpfen kann. Diese Funktion ist sehr nützlich, um Textgrößen über verschiedene Bildschirmgrößen hinweg richtig zu skalieren, z. B. um Fluid-Schriftarten niemals unter eine lesbare Schriftgröße fallen zu lassen.
html {
font-size: min(1rem, 22px); /* Stays between 16px and 22px */
}
min() akzeptiert zwei Werte, und diese können relative, prozentuale oder feste Einheiten sein. In diesem Beispiel weisen wir den Browser an, dass ein Element mit der Klasse .box niemals kleiner als 45 % Breite oder 600 Pixel sein soll, je nachdem, was kleiner ist, basierend auf der Viewport-Breite.
.box {
width : min(45%, 600px)
}
Wenn 45 % einen Wert ergeben, der kleiner als 600 Pixel ist, verwendet der Browser 45 % als Breite. Umgekehrt, wenn 45 % einen Wert ergeben, der größer als 600 Pixel ist, werden 600 Pixel für die Breite des Elements verwendet.
Ähnlich verhält es sich mit der Funktion max(). Sie akzeptiert ebenfalls zwei Werte, aber anstatt die kleinste Größe für ein Element anzugeben, definieren wir die größte, die es erreichen kann.
.box {
width : max(60%, 600px)
}
Wenn 60 % einen Wert ergeben, der größer als 600 Pixel ist, verwendet der Browser 60 % als Breite. Auf der anderen Seite, wenn 60 % einen Wert ergeben, der kleiner als 600 Pixel ist, werden 600 Pixel als Breite des Elements verwendet.
Werte begrenzen
Viele von uns haben schon seit einiger Zeit nach clamp() geschrien, und wir haben tatsächlich eine breite Unterstützung in allen modernen Browsern (sorry, Internet Explorer). clamp() ist die Kombination der Funktionen min() und max() und akzeptiert drei Parameter:
- den Minimalwert,
- den bevorzugten Wert und
- den Maximalwert.
Zum Beispiel:
.box {
font-size : clamp(1rem, 40px, 4rem)
}
Der Browser setzt die Schriftgröße auf 1rem, bis der berechnete Wert von 1rem größer als 40 Pixel ist. Und wenn der berechnete Wert über 40 Pixel liegt? Ja, der Browser hört auf, die Größe zu erhöhen, nachdem er 4rem erreicht hat. Sie können sehen, wie clamp() verwendet werden kann, um Elemente fließend zu gestalten, ohne auf Media Queries zurückgreifen zu müssen.
Arbeiten mit responsiven Einheiten
Haben Sie jemals eine Seite mit einer großen Überschrift oder Unterüberschrift erstellt und bewundert, wie gut sie auf einem Desktop-Bildschirm aussah, nur um sie auf einem Mobilgerät zu überprüfen und festzustellen, dass sie zu groß ist? Ich war definitiv schon in dieser Situation, und in diesem Abschnitt werde ich erklären, wie man solche Probleme bewältigt.
In CSS können Sie Größen oder Längen von Elementen mit verschiedenen Maßeinheiten bestimmen, und die am häufigsten verwendeten Maßeinheiten sind: px, em, rem, %, vw und vh. Obwohl es mehrere weitere Einheiten gibt, die nicht so häufig verwendet werden. Was uns interessiert, ist, dass px als absolute Einheit betrachtet werden kann, während die anderen als relative Einheiten gelten.
Absolute Einheiten
Ein Pixel (px) gilt als absolute Einheit, hauptsächlich weil er fest ist und sich nicht aufgrund der Messung eines anderen Elements ändert. Er kann als Basis- oder Stammeinheit betrachtet werden, die einige andere relative Einheiten verwenden. Der Versuch, Pixel für responsives Verhalten zu verwenden, kann zu Problemen führen, da sie fest sind, aber sie sind großartig, wenn Sie Elemente haben, die überhaupt nicht in der Größe geändert werden sollen.
Relative Einheiten
Relative Einheiten wie %, em und rem eignen sich besser für responsives Design, hauptsächlich aufgrund ihrer Fähigkeit, über verschiedene Bildschirmgrößen hinweg zu skalieren.
vw: Relativ zur Breite des Viewportsvh: Relativ zur Höhe des Viewportsrem: Relativ zum Root-Element (<html>) (Standard-Schriftgröße ist normalerweise 16px)em: Relativ zum übergeordneten Element%: Relativ zum übergeordneten Element
Auch hier ist die Standard-Schriftgröße für die meisten Browser 16px, und rem-Einheiten verwenden diese, um ihre berechneten Werte zu erzeugen. Wenn ein Benutzer die Schriftgröße im Browser anpasst, skalieren alle Elemente auf der Seite richtig, abhängig von der Root-Größe. Wenn Sie beispielsweise mit einer Root-Größe von 16px arbeiten, wird die von Ihnen angegebene Zahl mit der Standardgröße multipliziert. Zum Beispiel
.8rem = 12.8px (.8 * 16)
1rem = 16px (1 * 16)
2rem = 32px (2 * 16)
Was passiert, wenn Sie oder der Benutzer die Standardgröße ändern? Wie wir bereits gesagt haben, handelt es sich um relative Einheiten, und die endgültigen Größenwerte basieren auf der neuen Basisgröße. Dies ist nützlich innerhalb von Media Queries, wo Sie einfach die Schriftgröße ändern und die gesamte Seite entsprechend skaliert wird.
Wenn Sie beispielsweise die Schriftgröße innerhalb des CSS auf 10px ändern würden, wären die berechneten Größen:
html {
font-size : 10px;
}
1rem = 10px (1 * 10)
2rem = 20px (2 * 10)
.5rem = 5px (.5 * 10)
Hinweis: Dies gilt auch für Prozente %. Zum Beispiel
100% = 16px;
200% = 32px;
50% = 8px;
Und was ist der Unterschied zwischen rem und em Einheiten? Es hängt davon ab, welche Basis das Element verwendet. rem berechnet Werte unter Verwendung der Schriftgröße des Root-Elements (<html>), während ein Element, das em-Werte deklariert, auf die Schriftgröße des übergeordneten Elements verweist, das es enthält. Wenn die Größe des angegebenen übergeordneten Elements von der Root-Größe abweicht (z. B. das übergeordnete Element ist 18px, aber das Root-Element ist 16px), dann werden em und rem unterschiedliche berechnete Werte ergeben. Dies gibt uns eine feinere Kontrolle darüber, wie sich unsere Elemente in verschiedenen responsiven Kontexten verhalten.
vh ist eine Abkürzung für *viewport height* (Ansichtsfensterhöhe) oder die Höhe des sichtbaren Bildschirms. 100vh steht für 100 % der Höhe des Ansichtsfensters (abhängig vom Gerät). In ähnlicher Weise steht vw für *viewport width* (Ansichtsfensterbreite), was die sichtbare Breite des Bildschirms des Geräts bedeutet, und 100vw steht buchstäblich für 100 % der Breite des Ansichtsfensters.
Jenseits von Media Queries
Sehen Sie das? Wir haben gerade eine Reihe von wirklich leistungsstarken und relativ neuen HTML- und CSS-Funktionen durchgesehen, die uns zusätzliche (und möglicherweise effektivere) Möglichkeiten zum Erstellen von responsiven Designs bieten. Es ist nicht so, dass diese neuen Techniken das ersetzen, was wir bisher getan haben. Sie sind lediglich weitere Werkzeuge in unserem Entwickler-Werkzeugkasten, die uns mehr Kontrolle darüber geben, wie Elemente in verschiedenen Kontexten funktionieren. Ob es sich um Schriftgrößen, Auflösungen, Breiten, Fokuspunkt oder eine beliebige Anzahl von Dingen handelt, wir haben mehr Feinsteuerung über das Benutzererlebnis als je zuvor.
Wenn Sie also das nächste Mal an einem Projekt arbeiten, bei dem Sie mehr Kontrolle über das genaue Aussehen und Gefühl des Designs auf bestimmten Geräten wünschen, schauen Sie sich an, was natives HTML und CSS leisten können – es ist unglaublich, wie weit die Dinge gekommen sind.
Schöner Artikel! Ich habe das Gefühl, dass die Verwendung von weniger Media Queries es einfacher macht, viele verschiedene Kontexte zu handhaben. Auch, etwas Container-Queries.
Übrigens, für
max()glaube ich, sollte dies gelesen werden (vermutlich Tippfehler)Ah ja! Danke für den Hinweis. :)
Toller Beitrag David, danke für deine Zeit. Und ja, mehr Werkzeuge für unseren Gürtel bei der Entwicklung von Websites.
Eine Frage, gibt es ein Online-Tool, um die verkleinerten Bilder und den HTML-Code entsprechend dieser neuen Reihe von responsiven Bild-Tags automatisch zu generieren?
Ja, hier.
Cloudinary leistet gute Arbeit bei der Optimierung von Bildern
Hallo Carlos, zu Ihrer letzten Frage können Sie diese ausprobieren
https://responsivebreakpoints.com/
Werkzeuge zur automatischen Generierung sind eine gute Frage. Keine Antwort, aber ich möchte erwähnen, dass ich Lighthouse in den Google Chrome Devtools verwendet habe und meistens einfach den "Anweisungen folgen" konnte und die Picture-Elemente mit Source-Media und Bildvarianten in den vorgeschriebenen Formaten und Größen als Ergebnis erhalten habe. Ich frage mich jetzt selbst, ob es einen besseren, automatisierteren Weg gibt, dies zu tun. Dennoch denke ich, dass es sich lohnt, es zuerst manuell zu tun, wenn Sie es noch nicht getan haben, so wie ich mich erinnere, dass mir jemand gesagt hat, ich solle meine Steuern mindestens einmal von Hand machen :)
Das ist tatsächlich ein Szenario, für das imgix sehr gut gerüstet ist. Es unterstützt eine Sammlung von Client-Bibliotheken, die den Code für Ihr
srcset-Attribut automatisch für Sie generieren. In Kombination mit seinem On-the-fly-Bildrendering-Service können Sie den gesamten Prozess der Generierung responsiver Bilder ziemlich schnell automatisieren.Haftungsausschluss: Ich bin Ingenieur bei imgix und pflege diese genannten Bibliotheken.
Das überschneidet sich stark mit Intrinsic Web Design. Wir übertragen so viel wie möglich der Aufgabe, das Layout zu bestimmen, dem Browser.
Gut geschrieben. Hilfreich. Guter Artikel.
Sehr interessant, ich werde diese Techniken definitiv auf meine Codes anwenden.
Fehlt mir hier etwas? Wie ist das gültig?
Das ist ein toller Beitrag. Es gibt verschiedene Tags in HTML, mit denen man mit Hilfe von CSS das beste Design erstellen kann.
Wow, ich liebe den Inhalt hier, ich hatte noch nie von diesen Min-Max- und Clamp-Funktionen gehört, wirklich dankbar, und Herr, ich habe eine Bitte, bitte schreiben Sie einen Beitrag über diese runden Kreistexte, die Sie gemacht haben, die, die ich überprüft habe, funktionieren nicht, vielleicht mache ich etwas falsch oder so.
Brillante Zusammenfassung, vielen Dank für das Teilen, David!
Ausgezeichneter Artikel! Danke.
Vielleicht bilde ich mir das nur ein, aber ich kann die CSS-Mathematikfunktion minmax() nirgends finden. Sie ist nicht hier: https://www.w3.org/TR/css-values-4/#math-function, und sie wird auch nicht in caniuse angezeigt. Nur die CSS Grid-Spezifikation zeigt minmax(). In devtool zeigt Chrome sie als ungültige Eigenschaft an, wenn sie mit width verwendet wird. Können Sie die offizielle Spezifikationsseite angeben, auf der Sie sie gefunden haben?
Toller Beitrag! Viel gelernt beim Lesen dieses Artikels. Ich habe vor ein paar Monaten mit der Frontend-Entwicklung begonnen und versuche, mich mit Best Practices vertraut zu machen, daher hat dies wirklich geholfen!
Danke für diesen Beitrag, David. Ich versuche, ihn für selfhtml.org (einer deutschen Ressource für Web-Wissen) zu übersetzen, und ich habe Schwierigkeiten mit Ihren Beschreibungen zu min und max.
Entweder bin ich komplett verwirrt oder Sie waren es. min() wählt den kleineren Wert, also definiert font-size: min(1rem, 22px) entgegen dem Funktionsnamen eine maximale Pixelgröße für die Schrift, wenn ich hochskaliere. Aber wenn ich runterskaliere, gibt es keine Grenze. max() (oder clamp()) würde hier die Lösung bringen.
Und minmax(), außerhalb eines Grid-Templates verwendet, scheint ungültiges CSS zu sein. Ich habe es mit Chrome und Firefox versucht, und beide haben es abgelehnt. Ist das etwas ganz Neues? Persönlich denke ich, dass Ihr Beispiel
.box {
width : minmax( 600px, 50% ); /* mindestens 600px, aber nie mehr als 50% */
}
könnte so geschrieben werden
.box {
width: max(600px, 50%);
}
„Die Funktion min() gibt die absolut kleinste Größe an, auf die ein Element schrumpfen kann.“ <– Ich denke, diese Aussage ist verwirrend, da sie meiner Meinung nach keine genaue Beschreibung von min() ist. So wie ich es verstehe, kann sich das UI-Element schrumpfen! und wachsen! bis zum absolut von Ihnen gesetzten Wert. Während max() dem Element erlaubt, sich von dem von Ihnen gesetzten absoluten Wert zu schrumpfen! und zu wachsen!
width: min(50%, 300px) -> hier kann 50% jeder Wert von 0 bis 300px sein
width: max(50%, 300px) -> hier kann 50% jeder Wert von 300px bis zur maximalen Viewport-Breite sein.
Zusammenfassend lässt sich sagen, dass es kontraintuitiv ist, da min den Maximalwert und max den Minimalwert festlegt.
Ich hoffe, das ergibt Sinn.
Ich brauche clamp() so schnell wie möglich in meinem Leben. Danke.
Ausgezeichneter Artikel! Ich denke mir immer wieder: „Nein, das kann ich nicht verwenden, es hat noch keine ausreichende Unterstützung“, und stelle dann fest, dass es 5 Jahre her ist, seit ich das letzte Mal nachgesehen habe! Das wird mir helfen, mein Wissen aufzufrischen, danke!
Ich denke, für min() und max() ist eine Möglichkeit, es auszudrücken:
min() -> legt eine Obergrenze fest (der Maximalwert, von dem aus das Schrumpfen beginnt)
max() -> legt eine Untergrenze fest (der Minimalwert, von dem aus das Wachsen beginnt)
Toller Beitrag!
Das ist ein toller Beitrag! Allerdings verstehe ich die Erklärung der clamp-Funktion noch nicht ganz. Wenn ich
font-size : clamp(1rem, 40px, 4rem)auf eine Überschrift auf dieser Seite in devtools anwende, ist die Schriftgröße immer 40px, da 40px der bevorzugte Wert ist.So wie es erklärt wird, scheint es, als ob es ein Bereich zwischen 1rem und 4rem sein sollte. Verwende ich es nicht richtig? Es scheint, als ob der bevorzugte Wert die relative Einheit sein sollte und Sie dann absolute Einheiten für die Min- und Max-Werte festlegen könnten.
Danke für den Beitrag David. Clamp war mir neu, gut zu wissen.
Eine Sache noch: Sind die Elemente innerhalb des Bildes vertauscht? Ihre ist die Standardeinstellung und das Bild für größere Bildschirme. Wenn Sie dann max-width auf die Elemente anwenden, sollten sie von der kleinsten Breite ausgehen und sich von dort aus vergrößern.
Da der Browser den ersten übereinstimmenden auswählt, würde JEDER Viewport, der schmaler als 1000px ist, picture-lg.png auswählen und die Optionen medium und small ignorieren.
Sollte es also sein:
<img src=”picture.png” alt=”picture””>
Hallo, darf ich Ihren Artikel ins Chinesische übersetzen? Ich möchte ihn mit mehr Entwicklern in China teilen. Ich werde den ursprünglichen Autor und die Originalquelle angeben.
Sicher, nur zu!