Verwendung von PostCSS mit BEM- und SUIT-Methoden

In diesem Lernprogramm erfahren Sie, wie Sie mit PostCSS die Entwicklung von CSS im BEM / SUIT-Stil einfacher und effizienter gestalten.

Diese beiden Methoden bieten eine Benennungskonvention für Klassen, die es einfacher macht, Ihre Stile funktionsorientiert zu halten, und hilft anderen Entwicklern, den Zweck verschiedener Klassen nur anhand der Namensgebung zu erkennen.

BEM war der Vorläufer dieser von Yandex erstellten Art der Klassennamensmethodik. Die SUIT-Methodik basiert auf BEM, jedoch mit einigen Anpassungen und Ergänzungen von Nicholas Gallagher. SUIT macht alles, was BEM macht, aber für viele Benutzer ist es eine Verbesserung.

Die Verwendung dieser Methoden hilft auf jeden Fall dabei, besser und besser strukturiertes CSS zu erstellen. Der schwierige Teil ist jedoch, dass es mühsam werden kann, die in dieser Struktur erforderlichen Klassennamen manuell einzugeben und zu verfolgen, wie Klassen in Beziehung zueinander stehen, und kann Kopfschmerzen verursachen. 

Das postcss-bem-Plugin von Malte-Maurice Dreyer beseitigt diese Probleme durch eine Kombination aus Abkürzungen und Verschachtelungen, die Sie im Verlauf dieses Tutorials verwenden werden.

Lassen Sie uns zunächst jedoch eine kurze Einführung in die BEM- und SUIT-Methoden geben, um sicherzustellen, dass Sie ein klares Bild von den Vorteilen des Postcss-bem-Plugins und seiner Verwendung erhalten.

Schnelle Grundierung auf BEM

Block

In BEM Blöcke sind High-Level-Brocken eines Designs; Die Bausteine, aus denen das Gelände besteht. Ein Block sollte ein Teil Ihrer Website sein, der von anderen Teilen unabhängig ist. Er könnte theoretisch an einer beliebigen Stelle in Ihrem Layout platziert werden, sogar in einem anderen Block.

Beispielsweise können Suchformblöcke auf Ihrer Site die Klasse verwenden .Suchformular.

Element

Ein Element in BEM ist ein Unterabschnitt innerhalb eines Blocks. Sie werden durch einen zwei Unterstrich gekennzeichnet __ Trennzeichen und einen Elementnamen zum Namen des übergeordneten Blocks.

Ein Suchformular kann zum Beispiel Überschriften, Textfelder und Schaltflächenelemente zum Senden enthalten. Ihre Klassennamen könnten sein .Suchformular__Kopf.Suchformular__Textfeld und .Suchformular__Schaltfläche beziehungsweise.

Modifikator

EIN Modifikator wird auf einen Block oder ein Element angewendet, um eine Änderung in seiner Präsentation oder eine Änderung in seinem Status anzuzeigen. Sie werden durch Anhängen eines Trennzeichens und eines Modifikatornamens an den betreffenden Block oder das betreffende Element gekennzeichnet.

Die offiziellen BEM-Site-Dokumente geben an, dass Modifizierer-Trennzeichen ein einzelner Unterstrich sein sollten _. Die "BEM-ähnliche" Konvention der CSS-Richtlinien von Harry Roberts verwendet jedoch zwei Striche -- und ist wahrscheinlich weiter verbreitet und bekannt als das offizielle BEM-Übereinkommen.

In einem Design möchten Sie beispielsweise erweiterte Suchformulare anders darstellen als reguläre Suchformulare und daher die Modifiziererklasse erstellen .Suchformular_Advanced (offizielles BEM) oder .Suchformular - fortgeschritten (BEM-like).

In einem anderen Beispiel möchten Sie möglicherweise das Erscheinungsbild des Formulars aufgrund einer Statusänderung ändern, z. B. wenn gerade ungültiger Inhalt übermittelt wurde, und daher den Modifikator erstellen .Suchformular ungültig (offizielles BEM) oder  .Suchformular - ungültig (BEM-like).

Schnelle Grundierung im ANZUG

ANZUG umfasst Dienstprogramme und Komponenten. Innerhalb von Komponenten kann es sein Modifikatoren, Nachkommenschaft und Zustände.

