Die Verwendung von Media Queries in CSS als Teil von responsiven Websites ist für heutige Frontend-Entwickler alltäglich. Die Verwendung von Präprozessoren, um sie komfortabler zu schreiben und leichter zu warten, ist ebenfalls üblich geworden.
Ich habe einige Monate lang mit einem Dutzend verschiedener Ansätze für Media Queries in Sass experimentiert und einige davon tatsächlich produktiv eingesetzt. Alle erwiesen sich letztendlich als ungeeignet, um alles, was ich auf elegante Weise tun musste, abzudecken. Daher habe ich das, was mir an jedem einzelnen gefiel, genommen und eine Lösung entwickelt, die alle aufgetretenen Szenarien abdeckt.
Warum überhaupt einen Präprozessor verwenden?
Das ist eine berechtigte Frage. Was bringt es schließlich, all das zu tun, wenn man Media Queries auch einfach mit purem CSS schreiben kann? Sauberkeit und Wartbarkeit.
Der häufigste Anwendungsfall für Media Queries ist die Transformation eines Layouts basierend auf der Breite des Browser-Viewports. Sie können ein Layout so anpassen, dass mehrere Geräte mit unterschiedlichen Bildschirmgrößen ein optimales Erlebnis genießen können. Infolgedessen werden die Ausdrücke, die zur Definition der Media Queries verwendet werden, sich auf die typische Bildschirmbreite dieser Geräte beziehen.
Wenn Ihr Code also 5 Media Queries enthält, die sich an Tablet-Geräte mit einer Breite von 768px richten, werden Sie diese Zahl 5 Mal fest codieren, was etwas Hässliches ist, das meine OCD niemals verzeihen würde. Erstens möchte ich, dass mein Code so einfach zu lesen ist, dass jeder sofort versteht, dass eine Media Query sich an Tablet-Geräte richtet, nur durch das Hinsehen – ich glaube, das Wort Tablet würde das besser tun als 768px.
Was ist, wenn sich diese Referenzbreite in Zukunft ändert? Ich hasse die Vorstellung, sie an 5 Stellen im Code ersetzen zu müssen, besonders wenn sie über mehrere Dateien verteilt ist.
Ein erster Schritt wäre, diesen Breakpoint in einer Variablen zu speichern und diese zur Konstruktion der Media Query zu verwenden.
/* Using plain CSS */
@media (min-width: 768px) {
}
/* Using SCSS variables to store breakpoints */
$breakpoint-tablet: 768px;
@media (min-width: $breakpoint-tablet) {
}
Ein weiterer Grund, Media Queries mit einem Präprozessor wie Sass zu schreiben, ist, dass er manchmal wertvolle Hilfe bei der Syntax leisten kann, insbesondere beim Schreiben eines Ausdrucks mit einem logischen oder (dargestellt durch ein Komma in CSS).
Wenn Sie zum Beispiel Retina-Geräte ansprechen möchten, wird die reine CSS-Syntax etwas umständlich.
/* Plain CSS */
@media (min-width: 768px) and
(-webkit-min-device-pixel-ratio: 2),
(min-width: 768px) and
(min-resolution: 192dpi) {
}
/* Using variables? */
@media (min-width: $bp-tablet) and ($retina) { // or #{$retina}
}
Es sieht zwar besser aus, funktioniert aber leider nicht wie erwartet.
Ein Problem mit der Logik
Aufgrund der Funktionsweise des CSS-"oder"-Operators könnte ich die Retina-Bedingungen nicht mit anderen Ausdrücken mischen, da a (b or c) zu (a or b) c kompiliert würde und nicht zu a b or a c.
$retina: "(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)";
// This will generate unwanted results!
@media (min-width: 480px) and #{$retina} {
body {
background-color: red;
}
}
/* Not the logic we're looking for */
@media (min-width: 480px) and (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
body {
background-color: red;
}
}
Ich erkannte, dass ich etwas Mächtigeres brauchte, wie eine Mixin oder eine Funktion, um dies zu lösen. Ich habe ein paar Lösungen ausprobiert.
Dmitry Sheikos Technik
Eine, die ich ausprobiert habe, war Dmitry Sheikos Technik, die eine schöne Syntax hatte und Chris' Retina-Deklaration enthielt.
// Predefined Break-points
$mediaMaxWidth: 1260px;
$mediaBp1Width: 960px;
$mediaMinWidth: 480px;
@function translate-media-condition($c) {
$condMap: (
"screen": "only screen",
"print": "only print",
"retina": "(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-device-pixel-ratio: 1.5), (min-resolution: 120dpi)",
">maxWidth": "(min-width: #{$mediaMaxWidth + 1})",
"<maxWidth": "(max-width: #{$mediaMaxWidth})",
">bp1Width": "(min-width: #{$mediaBp1Width + 1})",
"<bp1Width": "(max-width: #{$mediaBp1Width})",
">minWidth": "(min-width: #{$mediaMinWidth + 1})",
"<minWidth": "(max-width: #{$mediaMinWidth})"
);
@return map-get( $condMap, $c );
}
// The mdia mixin
@mixin media($args...) {
$query: "";
@each $arg in $args {
$op: "";
@if ( $query != "" ) {
$op: " and ";
}
$query: $query + $op + translate-media-condition($arg);
}
@media #{$query} { @content; }
}
Aber das Problem mit der logischen Disjunktion bestand weiterhin.
.section {
@include media("retina", "<minWidth") {
color: white;
};
}
/* Not the logic we're looking for */
@media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-device-pixel-ratio: 1.5), (min-resolution: 120dpi) and (max-width: 480px) {
.section {
background: blue;
color: white;
}
}
Landon Schropps Technik
Landon Schropps war mein nächster Stopp. Landon erstellt einfache benannte Mixins, die spezifische Aufgaben erfüllen. Wie
$tablet-width: 768px;
$desktop-width: 1024px;
@mixin tablet {
@media (min-width: #{$tablet-width}) and (max-width: #{$desktop-width - 1px}) {
@content;
}
}
@mixin desktop {
@media (min-width: #{$desktop-width}) {
@content;
}
}
Er hat auch eine Single-Responsibility-Retina-Version.
Aber ein weiteres Problem trat auf, als ich ein Element gestaltete, das zusätzliche Regeln für Zwischen-Breakpoints erforderte. Ich wollte meine Liste globaler Breakpoints nicht mit fallspezifischen Werten verunreinigen, nur um die Mixin weiterhin verwenden zu können, aber ich wollte definitiv nicht auf die Mixin verzichten und wieder auf reines CSS zurückfallen und jedes Mal, wenn ich benutzerdefinierte Werte verwenden musste, Dinge fest codieren.
/* I didn't want to sometimes have this */
@include tablet {
}
/* And other times this */
@media (min-width: 768px) and (max-width: 950px) {
}
Breakpoint-Technik
Breakpoint-sass war als nächstes auf meiner Liste, da es sowohl Variablen als auch benutzerdefinierte Werte in seiner Syntax unterstützt (und als Bonus ist es wirklich clever mit Pixel-Ratio-Media-Queries).
Ich konnte etwas schreiben wie
$breakpoint-tablet: 768px;
@include breakpoint(453px $breakpoint-tablet) {
}
@include breakpoint($breakpoint-tablet 850px) {
}
/* Compiles to: */
@media (min-width: 453px) and (max-width: 768px) {
}
@media (min-width: 768px) and (max-width: 850px) {
}
Die Dinge sahen besser aus, aber ich persönlich finde, dass die Syntax von Breakpoint-sass weniger natürlich ist als die von Dmitry. Sie können eine Zahl angeben und es wird angenommen, dass es ein min-width-Wert ist, oder eine Zahl und eine Zeichenfolge, und es wird angenommen, dass es sich um ein Eigenschaft/Wert-Paar handelt, um nur einige der unterstützten Kombinationen zu nennen.
Das ist in Ordnung, und ich bin sicher, es funktioniert gut, sobald man sich daran gewöhnt hat, aber ich hatte die Hoffnung noch nicht aufgegeben, eine Syntax zu finden, die sowohl einfach als auch so nah wie möglich an der Art und Weise ist, wie ich mündlich beschreibe, was eine Media Query ansprechen muss.
Auch wenn Sie sich das obige Beispiel ansehen, werden Sie sehen, dass ein Gerät mit einer Breite von genau 768px beide Media Queries auslöst, was möglicherweise nicht genau das ist, was wir wollen. Daher habe ich die Möglichkeit, inklusive und exklusive Breakpoints zu schreiben, meiner Anforderungsliste hinzugefügt.
Meine (Eduardo Boucass') Technik
Das ist mein Beitrag dazu.
Saubere Syntax, dynamische Deklaration
Ich bin ein Fan von Dmitrys Syntax, daher war meine Lösung davon inspiriert. Ich hätte jedoch gerne mehr Flexibilität bei der Erstellung von Breakpoints. Anstatt die Namen der Breakpoints fest in der Mixin zu codieren, habe ich eine mehrdimensionale Map verwendet, um sie zu deklarieren und zu labeln.
$breakpoints: (phone: 640px,
tablet: 768px,
desktop: 1024px) !default;
@include media(">phone", "<tablet") {
}
@include media(">tablet", "<950px") {
}
Die Mixin kommt mit einer Reihe von Standard-Breakpoints, die Sie an jeder Stelle im Code überschreiben können, indem Sie die Variable $breakpoints neu deklarieren.
Inklusive und exklusive Breakpoints
Ich wollte eine feinere Kontrolle über die Intervalle in den Ausdrücken haben, daher habe ich die Unterstützung für die Operatoren kleiner-als-oder-gleich und größer-als-oder-gleich aufgenommen. Auf diese Weise kann ich dieselbe Breakpoint-Deklaration in zwei sich gegenseitig ausschließenden Media Queries verwenden.
@include media(">=phone", "<tablet") {
}
@include media(">=tablet", "<=950px") {
}
/* Compiles to */
@media (min-width: 640px) and (max-width: 767px) {
}
@media (min-width: 768px) and (max-width: 950px) {
}
Medientypen ableiten und logische Disjunktion behandeln
Ähnlich wie bei den Breakpoints gibt es standardmäßig eine Liste für Medientypen und andere statische Ausdrücke (die Sie überschreiben können, indem Sie die Variable $media-expressions festlegen). Dies fügt Unterstützung für optionale Medientypen hinzu, wie screen oder handheld, ist aber auch in der Lage, Ausdrücke mit logischen Disjunktionen korrekt zu behandeln, wie die zuvor gesehene Retina-Media-Query. Die Disjunktionen werden als verschachtelte Listen von Zeichenfolgen deklariert.
$media-expressions: (screen: "screen",
handheld: "handheld",
retina2x:
("(-webkit-min-device-pixel-ratio: 2)",
"(min-resolution: 192dpi)")) !default;
@include media("screen", ">=tablet") {
}
@include media(">tablet", "<=desktop", "retina2x") {
}
/* Compiles to */
@media screen and (min-width: 768px) {
}
@media (min-width: 769px) and
(max-width: 1024px) and
(-webkit-min-device-pixel-ratio: 2),
(min-width: 769px) and
(max-width: 1024px) and
(min-resolution: 192dpi) {
}
Es gibt keine Raketenwissenschaft dahinter, aber die vollständige Implementierung der Mixin ist nichts, was ich in nur wenigen Codezeilen zeigen könnte. Anstatt Sie mit riesigen Code-Schnipseln und endlosen Kommentaren zu langweilen, habe ich ein Pen mit allem, was funktioniert, beigefügt und werde den Prozess, den es durchläuft, um die Media Queries zu konstruieren, kurz beschreiben.
Wie es funktioniert
- Die Mixin empfängt mehrere Argumente als Zeichenfolgen und beginnt damit, jedes einzelne zu durchlaufen, um herauszufinden, ob es einen Breakpoint, eine benutzerdefinierte Breite oder einen der statischen Media-Ausdrücke darstellt.
- Wenn ein Operator gefunden wird, wird er extrahiert und jeder passende Breakpoint wird zurückgegeben, andernfalls nehmen wir an, dass es sich um einen benutzerdefinierten Wert handelt, und wandeln ihn in eine Zahl um (mithilfe von SassyCast).
- Wenn es sich um einen statischen Media-Ausdruck handelt, prüft er auf
oder-Operatoren und generiert alle notwendigen Kombinationen, um die Disjunktion darzustellen. - Der Prozess wird für alle Argumente wiederholt und die Ergebnisse werden mit dem
und-Connector verknüpft, um den Media-Query-Ausdruck zu bilden.
Wenn Sie sich den vollständigen Sass-Code ansehen möchten, finden Sie ihn hier. Er heißt include-media auf GitHub.
Abschließende Gedanken
- Ich bin ein großer Fan von dieser Technik, um Sass mit JavaScript sprechen zu lassen. Da wir Breakpoints als multidimensionale Liste mit ihren Namen als Schlüssel deklarieren, wird der Export in großen Mengen an JavaScript sehr einfach und kann mit nur wenigen Codezeilen automatisch erfolgen.
- Ich versuche nicht, die Lösungen anderer Leute schlecht zu machen, und ich sage definitiv nicht, dass diese besser ist. Ich habe sie erwähnt, um einige der Hindernisse auf dem Weg zu meiner idealen Lösung aufzuzeigen, sowie einige großartige Dinge, die sie eingeführt haben und die meine eigene Lösung inspiriert haben.
- Sie haben vielleicht einige Bedenken hinsichtlich der Länge und Komplexität dieser Implementierung. Während ich das verstehe, ist die Idee dahinter, dass Sie eine einzelne Datei herunterladen, sie in Ihr Projekt
@importieren und mit der Verwendung beginnen, ohne den Quellcode anfassen zu müssen. Pingen Sie mich aber auf Twitter an, wenn Sie Fragen haben. - Sie können es von GitHub erhalten und sind herzlich eingeladen, mit Issues/Code/Liebe beizutragen. Ich bin sicher, es gibt noch viel, was wir tun können, um es besser zu machen.
Update!
Eduardo hat eine Website für seinen Ansatz erstellt: @include-media.
Das ist ein Monstrum von einer Mixin. Gut gemacht.
Es ist wahrscheinlich lohnenswert, ein oder zwei Beiträge zu verfassen, um den Leuten beizubringen, wie man SASS/SCSS Mixins so gründlich durchdenkt, wie diese hier durchdacht wurde. Der mit Abstand beste Teil dieses Beitrags war für mich das Lesen dieser Mixin.
Großartige Lösung für die Media-Query-Syntax ebenfalls! Alles in allem gute Arbeit.
Wie unterscheidet sich das von Bootstraps einfachem
…/* Extra kleine Geräte (Handys, unter 768px) /
/* Keine Media Query, da dies der Standard in Bootstrap ist */
/* Kleine Geräte (Tablets, ab 768px) */
@media (min-width: @screen-sm-min) { … }
/* Mittlere Geräte (Desktops, ab 992px) */
@media (min-width: @screen-md-min) { … }
/* Große Geräte (große Desktops, ab 1200px) */
@media (min-width: @screen-lg-min) { … }…
Echte Frontend-Entwickler möchten sich normalerweise nicht ständig auf ein Framework wie Bootstrap verlassen. Es erlaubt Ihnen, unnötige Stylesheets zu laden. Der Sinn der Sache ist es, eine bessere Media Query aus dem Stylesheet zu erstellen, anstatt fertige Klassen aus einem Haufen Regeln in einem Framework zu haben.
So mache ich das. Man muss kein riesiges, aufgeblähtes Framework wie BS laden. Es ist nichts Falsches daran, die guten Teile herauszunehmen und in die eigenen zu integrieren.
Ich mache das auch mit dem Grid. Man kann den Bloat im Grid auch reduzieren, indem man @if nutzt und eine Optionsdatei erstellt, in der man Teile des Grids einfach hinzufügen oder entfernen kann.
@wiziwiz, weil es nicht mit einer Million verschiedener Dinge aufgebläht ist, die Sie wahrscheinlich nicht verwenden werden.
Im Allgemeinen, wenn ich so etwas wie Bootstrap oder Foundation verwende, dann für einen schnellen Prototyp oder einen Klick-Dummy (um eine User Story oder was auch immer zu demonstrieren).
Dann baue ich mein eigenes (mobile-first) Stylesheet. Susy oder zen grids sind großartige Werkzeuge, die Frameworks wie Bootstrap und Foundation überflüssig machen.
Sind em-basierte MQs jetzt Schnee von gestern?
px sind ein besserer Weg für Media Queries und em sind besser für Typografie und Block-Level/Inline-Elemente. Nur meine 2 Cents.
Ich bevorzuge em-basierte Media Queries, weil, wenn der Benutzer beschließt, seinen Browser zu vergrößern, dieser die Media Queries erkennt und die responsive Seite anzeigt, wodurch die Website nie kaputtgeht.
Außerdem melden einige Geräte eine größere Schriftgröße als 16px, und wenn das der Fall ist, sehen sie ebenfalls die responsive Seite aufgrund der em-basierten MQs.
http://bradfrost.com/blog/post/7-habits-of-highly-effective-media-queries/#relative
http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/
Einige schlagen sogar die Verwendung von REMs vor
Aber, https://twitter.com/brad_frost/status/335259353466691584
Das Zoom-Problem bei px-basierten Media Queries war ein Problem in Chrome, das schon lange behoben ist. Und da alte Chrome-Versionen nicht lange bestehen bleiben, würde ich mir darüber nicht viele Gedanken machen. Es ist lustig, wie solche Ideen in unseren Köpfen haften bleiben.
Ich stimme Tony zu. EMs / REMs für typografische Elemente oder Wrapper oder solche, die Sie mit der Typografie in Beziehung setzen möchten. Dinge, die die Struktur beeinflussen, sollten entweder % oder px erhalten. Das ist die Philosophie, die mir bisher gut gedient hat.
Em ist nicht präzise genug, ich bin auf Probleme gestoßen, bei denen eine 1-Pixel-Lücke zwischen Breakpoints besteht (wenn Sie Bereichs-Bpts anstatt überlappende Bpts definieren). Px ist die kleinste Einheit, sie ist exakt.
@Ricardo, das ist eine Bedingung.
@mike mai Genau das habe ich beim Festlegen von Breakpoints mit ems erlebt, ich musste fummeln und basteln, um die Breakpoints auslösen zu lassen, die Mathematik stimmte einfach nicht mit einer Basisschriftgröße von 16px oder was auch immer Sie eingestellt haben, die Formel funktioniert nicht wie erwartet. (Entschuldigung, ich werde kein Beispiel geben, probieren Sie es einfach selbst aus)
@rxrrctct absolut nicht. Ich bin mir nicht sicher, ob wir heutzutage überhaupt px verwenden sollten.
@Tony Ich würde Ihnen bezüglich px-Media-Queries widersprechen. Die Verwendung von em-basierten Media Queries kann dazu beitragen, Ihre Website zugänglicher zu machen. Ich empfehle dringend, diesen Blogbeitrag zu lesen – er wird Ihre Meinung wahrscheinlich vollständig ändern.
http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/
@Alistar, ich liebe es, ems zu verwenden, ich verwende sie und rems.
Ich finde es lustig, dass der von Ihnen verlinkte Artikel vom Autor besagt,
Ich hatte einfach ein paar unerwartete Ergebnisse bei der Verwendung von ems und Breakpoints in meinen ScSS-Dateien
Ich bin mir nicht sicher, ob ich bereit bin, die Eleganz von CSS zu abstrahieren.
Es ist irgendwie eine seltsame Art, Media Queries zu warten. Ich wette, die normale CSS-Syntax ist in diesem Fall besser.
Massive Arbeit, offensichtlich. Eine Frage jedoch, warum nicht die Tatsache nutzen, dass Sass Media Queries kombiniert, anstatt die gesamte Logik und (De)Strukturierung nach SassScript zu verlagern?
Unter Verwendung von Landon Schropps Technik könnte man etwas wie das hier haben (obwohl ich keine Mixin pro Breakpoint mag, ist sie definitiv nicht skalierbar)
Diese Syntax definiert nicht nur klar ihre Absicht, die Komponente für den „Tablet“-Breakpoint zu stylen, sondern fügt auch gleichzeitig eine zusätzliche Anforderung hinzu.
Zu den Dingen, die Sie ausprobieren könnten
– Sass-MQ von @Kaelig, verwendet bei The Guardian und The Financial Times (unter anderem): https://github.com/sass-mq/sass-mq
– Breakpoint-slicer von @lolmaus, eine syntaktische Zuckersüße über Breakpoint: https://github.com/lolmaus/breakpoint-slicer
Für Leute, die sich für das Thema interessieren, habe ich einen Artikel über Responsive Breakpoints Management bei SitePoint geschrieben: http://www.sitepoint.com/managing-responsive-breakpoints-sass/. Falls das hilft.
Ich mag, wie Ihre Lösung mit SCSS funktioniert
Beeindruckende Arbeit!
Aber was ist mit dem Content, der die Breakpoints definiert?
http://bradfrost.com/blog/post/7-habits-of-highly-effective-media-queries/#content
http://www.smashingmagazine.com/2013/03/01/logical-breakpoints-responsive-design/
Das war mein allererster Gedanke, als ich den Artikel las.
Offensichtlich wurde hier enorme Arbeit geleistet – Respekt an Eduardo! Aber ich würde niemals „vordefinierte“ Breakpoints festlegen und den Content danach gestalten.
Der Content sollte die Breakpoints definieren, nicht umgekehrt.
aber es erlaubt Ihnen, den Content den Breakpoint definieren zu lassen, wie hier
Ich finde es tatsächlich sehr flexibel und intuitiv (zumindest für mich).
Ich habe diese Mixin sofort verwendet. Vielen Dank für diese Arbeit, Eduardo.
Manchmal hat man nicht den Luxus, den Content zu kennen. Besonders bei der Gestaltung von Websoftware, die konfigurierbar und kundenspezifisch ist. Man müsste den Content kennen und ihn nicht wirklich ändern.
Persönlich bin ich kein großer Fan von Breakpoints, die nach Gerätekategorien benannt sind (Tablet, Handy usw.) aus offensichtlichen Gründen. (z. B. kann ein Gerät mit einer Bildschirmbreite von 1024 Pixeln buchstäblich alles sein, von Handy bis Desktop)
Ich denke, der Ansatz von Brad Frost, Dinge zu benennen, ist die am wenigsten schlechte Lösung: http://bradfrost.com/blog/post/7-habits-of-highly-effective-media-queries/#content
($bp-small, $bp-small-2, $bp-med, $bp-med-2,…)
Das schätze ich, aber das Gute an dieser Lösung ist, dass sie flexibel genug ist, um alles zu tun, was Sie wollen. Sie können
$breakpointsneu definieren, um diese Benennungskonvention anstelle der standardmäßig enthaltenen Gerätenamen zu verwenden.Ich denke wirklich, dass der Content die Breakpoints definieren sollte und nicht eine vorgegebene Gerätebreite, die sich ändern wird. Geräte werden weiterhin unterschiedlich groß sein, also warum nicht die Elemente im Design individuell reagieren lassen, wenn sich die Breite ändert? Das kann man immer noch sehr einfach mit einer Mixin machen…
verwenden
Ich muss zustimmen. Da mit jedem Jahr neuere Versionen von Handys und Tablets auf den Markt kommen (heutzutage viel zu schnell), scheint es nur logisch, Breakpoints basierend auf dem Content zu implementieren. Es scheint, dass durch die Verwendung dieser Methode weniger Zeit für die Website-Wartung aufgewendet werden muss.
Das ist eine Technik, die ich auch verwende, gemischt mit der Technik von Landon Schropp. Auch das mobile-first-Vorgehen vereinfacht dies für mich enorm. Ich habe break-one, break-two usw. (ähnlich wie bei Schropps Ansatz) als allgemeine Richtlinie verwendet und dann ein break-any, wie Sie es beschrieben haben (was wahrscheinlich am häufigsten zusammen mit break-one verwendet wird), und vermeide im Allgemeinen alle max-width Media Quries.
@Jason, Mann, diese Mixin ist großartig.
Auf Wiedersehen, Benennung von Media Queries!
Betreff: px vs em-basierte Media Queries, während der Browser-Zoom in Chrome beide jetzt gleich behandelt (z. B. mit Strg/Cmd +/-), werden px-basierte Media Queries nicht ausgelöst, wenn Benutzer stattdessen ihre Textgröße innerhalb der Browsereinstellungen erhöhen. Aus diesem Grund bevorzuge ich immer noch em-basierte, obwohl ich mir nicht sicher bin, welches Szenario unter Benutzern, die zoomen (Browser oder Text-basiert), häufiger vorkommt.
http://codepen.io/mpiotrowicz/pen/pvNNXM/
Hier, bitte: http://bit.ly/1xD75tZ
Bestätigt! Monikas Demo funktioniert wie beschrieben.
Zugegeben, es war einfacher, nur die Textgröße in Firefox als in Chrome zu ändern und die Ergebnisse zu sehen.
Danke für das Teilen.
Ich verhindere im Allgemeinen, dass sie in den Browsereinstellungen herumfummeln, indem ich ein Reset-Stylesheet verwende. Sie haben mehr Kontrolle über die Darstellung und nehmen die standardmäßige Textgröße aus der Gleichung.
Das mache ich. Es hat die Vorteile der Verwendung gängiger Breakpoints und der Verwendung benutzerdefinierter Breakpoints basierend auf dem Content. Gelernt von Tim Knight.
Und wie benutzen wir es? :)
@Ricardo, das ist eine Bedingung.
Entschuldigung, ich meinte, der Kommentar sollte hier für @Ricardo sein
http://bit.ly/1xD75tZ
Vielleicht bin ich die Ausnahme, aber ich verwende ein System wie folgt…
In main.scss lade ich general.scss, das alle erforderlichen Styles in allen Fällen enthält. Danach, ebenfalls in main.scss, aber unterhalb des allgemeinen Imports, sind alle Breakpoints aufgelistet, wobei jedes Kriterium die „sub“ SCSS-Datei für diesen spezifischen Breakpoint importiert.
Also hat general.scss die generischen (S)CSS, typischerweise die Mobile-First-Styles, die dann bei Bedarf in größeren Breakpoints erweitert werden. Ich liebe diese saubere Trennung. Es gibt keinen wiederholten Breakpoint-Code irgendwo und es gibt eine klare Unterscheidung zwischen Basisstilen und erweiterten Stilen. Tatsächlich können Sie allein anhand der Größe dieser „sub“ SCSS-Dateien die Qualität Ihres Designs erkennen. Je größer sie sind, desto weniger reaktionsschnell ist das Design tatsächlich.
Jedem das Seine, aber ich frage mich, warum Leute all die oben genannten Methoden verwenden, mir erscheinen sie unnötig? Der einzige Nachteil meines Ansatzes ist, dass man mehrere Dateien öffnen muss, wenn man einen vollständigen Überblick über einen Selektor bekommen möchte, aber in der Praxis stellt dies für mich kein Problem dar.
Würden Sie die Dateien teilen, damit wir Ihre Struktur sehen können?
@Ricardo: Klar, hier ist der Inhalt von projectname.scss, meiner Haupt-SCSS-Datei
Wie Sie sehen, lade ich zuerst Basisstile, die pro Feature in separate Dateien aufgeteilt sind. Alle diese Basisstile zusammen bilden im Wesentlichen den Mobile-First-Zustand.
Als nächstes kommen die Breakpoints, bei denen basierend auf dem Viewport progressiv weitere SCSS-Dateien importiert werden. Die Dateien addieren sich im Grunde, so dass, wenn wir uns auf einem „M“-Breakpoint befinden, die Basis + XXS + XS + S + M in diesem Fall geladen werden.
Diese Breakpoint-Dateien enthalten nur CSS-Overrides, keine Basisstile, und natürlich nur Overrides für den jeweiligen Breakpoint.
Wie gesagt, ich mag diesen Ansatz, weil ich nirgendwo Media Queries sehe, ich dupliziere sie nie. Ich arbeite einfach in der richtigen Datei. Der andere Hauptvorteil ist, dass er einen sehr guten Überblick über den Zustand eines Projekts gibt. Wenn ich zum Beispiel eine einzelne Klasse in jedem Breakpoint stark überschreiben muss, ist diese Klasse von Anfang an möglicherweise nicht sehr gut konzipiert. Auch wenn eine Breakpoint-SCSS-Datei übermäßig groß wird, riecht das auch nach Ärger.
In dem (sehr großen) Projekt, in dem ich dies verwende, enthalten die meisten dieser Breakpoint-Dateien höchstens ein paar Dutzend Zeilen von Overrides, mit der Ausnahme des L-Breakpoints, der radikale Layout-Änderungen und somit viele Overrides mit sich bringt.
Der einzige Nachteil, den ich bei diesem Ansatz sehe, ist, dass einige Leute es vorziehen würden, alle Breakpoint-Overrides einer Klasse in einer Datei zu sehen. Ich nicht. Ich trenne die Basis sauber von den Overrides.
Hilft das?
@Ferdy, ja, das ist ziemlich cool.
Ich muss zugeben, ich wäre einer von denen, die gerne eine Klasse und all ihre Breakpoints in derselben Datei sehen würden :p
Die Art und Weise, wie Sie das machen, ähnelt stark der Art und Weise, wie Chris hier zuvor gezeigt hat, wie er es macht, wo die Hauptdatei nur eine Reihe von
@imports ist. Ich weiß, dass ich etwas Ähnliches hier auf CSS-Tricks.com gesehen habe, kann aber die Seite nicht finden.OFFTOPIC –
Ich bin keineswegs ein Sass-Experte und vielleicht wissen Sie das schon, aber für diejenigen, die es nicht tun: Sie können alle importierten Dateien mit einer einzigen
@import-Direktive verketten.Oder gestapelt für bessere Lesbarkeit.
Vielen Dank für das Teilen und die detaillierte Erklärung.
Entschuldigung, ich habe das Markdown falsch formatiert
Hier ist die Gruntfile, die ich benutze
Thema verfehlt
chris, ich mag das neue Aussehen von css-tricks wirklich sehr, es lädt auch viel schneller
Das ist eine großartige Lektüre. Media Queries sind inzwischen etwas Selbstverständliches, aber die Verwendung mit SASS führt zu etwas komplexerem Code. Ich bin mit meinem OCD mit meinem CSS sehr ähnlich, daher möchte ich, dass es sauber und leicht verständlich ist.
Ich würde gerne sehen, wie dieser Super-Mixin nach Stylus übersetzt wird, da es in jeder Hinsicht besser als Sass ist.
Ich bin selbst ein großer Fan von Stylus. Außer dass ich es für meine Node-Anwendungen verwende. Wie verwendest du es in einem Nicht-Node-Projekt?
Ich benutze einfach gulp-stylus, um es zu CSS zu kompilieren
Ich bin an deiner Behauptung interessiert, dass Stylus in jeder Hinsicht besser als Sass ist. Kannst du das etwas ausführen? Was macht Stylus besser? Ich habe Stylus noch nie benutzt – ich hatte eine kurze Zeit mit LESS, bin aber zu Sass (SCSS) zurückgekehrt.
doh >_<, ich kann nicht glauben, dass ich nicht einmal daran gedacht habe, lol, ich habe nicht darüber nachgedacht, es außerhalb eines Node-Projekts zu verwenden, bis jetzt. Stylus ist etwas, das ich persönlich mit Express-Projekten verwendet habe, es hat viel von der gleichen Syntax wie altmodisches SaSS. Ich liebe seine Syntax, weil sie sehr rubesque ist. Was das Bessersein angeht, das ist eine Frage der Meinung, ich persönlich liebe es.
Stylus kann alles, was Sass kann. Der einzige Grund, Sass gegenüber Stylus zu wählen, ist, wenn du wirklich gerne viele zusätzliche geschweifte Klammern, Doppelpunkte, Semikolons und das Wort "@mixin" schreibst.
Ich mag die SCSS-Syntax, hauptsächlich weil sie vertraut und konsistent mit dem CSS ist, das ich seit etwa 1998 schreibe! Alte Gewohnheiten sterben schwer :) Und außerdem erledigt mein Texteditor die meiste Arbeit für mich.
@Darryl Benutze dann SASS-Syntax.
Ich benutze eher
@includeals@mixin:]Ich füge gerne per JS eine "lg, md, sm oder xs"-Klasse zu meinem Tag hinzu. Dann verschachtele ich das einfach in meine CSS-Regeln, sodass meine gesamte Formatierung zusammen ist, anstatt in einem separaten Media-Query-Bereich aufgeteilt zu sein.