Rilevamento feature CSS query Modernizr o Feature?

In questo tutorial, esaminerò due approcci per scoprire se un browser supporta determinate funzionalità CSS o meno. Il primo si avvale di Modernizr, una popolare libreria JavaScript e la seconda di una query, una soluzione CSS promettente.

Quindi iniziamo!

Rilevazione delle funzionalità tramite Modernizr

Come accennato in precedenza, Modernizr è una libreria JavaScript leggera che rileva le funzionalità HTML5 e CSS3 nel browser. Finché la pagina viene caricata, viene eseguita dietro le quinte ed esegue test delle funzionalità. Quindi memorizza i risultati come proprietà di un oggetto JavaScript e come classi di html elemento. Maggiori informazioni in seguito.

Per installare e utilizzare Modernizr, puoi visitare il suo sito e scaricare la versione preferita.

Nota: al momento della scrittura, la versione attuale di Modernizr è 2.8.3, sebbene la versione 3 sia quasi pronta. In effetti, il team dietro la biblioteca si aspetta di avviarlo nelle prossime settimane. Una breve panoramica di questa nuova versione può essere trovata qui. Inoltre, puoi accedere alla versione beta visitando questo link.

Una volta scaricato, posiziona il file JavaScript nel tuo progetto e includilo nel file della tua pagina html. Ultimo ma non meno importante, per abilitare la funzionalità di Modernizr dovresti aggiungere il no-js classe al html elemento.

Nelle prossime due sezioni, tratterò i fondamenti di Modernizr. Per concetti più avanzati, assicurarsi di leggere la documentazione. 

Rilevazione CSS

Come discusso sopra, Modernizr aggiunge un numero di classi al html elemento. I nomi delle classi dipendono dal supporto del browser. Se il browser non riconosce alcuni dei test delle funzionalità, Modernizr aggiunge il no- prefisso prima dei suoi nomi di classe incorporati. Ad esempio, supponendo di testare gli effetti di riflessione, il html l'elemento su Chrome 40 si presenta così:

Mentre su Firefox 35:

Notare anche il js classe. Quando si esegue Modernizr, supponendo che JavaScript sia abilitato nel nostro browser, sostituisce il vecchio no-js classe con quello nuovo. 

Sulla base dei risultati ottenuti dai test di Modernizr, possiamo personalizzare i nostri fogli di stile.

Esempi

Per iniziare, ecco il codice HTML di base che useremo per il resto del tutorial:

Riflessioni CSS

Usando le classi che ci hanno dato Modernizr modifichiamo gli stili di h2 elemento come segue:

h2 color: # c0ccdb; font-size: 3em;  .cssreflections h2 -webkit-box-reflect: below -.45em -webkit-gradient (lineare, a sinistra in alto, a sinistra in basso, da (trasparente), color-stop (0%, trasparente), a (rgba (255, 255, 255, 0,75)));  .no-cssreflections h2 text-shadow: 0 1px 0 # 136ed1, 0 2px 0 # 126ac9, 0 3px 0 # 1160b6, 0 4px 0 # 105cad, 0 5px 0 # 0f56a2, 0 6px 1px rgba (0,0, 0, .1), 0 0 5px rgba (0,0,0, .1), 0 1px 3px rgba (0,0,0, .3), 0 3px 5px rgba (0,0,0, .2) , 0 5px 10px rgba (0,0,0, .25), 0 10px 10px rgba (0,0,0, .2), 0 20px 20px rgba (0,0,0, .15); 

I browser basati su Webkit che supportano i riflessi mostreranno il h2 elemento come segue:

Mentre il resto di loro (almeno quelli che supportano il text-shadow proprietà) applicherà un effetto diverso, basato su un effetto testo 3D di Mark Otto:

Ecco l'esempio su Codepen:

Rilevazione JavaScript

Il secondo modo per verificare i risultati ottenuti dai test di Modernizr è tramite JavaScript. Come già accennato, Modernizr crea un oggetto con i nomi di proprietà delle funzionalità che sono configurate per testare. La maggior parte delle volte, i loro valori restituiscono entrambi vero o falso.

Lo screenshot qui sotto mostra come Firefox 35 visualizza l'oggetto Modernizr (scheda Console):

Come possiamo vedere il Modernzir.cssreflections la proprietà restituisce a falso valore. Ciò accade perché Chrome, Safari e Opera sono gli unici browser che supportano le riflessioni (al momento della scrittura).

Ecco come possiamo riprodurre l'esempio precedente con JavaScript, aggiungendo il riflessione e nessun riflesso classi al nostro

 manualmente:

var element = document.getElementById ('reflection'); if (Modernizr.cssreflections) element.className = 'reflection';  else element.className = 'no-reflection';  

Quindi styling con il CSS pertinente:

.reflection / * applica reflection property * / .no-reflection / * applica text-shadow property * / 

E la nuova demo su Codepen:

Rilevazione di funzioni mediante query di caratteristiche