SUIT verwendet eine Kombination aus PascalCase (PascalCase), CamelCase (CamelCase) und Bindestrichen. Durch seine Konventionen wird die manchmal verwirrende Anzahl von Strichen und Unterstrichen, die in BEM vorkommen können, begrenzt. Zum Beispiel die BEM-Klasse .Suchformular__Textfeld wäre .SearchForm-textField Im Anzug.

Nützlichkeit

Dienstprogramme Struktur und positionelles Styling handhaben und so geschrieben sind, dass sie überall in einer Komponente angewendet werden können. Sie sind mit vorangestellt u- und in Kamelhülle geschrieben. Zum Beispiel, .u-clearFix.

Komponente

EIN Komponente in ANZUG tritt an die Stelle eines Block in BEM. Komponenten werden immer in Pascal Case geschrieben und sind nur ein Teil von SUIT, der Pascal Case verwendet, wodurch sie leicht zu identifizieren sind. Zum Beispiel, .Suchformular.

Komponentennamensraum

Den Komponenten kann optional ein Namensraum und ein einzelner Strich vorangestellt werden nmsp- um sicherzustellen, dass Konflikte verhindert werden, z. .Mine-SearchForm.

Absteigend

EIN absteigend in ANZUG ersetzt ein Element in BEM. Es wird ein einzelner Gedankenstrich verwendet - und ist in Kamelfall geschrieben. Zum Beispiel .SearchForm-Überschrift.SearchForm-textField und .SearchForm-submitButto.

Modifikator

ANZUG verwendet Modifikatoren Wie bei BEM wird ihre Rolle jedoch stärker kontrolliert. Ein SUIT-Modifikator wird im Allgemeinen nur direkt auf eine Komponente angewendet, nicht auf eine untergeordnete Komponente. Es sollte auch nicht zur Darstellung von Zustandsänderungen verwendet werden, da SUIT eine eigene Namenskonvention für Zustände hat.

Die Modifikatoren sind in Kamelbuchstaben geschrieben und es sind zwei Striche vorangestellt --. Zum Beispiel,  .SearchForm - erweitert.

Zustand

Zustand Klassen können verwendet werden, um Änderungen des Zustands einer Komponente anzuzeigen. Dadurch können sie klar von Modifikatoren unterschieden werden, die die Änderung des Basisaussehens einer Komponente unabhängig vom Status widerspiegeln. Bei Bedarf kann ein Status auch auf ein untergeordnetes Element angewendet werden.

Staaten sind mit vorangestellt ist- und sind in Kamelfall geschrieben. Sie werden auch immer als angrenzende Klassen geschrieben. Zum Beispiel  .SearchForm.is-ungültig.

Richten Sie Ihr Projekt ein

Jetzt, da Sie die Grundlagen von BEM und SUIT haben, müssen Sie Ihr Projekt einrichten.

Je nach Wunsch benötigen Sie ein leeres Projekt, das entweder Gulp oder Grunt verwendet. Wenn Sie für das eine oder das andere nicht bereits eine Präferenz haben, empfehle ich die Verwendung von Gulp, da Sie weniger Code benötigen, um die gleichen Ziele zu erreichen, so dass Sie mit dem Arbeiten ein bisschen einfacher sein sollten.

Wie Sie Gulp- oder Grunt-Projekte für PostCSS einrichten, erfahren Sie in den vorherigen Tutorials

  • PostCSS Quickstart Guide: Gulp Setup oder
  • PostCSS-Schnellstartanleitung: Grunt-Setup

beziehungsweise.

Wenn Sie Ihr Projekt jedoch nicht manuell einrichten möchten, können Sie die an dieses Tutorial angehängten Quelldateien herunterladen und entweder das bereitgestellte Gulp- oder Grunt-Starterprojekt in einen leeren Projektordner extrahieren. Führen Sie dann den Befehl mit einer Terminal- oder Eingabeaufforderung auf den Ordner aus npm installieren.

Installiere Plugins

Als nächstes müssen Sie das postcss-bem-Plugin installieren. Wir werden auch ein Plugin installieren, das gut funktioniert: postcss-nested.

Führen Sie den folgenden Befehl in Ihrem Projektordner aus, unabhängig davon, ob Sie Gulp oder Grunt verwenden:

