Bruk av PostCSS for kryssbrowser-kompatibilitet

I den siste opplæringen pakket vi opp "Quick Start" -delen av denne serien, og vi er nå klare til å flytte inn på PostCSS for å generere stilark, ved hjelp av forskjellige typer plugins for ulike formål.

I denne opplæringen skal vi bruke PostCSS til å lage et stilark som er designet for å krysse nettleserens kompatibilitet. Vi vil:

  • Har leverandørprefikser automatisk lagt til i
  • Legg til en rekke fallbacks for Internet Explorer versjon 8, 9 og 10
  • Legg til fallbacks for den ennå ikke mye støttet Kommer til å endres eiendom

La oss begynne!

Konfigurer prosjektet ditt

Det første du må gjøre er å sette opp prosjektet ditt for å bruke enten Gulp eller Grunt, avhengig av dine preferanser. Hvis du ikke allerede har en preferanse for den ene eller den andre, anbefaler jeg at du bruker Gulp, da du trenger mindre kode for å oppnå de samme ender.

Du kan lese om hvordan du konfigurerer Gulp eller Grunt-prosjekter for PostCSS i de tidligere opplæringsprogrammene

  • PostCSS Quickstart Guide: Gulp Setup eller
  • PostCSS Quickstart Guide: Grunt Setup

henholdsvis.

Hvis du ikke vil opprette prosjektet manuelt fra starten, kan du laste ned kildefilene som er vedlagt denne opplæringen, og trekke ut enten det forsynte Gulp- eller Grunt-startprosjektet i en tom prosjektmappe. 

Deretter kjører kommandoen med en terminal eller kommandoprompt i mappen npm installasjon.

Installer plugger

Nå som du har ditt tomme Gulp eller Grunt + PostCSS-prosjekt klar, må vi installere plugins du skal bruke i denne opplæringen.

Vi skal installere ganske mange plugins, så i stedet for å installere dem en om gang som vi gjorde i "Quickstart Guides" for Gulp and Grunt, installerer vi dem alle samtidig med en enkelt kommando.

Enten du bruker Gulp eller Grunt, kjør følgende kommando inne i prosjektmappen din for å installere pluginene vi skal bruke:

npm installere autoprefixer postcss-color-rgba-fallback postcss-opacity postcss-pseudoelements postcss-vmin pixrem postcss-will-change -save-dev

Nå er plugins installert, la oss gå videre og laste dem inn i prosjektet ditt.

Legg inn plugins via Gulp

Hvis du bruker Gulp, legger du til disse variablene under variablene som allerede finnes i filen:

var autoprefixer = krever ('autoprefixer'); var color_rgba_fallback = krever ('postcss-color-rgba-fallback'); var opacity = krever ('postcss-opacity'); var pseudoelements = krever ('postcss-pseudoelements'); var vmin = krever ('postcss-vmin'); var pixrem = krever ('pixrem'); var will_change = krever ('postcss-will-change');

Legg nå til hver av de nye variabelenavnene i din prosessorer matrise:

 var prosessorer = [will_change, autoprefixer, color_rgba_fallback, opacity, pseudoelements, vmin, pixrem];

Gjør en rask test at alt fungerer ved å kjøre kommandoen gulp css og deretter sjekker du at en ny "style.css" -fil har dukket opp i prosjektets "dest" -mappe.

Legg inn plugger via Grunt

Hvis du bruker Grunt, oppdaterer du prosessorer objekt, som er nestet under opsjoner objekt til følgende:

 prosessorer: [krever ('postcss-will-change') (), krever ('autoprefixer') (), krever ('postcss-color-rgba-fallback') (), krever ('postcss-opacity') , krever ('postcss-pseudoelements') (), krever ('postcss-vmin') (), krever ('pixrem') ()]

Utfør en rask test ved å kjøre kommandoen grunt postcss Sjekk deretter at prosjektets "dest" -mappe nå inneholder en ny "style.css" -fil.

