Da immer mehr Leute in Sass schreiben, lohnt es sich, darüber nachzudenken, wie wir es formatieren. CSS-Style-Guides sind üblich, also können wir diese vielleicht erweitern, um spezifische Sass-Entscheidungen abzudecken.
Hier sind einige Ideen, zu denen ich tendiere. Vielleicht sind sie nützlich für Sie oder helfen Ihnen, eigene Ideen zu entwickeln. Wenn Sie weitere Beispiele suchen, ist Sass Guidelines eine weitere gute Anlaufstelle.
Verwenden Sie Ihre regulären CSS-Formatierungsregeln / Style Guide
In diesem Beitrag geht es um Sass-spezifische Dinge, aber als Grundlage sollten Sie alle guten CSS-Formatierungsrichtlinien befolgen, die Sie bereits einhalten. Wenn Sie dies noch nicht tun, kann Ihnen diese Zusammenfassung von Style Guides helfen. Dazu gehören Dinge wie:
- Seien Sie konsistent bei der Einrückung
- Seien Sie konsistent, wo Leerzeichen vor/nach Doppelpunkten/Klammern platziert werden
- Ein Selektor pro Zeile, Eine Regel pro Zeile
- Listen Sie verwandte Eigenschaften zusammen auf
- Haben Sie einen Plan für die Benennung von Klassennamen
- Verwenden Sie keine IDs #hotdrama
- usw.
List @extend(s) zuerst
.weather {
@extend %module;
...
}
Sofort zu wissen, dass diese Klasse von anderen Regeln erbt, ist gut. Ein weiterer Vorteil ist, dass das Überschreiben von Stilen für diesen geerbten Satz von Regeln dadurch viel einfacher wird.
Zu wissen, wann @extend anstelle von @include verwendet werden soll, kann etwas knifflig sein. Harry macht eine gute Arbeit, die beiden zu unterscheiden und bietet Gedanken, wie man beide verwendet.
List @include(s) next
.weather {
@extend %module;
@include transition(all 0.3s ease-out);
...
}
Als Nächstes kommen Ihre @includes für Mixins und andere Funktionen. Auch dies ist gut, um es für die Referenz ganz oben zu haben, aber es ermöglicht auch Überschreibungen. Sie könnten sich auch entscheiden, benutzerdefinierte @includes von vendor-seitigen @includes zu trennen.
Listen Sie "reguläre" Stile als Nächstes auf
.weather {
@extend %module;
@include transition(all 0.3s ease-out);
background: LightCyan;
...
}
Das Hinzufügen unserer regulären Stile nach den @Extends und @Includes ermöglicht es uns, diese Eigenschaften bei Bedarf richtig zu überschreiben.
Verschachtelte Pseudo-Klassen und Pseudo-Elemente als Nächstes
.weather {
@extend %module;
@include transition(all 0.3s ease-out);
background: LightCyan;
&:hover {
background: DarkCyan;
}
&::before {
content: "";
display: block;
}
...
}
Pseudo-Elemente und Pseudo-Klassen beziehen sich direkt auf das Element selbst, daher verschachteln wir sie aus diesem Grund zuerst vor anderen Selektoren. Dass Pseudo-Elemente vor Klassen kommen, scheint etwas einfacher zu lesen zu sein, aber ob das eine vor dem anderen kommt, ist reine Geschmackssache. So oder so ist es vielleicht am besten, Elemente mit anderen Elementen und Klassen mit anderen Klassen zusammenzuhalten.
Verschachtelte Selektoren zuletzt
.weather {
@extend %module;
@include transition(all 0.3s ease);
background: LightCyan;
&:hover {
background: DarkCyan;
}
&::before {
content: "";
display: block;
}
> h3 {
@include transform(rotate(90deg));
border-bottom: 1px solid white;
}
}
Nach dem verschachtelten Zeug kommt nichts mehr. Und die gleiche Reihenfolge wie oben innerhalb des verschachtelten Selektors gilt.
Schreiben Sie niemals Vendor-Präfixe
Vendor-Präfixe sind eine zeitabhängige Sache. Da sich Browser im Laufe der Zeit aktualisieren, wird die Notwendigkeit dafür wegfallen. Wenn Sie Autoprefixer beim Kompilieren von Sass verwenden, sollten Sie sie niemals schreiben müssen.
Alternativ können Sie @mixins von Bibliotheken wie Compass und Bourbon verwenden. Oder Ihre eigenen erstellen. Obwohl die Verwendung von @mixins für Vendor-Präfixe immer noch weniger praktisch ist als Autoprefixer und immer noch etwas Wartung erfordert, ist es immer noch besser, als alles manuell schreiben zu müssen.
Maximale Verschachtelung: Drei Ebenen tief
.weather {
.cities {
li {
// no more!
}
}
}
Wahrscheinlich schreiben Sie, wenn Sie tiefer gehen, einen schlechten Selektor. Schlecht, weil er zu stark von der HTML-Struktur abhängt (fragil), übermäßig spezifisch ist (zu mächtig) und nicht wiederverwendbar ist (nicht nützlich). Außerdem ist er an der Grenze zur Schwierigkeit der Verständlichkeit.
Wenn Sie wirklich Tag-Selektoren verwenden möchten, weil Ihnen die Klassenfamilie zu viel wird, sollten Sie sich ziemlich genau darauf festlegen, um unerwünschte Kaskaden zu vermeiden. Und möglicherweise sogar @extend nutzen, damit es auf der CSS-Seite den Vorteil der Wiederverwendbarkeit hat.
.weather
> h3 {
@extend %line-under;
}
}
Maximale Verschachtelung: 50 Zeilen
Wenn ein verschachtelter Sass-Block länger als das ist, besteht eine gute Chance, dass er nicht auf einen Code-Editor-Bildschirm passt und schwer zu verstehen wird. Der Sinn der Verschachtelung ist Komfort und Unterstützung bei der mentalen Gruppierung. Verwenden Sie sie nicht, wenn sie schadet.
Globale und abschnittsspezifische Sass-Dateien sind nur Inhaltsverzeichnisse
Mit anderen Worten, keine Stile direkt darin. Zwingen Sie sich, alle Stile in Komponenten aufzuteilen.
Listen Sie zuerst Vendor/Global Dependencies auf, dann Author Dependencies, dann Patterns, dann Parts
Es ergibt sich ein leicht verständliches Inhaltsverzeichnis.
/* Vendor Dependencies */
@import "compass";
/* Authored Dependencies */
@import "global/colors";
@import "global/mixins";
/* Patterns */
@import "global/tabs";
@import "global/modals";
/* Sections */
@import "global/header";
@import "global/footer";
Die Abhängigkeiten wie Compass, Farben und Mixins erzeugen keine kompilierte CSS überhaupt, sie sind rein code-basierte Abhängigkeiten. Das Auflisten der Patterns als Nächstes bedeutet, dass spezifischere "Parts", die danach kommen, die Macht haben, Patterns zu überschreiben, ohne einen Spezifitätskrieg zu führen.
Teilen Sie in so viele kleine Dateien auf, wie sinnvoll ist
Es gibt keine Nachteile, in viele kleine Dateien aufzuteilen. Tun Sie es so viel, wie es sich für das Projekt gut anfühlt. Ich persönlich finde es einfacher, zu kleinen spezifischen Dateien zu springen und sie zu durchsuchen, als wenige/größere.
...
@import "global/header/header/";
@import "global/header/logo/";
@import "global/header/dropdowns/";
@import "global/header/nav/";
@import "global/header/really-specific-thingy/";
Ich würde dies wahrscheinlich direkt in der global.scss tun, anstatt dass global _header.scss importiert, was eigene Unterimporte hat. All diese Unterimporte könnten außer Kontrolle geraten.
Globbing könnte helfen, wenn es zu viele werden, um sie aufzulisten.
Partials werden _partial.scss genannt
Dies ist eine gängige Namenskonvention, die anzeigt, dass diese Datei nicht eigenständig kompiliert werden soll. Sie hat wahrscheinlich Abhängigkeiten, die eine eigenständige Kompilierung unmöglich machen. Persönlich mag ich Bindestriche im "eigentlichen" Dateinamen, wie z. B. _dropdown-menu.scss.
Lokal mit Source Maps kompilieren
In der Entwicklung ist es wahrscheinlich egal, in welchem Format Sie Ihr Sass kompilieren (z. B. expanded, compressed usw.), solange Sie Source Maps erzeugen.
Es ist eine Option, wenn Sie Sass kompilieren
$ sass sass/screen.scss:stylesheets/screen.css --sourcemap
Obwohl Sie Sass wahrscheinlich nicht typischerweise so kompilieren, gibt es immer eine Möglichkeit, die von Ihnen verwendete Sache zum Kompilieren von Sass so zu konfigurieren, dass sie mit Source Maps funktioniert. Wenn Sie sie haben, bedeutet das, dass DevTools Ihnen zeigt, wo sich der Sass-Code befindet, was super (duper) nützlich ist.

