PostCSS Deep Dive Pre-elaborazione con PreCSS

Negli ultimi due tutorial abbiamo esaminato i modi per utilizzare PreCSS su fogli di stile completati per migliorare la compatibilità e l'ottimizzazione del browser incrociato, essenzialmente come inviare-processore. In questo tutorial imparerai a utilizzare PostCSS come pre-processore, nello stesso modo in cui utilizzeresti Stylus, Sass o LESS.

Esistono due modi principali per utilizzare PostCSS per la pre-elaborazione. Uno è quello di selezionare tutti i propri plugin per aggiungere la funzionalità del preprocessore che si desidera, e l'altro è quello di installare un pacchetto di plugin preselezionati in modo da essere pronti ad andare subito.

Inizieremo con l'approccio più rapido e semplice, installando l'eccellente pacchetto di plug-in PreCSS, creato da Jonathan Neal. Nel tutorial successivo passeremo a come mettere insieme il tuo preprocessore, usando solo la funzionalità che desideri.

Questo tutorial presumerà che tu abbia un certo grado di familiarità con le caratteristiche che si trovano comunemente nei preprocessori come Stylus, Sass o LESS. Questo è puramente perché ci concentreremo su Come puoi utilizzare questi stessi tipi di funzionalità tramite PostCSS, piuttosto che che cosa le caratteristiche effettivamente lo fanno. Detto questo, anche se non hai mai usato un preprocessore prima, questo potrebbe essere il punto di partenza perfetto.

Prova PreCSS Live

Vedremo come configurare un progetto Gulp o Grunt usando PreCSS nella prossima sezione, tuttavia, se vuoi prendere una scorciatoia, (solo per ora), puoi in alternativa utilizzare il campo di dimostrazione dal vivo per provare il codice ci occuperemo di questo tutorial. Il codice può essere digitato nella finestra di sinistra e verrà automaticamente compilato per te e visualizzato nella finestra di destra.

PreCSS Live Editor: https://jonathantneal.github.io/precss

Imposta il tuo progetto

La prima cosa che devi fare è impostare il tuo progetto in modo che utilizzi Gulp o Grunt, a seconda delle tue preferenze. Se non hai già una preferenza per l'uno o l'altro, ti consiglio di utilizzare Gulp in quanto avrai bisogno di meno codice per raggiungere gli stessi fini.

Puoi leggere come configurare i progetti Gulp o Grunt per PostCSS nelle esercitazioni precedenti

  • Guida rapida per PostCSS: Gulp Setup o
  • Guida rapida per PostCSS: installazione Grunt

rispettivamente.

Se non si desidera configurare manualmente il progetto da zero, è possibile scaricare i file sorgente allegati a questo tutorial ed estrarre il progetto di avviamento Gulp o Grunt in una cartella di progetto vuota. 

Quindi, con un terminale o un prompt dei comandi puntato sulla cartella, eseguire il comandoinstallazione di npm.

Installa PreCSS

Sia che tu stia usando Gulp o Grunt, installa PreCSS nel tuo progetto con il comando:

npm installa precss --save-dev

Carica come un Gulp Plugin

Se stai usando Gulp, aggiungi questa variabile sotto le variabili già presenti nel file:

var precss = require ('precss');

Ora aggiungi il nuovo nome della variabile nel tuo processori array:

 var processors = [precss];

Fai un rapido test per verificare che tutto funzioni eseguendo il comando gulp css quindi controlla che un nuovo file "style.css" sia apparso nella cartella "dest" del tuo progetto.

Carica come plugin Grunt

Se stai usando Grunt, aggiorna il processori oggetto, che è annidato sotto il opzioni oggetto, al seguente:

 processori: [require ('precss') ()]

Fai un rapido test per verificare che tutto funzioni eseguendo il comando grunt postcss quindi controlla che un nuovo file "style.css" sia apparso nella cartella "dest" del tuo progetto.

Ora hai tutto ciò che ti serve per utilizzare PreCSS installato e pronto all'uso. Ciò significa che siamo pronti per iniziare a passare attraverso alcune delle funzionalità di pre-elaborazione di PreCSS e come possono essere utilizzate.

Pre-elaborazione tramite "PreCSS"

In generale, la sintassi PreCSS è più simile a quella di Sass. Tuttavia usa alcuni dei suoi approcci unici, che copriremo mentre procediamo. 