Senza dubbio, Modernizr è uno strumento prezioso nell'arsenale di ogni sviluppatore di frontend. Ma non sarebbe meglio se potessimo replicare i test di Modernizr con puro CSS? Per fortuna, possiamo farlo usando le query sulle funzionalità. Si tratta di regole condizionali che ci consentono di applicare stili diversi in base al supporto del browser. Funzionano proprio come le domande dei media. E sì, oltre all'edizione CSS arrivano anche su JavaScript.

Pronto a dare un'occhiata?

Rilevazione CSS

Per definire le query di caratteristiche nel nostro CSS dobbiamo usare il @supports e @supporta non regole. La loro sintassi assomiglia a questo:

@supports (condizione di test) / * applica le regole * / @supports not (condizione di test) / * applica le regole * / 

La condizione include costo dell'immobile coppie di funzionalità che vogliamo testare. I browser che supportano le funzionalità applicano le regole di destinazione, che vengono specificate all'interno di @supports regola. Altrimenti, gli stili all'interno di @supporta non la regola viene eseguita.

Usando il E e / o O operatori logici possiamo creare test complessi. Tuttavia, tieni presente che questi operatori dovrebbero essere separati da parentesi.

Vediamo due esempi. Come già sappiamo, il nostro HTML è semplicemente semplice! È solo un h2 elemento.

In questo primo esempio, usiamo il colore di sfondo proprietà per specificare il colore di sfondo del corpo elemento. Per rendere le cose più interessanti, creiamo anche una variabile CSS. Il supporto del browser è suddiviso nelle seguenti categorie:

  1. Browser che supportano query di caratteristiche e variabili CSS (attualmente solo Firefox 31+).
  2. Browser che supportano le query di caratteristiche, ma non supportano le variabili CSS.
  3. Browser che non supportano query di caratteristiche né variabili CSS.

A seconda di queste circostanze, il corpo l'elemento mostrerà un diverso colore di sfondo.

Ecco il codice CSS basato sulle ipotesi di cui sopra:

body --bg-color: # 98FB98; colore di sfondo: kaki;  @supports (background-color: var (- bg-color)) body background-color: var (- bg-color);  @supports not (background-color: var (- bg-color)) body background-color: tomato; 

Ad esempio su Safari, che appartiene alla terza categoria, il nostro elemento sarebbe simile a questo:

Quindi Chrome, che può interpretare la funzione Query, ma non supporta le variabili CSS, appartiene alla seconda categoria:

Infine, Firefox, che si trova nella prima categoria:

E l'esempio incorporato su Codepen:

Un altro esempio

In questo caso, espanderemo la condizione di test per contenere a secondo regola. Più specificamente, ora stiamo prendendo di mira i browser che supportano non solo i riflessi ma anche gli effetti del tratto di testo.

Ecco il codice per questo comportamento:

 @supports ((/ * condizione riflessioni * /) e (-webkit-testo-tratto: 1px pomodoro)) h2 / * applica la proprietà reflection * / -webkit-text-stroke: 1px pomodoro;  @supports not ((/ * condizione riflessioni * /) e (/ * condizione stroke * /)) h2 / * applica proprietà text-shadow * / 

Ad esempio, i browser (al momento in cui scrivo solo Chrome 28+) che supportano le query sulle funzioni, i riflessi e gli effetti del tratto di testo visualizzeranno il h2 elemento come segue:

Di seguito è riportato l'esempio incorporato su Codepen:

Rilevazione JavaScript

Le query di caratteristiche possono anche essere definite tramite JavaScript. Per fare ciò, dobbiamo usare il CSS.supports metodo. Ecco i suoi possibili parametri:

CSS.supports (propertyName, propertyValue) CSS.supports (condizione di test) 

Il risultato di questo metodo è a booleano valore che indica se il browser supporta le funzionalità o meno. Infine, dovremmo racchiudere i parametri in virgolette singole o doppie.

Utilizzando l'edizione JavaScript delle query sulle funzionalità, il nostro ultimo esempio può essere riprodotto come segue:

var result = CSS.supports ('(/ * condizione di riflessione * /) e (/ * condizione di ictus * /)'); var element = document.getElementById ('reflection'); if (result) element.className = 'reflection';  else element.className = 'no-reflection';  

La demo corrispondente:

Supporto del browser

In termini generali, il supporto del browser per le query sulle funzionalità è buono. Al momento di scrivere Firefox (22+), Chrome (28+) e Opera (12.1+) supportano tutte queste funzionalità CSS. Speriamo che le prossime versioni di IE comprenderanno anche le regole delle condizioni (ci stanno lavorando!).


polyfills

Se desideri utilizzare le query sulle funzionalità nei tuoi progetti, ma sei un po 'scettico riguardo ai browser che li comprendono, troverai qui sotto alcuni utili polilavorati:

  • CSS-supports.js
  • CSS.supports
  • FQ-polyfill

Conclusione

In questo tutorial, ho utilizzato due metodi utili che è possibile utilizzare per offrire esperienze cross-browser affidabili. Sfruttare Modernizr e / o le query sulle funzionalità ti aiuterà a comprendere i vantaggi della progettazione Caratteristiche e non per i browser. Modernizr è l'attuale soluzione stabile, ma le query sulle funzionalità stanno arrivando, quindi la scelta è vostra!