Du har nå alle pluginene som er installert som kreves for denne opplæringen, og du er klar til å gå videre og se hvordan du bruker dem for å forbedre stilarkets kryssleser-kompatibilitet.

Legg automatisk til leverandørprefiksering

Noen av tiltakene for kryssbrowser-kompatibilitet vi vil dekke, vil bare være nødvendige for spesielle brukstilfeller. Automatisert leverandør prefixing, derimot, er noe jeg foreslår at det skal gjøres med hver prosjekt, via Autoprefixer-plugin laget av Andrey Sitnik.

Det kan være vanskelig å holde faner på hvilke egenskaper som krever hvilken leverandør som prefikser til enhver tid, og ved å bruke Autoprefixer du ikke trenger å. Bruk Autoprefixer som en del av hvert prosjekt, og det vil sjekke koden din mot dataene fra CanIUse.com, og deretter legge til leverandørprefikser etter behov uten at du må tenke på det.

La oss gjøre en liten test for å se Autoprefixer i aksjon. Legg til følgende animasjon og flexbox kode i prosjektets "src / style.css" -fil:

@keyframes animasjon Eksempel fra bredde: 0;  til bredde: 100%;  .animateThis animasjon: animasjon Eksempel 2s; display: flex; 

Løpe gulp css eller grunt postcss å kompilere filen din, og din "dest / style.css" bør nå inneholde denne leverandørens prefixed kode:

@ -webkit-keyframes animasjon Eksempel fra bredde: 0;  til bredde: 100%;  @keyframes animasjon Eksempel fra bredde: 0;  til bredde: 100%;  .animateThis -webkit-animasjon: animasjon Eksempel 2s; animasjon: animasjon Eksempel 2s; display: -webkit-boks; display: -webkit-flex; display: -ms-flexbox; display: flex; 

Som du kan se, har leverandørprefikser automatisk blitt lagt til, som diktert av dataene fra CanIUse.com på animasjon og flexbox.

Angi støttestørrelser for nettlesere

Autoprefixer bruker nettleserlisten for å finne ut hvilke nettleserversjoner den vil legge til støtte for. Under standardinnstillinger vil det bruke leverandørprefikser etter behov for:

  • > 1%: nettlesere som brukes av mer enn en prosent av mennesker globalt
  • siste 2 versjoner: De to siste versjonene av hver nettleser spores av CanIUse.com
  • Firefox ESR: den nyeste Firefox-versjonen
  • Opera 12.1: Opera versjon 12.1

Eksemplet vi løp gjennom ovenfor ble samlet under Autoprefixers standardinnstillinger. Dette betydde støtte for IE10 og Safari 8 ble inkludert, så -ms- og -webkit- prefiks de krever for animasjon og flexbox ble automatisk satt inn.

Imidlertid krever IE11 og Safari 9 ikke disse prefiksene, så hvis du skulle stille inn nettleserkartskonfigurasjonen for å bare støtte IE11 + og Safari 9+, vil disse prefikser ikke lenger bli lagt til.

Prøv dette ved å passere a lesere sette inn til Autoprefixer i Gulpfile eller Gruntfile slik:

// I Gulpfile-prosessorens array: autoprefixer (browsers: 'safari> = 9, ie> = 11') 'safari> = 9, dvs.> = 11']),

Nå, hvis du kompompillerer CSS, vil du se at det ikke er noen forskjell mellom den opprinnelige og kompilerte koden. Dette skyldes at uten støtte for Safari 8 eller IE10, har ingen leverandørprefikser blitt lagt inn for å passe dem.

Relaterte linker:

  • Autoprefixer: https://github.com/postcss/autoprefixer
  • Nettleserliste: https://github.com/ai/browserslist

Legg til Fallback for "vil-endre" Property

De Kommer til å endres Egenskapen er brukt til å la en nettleser vite før tiden at bestemte elementer i ditt design skal animeres. Dette gjør at nettleseren kan optimalisere gjengivelsesprosessen og forhindre forsinkelser og flimmer. Men for tiden er denne egenskapen ikke støttet av IE / Edge, Safari eller Opera Mini.