Hier sind einige relevante Links dazu
- (Google) Arbeiten mit CSS-Präprozessoren
- (The Sass Way) Verwenden von Source Maps mit Sass 3.3
Im Deployment kompilieren Sie komprimiert
Live-Websites sollten nur komprimierte CSS enthalten. Und mit Gzip und weit hergeholten Ablaufdaten-Headern obendrein.
Commiten Sie nicht einmal .css-Dateien
Dies erfordert möglicherweise etwas DevOps-Arbeit, aber es ist ziemlich nett, wenn .css-Dateien nicht einmal in Ihrem Repository enthalten sind. Die Kompilierung erfolgt während des Deployments. So sehen Sie im Repository nur Ihre schön formatierten, von Hand geschriebenen Sass-Dateien. Das macht auch die Diffs nützlich. Ein Diff ist eine Vergleichsansicht dessen, was sich geändert hat, die von Versionskontrollanbietern bereitgestellt wird. Der Diff für eine komprimierte CSS-Datei ist nutzlos.
Seien Sie großzügig mit Kommentaren
Es ist selten, dass man es bereut, einen Kommentar im Code hinterlassen zu haben. Er ist entweder hilfreich oder leicht zu ignorieren. Kommentare werden beim Kompilieren zu komprimiertem Code entfernt, sodass keine Kosten entstehen.
.overlay {
// modals are 6000, saving messages are 5500, header is 2000
z-index: 5000;
}
Und wo wir gerade von Kommentaren sprechen, sollten Sie sich vielleicht auf eine Standardisierung einigen. Die // Syntax in Sass ist ziemlich praktisch, besonders für Kommentarblöcke, sodass es einfacher ist, einzelne Zeilen zu kommentieren/entkommentieren.
Variablisieren Sie alle häufig verwendeten Zahlen und Zahlen mit Bedeutung
Wenn Sie eine Zahl häufiger als 0 oder 100% verwenden, verdient sie wahrscheinlich eine Variable. Da sie wahrscheinlich Bedeutung hat und Konsistenz steuert, kann es nützlich sein, sie in Massen ändern zu können.
Wenn eine Zahl eindeutig eine starke Bedeutung hat, ist das ebenfalls ein Anwendungsfall für die Variablisierung.
$zHeader: 2000;
$zOverlay: 5000;
$zMessage: 5050;
.header {
z-index: $zHeader;
}
.overlay {
z-index: $zOverlay;
}
.message {
z-index: $zMessage;
}
Idealerweise sollten diese Zahlen wahrscheinlich in einer separaten Datei gespeichert und als Abhängigkeit @importiert werden. So können Sie Ihren gesamten z-Index-Stack an einem Ort nachverfolgen. Wenn die Variablen jedoch an die Klasse gebunden sind, macht es Sinn, sicherzustellen, dass sie vor allen anderen Regeln stehen.
.accordion {
$accordion-header-color: $primary-color;
$accordion-padding: 1em;
@extend %module;
@include transition(all 0.3s ease-out);
background: $accordion-header-color;
padding: $accordion-padding;
}
Variablisieren Sie alle Farben
Außer vielleicht Weiß und Schwarz. Wahrscheinlich ist eine Farbe kein Einzelfall, und selbst wenn Sie denken, dass sie es ist, sobald sie in einer Variablen ist, sehen Sie vielleicht anderswo Verwendungen dafür. Variationen dieser Farbe können oft mit den Sass- Farbfunktionen wie lighten() und darken() behandelt werden – was das Aktualisieren von Farben erleichtert (an einer Stelle ändern, das gesamte Farbschema aktualisiert sich).
Verschachteln und benennen Sie Ihre Media Queries
Die Möglichkeit, Media Queries in Sass zu verschachteln, bedeutet 1) dass Sie den Selektor nicht woanders neu schreiben müssen, was fehleranfällig sein kann, und 2) dass die Regeln, die Sie überschreiben, sehr klar und offensichtlich sind, was normalerweise nicht der Fall ist, wenn sie am Ende Ihres CSS oder in einer anderen Datei stehen.
.sidebar {
float: right;
width: 33.33%;
@include bp(mama-bear) {
width: 25%;
}
}
Mehr dazu und die Bedeutung, sie gut zu benennen.
Scham zuletzt
In Ihrem globalen Stylesheet importieren Sie eine _shame.scss-Datei zuletzt.
@import "compass"
...
@import "shame"
Wenn Sie eine schnelle Korrektur vornehmen müssen, können Sie dies hier tun. Später, wenn Sie richtige Zeit haben, können Sie die Korrektur in die richtige Struktur/Organisation verschieben. Siehe mehr.
Das Endergebnis liegt bei Ihnen
Sass tut nichts, was Sie ihm nicht sagen, also ist die Behauptung, dass Sass-Output aufgebläht ist, nur die Behauptung, dass Sie aufgeblähten Code schreiben. Schreiben Sie Sass so, dass der endgültige CSS-Output genau so ist, wie Sie ihn ohne Sass geschrieben hätten.
In höheren Bildungseinrichtungen gibt es eine Vielzahl von Stakeholdern, das Potenzial für viel Turnover und eine Menge geerbten Code. Daher haben wir kürzlich einen CSS/SASS-Styleguide erstellt, nur um ehrlich zu bleiben. Es gibt immer noch viele Leute, die SASS noch nicht nutzen konnten. Daher fügen wir, obwohl nicht wirklich Teil des Styleguides, eine Markdown-Datei "Getting Started with SASS" hinzu, wie wir kompilieren möchten (wir arbeiten alle unter Windows), Sublime-Text-Snippets usw. in der Erwartung, dass wir eines Tages weiterziehen und ein armer Tropf mit unserem gesamten Code zu tun haben wird – und was, wenn die neue Person .scss nicht erkennt?
Das andere, was wir getan haben, war, all unsere Stile bis zum Äußersten zu abstrahieren, damit ein schneller Blick auf alle _partials klar macht, was der globale Stylesheet enthielt. Zum Beispiel könnten Sie sich das Repository ansehen und sagen: "Oh, es gibt eine Regel für Alerts, Buttons, Forms, Breadcrumbs, aber keine Tooltips." So muss niemand die Stylesheet öffnen, um festzustellen, ob es dafür einen Stil gibt.
Ich liebe die Idee der _shame.scss-Datei wirklich. Oft finde ich mich gezwungen, hässlichen Code hastig am Ende eines Projekts einzufügen, und ich hasse es, ihn in meinen Hauptstilen zu lassen. Ich muss definitiv meine Verschachtelung begrenzen, es wird zum neuen "Div-itis" für Webdesigner.
Tolles Vorschläge rundum, und ich werde definitiv neu bewerten, wie ich SASS von nun an schreibe!
Ich mag die Idee von _shame.scss auch, obwohl ich feststelle, dass 90% meiner beschämenden Dinge sowieso in meinem _ie.scss landen :P
Ha, das stimmt zu gut. IE war und ist der Fluch meines cbc-Lebens. Übrigens gefällt mir die Idee, mit Kommentaren großzügig zu sein. Ich habe für eine SEO-Firma gearbeitet, die behauptete, das sei schlecht für die Bots. Als Programmierer erleichtert es einfach, Notizen hinzuzufügen, die in 6 Monaten leicht zu sehen sind, wenn man eine schnelle Änderung vornehmen muss. Toller Beitrag!
Genau so mache ich es, lustigerweise. Ein weiterer Punkt, den ich in Bezug auf Verschachtelung machen würde, ist, zu versuchen, Tag-Selektoren so wenig wie möglich als tiefste zu verwenden, nur aus Performance-Gründen, obwohl es im verschachtelten Format elegant aussehen kann.
Fantastischer Artikel, und ich möchte Aufkleber mit Ihrem abschließenden Absatz darauf machen und sie auf die Tastatur jedes Entwicklers kleben, der sich über Präprozessoren beschwert, die schlechten Produktionscode erzeugen.
Ich verstehe die Begrenzung Ihrer Verschachtelung nicht ganz. Zum Beispiel
Dadurch wird das `a` auf der untersten Ebene Ihres nächsten sehr spezifisch, was im Navigationsbeispiel, das Sie erwähnen, kein großes Problem sein mag, da Navigation der Bereich ist, in dem viele von uns sogar in Vanilla CSS schreiben würden.
nav ul li a {}.Aber sagen wir, Ihr Kunde fügt dann ein Dropdown hinzu, Sie müssen dies auch verschachteln, und der Code kann schnell verwirrend werden.
Schreiben Sie etwas Beispielcode, verschachteln Sie ein paar Stile und versuchen Sie dann, einige der verschachtelten Stile weiter unten in der Stylesheet zu überschreiben, und Sie werden feststellen, dass die verschachtelten Stile zu spezifisch geworden sind und Sie dazu zwingen, entweder überall lange Selektoren zu schreiben oder zu noch schlimmerem zu greifen, wie !important.
Auch (obwohl meiner Meinung nach ein geringeres Problem)
Es ist auch ein geringer Performance-Hit, da der Browser Stile von rechts nach links liest, also muss er in diesem Fall herausfinden,
OK, das ist ein Anker
und es ist eine Teilmenge eines Listenelements
und dies ist eine Teilmenge einer ungeordneten Liste
welche eine Teilmenge eines Nav-Elements ist
Bevor er die richtigen Stile zuweisen kann. Das ist auf den meisten Geräten keine große Sache, aber wenn der Browser auf einem älteren Telefon läuft und alle Ihre Stile verschachtelt sind, wird es einen kleinen Unterschied machen.
Durch die Verwendung von Klassen und das Nicht-Verschachteln machen Sie Ihren Code etwas schneller, was nur von Vorteil sein kann.
Alles gesagt, eine typische Listenbasierte Navigation ist die einzige Sache, bei der Verschachtelung Sinn machen kann! Ihr Code – Ihre Regeln …
Zusätzlich zu dem, was Simon gesagt hat, macht die kontinuierliche Verschachtelung den Selektor unnötig spezifisch. Sie sollten nur so viel verschachteln, wie es absolut notwendig ist. Hängen die `li`-Stile WIRKLICH davon ab, innerhalb eines `ul` zu sein? Sie wären nicht innerhalb eines `ol` geeignet? Und hängen die Stile für das `a`-Tag WIRKLICH davon ab, innerhalb eines `li` zu sein, das innerhalb eines `ul` ist, das schließlich innerhalb eines `
Wenn Ihre Markup wie folgt aussieht
Dann sollten Sie versuchen, Ihr SCSS wie folgt zu verschachteln
Ihre SCSS-Verschachtelung muss nicht exakt mit Ihrer Markup-Verschachtelung übereinstimmen. Sie muss nur spezifisch genug sein, um zu verhindern, dass Code-Stile in unbeabsichtigte Elemente "sickern" und nicht spezifischer als das.
Ihre Antwort ist hier
Vermeiden Sie verschachtelte Selektoren für modulareres CSS
Gute Ratschläge im Artikel, bis auf die willkürliche Verschachtelungsgrenze.
Ich neige sehr stark dazu, die Dokumentenstruktur als gerichteten azyklischen Graphen zu betrachten, was eine formale Grundlage für die Analogie mit gerichteten azyklischen Objektgraphen (ein sehr häufiges Gebilde) in der objektorientierten Programmierung bietet. Das Beschränken der Verschachtelung auf eine willkürliche Ebene ist dann nicht anders, als die Tiefe eines Objektgraphen auf eine willkürliche Ebene zu beschränken. Beides ist Unsinn.
Der Kommentar von Dale Sande ist die einzige Rechtfertigung für eine Verschachtelungsgrenze: modulares CSS. Das Weglassen dieser Erklärung in diesem Artikel ist offensichtlich. Mit diesem Ansatz wäre die Verschachtelungsgrenze genau 0 (keine Verschachtelung). Diesen Ansatz mag ich persönlich nicht, da er nicht mit meinem DAG-Mentalmodell übereinstimmt und stattdessen eine Abflachung der HTML-Struktur in den globalen CSS-Selektorraum erzwingt.
Aber der Ansatz im verlinkten Artikel ist nur eine von vielen Möglichkeiten, modulares CSS zu erreichen, und er ist nicht ohne Einschränkungen. (Ich persönlich bevorzuge einen Ansatz, der die Rettung von CSS, den Kindkombinator `>` für Leistung und Produktivität nutzt – Details auf meinem Blog, falls Sie interessiert sind.)
Das Problem hierbei ist, dass Sie eine Regel mit einer unnötig hohen Spezifität erstellen, so dass es schwierig ist, eine so definierte Regel später zu überschreiben (es sei denn, Sie verwenden `!important`, aber das ist keine wirklich gute Praxis).
Betrachten Sie auch die Leistung dessen, was Sie schreiben: Der Browser liest die Stile von rechts nach links, so dass er überprüfen muss, ob ein `a`-Element in einem `li` verschachtelt ist, welches in einem `ul` verschachtelt ist, welches schließlich in einem `nav` verschachtelt ist.
Wahrscheinlich würden Sie einfach schreiben
Wenn Sie mehr als ein `nav`-Element pro Seite haben können, möchten Sie diesem Stil vielleicht einen `id`-Attribut oder ein `role="navigation"`-Attribut zuweisen, und Ihr Block wird
Zu tief verschachtelte Selektoren verringern auch die Leistung Ihrer Webseite/App.
Tolle Liste.
Zum Thema Verschachtelung: Ich komme zu dem Schluss, dass "niemals verschachteln" eine gute Regel ist (in der gleichen Weise und aus dem exakt gleichen Grund, warum "niemals IDs für Stile verwenden" eine gute Regel ist).
Sobald Sie Regeln verschachteln, erzeugen Sie Spezifitätsprobleme für Ihr Team / Ihre zukünftige Selbst und schränken die Wiederverwendbarkeit Ihrer Stile ein.
Ich versuche auch, BEM-Klassennamen zu verwenden, obwohl es am Anfang den Kopf verdreht, ich bin mir sicher, dass es die Zukunft ist und das Verschachteln von irgendetwas BEM unmöglich macht, es zu verstehen.
Die Ausnahme ist Media Queries – das Verschachteln macht für mich viel Sinn.
Ich liebe auch das Kommentieren in Sass. Immer mehr werde ich Kommentare für jede Klasse schreiben
.classname { // Normalerweise (falls zutreffend) betont dieser Stil den Text usw..
font-weight: bold;
}
Obwohl dies wie eine Qual aussieht, zwingt es Sie wirklich, über die Stile nachzudenken, die Sie schreiben, und wie Sie sie in Zukunft wiederverwenden könnten.
Ich behalte auch die meisten Stile in der Haupt-`.scss`-Datei mit wenigen Imports, die für alle Projekte nützlich sind.
_compass.scss
_reset.scss (mein eigener Reset, nachdem ich Normalize zu oft versucht und mich frustriert habe)
_components.scss (eine Datei mit Variablen und Mixins)
_helpers.scss (Dinge wie .visuallyhidden von H5BP, clearfix usw.)
_grid.scss (mein eigenes Grid basierend auf Twitter Bootstrap), wenn ich es benutze
_placeholders (eine Datei voller unsichtbarer Klassen (%)) bin mir immer noch nicht sicher über den besten Weg, dies zu tun)
_shame.scss (so eine brillante Idee!)
Dann legen Sie alle einzigartigen Stile in eine Datei. Ich habe versucht, sie in Typografie, Struktur usw. aufzuteilen, fand aber, dass es mich Zeit kostete, die benötigten Dateien zu öffnen und über Dateien zu suchen, also ging ich zurück zur einen Hauptdatei. Wenn ich in einem Team arbeite, macht das Aufteilen der Datei in Partials sicher Sinn.
Alles gesagt, ich denke, das einzige, was wirklich zählt, ist, dass Ihre Style Guides / Coding Conventions für Sie und Ihr Team sinnvoll sind.
Die Verwendung von doppelten Schrägstrichen für Kommentare stellt auch sicher, dass Sie die Fehlermeldungen nicht unterbrechen, die SASS ausgeben kann.
Wenn ein Blockkommentar in der Nähe Ihres Fehlers liegt, beendet er den Blockkommentar, den SASS zur Ausgabe des Backtrace in Ihrer generierten CSS-Datei verwendet.
Toller Beitrag.
Ich denke, das Einzige, was übrig bleibt, ist, wo man geskriptete Variablen platziert. Ich platziere sie oben, vor dem @extend, so:
.weather { $u: 10px; @extends %module; background: LightCyan; padding: $u; margin: $u/2; }Soweit ich weiß, sind Variablen in Sass/Compass sowieso nicht geskriptet, aber ich stimme zu, dass sie oben so platziert werden sollten.
Variablen allein können geskriptet sein, werden aber leicht überschrieben. Es stimmt, dass, wenn Sie eine Variable nur innerhalb eines Selektors definieren, sie auf diesen Selektor beschränkt ist und nicht in anderen Fällen verwendet werden kann. Wie im folgenden Beispiel
Aber wenn Sie eine neue Variable im globalen Gültigkeitsbereich einführen, erlaubt Sass die Kaskade, diese Variable in jedem Anwendungsfall zu überschreiben, selbst wenn sie auf einen Selektor beschränkt ist.
Und zweifellos ist eine der wahren Stärken von Sass die Verwendung von globalen Variablen zur Festlegung von Werten innerhalb Ihrer CSS-Regeln.
In diesem Beispiel setze ich die globale Variable `$var: orange` und obwohl ich im dritten Selektor keine geskriptete Variable im Selektor setze, wird die globale Variable durch die letzte Instanz der geskripteten Variable im Selektor überschrieben.
Und unser Ausgabe-CSS sieht so aus:
Die einzig wirklich geskripteten Variablen befinden sich innerhalb von Mixins und Funktionen.
Sie können mit diesem Beispiel auf SassMeister.com experimentieren.
Es ist so enttäuschend, dass dieser Mythos weiterlebt, besonders in einem Artikel über sass/less (wo die Trennung von Stilen gefördert werden sollte!). CSS wird immer von HTML abhängig sein und HTML hat mehr Verantwortlichkeiten als nur die einfache CSS-Arbeit.
Schaffen Sie eine Abstraktion Ihrer Stile und wenden Sie diese Abstraktionen auf den richtigen Selektor an.
Nennen Sie es einen Mythos, wenn Sie wollen, aber ich werde Dinge wie `.main nav ul li a` für immer als schlechten Selektor bezeichnen. Das ist das Ergebnis von Überverschachtelung und es war mir schon oft ein Dorn im Auge und ich bin darüber hinweggekommen.
Es ist eine Sache zu sagen, dass ein Selektor wie `div.foo span a strong .bar` ein schrecklicher Selektor ist, weil er übermäßig spezifisch ist, denn `div.foo .bar` ist genauso effizient, um das richtige Element zu finden. Sie SOLLTEN den kürzesten Selektor schreiben, um genau das zu finden, was Sie brauchen. All die Bytes, die Sie sparen, summieren sich.
Eine andere Sache ist zu sagen "tun Sie es nicht" wegen vorzeitiger Optimierung. Das Hinzufügen einer Klasse zu all Ihren Links, weil es 20 ms schneller ist als ein Selektor wie `nav > ul > li > a`, um die Links in einer Top-Level-Liste zu finden, ist einfach lächerlich.
Lesenswert: http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/
Das hier bezieht sich mehr auf die Verwendung von Nachfahren-Selektoren als auf Kind-Selektoren.
Dinge wie `.main nav ul li a` werden als schlecht (langsam, möglicherweise problematisch) betrachtet, aber ich gehöre nicht zu den Leuten, die empfehlen, jedes Element in HTML mit einer Klasse zu versehen, was ich ebenfalls schlecht finde.
Wenn Sie jedoch Kind-Selektoren verwenden
.main>nav>ul>li>a(was wir jetzt endlich verwenden können, weil es sicher ist, IE6 komplett zu ignorieren)
..dann ist das besser. Es ist definitiv viel schneller und klarer und führt nicht zu potenziell unklaren Einflüssen. Normalerweise sollten Sie jedoch keinen so langen Selektor verwenden müssen.
Ich sage immer: Vermeiden Sie extreme Meinungen. Zum Beispiel zu sagen: "Verwenden Sie niemals, niemals IDs in CSS" ist einfach dumm.
Eine weitere lustige Sache, die man standardisieren kann, sind Kommentarstile innerhalb Ihrer Dokumente. Wenn man in ein neues Projekt einsteigt, in dem frühere Programmierer verschiedene Kommentarstile verwendet haben, um verschiedene Abschnitte des Codes darzustellen, kann das eine ziemliche Kopfschmerzen bereiten.
Dieser Styleguide passt ziemlich gut zu meinen eigenen Vorlieben, aber selbst wenn jemand ihn nicht unbedingt mag, würde ich trotzdem empfehlen, sich an eine Art von Guide zu halten. Konsistenz ist wichtig.
Eine kleine Kritik: `@include`s machen mehr Sinn vor einfachen CSS-Regeln. Wenn ich einen Button- oder Grid-Mixin einschließe und ihn nur für diesen Stil anpassen möchte, muss ich die Regeln danach hinzufügen. Platzhalter – Mixin – Stile ordnen die Code-Kaskade vom am wenigsten spezifischen auf diesen Selektor zum spezifischsten an.
Stimme zu 100%, Mixins sollten zuerst kommen, nutzen Sie die Kaskade, mein Freund!
Ich müsste Ihnen teilweise zustimmen, Rob. In den meisten Fällen sollten wir die Kaskade nutzen. Meine allgemeine Regel ist, Includes genauso wie reguläre Selektoren zu behandeln und meine Selektoren logisch in einem Block zu gruppieren, es sei denn, die Includes rufen einen Mixin auf, von dem ich weiß, dass er viele Regeln generiert, wie der `button`-Mixin in Ihrem Beispiel.
Das ist genau das, was ich hier sagen wollte. @Extends, @Includes, dann Ihre regulären CSS, in alphabetischer Reihenfolge für jede. Unterbrechungen dazwischen, wenn nötig, aber ich finde es einfach genug zu lesen ohne.
Ich stimme Mandy zu. Ich finde, dass das Hinzufügen von CSS-Stilen alphabetisch mir auch bei der Organisation hilft.
Ja. Ich mache Mixins zuerst, damit ich, wenn ich etwas im Mixin überschreiben muss, das tun kann. Und ich lege Extends zuletzt, nur damit ich mich wie ein Rebell fühle.
Mein normaler Fall für Stile zuerst sind Hintergründe mit Verläufen. Compass (soweit ich weiß) gibt keine solide Farbhinterlegung bei Verläufen aus, also mache ich
@Chris – Wenn Sie es als "background-color" schreiben, können Sie es überall platzieren. Die Reihenfolge spielt keine Rolle.
Ja, das ist ein guter Punkt. Ich denke oft an Fallbacks als zuerst aufgelistet – wenn die zweite/fortschrittlichere Regel nicht funktioniert, fällt sie auf den vorherigen Selektor zurück. Aber in diesem Fall ist der Verlauf wirklich `background-image` (sogar als Teil des `background`-Kurzschreibens) und die Volltonfarbe ist `background-color`. Wenn also das `background-image` fehlschlägt, fällt es auf das `background-color` zurück – das, wie Sie sagten, überall gesetzt werden kann. Und wenn das `background-image` erfolgreich ist, liegt es ohnehin über dem `background-color`.
Guter Punkt und clevere Lösung.
Übrigens, wenn Sie auf den Autoprefixer-Zug aufspringen, müssen Sie sich nie wieder darum kümmern :) :) :)
https://github.com/ai/autoprefixer
Kudos! Ich mache das auch so.
@Niels Es war eher eine Aussage der Wahrscheinlichkeit als eine solide Tatsachenaussage, daher das Präfix und der Haftungsausschluss "Chancen stehen gut". Ein Selektor mit mehr als drei Hierarchieebenen sollte sehr selten sein. Das Navigationsbeispiel `nav ul li a` kann zu `nav a` vereinfacht werden. Sie müssen nicht angeben, dass der Anker ein Nachfahre eines Listenelements ist, das ein Nachfahre einer ungeordneten Liste ist, die ein Nachfahre eines `
@Martin Bean
Ich glaube nicht, dass sie selten sind, tatsächlich glaube ich, dass sie sehr häufig sind. Sobald man mit HTML-Komponenten zu arbeiten beginnt, werden die Dinge generischer.
Was kein Problem ist, wenn Sie faire Abstraktionen oder Ihre CSS-Stile erstellen (was der Punkt von CSS-Präprozessoren ist). Es schlägt sicherlich das Vermüllen Ihres HTML mit nutzlosen Klassen, die nicht von Projekt zu Projekt übernommen werden und nur bestimmte Visualisierungen innerhalb eines einzelnen Projekts abgleichen. In meinen Augen ist das eine größere Sünde als ein 6-elementiger Selektor.
Gibt es einen Unterschied bei dem verwendeten Kommentar, /* comment */ vs. // comment, dahingehend, ob er im kompilierten CSS angezeigt wird? Ich dachte, das sei der Fall, könnte mich aber irren.
Ja,
/* dieser sollte bei der Kompilierung erscheinen */
// dieser wird es nicht tun
aber es hängt von Ihrem gewählten Ausgabetyp ab. Ich würde vorschlagen, die ausgegebene CSS zu minifizieren, damit sie klein durch die Leitung geht :)
Der typische /* Kommentar */ wird bei verschachtelten, expandierten und kompakten Ausgaben angezeigt – aber nicht bei komprimierten… es sei denn, Sie verwenden das !bang; z.B.
/! Kommentar wird in komprimierter Ausgabe kompiliert; d.h. Hinzufügen von Copyright-Hinweisen/Kommentarinfos auf sass-lang.com
Schöne Zusammenfassung. Warum bevorzugen manche Entwickler *immer* Klassen gegenüber IDs? Das habe ich nie ganz verstanden, und ich habe mir persönlich immer bewusst Mühe gegeben, nur Klassen zu verwenden, wenn diese Stile woanders wiederverwendet werden sollen, und wenn es sich um ein prominentes Element wie eine Seitenleiste oder einen Footer handelt, oder einen Abschnitt, zu dem ich vielleicht verlinken oder ein Element mit jQuery binden möchte, würde ich IDs verwenden.
Jetzt, wo ich mein CSS in Sass schreibe und Mixins, Variablen und die einfachen Steuerung der Stile verschachtelter Elemente verwenden kann. Bin ich neugierig auf die Vor- und Nachteile der Verwendung von Klassen gegenüber IDs?
Klassen werden bevorzugt, weil CSS zum Stylen da ist, und wenn Sie Ihre Stile modular schreiben, schreiben Sie sie für die potenzielle mehrmalige Verwendung auf einer Seite. Also würden Sie den Stil an einer Klasse und nicht an einer ID haken.
Ich weiß, dass einige Entwickler blind darauf schwören, niemals IDs zu verwenden (hust* Harry Roberts *hust*), aber ich habe keine Probleme, sie in isolierten Fällen zu verwenden, z.B. `#content` für den Hauptinhalt-Wrapper meiner Website.
Außerdem können Sie JavaScript-Funktionalität sowohl an Klassennamen als auch an IDs haken ;)
Das größte Problem bei der Verwendung von IDs in CSS ist, dass sie in den Spezifitätskriegen WAY zu mächtig sind. Wenn Sie jemals einen Selektor schreiben, der eine ID verwendet, können Sie ihn so gut wie nicht mit einem reinen Klassenselektor überschreiben, es sei denn, Sie verwenden 256 davon. Und das wäre einfach nur verrückt.
Sie denken vielleicht, dass das in Ordnung ist, weil "Warum sollte ich jemals Stile auf eine ID überschreiben müssen? Davon soll es nur eine auf der Seite geben!" In der Praxis ist das jedoch oft nicht der Fall, besonders bei jeder Art von zusammengesetztem Selektor.
Danke fürs Teilen, Chris. Ich habe versucht, eine "Styleguide" zu erstellen, an die ich mich in meinem Repo halten soll, als Startpunkt hier – https://github.com/sturobson/a-slightly-bizarre-starting-point#sass
Ich habe auch darüber gesprochen, wie meine Sass-Struktur sein sollte, hier –
http://alwaystwisted.com/post.php?s=2013-01-07-structuring-my-sass-101-part-1
http://alwaystwisted.com/post.php?s=2013-01-07-structuring-my-sass-101-part-2
http://alwaystwisted.com/post.php?s=2013-01-08-structuring-my-sass-101-part-3
Schön zu sehen, mehr Diskussion und Gedanken dazu
Danke, dass Sie Ihren Ansatz teilen, Chris. Das ist sehr nah daran, wie ich meinen Sass-Code/meine Dateien organisiere.
Es gibt einige `@include`-Anweisungen, die ich am Anfang eines Deklarationsblocks bevorzuge, wie `@include pie-clearfix;` und `@include inline-block;` von Compass.
Auch finde ich verschachtelte Selektoren leichter zu lesen/erkennen, wenn über ihnen eine Leerzeile ist (selbst mit großartiger Syntaxhervorhebung).
Also dies
Wird dies
Ich wäre neugierig, von anderen Entwicklern zu hören, ob sie eine Leerzeile über verschachtelten Selektoren bevorzugen/nicht bevorzugen.
Chris, wenn Sie Ihre CSS-Dateien nicht committen, wie kompilieren Sie dann auf Ihrem Entwicklungsserver?
Sie committen die .scss oder .sass-Dateien
Ich stimme zu, warum sollte man seinen Produktionsserver die CSS-Datei neu rendern lassen wollen? Ich würde es vorziehen, wenn mein Prod keine Sass/SCSS-Datei enthält, die geändert werden kann.
@peter Committen bedeutet nicht unbedingt deployen. Sie hätten idealerweise einen "Build"-Prozess, der sich um Dinge wie das Kompilieren von Sass oder CoffeeScript kümmert, und Dinge wie Konkatenation, Minifizierung, Asset-Versionierung usw. Und dann einen "Deploy"-Prozess, der alle Dateien an den richtigen Ort bringt.
Jenkins (jenkins-ci.org) und CircleCI (circleci.com) sind beliebte Continuous Integration Tools für die Automatisierung solcher Prozesse.
Eine weitere Option ist die Verwendung von etwas wie deployhq.com
Der Hauptgrund für uns war, dass Git oft Probleme hat, wenn es komprimierte CSS-Dateien diffennt, bei denen der Code auf einer Zeile steht. Wenn also zwei von uns dieselbe SASS-Datei bearbeiten, die dann unterschiedliche CSS ausgibt, und wir diese CSS-Dateien zusammenführen müssen, gerät Git in einen vollen Anfall. Das Zusammenführen und Pflegen von Master-SASS-Dateien ist viel handlicher und weitaus weniger redundant. Darüber hinaus können Probleme auftreten, wenn einzelne Mitglieder eines Teams verschiedene Bibliotheken oder verschiedene Builds von SASS usw. verwenden. Das Kompilieren des CSS als GIT Post-Hook stellt sicher, dass alle den Standard einhalten.
Beginnen Sie immer mit @includes… Das erscheint bis zu einem gewissen Punkt logisch. Es scheint, dass eine gewisse Menge an Schmerz ausgeglichen werden muss zwischen dem Einbeziehen von Regeln innerhalb von @includes, die von den Orten, an denen sie einbezogen werden, überschrieben werden können. Manchmal ist es gut, sie am Ende zu platzieren, um sicherzustellen, dass sie die letzten aufgerufenen sind und nicht überschrieben werden. Während globale Stilregeln sehr, sehr gut sind, frage ich mich, ob dies eine Sache ist, die von Fall zu Fall überprüft werden sollte.
Was ist mit dem ganzen Hass auf Verschachtelung >4 Ebenen tief? Wenn das ein so großes Problem ist, warum kann Sass dann keine Variable in config.rb machen, die die oberste Ebene auf <4 beschränkt?
Meiner Erfahrung nach war es schrecklich, nach einem Tag in einer hastig benannten Include-Datei zu suchen.
Vielleicht ist das Problem, dass Leute zu viel CSS schreiben.
Dies ist ein großartiger Artikel, der einige der mächtigen Funktionen von Sass berührt. Aber mit großer Macht kommt große Verantwortung (wer hat das gesagt?). Wie auch immer, ich würde denjenigen, die diesen Beitrag mögen, dringend empfehlen, Ihre Sass-Schublade ausmisten zu lesen.
„Viele von uns, die mit Sass angefangen haben, haben irgendwann eine Schublade mit Dateien erstellt. Für die meisten war das ein Anfängerfehler, aber für andere ist es ein fortlaufendes Problem mit unserer Architektur und unseren Dateiverwaltungstechniken. Sass wird nicht mit echten Regeln für die Dateiverwaltung geliefert, so dass Entwickler ziemlich auf sich allein gestellt sind.“
Es gibt auch eine Folien-Präsentation!
Ich habe mir angewöhnt, alle z-indexes am Anfang meiner Master-Datei direkt nach all meinen Includes aufzubewahren, da sie oft die Quelle von Kopfschmerzen sind und sehr schnell außer Kontrolle geraten können.
Ich bin kein Fan von Sass, mein CSS ist sauber und effizient, warum das Rad neu erfinden, wirklich …
Gute Sachen. Ich sammle eine Liste von Best Practices unter http://betterfrontend.com – es ist Open Source, also fügen Sie gerne Ihr Feedback hinzu.
Ein Hinweis
Sie haben das $ vor dem
zOverlay: 5000;
zMessage: 5050;
Eine Anregung
Verwenden Sie zwei Ebenen von Variablen für Farben, eine zum Deklarieren und eine zum Zuordnen.
Beispiel
/* Farbdeklarationen */
$rot-1: #ff0000;
$rot-2: #890000;
/* Farbbezeichnungen */
$rot-rand: $rot-1;
$alarm: $rot-2;
usw…
So können Sie Farben später leichter anpassen, ohne sich Sorgen machen zu müssen, wie sich dies auf nicht verwandte Stile auswirkt.
Ich hoffe, das hilft!
Das z-index-Syntax-Problem wurde behoben, danke.
Ich bin etwas verwirrt, ich habe SASS so verwendet
Vielleicht lag es daran, wie der Entwickler SASS eingerichtet hat… aber das gefällt mir. Sehr sauber.
Der Name dieses Artikels ist etwas irreführend – er sagt SASS, wo SCSS stehen sollte.
SASS hat die gleiche Syntax wie Haml, aber es schien vielen CSS-Benutzern fremd, so dass sie in Version 3 SCSS (Sassy CSS) eingeführt haben, das Chris und die meisten verwenden.
Sie könnten die meisten (wenn nicht alle) Konzepte in Ihren SASS-Workflow ohne viel Aufwand anwenden.
Ohhhhhhhhhhhhhhh.
Der Titel beginnt mit "Sass Style Guide", dann ist der Code SCSS
; /
Guter Artikel Chris.
Persönlich alphabetisiere ich meine Regeln, also geht mein @extend natürlich zuerst, @include kommt als zweites und dann die restlichen Stile darunter. Das gefällt mir irgendwie besser, als das @include am Ende zu haben, es trennt die SASS-Methoden von den normalen reinen CSS-Stilen.
Nur ein kleiner Tippfehler: In der Codebox unter der Überschrift "Variablize All Common Numbers, and Numbers with Meaning" fehlen den zweiten und dritten Variablen ihr Dollarzeichen. Sie fühlen sich ausgeschlossen.
"Maximum nesting: three levels deep". Wenn ich SMACSS nachplappere, würde ich tatsächlich vorschlagen, diese Einschränkung weiter zu straffen: Kein Selektor sollte mehr als drei Ebenen im DOM überspannen.
http://smacss.com/book/applicability
>
Globale und abschnittsspezifische Sass-Dateien sind nur Inhaltsverzeichnisse
Mit anderen Worten, keine Stile direkt darin. Zwingen Sie sich, alle Stile in Komponenten aufzuteilen.
Könnte das bitte jemand erläutern?
Siehe das Beispiel direkt nach dem Abschnitt, den Sie erwähnt haben. Wenn Sie diesem Leitfaden folgen, sollte Ihre globale (oder main.scss oder app.scss oder wie auch immer) wenig mehr als eine Liste von Imports all der Komponenten-SCSS-Dateien sein, die Sie erstellt haben.
Dann könnte Ihr Header-Abschnitt haben
Wenn Sie Ihre Stile gut in Komponenten organisiert halten, sollten die globalen und abschnittsspezifischen Stylesheets etwas wie ein Inhaltsverzeichnis eines Lehrbuchs fungieren und neuen Codern eine gute Vorstellung davon geben, wo sie die Stile finden, nach denen sie suchen, ohne dass sie alle CSS durchsuchen müssen.
Dan, danke. Jetzt habe ich es verstanden.
Aus irgendeinem Grund hatte ich das Gefühl, dass sich die beiden Abschnitte widersprachen, aber nachdem Sie es aufgeschlüsselt haben, ergibt es Sinn.
Welches Paket muss installiert werden, um Text-Highlighting für .scss in Sublime Text 2 zu haben?
Danke..
übrigens, unter Windows..
Ich empfehle, Package Control zu installieren, falls Sie das noch nicht getan haben. Von dort aus suchen Sie einfach nach "scss", und es werden Ihnen eine Reihe von Tools angezeigt, von denen das erste die Syntaxhervorhebung ist.
Verwenden Sie Variablen auch für Schwarz und Weiß, auch wenn Sie ihnen die Werte #FFF und #000 geben. Man weiß nie, wann man sie später in ein Off-White oder ein helleres Schwarz ändern möchte.
Guter verwandter Artikel: Design-Tipp: Verwenden Sie niemals Schwarz.
Ich habe dies gestern verlinkt, es scheint nicht angekommen zu sein. Ich habe mir eine "Styleguide" für SCSS als Teil meines eigenen "Boilerplate" geschrieben.
Grundsätzlich ist es wie bei Chris hier, aber mit kleinen Varianten –
Ich denke auch darüber nach, wie ich Media Queries verschachtle, und habe mich für Folgendes entschieden –
Es gibt mehr Informationen darüber, wie ich das mache, hier – https://github.com/sturobson/a-slightly-bizarre-starting-point#sass
Ich habe auch im Januar darüber geschrieben, wie ich meine SCSS-Ordnerstruktur aufbaue. Der erste Artikel dazu ist hier – http://alwaystwisted.com/post.php?s=2013-01-07-structuring-my-sass-101-part-1
Ich stimme allen Vorschlägen im Artikel zu, außer einem: dem Verschachteln von Media Queries. Vielleicht bin nur ich das, aber ich finde es eine schreckliche Doppelarbeit. Indem man allen breakpoint-spezifischen Code in einem dedizierten Partial trennt, muss man die Media Query nur einmal schreiben, und man hat alle Stile, die für diesen Breakpoint spezifisch sind, in einer einzigen Datei. Ich sehe nicht, wie das Fragmentieren und Duplizieren all dessen über Dateien hinweg eine bewährte Methode ist.
fchristant, es ist die Art von Situation, in der man einfach entscheiden muss, was für einen am besten funktioniert. Entweder die Stile für ein bestimmtes Element über mehrere Media Queries fragmentieren oder die Media Queries über mehrere Elemente fragmentieren. Man kann nicht wirklich beides haben.
Ich habe eine Frage zu den Media-Queries.
Wenn Sie es wie im Text mit einem Mixin schreiben, werden Sie dann viele Media-Queries in Ihrem CSS haben? Wenn ich meine Stile überprüfe, würde dies ungefähr 40 Media-Queries im CSS erzeugen – als Beispiel für das Styling des Menüs. Ist das nicht ein bisschen viel Overhead?
Ich würde @include am Ende nicht empfehlen. Ich würde es nach oder vor @Extends machen. Wenn Sie es am Ende haben, haben Sie keine Wahl, etwas zu überschreiben, wenn nötig.
Die Verwendung von "bubbled up" Media Queries war Gegenstand vieler Debatten. Fügt dies unnötigen Code-Aufblähungen hinzu? Gibt es Leistungsprobleme? Sind diese Probleme vernachlässigbar und ich störe mich daran, weil meine ausgegebene CSS hässlich aussieht?
Ich würde empfehlen, Sass und Media Queries zu lesen, einen Artikel, den ich letzten Dezember geschrieben habe, in dem diese Argumentation auf die Probe gestellt wird.
Ich würde auch empfehlen, sich das Interview mit Chris anzuhören, in dem wir dieses Thema ebenfalls besprochen haben. Kurz gesagt, wenn Ihr CSS minifiziert ist, spielt das keine Rolle.
Eine weitere Sache, die wir tun, ist, einen mehrzeiligen Kommentar am Anfang jedes Partials zu belassen. Das macht die Fehlersuche einfach, ohne dass man die Zeilenkommentare einschalten muss, wenn es ein Problem gibt. Jedes Partial ist dann leicht zu identifizieren, wenn man später Fehler behebt.
Tolle Liste guter Praktiken!
Wo gehen Pseudo-Selektoren hin? Vor oder nach anderen verschachtelten Selektoren?
Halten Sie sich auch an die Regel "verschachtelt 3 Ebenen tief", wenn Sie Media Queries verschachteln?
Zählt eine Breakpoint-Media-Query als eine weitere Ebene tief?
Was ich generell für Pseudo-Selektoren und alle Selektoren mache, die das Symbol "ampersand" verwenden, ist, sie nach den Nachfahren-Selektoren zu schreiben. Also würde es ungefähr so aussehen:
Danke für eine wunderbare Lektüre! Und es ist gut, dass ich nicht mehr Zeit in das Schreiben meines eigenen SCSS-Styleguides investiert habe – er war in Arbeit, aber dieser hier sagt alles!
Eine schnelle Frage aber: Mit wie vielen Dateien (Patterns & Sections) arbeiten Sie bei einem typischen Projekt?
Eine Sache, die mir beim Lesen einfiel, ist das Haben von "Schichten", durch die Verwendung von Mixins und Variablen von z-index. Meine zindex's geraten immer außer Kontrolle, und wenn ich eine _shame-Datei verwenden würde, würden sie dort zu finden sein!
Ich würde argumentieren, dass Pseudo-Selektoren direkt nach den Stilen für den übergeordneten Selektor kommen. Es ist immer noch konzeptionell Teil des Selektors selbst, nur in ein Pseudo-Element eingehüllt.
Was ich in meinem CSS-LESS-Workflow nützlich finde (könnte auch auf SASS zutreffen), ist die Verwendung von tief verschachtelten Selektoren, um `!important` zu vermeiden.
Hier ist ein einfaches Beispiel
Verschachtelung ist für mich zur Code-Organisation da. Aus diesem Grund strukturiere ich die Nester identisch zu meinem HTML, zusammen mit allen Pseudo-Selektoren, die ich vielleicht brauche. DANN platziere ich alle Selektoren, die ohne nachteilige Auswirkungen aus dem Nest herausgebrochen werden können, unter dem Deep-Nest. Der "ausgebrochene" Bereich ist, wo ich meine Hauptcodierung mache, während das Nest zur Referenz dient (weil ich nicht zwischen HTML und CSS in Fenstern oder in der Split-Ansicht meines Editors wechseln möchte).
Das Schöne ist, dass alle Deep-Nested-Selektoren, die ich nicht verwende (also leer sind), nicht in die resultierende CSS-Datei beim Kompilieren aufgenommen werden (ich benutze WP-LESS mit WordPress).
Die Deep-Nest wirkt fast identisch wie `!important`, da sie spezifisch sind. Außerdem, da ich `!important` in meinem Code selten wirklich gebraucht habe (vielleicht maximal 10 Mal in einem ganzen WordPress-Theme), sind die Leistungsprobleme minimal.
Beachten Sie, dass dies NUR ist, wenn ich Dinge baue, die ich nicht woanders auf einer Seite wiederverwenden muss.
Es ist wirklich eine Balance, die Leute finden müssen, nicht nur für Browserleistung und Wiederverwendbarkeit, sondern auch für den persönlichen Workflow.
Weiß jemand, warum das SASS-Debugging in Chrome nicht mehr funktioniert?
Haben Sie sichergestellt, dass „Experimental Dev Tools“ in chrome://flags noch aktiviert ist und „Support for Sass“ noch angehakt ist? Ich weiß, dass bei einer meiner Installationen „Experimental Dev Tools“ nicht aktiviert war und bei einer anderen (bei der ich zuvor Sass-Debugging aktiviert hatte) „Support for Sass“ nicht angehakt war. Ich weiß nicht, ob ein Update dies rückgängig gemacht hat oder nicht, aber es lohnt sich, dies noch einmal zu überprüfen.
(Update für diejenigen, die diese Seite finden und das Debugging in Chrome nicht wieder zum Laufen gebracht haben.) Ich habe den Grund dafür vor ein paar Wochen herausgefunden. Sie sind zu echtem Quellcode-Mapping übergegangen und verwenden keine Debug-Infos oder Zeilenkommentare mehr. Sass, beginnend mit 3.3.0 (das sich derzeit im RC-Status befindet) und dem Sourcemap-Zweig von Compass, enthält ein Flag zum Ausgeben von Quellcodes, mit dem Sie Quellcodes wieder erhalten können.
Google hat eine hilfreiche Anleitung zur Aktivierung der Unterstützung für Quellcodes, aber ich habe festgestellt, dass ein Browser-Neustart erforderlich ist, um dies wirksam werden zu lassen (etwas, das die Anleitung, die ich zu dieser Zeit verwendet habe, nicht erwähnt hat).
Das stimmt nicht ganz, je nachdem, wie man die Dateien aufteilt.
Ein gutes Beispiel ist die Struktur, die das Standard-Octopress-Theme verwendet. Eine der Möglichkeiten, wie es die Dateien aufteilt, ist nach Typografie, Design und Layout. Daher gibt es eine ziemliche Überschneidung bei den Selektormustern. Sass kombiniert diese beim Kompilieren nicht, sodass Ihre endgültige CSS-Datei ziemlich viel Duplikation von Selektoren aufweisen kann, was bedeutet, dass die Rendering-Engine dieselben Elemente mehrmals finden muss. Dies kann letztendlich zu einer Verlangsamung der Rendering-Geschwindigkeit führen.
Ihr fragmentierter Stil scheint weniger anfällig dafür zu sein, aber ich denke, es lohnt sich trotzdem, daran zu denken, damit Sie Ihre Dateien weiterhin so aufteilen können, dass duplizierte Selektoren vermieden werden.
Wie kompilieren Sie es erweitert mit Zeilennummern lokal und komprimiert für die Produktion?
Ich weiß, dass man in
config.rbdenoutput_styleangeben kann, aber das gilt nur für eine Umgebung. Wie gehen Sie mit beiden Umgebungen um?Die Datei config.rb ist eine Ruby-Datei, sodass Sie Zugriff auf das gesamte Ruby-Toolkit haben, einschließlich Variablen und if-Anweisungen. Hier ist der Code, den ich in meiner config.rb-Datei verwende
Dann müssen Sie nur noch die Variable „environment“ festlegen. Da sich dies fast nie ändert, ist der schnelle und schmutzige Weg, sie einfach in der Datei zu deklarieren und Git auf „assume-unchanged“ für die config.rb-Datei einzustellen. Der robustere Weg wäre, sie woanders festzulegen (z. B. eine maschinenweite Konfiguration) und darauf zuzugreifen, oder wenn die Umgebung nicht anderswo festgelegt ist, davon auszugehen, dass es sich um die Produktion handelt und sie lokal festzulegen.
Die Kombination von Platzhaltern mit @extend ermöglicht sehr leistungsfähige Designmuster, die tatsächlich dem objektorientierten Programmiercode ähneln.
Betrachten Sie den folgenden Sass-Code
Dies ergibt die folgende Ausgabe
Solche Techniken ermöglichen es Ihnen, einen optimalen CSS-Fußabdruck und einen optimalen HTML-Fußabdruck mit einfacher Wartung und Anpassbarkeit zu kombinieren.
Ich experimentiere derzeit mit der Codebasis von [Cascade Framework](Cascade Framework „http://cascade-framework.com/“), um das für das Projekt am besten geeignete Muster zu finden. Die nächste Version von Cascade Framework wird wahrscheinlich eine SASS-Version enthalten, die auf diesem Muster basiert.
Ich bin neu bei SASS und an einem Punkt stecken geblieben, brauche Hilfe. Unten ist mein Code
Hier versuche ich, jedem Menüpunkt eine separate Hintergrundfarbe zu geben, aber dieser Code funktioniert nicht. Bitte helfen Sie mir und sagen Sie mir, wo ich falsch liege.
Danke
@sanjan…. Wenn ich mir das ansehe, bin ich mir nicht sicher, ob es ein Sass-Problem oder ein HTML-Problem ist. Planen Sie, .l2, .l3 usw. zu erstellen und diese dann entsprechenden Klassen in den Listenelementen in HTML zuzuordnen?
Wenn ja, möchten Sie vielleicht SASS-Listen als Lösung untersuchen. Chris hat hier auf css-tricks großartige Artikel zu diesem Ansatz veröffentlicht.
@Crispen: Danke für Ihre Antwort.
Tatsächlich erstelle ich Menüpunkte mit ihren Klassennamen l1, l2 usw. und möchte jedem Punkt eine andere Hintergrundfarbe geben. Um die gewünschte Hintergrundfarbe für jeden Punkt in der CSS-Datei zu erhalten, muss ich meinen Code wie folgt schreiben:
.menu ul li.l1{
background: red;
}
.menu ul li.l2
{
background: green;
}
In Sass versuche ich, die Verschachtelungseigenschaft zu verwenden und schreibe meinen Code wie folgt:
.menu{
einige Eigenschaften
ul li
{
einige Eigenschaften
.l1
{
background: red;
}
}
}
Beim Schreiben des oben genannten Codes erhalte ich folgende CSS als Ausgabe:
.menu ul li .l1{
background: red;
}
und dies setzt nicht meine gewünschte Hintergrundfarbe. Wie kann ich meine Menüpunkte mit Sass ansprechen?
Ich bin völlig anderer Meinung zu Ihren Stil-Empfehlungen bezüglich @include und @extend.
In OOCSS ist es beliebt, das Markup an die CSS zu koppeln und nicht die CSS an das Markup. Dies hat den Vorteil von semi-modularem Code. Um das Markup an CSS zu koppeln, müssen jedoch nicht-semantische Klassennamen zu Ihrem Markup hinzugefügt werden. Aber mit SASS ist es möglich, diese CSS-Chunks in semantische Klassen- oder ID-Namen auf einem Element zu @include. Ich denke, das Wichtigste ist zu verstehen, was @include und @extend in Bezug auf die ausgegebene CSS bewirken, und diese Zeilen dort zu platzieren, wo sie am sinnvollsten sind.
@Tom
„Wo auch immer sie am sinnvollsten sind“ ist vage und als Richtlinie nicht sehr aussagekräftig.
Für OOCSS, SMACSS oder Atomic design (die im Wesentlichen dasselbe Entwurfsmuster mit geringfügigen Variationen sind), ist meiner Meinung nach das optimalste Muster dieses:
Erstellen Sie eine erste Ebene von DRY CSS mit Platzhaltern, die eine minimale Anzahl von Regeln enthalten.
Fügen Sie eine zweite Ebene von Platzhaltern darüber hinzu, um Ihre Komponenten zu definieren, die die erste Ebene erweitern.
Fügen Sie eine dritte Ebene von Selektoren hinzu, die die zweite Ebene erweitern. Dies können sowohl semantische als auch präsentationsbezogene Selektoren sein, je nach Präferenz.
Das ist im Grunde das Muster, das ich oben beschrieben habe, wenn auch in sehr grober Form...
@Johnslegers
Richtig, meine Idee ist im Grunde, diese Selektoren der ersten, zweiten und dritten Ebene zu nehmen und sie so weit wie möglich in semantische Klassennamen @include.
Dieses Muster führt natürlich zu einer etwas größeren CSS-Datei, aber auch zu etwas kleineren HTML-Dateien. Was „Wo auch immer sie am sinnvollsten sind“ angeht, ist das wohl vage und als Richtlinie nicht sehr aussagekräftig, weil ich nicht glaube, dass es Teil einer Stilrichtlinie sein sollte.