Suggerimento rapido rileva il supporto CSS3 nei browser con JavaScript

Non è divertente giocare con le ultime tecniche CSS, come ombre e transizioni? C'è un solo problema: come possiamo compensare o, soprattutto, rilevare i browser che non li supportano? Bene, ci sono alcune soluzioni. In questo tutorial e screencast, tuttavia, creeremo una funzione JavaScript che accetterà un nome di proprietà CSS come parametro e restituirà un booleano, indicando se il browser supporta o meno la proprietà passata.


Preferisci un video tutorial?

premi il HD pulsante per un'immagine più chiara.

Iscriviti alla nostra pagina YouTube per guardare tutti i tutorial video!


Passo 1

Iniziamo determinando Come vogliamo chiamare il nostro funzione. Manterremo le cose semplici qui; qualcosa come il seguente dovrebbe fare il trucco:

 if (supports ('textShadow')) document.documentElement.className + = 'textShadow'; 

Questo dovrebbe essere il finale funzione chiamata. Quando passiamo un nome di proprietà CSS al supporti () funzione, restituirà a booleano. Se vero, allegheremo un nome della classe al documentElement, o . Questo ci fornirà quindi un nuovo nome di "classe" su cui collegarci, dal nostro foglio di stile.


Passo 2

Successivamente, costruiremo il supporta () funzione.

 var supports = (function () ) ();

Perché non stiamo facendo supporti uguale a una funzione standard? La risposta è perché abbiamo un po 'di prep lavoro da fare prima, e non c'è assolutamente alcun motivo per ripetere queste attività più e più volte ogni singola volta viene chiamata la funzione. In casi come questo, è meglio fare supporti uguale a qualsiasi cosa viene restituito dalla funzione autoeseguibile.


Passaggio 3

Per verificare se il browser supporta o meno proprietà specifiche, è necessario creare un elemento * dummy *, per il test. Questo elemento generato non verrà mai inserito nel DOM; pensalo come un manichino di prova!

 var div = document.createElement ('div');

Come probabilmente saprai, ci sono una manciata di prefissi dei fornitori che possiamo usare, quando si lavora con le proprietà CSS3:

  • -moz
  • -webkit
  • -o
  • -Signorina
  • -khtml

Il nostro JavaScript dovrà filtrare questi prefissi e testarli. Quindi, inserirli in un schieramento; lo chiameremo, fornitori.

 var div = document.createElement ('div'), vendors = 'Khtml Ms O Moz Webkit'.split (");

Usando il Diviso() funzione per creare un schieramento da un stringa è certamente pigro, ma risparmia una manciata di secondi!

Come filtreremo attraverso questo schieramento, siamo bravi ragazzi e ragazze, e nascondiamo il lunghezza del schieramento anche.

 var div = document.createElement ('div'), venditori = 'Khtml Ms O Moz Webkit'.split ("), len = vendors.length;

Il prep lavorare, sopra, è statico, in natura, e non ha bisogno di essere ripetuto ogni volta che chiamiamo supporti (). Questo è il motivo per cui lo eseguiamo solo una volta, quando la pagina viene caricata. Ora facciamo ritorno il funzione che sarà effettivamente assegnato al supporti variabile.

 funzione di ritorno (prop) ;

La bellezza di chiusure è quello, anche se supporti () è uguale a quello restituito funzione, ha ancora accesso a div, fornitori, e len variabili.


Passaggio 4

Il test immediato: se la proprietà passata è disponibile per div'S stile attributo, sappiamo che il browser supporta la proprietà; così ritorna vero.

 return function (prop) if (prop in div.style) restituisce true; ;

Pensa, per esempio, al text-shadow Proprietà CSS3. La maggior parte dei browser moderni lo supporta, senza la necessità di un prefisso del venditore. Con questo in mente, perché filtrare tutti i prefissi se non ne abbiamo bisogno? Ecco perché lo posizioniamo dai un'occhiata in cima.


Passaggio 5

Probabilmente sei abituato a digitare nomi di proprietà CSS3, in questo modo: -moz-box-ombra. Tuttavia, se, in Firebug, rivedi il stile oggetto, troverai che è scritto, MozBoxShadow. In quanto tale, se testiamo:

 'mozboxShadow' in div.style // false

falso sarà restituito. Questo valore è sensibile al maiuscolo / minuscolo.

Ciò significa che, se l'utente passa boxShadow al supporti () funzione, fallirà. Pensiamo in anticipo e controlliamo se la prima lettera dell'argomento è in minuscolo. Se lo è, correggeremo l'errore per loro.

 return function (prop) if (prop in div.style) restituisce true; prop = prop.replace (/ ^ [a-z] /, function (val) return val.toUpperCase ();); ;

Espressioni regolari in soccorso! Sopra, stiamo controllando se c'è una singola lettera minuscola all'inizio della stringa (^). Solo a condizione che ne venga trovato uno, usiamo il toUpperCase () funzione per capitalizzare la lettera.


Passaggio 6

Abbiamo quindi bisogno di filtrare attraverso il fornitori array e verifica se c'è una corrispondenza. Ad esempio, se box-ombra è passato, dovremmo testare se il stile attributo del div contiene uno dei seguenti:

  • MozBoxShadow
  • WebkitBoxShadow
  • MsBoxShadow
  • OBoxShadow
  • KhtmlBoxShadow

Se viene trovata una corrispondenza, possiamo ritorna vero, perché il browser, in effetti, fornisce supporto per le ombre delle caselle!

 return function (prop) if (prop in div.style) restituisce true; prop = prop.replace (/ ^ [a-z] /, function (val) return val.toUpperCase ();); while (len--) if (vendors [len] + prop in div.style) return true; ;

Anche se potremmo usare a per dichiarazione per filtrare attraverso il schieramento, non è necessario in questo caso.

  • L'ordine non è importante
  • mentre le istruzioni sono più veloci da digitare e richiedono meno caratteri
  • C'è un piccolo miglioramento delle prestazioni

Non essere confuso da venditori [len] + prop; semplicemente sostituire quei nomi con i loro valori di vita reale: MozBoxShadow.


Passaggio 7

Ma, cosa succede se nessuno di questi valori corrisponde? In tal caso, il browser non sembra supportare la proprietà, nel qual caso dovremmo restituisce falso.

 while (len--) if (vendors [len] + prop in div.style) return true;  return false;

Questo dovrebbe farlo per la nostra funzione! Proviamoci, applicando un nome della classe al html elemento, se il browser supporta, ad esempio, il text-stroke proprietà (che solo il webkit fa).

 if (supports ('textStroke')) document.documentElement.className + = 'textStroke'; 

Step 8: Uso

Con un classe nome che possiamo ora gancio su, proviamolo nel nostro foglio di stile.

 / * fallback * / h1 color: black;  / * supporto per il tratto di testo * /. textStroke h1 color: white; -webkit-text-stroke: 2px black; 

Codice sorgente finale

 var supports = (function () var div = document.createElement ('div'), venditori = 'Khtml Ms O Moz Webkit'.split ("), len = vendors.length; funzione return (prop) if (prop in div.style) return true; prop = prop.replace (/ ^ [az] /, function (val) return val.toUpperCase ();); while (len--) if (vendors [len] + prop in div.style) // browser supporta box-shadow Fai quello che ti serve. // Oppure usa il botto (!) per verificare se il browser non lo fa. return true; return false;;) (); if (supports ('textShadow')) document.documentElement.className + = 'textShadow';

Per una soluzione più completa, fare riferimento alla libreria Modernizr.