Postcss-will-change-pluginet, også skapt av Andrey Sitnik, legger til en tilbakebetaling som vil hjelpe disse nettleserne til å gjøre en bedre jobb med gjengivelse, selv om ikke med effektiviteten de kunne, hvis de støttet Kommer til å endres. Det gjør det ved å legge til backface-synlighet eiendom som utløser opprettelsen av et kompositorlag som skal håndteres av GPU.

For eksempel, legg til denne koden i filen "src / style.css":

.thisWillChange will-change: transform; 

Samle stilarket ditt, og du bør se fallbacken i filen "dest / style.css":

.thisWillChange backface-synlighet: hidden; vil-endre: transformere; 

Merk: dette pluginet skal lastes inn før Autoprefixer i Gulpfile / Gruntfile. Dette gjør at Autoprefixer kan legge til leverandørprefikser til backface-synlighet eiendom, slik som:

/ * Fallback med leverandør prefikser * / .thisWillChange -webkit-backface-synlighet: skjult; backface-synlighet: skjult; vil-endre: transformere; 

Relaterte linker

  • postcss-will-change plugin: https://github.com/postcss/postcss-will-change
  • Alt du trenger å vite om CSS vil-endre eiendom
  • CanIUse info: http://caniuse.com/#feat=will-change

Legg til Fallbacks for Old IE Issues

Takket være forbedrede nettleserversjoner fra Microsoft, og store grupper som fører veien til å slippe støtte for gamle IE, går vi gradvis nærmere ved ikke å hele tiden vurdere tilbakebetalinger og løsningsmuligheter for problematiske eldre nettlesere. Microsoft selv vil slippe støtte for IE8 i 2016. Bootstrap 4 alpha ble nylig utgitt, og den har også falt støtte for IE8. Google sluttet å støtte IE8 i 2012 og droppet IE9-støtte i 2013.

Alt som er sagt, på slutten av dagen må hvert prosjekt vurderes fra sak til sak, og hvis du målretter mot en demografisk som har høye bruksfrekvenser for eldre nettlesere, har du kanskje ikke annet valg enn å gjøre ditt beste å støtte dem. Hvis det er tilfelle, kan følgende plugins hjelpe deg med å gjøre prosessen litt mindre smertefull.

Skape RGBA () Farge Fallbacks

IE8 har ingen støtte for RGBA () farger, slik at plug-in-farge-rgba-fallback-plugin av Guillaume Demesy legger til en flat hexadecimal farge som en tilbakekalling.

For eksempel, legg til denne koden i filen "src / style.css":

.rgbaFallback bakgrunn: rgba (0,0,0,0,5); 

Kompilere og du bør se heksekode fall tilbake lagt til din "dest / style.css" -fil:

.rgbaFallback bakgrunn: # 000000; bakgrunn: rgba (0,0,0,0,5); 

Relaterte linker

  • postcss-color-rgba-fallback-plugin: https://github.com/postcss/postcss-color-rgba-fallback
  • CanIUse info: http://caniuse.com/#feat=css3-colors

Skape opasitet fallbacks

IE8 kan ikke håndtere opasitet eiendom, slik at plug-in-opacity-plugin av Vincent De Oliveira legger til et IE-spesifikt filter for å oppnå samme effekt.

Legg til denne koden i kilde stilarket ditt:

.opacityFallback opacity: 0.5; 

Etter samling bør du se riktig -ms-filteret fallback lagt til:

.opacityFallback opacity: 0.5; -ms-filter: "progid: DXImageTransform.Microsoft.Alpha (Opacity = 50)"; 

Relaterte linker

  • postcss-opacity-plugin: https://github.com/iamvdo/postcss-opacity
  • CanIUse info: http://caniuse.com/#feat=css-opacity

Konvertere :: inn i : på pseudo-elementer