npm install postcss-bem postcss-nested --save-dev

Nun können wir die Plugins in Ihr Projekt laden.

Plugins über Gulp laden

Wenn Sie Gulp verwenden, fügen Sie diese Variablen unter den bereits in der Datei vorhandenen Variablen hinzu:

var bem = requir ('postcss-bem'); var nested = required ('postcss-nested');

Fügen Sie nun jeden dieser neuen Variablennamen in Ihre hinzu Prozessoren Array:

 var-Prozessoren = [bem, verschachtelt];

Führen Sie einen kurzen Test durch, indem Sie den Befehl ausführen Schluck Css Vergewissern Sie sich, dass eine neue Datei „style.css“ im Ordner „dest“ Ihres Projekts angezeigt wurde.

Plugins über Grunt laden

Wenn Sie Grunt verwenden, aktualisieren Sie die Prozessoren Objekt, das unter dem verschachtelt ist Optionen Objekt zu Folgendem:

 Prozessoren: [erfordern ('postcss-bem') (), erfordern ('postcss-nested') ()]

Führen Sie einen kurzen Test durch, indem Sie den Befehl ausführen grunzen postcss Vergewissern Sie sich, dass eine neue Datei „style.css“ im Ordner „dest“ Ihres Projekts angezeigt wurde.

Okay, du bist bereit zu gehen. Lernen Sie, wie Sie die BEM- und SUIT-Struktur erstellen.

BEM und SUIT mit postcss-bem

Beim manuellen Herausschreiben von Code kann es in der BEM- oder SUIT-Struktur zu Unpässlichkeiten kommen, da die ständige Wiederholung der gleichen Bezeichner in Klassennamen ermüdend wird und der Überblick, welche Elemente und Nachkommen zu den Blöcken und Komponenten gehören, die verwirrend werden können.

Wenn Sie jedoch postcss-bem verwenden, wird es leicht, die Struktur Ihres Codes auf einen Blick zu verstehen, und Wiederholungen beim Eingeben von Klassennamen sind praktisch nicht vorhanden.

SUIT-Struktur generieren

Trotz seines Namens wird postcss-bem standardmäßig nach der SUIT-Syntax und nicht nach BEM ausgegeben. Sie können die BEM-Syntax ausgeben, auf die wir später eingehen werden. Das Plugin ist jedoch hauptsächlich für die Ausgabe von SUIT konzipiert. Aus diesem Grund beginnen wir mit der SUIT-Syntax.

Eine Komponente generieren

Verwenden Sie zum Erstellen einer Komponente die Syntax @component ComponentName ….

Probieren Sie dies aus, indem Sie ein Suchformular Komponente zu Ihrer Datei "src / style.css":

@component SearchForm padding: 0; Marge: 0; 

Kompilieren Sie es und Ihr resultierender Code sollte sein:

.SearchForm padding: 0; Marge: 0; 

Nachkommen generieren

Verwenden Sie zum Erstellen eines Nachkommen die Syntax @descendent descName … verschachtelt in der übergeordneten Komponente.

Fügen Sie einen Nachkommen namens hinzu Textfeld in deinem Suchformular Komponente wie folgt:

@component SearchForm padding: 0; Marge: 0; / * Nest absteigend unter Komponente * / @descendent textField border: 1px solid #ccc; 

Nach dem Kompilieren sollten Sie jetzt sehen:

.SearchForm padding: 0; Marge: 0;  .SearchForm-textField border: 1px solid #ccc; 

Einen Modifier generieren

Erstellen Sie einen Modifikator für eine Komponente mit der Syntax @ modifier name …, verschachtelt in der Komponente, die es bewirkt. Modifikatoren sollten in der Regel über Ihren Nachkommen und Zuständen oben in Ihrer Komponente platziert werden.

Fügen Sie einen Modifikator mit dem Namen hinzu fortgeschritten zu deinem Suchformular Komponente mit dem folgenden Code:

@component SearchForm padding: 0; Marge: 0; / * Normalerweise platzieren Sie Modifizierer über den Nachkommen * / @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; 

Kompilieren Sie Ihren Code neu und Sie sollten Ihren neuen sehen fortgeschritten Komponentenmodifizierer:

.SearchForm padding: 0; Marge: 0;  .SearchForm - advanced padding: 1rem;  .SearchForm-textField border: 1px solid #ccc; 

Einen Staat erzeugen

Zustände werden über die Syntax erstellt @wenn Name … und kann in einer Komponente oder einem Nachkommen verschachtelt sein.

Fügen Sie einen Staat mit dem Namen hinzu ungültig zu deinem Textfeld Abkömmling mit diesem Code:

@component SearchForm padding: 0; Marge: 0; @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; / * Hiermit wird ein Status für den Nachkommen von textField erstellt. * / @Wenn ungültig border: 1px durchgehend rot; 

Wenn Sie nun Ihren Code kompilieren, sehen Sie, dass er Ihren neuen Code enthält ungültig Zustand:

.SearchForm padding: 0; Marge: 0;  .SearchForm - advanced padding: 1rem;  .SearchForm-textField border: 1px solid #ccc;  .SearchForm-textField.is-invalid border: 1px durchgehend rot; 

Namespace-Komponenten

Sie können Ihre Komponenten sowie alle in ihnen verschachtelten Nachkommen, Modifikatoren und Zustände mit einem Namensraum versehen, indem Sie sie mit einschließen @ Name des Komponentennamensbereichs …. Wenn Sie möchten, können Sie Ihr gesamtes Stylesheet mit diesem Namespace umschließen, sodass alle Klassen automatisch mit einem Präfix versehen werden.

Probieren Sie dies aus, indem Sie Ihren gesamten Code mit einschließen @ Komponentennamensraum mein …:

@ Komponentennamensraum mein @component SearchForm padding: 0; Marge: 0; @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; @wenn ungültig Rand: 1px durchgehend rot; 

Nach dem Kompilieren sehen Sie, dass jetzt jede Ihrer Komponenten mit einem Präfix versehen ist Bergwerk-:

.mine-SearchForm padding: 0; Marge: 0;  .mine-SearchForm - advanced padding: 1rem;  .mine-SearchForm-textField border: 1px solid #ccc;  .mine-SearchForm-textField.is-invalid border: 1px durchgehend rot; 

Dienstprogramm generieren

Dienstprogramme werden mit der Syntax erstellt @utility utilityName …. Sie erinnern sich, dass Sie beim Einrichten Ihres Projekts das Postcss-Nested-Plugin installiert haben. Wir haben dies getan, da es sehr praktisch sein kann, es gemeinsam mit postcss-bem zu verwenden, wie Sie in diesem Beispiel sehen werden, wo wir ein erstellen clearFix Nützlichkeit:

@utility clearFix &: before, &: after content: ""; Anzeige: Tisch;  &: after clear: both;  / * Bei Unterstützung von IE 6/7 * / * Zoom: 1; 

Nachdem Sie den obigen Code hinzugefügt haben, kompilieren Sie und Sie werden sehen, dass dieses neue Dienstprogramm erstellt wurde:

.u-clearFix / * Bei Unterstützung von IE 6/7 * / zoom: 1;  .u-clearFix: before, .u-clearFix: after content: ""; Anzeige: Tisch;  .u-clearFix: after clear: both; 

BEM-Struktur erstellen

Übergeben Sie die Option, um die BEM-Syntaxausgabe in postcss-bem zu aktivieren Stil: 'bem' in deiner Gulpfile oder Gruntfile wie folgt:

/ * Gulpfile * / var-Prozessoren = [bem (style: 'bem'), verschachtelt]; / * Gruntfile * / Prozessoren: [erfordern ('postcss-bem') (Stil: 'bem'), erfordern ('postcss-nested') ()]

Standardmäßig verwendet postcss-bem das offizielle Trennzeichen für einen Modifikator eines einzelnen Unterstrichs _. Wenn es für Ihr Projekt wichtig ist, verwenden Sie das allgemeinere Trennzeichen von zwei Strichen -- Stattdessen können Sie die Konfiguration für das Plugin "postcss-bem" ändern, indem Sie in den Ordner node_modules / postcss-bem Ihres Projekts gehen, index.js öffnen, Zeile 15 suchen und Folgendes ändern:

 bem: Trennzeichen: Namespace: '-', Nachkomme: '__', Modifikator: '_'

… Dazu:

 bem: Trennzeichen: Namespace: '_', Nachkomme: '__', Modifikator: '-'