Nota: a causa della sintassi simile a Sass di PreCSS, scoprirai che un evidenziatore Sass sintassi funzionerà meglio per te nel tuo editor di testo preferito.

annidamento

La nidificazione è qualcosa di comune a tutti e tre i principali preprocessori, ovvero Stylus, Sass e LESS, ed è presente anche in PreCSS. L'annidamento in PreCSS viene eseguito nello stesso modo in Sass e LESS, posizionando i selettori all'interno delle parentesi graffe degli altri selettori.

La possibilità di usare il & il simbolo per fare in modo che il selettore genitore duplicato nel selettore figlio funzioni allo stesso modo in PreCSS come in altri preprocessori.

Prova ad aggiungere il seguente codice annidato al tuo file "src / style.css":

.menu larghezza: 100%; a decorazione del testo: nessuna;  & :: before content: ";

Compila il tuo CSS con gulp cssgrunt postcss e il tuo file "dest / style.css" avrebbe dovuto valutare il codice annidato nel seguente modo:

.menu larghezza: 100%;  .menu a text-decoration: none;  .menu :: before content: ";

variabili

Le variabili sono un altro tipo di funzionalità comune a tutti i preprocessori e sono incluse in PreCSS. L'unica cosa in genere diversa tra ogni preprocessore è la sintassi per indicare le variabili.

  • Le variabili MENO iniziano con un @ simbolo e posto a : prima del valore. 
  • Le variabili dello stilo possono opzionalmente usare a $ simbolo e posto a = firmare prima del valore. 
  • Le variabili di Sass usano a $ simbolo e posto a : prima del valore.

In linea con la tendenza PreCSS ad usare la sintassi di Sass come, pone anche a $ prima del nome della variabile e a : prima del valore. 

Prova a utilizzare le variabili PreCSS aggiungendo questo al tuo file "src / style.css":

$ text_color: # 232323; body color: $ text_color; 

Dopo aver ricompilato dovresti vedere questo codice risultante:

body color: # 232323; 

Condizionali

Condizionali, cioè. Se e altro logica, sono una caratteristica molto forte sia in Sass che in Stylus. MENO offre mixin guardati, ma non offrono lo stesso grado di potenza. Le condizionali sono presenti in PreCSS e seguono la stessa sintassi di Sass, usando @Se@altro

Aggiungi questo codice di esempio al tuo file "src / style.css":

$ column_layout: 2; .column @if $ column_layout == 2 width: 50%; fluttuare: a sinistra;  @else width: 100%; 

Nell'esempio sopra abbiamo a .colonna l'output della classe differisce a seconda se vogliamo un layout a una colonna o un layout a due colonne. Abbiamo il $ column_layout variabile impostata su 2, il che significa che dovremmo vedere larghezza: 50%; fluttuare: a sinistra; uscita nella nostra classe.

Compila il tuo file, e dovresti vedere quanto segue nel tuo file "dest / style.css".

.colonna larghezza: 50%; float: sinistra

Nota: il plugin postcss-advanced-variables che fornisce questa funzionalità di conditionals è ancora abbastanza nuovo, e ho riscontrato un output inaspettato quando lo si utilizzava per condizionali più complessi, tuttavia, sono sicuro che verrà aggiornato nel prossimo futuro. 

Esiste un plug-in alternativo che può essere utilizzato per i condizionali denominati postcss-conditionals. Vedremo come puoi utilizzare quel plugin (se lo desideri) nel prossimo tutorial, "Rolling Your Own Preprocessor".

Loops - @per e @ogni

Ci sono due tipi di loop disponibili in PreCSS, il @per@ogni loop. Entrambi usano un approccio simile a Sass. I cicli "For" consentono di scorrere un contatore numerico, mentre i cicli "ciascuno" consentono di scorrere un elenco di elementi.

@per Loops

In un @per loop c'è una variabile "contatore" che tiene traccia di dove sei in bicicletta attraverso il tuo contatore numerico, tipicamente impostato come $ i. Ad esempio, durante l'iterazione da 1 a 3 ci saranno tre cicli; nel primo $ i sarà uguale 1, il secondo sarà uguale 2 e il terzo sarà uguale 3

Questo $ i la variabile contatore può essere interpolata in selettori e regole, che possono essere molto utili per cose come la generazione nth-of-type () regole e calcolo delle larghezze.