Det anses best praksis når du genererer pseudo-elementer som for eksempel .element :: før å bruke en dobbelt kolon notasjon ::. Dette er for å skille dem fra pseudo-klasser som for eksempel .element: hover som skal bruke en enkelt kolon notasjon :.

Imidlertid støtter IE8 ikke den dobbelte kolonnotasjonen :: For å skape pseudo-elementer, støtter det bare en enkelt kolon :. Ved å bruke postcss-pseudoelements plugin av Sven Tschui kan du kode i henhold til beste praksis, og har notasjonen endret automatisk.

Legg til følgende dobbelte :: notasjonskode:

.pseudo-element :: før innhold: ";

Kompilér filen din, og du bør se at den har blitt redusert til singelen : notasjon:

.pseudo-element: før innhold: ";

Ved å kryptere til beste praksis og bruke dette pluginet, når IE8 er fullstendig pensjonert, kan du bare reprosessere CSS uten plugin og ha riktig syntaks på plass.

Relaterte linker

  • postcss-pseudoelements plugin: https://github.com/axa-ch/postcss-pseudoelements
  • CanIUse info: http://caniuse.com/#feat=css-gencontent

Legg til vm Fallback for Vmin

I IE9 er visningsportenheten Vmin støttes ikke, men bruker i stedet den tilsvarende enheten vm. Hvis du er catering til IE9, vil postcss-vmin-pluginet av Vincent De Oliveira legge til vm enheter som en tilbakebetaling.

Legg til denne koden i filen "src / style.css":

.vmFallback bredde: 50vmin; 

Kompompilere, og den resulterende koden skal ha vm enhet fallback lagt i:

.vmFallback bredde: 50vm; bredde: 50vmin; 

Relaterte linker

  • postcss-vmin-plugin: https://github.com/iamvdo/postcss-vmin
  • CanIUse info: http://caniuse.com/#feat=viewport-units

Legg til px Fallback for rem enheter

IE8 støtter ikke rem enheter i det hele tatt, og i både IE9 og IE10 støttes de ikke kvasielementer og font shorthand deklarasjon. Med node-pixrem plugin av Vincent De Oliveira og Rob Wierzbowski kan du ha px baserte fallbacks lagt til automatisk hvor du bruker rem enheter.

Legg til denne koden i kilde stilarket ditt:

.remFallback høyde: 10rem; font: 2rem Arial;  .remFallback :: før innhold: "; linjehøyde: 1rem;

Kompompilere og du bør se alt riktig px fallbacks lagt til:

.remFallback høyde: 160px; høyde: 10rem; skrifttype: 32px Arial; font: 2rem Arial;  .remFallback: før innhold: "; linjehøyde: 16px; linjehøyde: 1rem;

Relaterte linker

  • node-pixrem plugin: https://github.com/robwierzbowski/node-pixrem
  • CanIUse info: http://caniuse.com/#feat=rem

La oss gjenskape

For å oppsummere hva vi har dekket i det ovennevnte:

  • Autoprefixer er et must-use verktøy for hvert prosjekt
  • Autoprefixer kan konfigureres for å legge til leverandørprefikser basert på hvilke nettlesere du trenger å støtte
  • Hvis du bruker animasjon i prosjektet, bør du vurdere å bruke plugin-posten-vil-endringen
  • Hvis du støtter IE8, bør du vurdere å bruke plugins postcss-color-rgba-fallback, postcss-opacity, postcss-pseudoelements og postcss-vmin.
  • Hvis støtte IE8, IE9, IE10 vurdere å bruke noden-pixrem plugin

I neste veiledning

Kommer opp neste i vår PostCSS Deep Dive-serie er en veiledning om hvordan du bruker plugins for å redusere og optimalisere CSS. Vi vil dekke inlining @importere filer, kombinere media spørringer, stripping hvit plass og flere flere metoder for å gjøre stilarkene dine så strømlinjeformede som mulig. Ser deg der!