Sfat rapid Detectați suportul CSS3 în browserele cu JavaScript

Nu este distractiv să jucăm cu cele mai recente tehnici CSS, cum ar fi umbrele și tranzițiile? Există o singură problemă: cum putem compensa sau, mai important, detecta browserele care nu le suportă? Ei bine, sunt câteva soluții. Totuși, în acest tutorial și screencast, vom crea o funcție JavaScript care va accepta un nume de proprietate CSS ca parametru și va returna boolean, indicând dacă browserul acceptă sau nu proprietatea trecută.


Prefer un Video Tutorial?

apasă pe HD pentru o imagine mai clară.

Abonați-vă la pagina noastră YouTube pentru a viziona toate tutorialele video!


Pasul 1

Să începem prin a determina Cum Vrem să sunăm pe noi funcţie. Vom păstra lucrurile simple aici; ceva de genul următor ar trebui să facă truc:

 dacă (suportă ('textShadow')) document.documentElement.className + = 'textShadow'; 

Ar trebui să fie ultimul funcţie apel. Când trecem un nume de proprietate CSS la suporturi () funcția, va reveni a boolean. Dacă Adevărat, vom atașa o numele clasei la documentElement, sau . Acest lucru ne va oferi apoi un nou nume de clasă pe care să-l cuprind, din foaia de stil.


Pasul 2

Apoi, vom construi suportă () funcția.

 var susține = (funcția () ) ();

De ce nu facem suporturi egal cu o funcție standard? Răspunsul este pentru că avem un pic de Prep să lucrezi mai întâi și nu e absolut nici un motiv să repeți din nou aceste sarcini fiecare o singură dată când este apelată funcția. În astfel de cazuri, este mai bine să faci suporturi egală cu ceea ce este returnat din funcția de auto-execuție.


Pasul 3

Pentru a testa dacă browserul acceptă sau nu anumite proprietăți, trebuie să creați un element * * inactiv pentru testare. Acest element generat nu va fi niciodată introdus în DOM; gândiți-vă la aceasta ca la un test fals!

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

După cum probabil știți, există o mână de prefixe de furnizori pe care le putem folosi, atunci când lucrăm cu proprietăți CSS3:

  • -Moz
  • -WebKit
  • -o
  • -Domnișoară
  • -KHTML

JavaScript-ul nostru va trebui să filtreze prin acele prefixe și să le testeze. Deci, hai să le punem într-un mulțime; o să-i spunem, vânzătorii.

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

Utilizarea Despică() funcția de a crea un mulțime de la şir este adesea leneș, dar salvează o mână de secunde!

Așa cum vom filtrează prin asta mulțime, Să fim băieți și fete bune și să ascundem cache-ul lungime din mulțime de asemenea.

 var div = document.createElement ('div'), vendors = 'Khtml D-na Mozk Webkit'.split ("), len = vendors.length;

Prep munca de mai sus este statică, în natură și nu trebuie repetată de fiecare dată când sunăm suporturi (). Din acest motiv, o rulați o singură dată, când pagina se încarcă. Acum hai să întoarcere funcţie care vor fi atribuite efectiv suporturi variabil.

 funcția return (prop) ;

Frumusețea lui închiderile este că, chiar dacă suporturi () este egal cu cel returnat funcţie, are încă acces la div, vânzătorii, și Len variabile.


Pasul 4

Testul imediat: dacă proprietatea trecută este disponibilă pentru div„s stil atributul, știm că browserul acceptă proprietatea; asa de retur adevărat.

 funcția return (prop) if (prop în div.style) return true; ;

Gândiți-vă, să zicem, text-shadow Proprietatea CSS3. Cele mai multe browsere moderne îl acceptă, fără a fi nevoie de un prefix de furnizor. Având în vedere acest lucru, de ce să filtruți prin toate prefixele dacă nu este necesar? De asta punem asta Verifica în vârf.


Pasul 5

Probabil ați folosit pentru a scrie nume de proprietăți CSS3, cum ar fi: -Moz-box-shadow. Cu toate acestea, dacă în Firebug revizuiți stil obiect, veți găsi că este scris, MozBoxShadow. Ca atare, dacă vom testa:

 'mozboxShadow' în div.style // false

Fals va fi returnat. Această valoare este sensibilă la litere mari și mici.

Aceasta înseamnă că, în cazul în care utilizatorul trece boxShadow la suporturi () funcționează, va eșua. Să ne gândim înainte și să verificăm dacă prima literă a argumentului este mică. Dacă este, vom remedia eroarea pentru ei.

 funcția return (prop) if (prop în div.style) return true; prop = prop.replace (/ ^ [a-z] /, funcția (val) retur val.toUpperCase ();); ;

Expresii regulate la salvare! Mai sus, verificăm dacă există o singură literă mică la începutul șirului (^). Numai cu condiția că se găsește, folosim toUpperCase () pentru a capitaliza litera.


Pasul 6

Apoi trebuie să filtrați prin vânzătorii și verificați dacă există un meci. De exemplu, dacă box-shadow este trecut, ar trebui să testați dacă stil atributul div conține oricare dintre următoarele:

  • MozBoxShadow
  • WebkitBoxShadow
  • MsBoxShadow
  • OBoxShadow
  • KhtmlBoxShadow

Dacă se găsește un meci, putem retur adevărat, deoarece browserul oferă, într-adevăr, suport pentru umbrele din cutie!

 funcția return (prop) if (prop în div.style) return true; prop = prop.replace (/ ^ [a-z] /, funcția (val) retur val.toUpperCase ();); în timp ce (len--) dacă (furnizori [len] + prop în div.style) return true; ;

Deși am putea folosi a pentru declarație pentru a filtra prin mulțime, nu este nevoie reală în acest caz.

  • Ordinea nu este importantă
  • in timp ce instrucțiunile sunt mai rapide de tip și necesită mai puține caractere
  • Există o îmbunătățire a performanțelor minuscule

Nu te confunda cu furnizori [len] + prop; pur și simplu înlocuiți aceste nume cu valorile lor din viața reală: MozBoxShadow.


Pasul 7

Dar dacă nu se potrivește nici una dintre aceste valori? În acest caz, browserul nu pare să susțină proprietatea, caz în care ar trebui return false.

 în timp ce (len--) dacă (furnizori [len] + prop în div.style) return true;  return false;

Ar trebui să o facem pentru funcția noastră! Să încercăm asta, aplicând a numele clasei la html element, în cazul în care browserul acceptă, să zicem, text-accident vascular cerebral proprietate (pe care numai webkit-ul o are).

 dacă (suportă ('textStroke')) document.documentElement.className + = 'textStroke'; 

Pasul 8: Utilizarea

Cu clasă nume pe care îl putem acum cârlig pe, să-l încercăm în foaia de stil.

 / * backback * / h1 culoare: negru;  / * suport text-stroke * / .textStroke h1 culoare: alb; -webkit-text-stroke: 2px negru; 

Codul sursă finală

 var suport = (functie () var div = document.createElement ('div'), vendors = 'Khtml Ms O Mozk Webkit'.split ("), len = vendors.length; in () ()) if (vendors [len]] + (return) prop în div.style) // browser-ul acceptă box-shadow.Faceți ceea ce aveți nevoie./ Sau folosiți un bang (!) pentru a testa dacă browserul nu întoarce adevărul; return false;) () (dacă este acceptat ('textShadow')) document.documentElement.className + = 'textShadow';

Pentru o soluție mai cuprinzătoare, consultați biblioteca Modernizr.

Cod