Aggiungi questo codice al tuo file "src / style.css" per provare a @per ciclo continuo:

@for $ i da 1 a 3 p: nth-of-type ($ i) margin-left: calc (100% / $ i); 

Dopo la compilazione dovresti vedere questo codice esteso a:

p: nth-of-type (1) margin-left: calc (100% / 1);  p: nth-of-type (2) margin-left: calc (100% / 2);  p: nth-of-type (3) margin-left: calc (100% / 3); 

Nota: numeri 1, 2 e 3 sono stati inseriti in ciascuno degli stili di cui sopra.

@ogni Loops

Un @ogni il ciclo scorre un elenco di elementi anziché numeri. Come con @per loop, la variabile che rappresenta l'oggetto corrente del loop può essere interpolata in selettori e regole. Si noti che per interpolare in una stringa, è necessario inserire una serie di parentesi nel nome della variabile nel formato $ (Var)

Dare usando PreCSS @ogni esegue un ciclo aggiungendo il seguente codice di esempio:

$ social: twitter, facebook, youtube; @each $ icon in ($ social) .icon - $ (icon) background: url ('img / $ (icon) .png'); 

Dopo la compilazione dovresti vedere il seguente CSS è stato generato:

.icona-twitter background: url ('img / twitter.png');  .icon-facebook background: url ('img / facebook.png');  .icon-youtube background: url ('img / youtube.png'); 

mixins

La sintassi per la creazione di mixin è un aspetto di PreCSS che è leggermente diverso da Sass. 

In Sass, per definire un mixin usi la sintassi @mixin mixin_name ($ arg1, $ arg2) ... e quindi usarlo con @include mixin_name (pass_arg1, pass_arg2);.

In PreCSS, d'altra parte, si definisce un mixin con la sintassi @ define-mixin nome_macro $ arg1, $ arg2 ... e usalo con @mixin mixin_name pass_arg1, pass_arg2;

Aggiungi questo esempio al tuo file "src / style.css":

@ define-mixin icon $ network, $ color .button. $ (network) background-image: url ('img / $ (network) .png'); colore di sfondo: $ colore;  @mixin icon twitter, blue; @mixin icon youtube, red;

Nella compilation dovresti vedere:

.button.twitter background-image: url ('img / twitter.png'); colore di sfondo: blu;  .button.youtube background-image: url ('img / youtube.png'); colore di sfondo: rosso; 

Nota: gli argomenti passati attraverso il mixin possono essere interpolati in selettori e stringhe con lo stesso approccio di citato in @ogni cappi sopra; con il formato $ (Var).

Usando @ mixin-content

Oltre a utilizzare i mixin nel modo mostrato sopra, possono anche essere impostati per consumare blocchi di contenuti passati quando si chiama il mixin. Questo è essenzialmente lo stesso processo di Sass ' @soddisfare

Ad esempio, modifica il mixin dell'esempio precedente, posizionando @ Mixin-content dove vuoi che appaia un blocco di contenuti passato, in questo modo:

@ define-mixin icon $ network, $ color .button. $ (network) background-image: url ('img / $ (network) .png'); colore di sfondo: $ colore; @ Mixin-content; 

Quando un mixin che incorpora @ Mixin-content è usato, deve essere posizionato con parentesi graffe, piuttosto che su una singola riga che termina con a ;, o non riuscirà a compilare.

Aggiorna il tuo codice in modo che le tue chiamate di mixino siano così:

@mixin icon twitter, blue width: 3rem;  @mixin icon youtube, red width: 4rem; 

Dopo la compilazione, questo dovrebbe fornire il seguente codice: notare l'inclusione di larghezza contenuto passato attraverso ogni uso del mixin:

.button.twitter background-image: url ('img / twitter.png'); colore di sfondo: blu; larghezza: 3rem;  .button.youtube background-image: url ('img / youtube.png'); colore di sfondo: rosso; larghezza: 4rem; 

estende

Le estensioni sono simili ai mixin in un certo senso, in quanto sono progettate per consentire il riutilizzo di blocchi di codice. Tuttavia, l'idea alla base di "estende" è quella di creare un set base di codice che sai che userai nello stesso modo più volte per un certo tipo di elemento. È quindi possibile estendere successivamente su quella base con un codice aggiuntivo non predefinito.

