Media Queries eignen sich hervorragend, um Werte bei verschiedenen Bildschirmgrößen in plötzlichen Sprüngen zu ändern. Aber durch die Kombination der Leistung von calc() und Viewport-Einheiten wie vw und vh können wir eine Menge an Fluidität über unsere Layouts hinweg erzielen. Dafür werden wir eine Technik namens lineare Interpolation verwenden.
Lineare Interpolation ist eine Formel, die verwendet wird, um einen Wert zwischen zwei Punkten auf einer Linie zu finden. In unserem Fall sind diese beiden Punkte CSS-Werte, wie Schriftgrößen, Ränder oder Breiten, zwischen denen wir über eine Reihe von Viewport-Breiten interpolieren möchten.
Der Grund, warum wir zwischen Werten über eine Reihe von Viewport-Breiten interpolieren möchten, ist, die Erstellung mehrerer Breakpoints zu vermeiden, um den Fluss unserer Inhalte zu steuern, wenn sich der Viewport ändert. Stattdessen lassen wir den Browser des Benutzers nach unseren Anweisungen berechnen, welche Werte er erhält. Lassen Sie es mich erklären.
Der folgende Ausschnitt ist eine Sass-Funktion, die auf linearer Interpolation basiert und die wir bei Aranja between nennen.
/**
* Computes a CSS calc function that betweens a value from
* A to B over viewport-width A to viewport-width B.
* Requires a media query to cap the value at B.
*/
@function between($from, $to, $fromWidth, $toWidth) {
$slope: ($to - $from) / ($toWidth - $fromWidth);
$base: $from - $slope * $fromWidth;
@return calc(#{$base} + #{100vw * $slope});
}
Die Funktion wird wie folgt verwendet
$small: 400px;
$large: 1000px;
.Container {
/* The base (smallest) value. */
padding: 20px;
/* In $small it should be 20px and in $large it should be 100px, */
/* In viewports between that its padding should be calculated */
@media (min-width: $small) {
padding: between(20px, 100px, $small, $large);
}
/* In $large we cap the value at 100px */
@media (min-width: $large) {
padding: 100px;
}
}
Das obige Codebeispiel zeigt, wie wir den Abstand eines Containers von 20px in "mobiler" Größe auf 100px in "Desktop"-Größe zwischen verändern können. Jede Größe dazwischen erhält einen berechneten Abstand zwischen 20 und 100 Pixeln. Um zu verhindern, dass der Abstand den Maximalwert überschreitet, begrenzen wir ihn mit einem Breakpoint.
Versuchen Sie, die folgende Demo zu verkleinern, um das Beispiel in Aktion zu sehen
Die between-Funktion eignet sich hervorragend zur Lösung von Abstandsproblemen. Probleme, die wir zuvor manuell mit verschiedenen Media Queries gelöst hätten.
Beispiel-Layout
Die talentierte Carly Sylvester hat mir den folgenden Wireframe zur Verfügung gestellt, den sie für eine Freiwilligen-Feuerwehr-Website entworfen hat, damit ich diese Technik an einem realen Layout demonstrieren kann.

Das Design-Dokument besteht aus Desktop-, Tablet- und Mobilversionen der Website mit 1440px, 720px bzw. 324px.
In Wirklichkeit sind die Grenzen zwischen diesen verschiedenen Geräten nicht so klar definiert, daher werden wir die gegebenen Werte als Zielpunkte verwenden und mit unserer Funktion dazwischen interpolieren.
Beachten Sie, wie das Layout der Desktop- und Tablet-Versionen ähnlich ist, abgesehen von der Verwendung von Weißraum und Schriftgrößen – zwischen denen wir nahtlos interpolieren können. Wenn wir unseren kleinsten Zielpunkt erreichen, schnappen wir das Layout in ein klassisches Vollbild-Mobil-Layout.
Zum Vergleich sehen wir die Implementierung auf die übliche Weise, bei der die 3 Haupt-Breakpoints verwendet werden, um das Layout auf seine neuen Werte zu setzen.
Videos von Demos
betweenbetweenVersuchen Sie, die Demos in verschiedenen Bildschirmgrößen zu durchsuchen, und die Vorteile unserer Funktion sollten klar sein. Um die "normale" Version der Website zu verbessern, müssten wir mehr Breakpoints zusätzlich zu den ursprünglichen drei aus dem Design-Dokument hinzufügen, was zu mehr Sprüngen führt.
Kombiniert mit der Macht von rem
Eine leistungsstarke Technik, die wir mit der Funktion machen können, ist, die Root-font-size zu between und unsere Stile auf rem zu basieren
Die rem-Einheit bezieht sich auf die Root-font-size (die auf dem Element :root oder html gesetzte Schriftgröße), um ihren Wert zu bestimmen, und die Root-font-size bezieht sich auf die Viewport-Breite, um ihren Wert zu bestimmen. Wir setzen die Root-font-size auf 10px am kleinsten und 18px am größten, und das Ergebnis ist ein sanfter Übergang zwischen den beiden. Die kleinste Größe der Karte in der Demo beträgt immer 245px bei unserem $small-Breakpoint und wächst allmählich, bis sie bei unserem $large-Breakpoint ihren Höhepunkt von 440px erreicht.
Abschluss
Ich bin davon überzeugt, dass wir durch die Nutzung dieser Technik das Web zu einem besseren Erlebnis für Benutzer machen können, die Geräte nutzen, die nicht in die Verallgemeinerung von "mobilen" oder "Tablet"-Größen passen. Für mich zumindest macht es auch den Entwicklungsprozess angenehmer, da weniger Layout-bedingte Fehler auf meinem Tisch liegen.
Hinsichtlich der Browserunterstützung – die Tatsache, dass wir nur calc() und vw für die Funktionsweise der Technik benötigen, macht sie in den USA und Europa bei etwa 97 % und weltweit bei etwa 84 % verfügbar.
In den obigen Demos verwenden nicht unterstützte Browser (hauptsächlich Opera Mini und UC Browser) entweder unsere niedrigsten (Basis) oder unsere höchsten (begrenzten) Werte, abhängig von der Viewport-Breite.
Toller Artikel. Danke für die nützlichen Tipps und die fantastische SCSS-Funktion!
Gern geschehen!
Ich liebe es. Funktioniert das in E-Mails?
Ich bin glücklich genug, noch nie E-Mail-Stile geschrieben zu haben. Ich überlasse es anderen, diese Frage zu beantworten. Danke fürs Lesen!
Schön. Gefällt mir, wie es auf den Basis- oder größten media-query-Wert zurückfällt, wenn kein calc vorhanden ist.
Ich habe Ihre Funktion in einen Mixin eingepackt, damit Sie so etwas tun können
.selector { @include between(padding, 20px, 100px); }und es werden die Media Queries für Sie hinzugefügt
http://codepen.io/tobystokes/pen/NjGOde
Danke für den Mixin, Toby.
Ich habe mich entschieden, ihn nicht zu schreiben, um wirklich zu betonen, wie die Funktion funktioniert.
Das ist der Geist! Ein wirklich inspirierendes Maß an Untersuchung hier. Wäre neugierig zu wissen, ob ein bestimmtes Designproblem diese Recherche ausgelöst hat oder ob es sich hauptsächlich um eine sehr praktische Entwicklungsweise handelt.
Es ist in der Tat eine sehr schöne Art zu entwickeln.
Ich habe jahrelang in der Spieleentwicklung "lerpt", aber nie daran gedacht, es so zu verwenden. Danke für die Inspiration!
Ich mache etwas Ähnliches mit einem SCSS-Mixin, das von der kleinsten bis zur größten angegebenen px-Zahl geht und über eine vw-Einheit dazwischen wechselt. Ich mag Ihre etwas mehr! Ihre ist vielseitiger und die Syntax sieht einfacher aus! Toller Artikel!
Eine großartige Technik. Danke für den Mixin :)
Das ist der Hammer! Großartig.
Toller Artikel! Danke fürs Teilen :)
Das ist so großartig, danke fürs Teilen, David. Es ist erstaunlich, wie klobig mobile/tablet/desktop-Klassen sind, und das ist so viel besser, als %-basierte Lösungen zu versuchen. Und danke Toby für den Mixin!
Absolut augenöffnend! Ich habe mich mit Problemen herumgeschlagen, die jetzt gelöst sind – danke fürs Teilen!
Froh, geholfen zu haben
Es ist so gut zu wissen! Einfache Lösung, aber so mächtig!
Toller Artikel, nur dass das Schriftgrößen-Beispiel mit rem gegen Ende keine wirklich vergrößerbaren Schriften zeigt, was schade ist, weil ich ein Problem mit der Verwendung von rems für Schriftgrößen habe und auf ein gutes Beispiel gehofft hatte. Großartiger Snippet nichtsdestotrotz!.
Tolle und interessante Inhalte wie immer auf CSS Trick dot com.
Aber ich frage mich, wie viel % der Leute Fenster auf dem Desktop vergrößern… ganz zu schweigen von Tablets / Smartphones.
Ich bin mir da nicht ganz sicher, das wäre eine interessante Statistik zum Sammeln!
Aber ich denke, Ihr Punkt hier könnte sein: Dies ist nur nützlich, wenn Benutzer die Größe ändern, was meiner Meinung nach nicht der Sinn der Sache ist. Selbst wenn ein Benutzer nie die Größe ändert, kann die Größe, in der er erscheint, immer noch von dieser Art des reaktionsfähigen Größenbedenkens profitieren.
Chris hat recht, Serialspeaker.
Ein Beispiel aus meiner Erfahrung: Jahrelang habe ich Teile des Grid-Systems von Bootstrap 3 verwendet und erweitert, aber ich habe nie deren "fixed width"-Container-Modell verwendet. Ich ziehe es vor, wenn alles fließend ist (bis zu einer bestimmten oberen Breite) und sicherstelle, dass das Layout die Fenster- oder Gerätegröße des Benutzers nutzt.
David Bachmanns Funktion hier ist eine Methode, um ein wirklich fließendes Layout zu erreichen. (Toller Artikel und Snippet! Danke fürs Posten, CSS Tricks!) Allerdings bin ich mir nicht sicher, wie ich zu der Idee stehe, dass die Browserfenster-/Gerätebreite immer proportional den vertikalen Abstand bestimmen sollte. Es scheint, dass jedes Mal, wenn ich in den letzten Wochen einen Browser eines Nicht-Entwicklers geöffnet habe, er nicht die volle Höhe seines Monitors hatte, was den riesigen vertikalen Weißraum nicht so hilfreich macht. Ich frage mich, ob eine Variante dieser Funktion die Viewport-Höhe für solche Situationen berücksichtigen könnte…
Ich verwende dies normalerweise für die
bodyfont-sizeund dann verwende ich Werte, die mit derem-Einheit skalieren sollen. Tolles Werkzeug!Danke für all die tollen Ratschläge!
Dieser Artikel erklärt Media Queries wirklich gut und einfach, sodass selbst ein Grafikdesign-Student (wie ich) ihn verstehen kann.
Kann mir jemand helfen, die Funktion in Less zu schreiben?
Ich habe eine Less-Funktion hier: http://codepen.io/MadeByMike/pen/RWJyML, auch Stylus, Sass und PostCSS und andere Beispiele finden Sie hier: https://madebymike.com.au/writing/fluid-type-calc-examples/
Von Luca Rosaldi, nach Abschluss der Kommentare