Block generieren

Da ein "Block" in BEM mit einer "Komponente" in SUIT korreliert, verwenden Sie die Syntax @Komponentenblockname … einen Block erzeugen.

So erstellen Sie eine Suchformular Block diesen Code hinzufügen:

@Komponenten-Suchformular Auffüllen: 0; Marge: 0; 

Dann kompilieren Sie und Sie sollten sehen:

.Suchformular Auffüllen: 0; Marge: 0; 

Element generieren

Da ein „Element“ in BEM mit einem „Nachkommen“ in SUIT korreliert, können sie mit der Syntax erstellt werden @descendent Elementname … verschachtelt im übergeordneten Block.

So erstellen Sie eine Textfeld Element hinzufügen Folgendes:

@Komponenten-Suchformular Auffüllen: 0; Marge: 0; @descendent text-field border: 1px solid #ccc; 

Beim Kompilieren sehen Sie, dass Ihr neues Element erstellt wurde:

.Suchformular Auffüllen: 0; Marge: 0;  .search-form__text-field border: 1px fest #ccc; 

Einen Modifier generieren

Obwohl BEM Modifikatoren sowohl für Blöcke als auch für Elemente zulässt, verarbeitet das Plugin postcss-bem nur diese Elemente, wenn sie in Blöcken und nicht in Elementen verschachtelt sind. Dies geschieht aufgrund der Konvention von SUIT, bei der Modifikatoren auf Komponenten angewendet werden, die keine Nachkommen sind. Sie können mit der Syntax erstellt werden @ modifier name …, in seinem übergeordneten Block verschachtelt.

Fügen Sie eine hinzu fortgeschritten Modifikator für Ihre Suchformular Komponente wie folgt:

@Komponenten-Suchformular Auffüllen: 0; Marge: 0; @modifier advanced padding: 1rem;  @descendent text-field border: 1px solid #ccc; 

Und beim Kompilieren wird es ergeben:

.Suchformular Auffüllen: 0; Marge: 0;  .search-form_advanced padding: 1rem;  .search-form__text-field border: 1px fest #ccc; 

Keine Dienstprogramme oder Zustände, aber Namensräume sind in

Im BEM-Modus wird der @Nützlichkeit und @wann Syntaxe werden nicht zu irgendetwas kompiliert, da BEM keine Dienstprogramme oder Zustände verwendet.

Obwohl es normalerweise nicht Teil von BEM ist, ist das @ Komponentennamensraum Die Syntax funktioniert weiterhin, wenn Sie sie in Ihrem BEM-Stylesheet verwenden möchten. Ihre Klassen werden mit vorangestellt Name--:

.meine - Suchformular padding: 0; Marge: 0;  .mine - search-form_advanced padding: 1rem;  .mine - Suchformular__Textfeld border: 1px solid #ccc; 

Lassen Sie uns rekapitulieren

Jetzt wissen Sie, wie Sie Ihre BEM- und SUIT-Entwicklung abkürzen und den gesamten Prozess einfacher machen. Fassen wir alles zusammen, was wir behandelt haben:

  • BEM und SUIT sind Namenskonventionen für Klassen, die dazu beitragen, dass Stylesheets funktionsorientiert und strukturiert bleiben, und hilft anderen Entwicklern dabei, den Zweck verschiedener Klassen zu erkennen.
  • ANZUG ist wie BEM, aber es wurden einige Extras hinzugefügt und Anpassungen vorgenommen
  • Das postcss-bem-Plugin enthält Verknüpfungen zum Erstellen von BEM- und SUIT-Klassen, z. B. @Komponente, @descendent, @Modifikator usw.
  • Das Plugin ermöglicht auch das Verschachteln von Code auf hilfreiche Weise, z. Modifikatoren sind in der Komponente verschachtelt oder blockieren sie.
  • Namespacing kann automatisch durch Umschließen von Klassen mit durchgeführt werden @ Name des Komponentennamensbereichs …

Im nächsten Tutorial

Als Nächstes schauen wir uns eine weitere großartige Möglichkeit an, PostCSS zu nutzen, indem wir ein Toolkit aus Abkürzungen und Abkürzungen zusammenstellen, um die Codierung schneller und effizienter zu gestalten.

Ich sehe dich dort!