In PreCSS, la sintassi per definire un'estensione è @ define-extend nome_estensione ....

Nel tuo file "src / style.css", definisci un'estensione contenente gli stili di base per un pulsante arrotondato in questo modo:

@ define-extend rounded_button border-radius: 0.5rem; imbottitura: 1em; border-width: 0.0625rem; border-style: solido; 

Questo set predefinito di stili è ora pronto per essere esteso con un codice aggiuntivo, ad esempio, impostando cose come colore di sfondo e colore del bordo. Questo viene fatto usando la sintassi @extend extend_name; per importare gli stili di base definiti nell'estensione. 

Aggiungi questo codice di esempio, sotto il codice che hai appena aggiunto:

.blue_button @extend rounded_button; border-color: # 2F74D1; background-color: # 3B8EFF;  .red_button @extend rounded_button; border-color: # C41A1E; background-color: # FF2025; 

Dove il @extend rounded_button; linea viene utilizzata, verrà inserito l'intero contenuto dell'estensione.

Compila i tuoi stili e dovresti ottenere:

.blue_button, .red_button border-radius: 0.5rem; imbottitura: 1em; border-width: 0.0625rem; border-style: solido;  .blue_button border-color: # 2F74D1; background-color: # 3B8EFF;  .red_button border-color: # C41A1E; background-color: # FF2025; 

Nota anche che gli stili comuni a .blue_button e .red_button la classe è stata combinata per l'efficienza.

importazioni

Il plugin utilizzato per l'inlining dei fogli di stile tramite @importare è lo stesso di cui abbiamo parlato nel precedente tutorial di questa serie: Minification and Optimization. Per una carrellata su come funziona, dirigiti e leggi la sezione "In linea / Combina file con @import".

Nel contesto dell'utilizzo di PostCSS come preprocessore, le importazioni diventano ancora più utili in quanto offrono la possibilità di configurare partial, a cui potresti essere abituato da altre soluzioni di pre-elaborazione. Ad esempio, è possibile impostare una cartella "parziali", separare il progetto in file parziali logicamente discreti e quindi importarli in questo modo:

@import "partials / _variables.css"; @import "partials / _utilities.css"; @import "partials / _mixins.css"; @import "partial / _extends.css";

Riassumiamo

Spero che ora abbiate alcune informazioni su quanto PostCSS possa essere potente come preprocessore tramite il pacchetto PreCSS. Per riassumere ciò che abbiamo visto sopra:

  • Puoi provare PreCSS live su https://jonathantneal.github.io/precss.
  • L'annidamento in PreCSS funziona allo stesso modo di Sass e LESS.
  • Le variabili in PreCSS usano la stessa sintassi di Sass.
  • Le condizionali sono presenti in PreCSS, usando la sintassi @if e @else.
  • Sono disponibili i cicli @for e @each.
  • I mixins PreCSS sono definiti con la sintassi:
    @ define-mixin nome_macro $ arg1, $ arg2 ...
  • I mixins PreCSS sono usati con la sintassi:
    @mixin mixin_name pass_arg1, pass_arg2;
  • @ Mixin-content può essere usato allo stesso modo di Sass ' @soddisfare
  • Estensioni in PreCSS sono definite con la sintassi:
    @ define-extend nome_estensione ...
  • Gli extends sono usati con la sintassi:
    @extend extend_name;
  • @importare inline file CSS esterni, particolarmente utili per l'uso di partial

Nel prossimo tutorial

PreCSS è un progetto fantastico, che riunisce alcuni eccellenti plug-in di estensione del linguaggio e rende la pre-elaborazione basata su PostCSS praticamente plug and play. Fornisce quasi tutte le funzionalità che la maggior parte degli utenti del preprocessore si aspettano, ed è un modo rapido e senza problemi per far rotolare il preprocessore PostCSS.

L'utilizzo di PreCSS è uno dei due metodi di preprocessing PostCSS di cui abbiamo parlato all'inizio di questo tutorial. L'altro metodo è impostare il tuo proprio preprocessore, seleziona a mano i plug-in di estensione del linguaggio che si adattano ai tuoi progetti o allo stile di codifica. Il trade off è un po 'più di setup, ma in cambio hai la libertà di mettere insieme un preprocessore che funziona comunque tu lo vuoi.

Imparerai come farlo nel prossimo tutorial, "Roll Your Own Preprocessor".