Snabbtips Upptäck CSS3-stöd i webbläsare med JavaScript

Är det inte kul att vi får spela med de senaste CSS-teknikerna, som skuggor och övergångar? Det finns bara ett problem: hur kompenserar vi, eller mer viktigt, upptäcka webbläsare som inte stöder dem? Tja, det finns några lösningar. I denna handledning och skärmdump kommer vi dock att skapa en JavaScript-funktion som accepterar ett CSS-fastighetsnamn som dess parameter och kommer att returnera en boolean, Indikerar om webbläsaren stöder den överförda egenskapen eller inte.


Föredrar en video-handledning?

tryck på HD knappen för en tydligare bild.

Prenumerera på vår YouTube-sida för att titta på alla videohandledning!


Steg 1

Låt oss börja med att bestämma på vilket sätt vi vill ringa vår fungera. Vi kommer att hålla det enkelt här; något som följande bör göra tricket:

 om (stöder ('textShadow')) document.documentElement.className + = 'textShadow'; 

Det borde vara finalen fungera ring upp. När vi skickar ett CSS-fastighetsnamn till stöd () funktion kommer det att returnera a boolean. Om Sann, vi bifogar en klassnamn till documentElement, eller . Detta ger oss ett nytt "klass" namn för att haka på, från vårt stilark.


Steg 2

Nästa ska vi konstruera stöder () funktionen.

 var stöder = (funktion () ) ();

Varför gör vi inte bärare lika med en standardfunktion? Svaret är att vi har lite av prep arbeta för att göra först och det finns absolut ingen anledning att upprepa dessa uppgifter om och om igen varje en gång som funktionen heter. I sådana fall är det bäst att göra bärare lika med vad som är tillbaka från den självförverkande funktionen.


Steg 3

För att testa om webbläsaren stöder specifika egenskaper måste vi skapa ett * dummy * -element för testning. Detta genererade element kommer aldrig att faktiskt införas i DOM; Tänk på det som en testdummy!

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

Som du är medveten om finns det en handfull leverantörs prefix som vi kan använda när du arbetar med CSS3 egenskaper:

  • -moz
  • -webkit
  • -o
  • -Fröken
  • -khtml

Vår JavaScript måste filtrera igenom dessa prefix och testa dem. Så, låt oss placera dem i en array; vi ringer det, säljare.

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

Använda dela() funktion för att skapa en array från en sträng är visserligen lat, men det sparar en handfull sekunder!

Som vi filtrerar genom det här array, låt oss vara bra pojkar och flickor, och cache längd av array också.

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

De prep Arbetet ovan är statiskt, i naturen, och behöver inte upprepas varje gång vi ringer stöd (). Det är därför vi kör det bara en gång, när sidan laddas. Nu, låt oss lämna tillbaka de fungera som faktiskt kommer att tilldelas bärare variabel.

 returfunktion (prop) ;

Skönheten i förslutningar är det, trots att stöd () är lika med den som returneras fungera, det har fortfarande tillgång till div, säljare, och len variabler.


Steg 4

Det omedelbara testet: om den överförda egendomen är tillgänglig för div's stil attribut, vi vet att webbläsaren stöder egenskapen; så returnera sant.

 returfunktion (prop) om (prop i div.style) returnerar true; ;

Tänk på, säg, text-shadow CSS3-egenskapen. De flesta moderna webbläsare stöder det, utan att det behövs ett leverantörs prefix. Med det i åtanke, varför filtrera igenom alla prefix om vi inte behöver? Därför placerar vi det här kontrollera på toppen.


Steg 5

Du brukar brukade skriva CSS3-fastighetsnamn, så här: -moz-box-shadow. Men om du, i Firebug, granskar du stil objekt, du kommer att märka att det är stavat, MozBoxShadow. Som sådan, om vi testar:

 "mozboxShadow" i div.style // false

Falsk kommer att returneras. Detta värde är skiftlägeskänsligt.

Detta innebär att om användaren passerar boxShadow till stöd () funktion, det kommer att misslyckas. Låt oss tänka framåt och kontrollera om argumentets första bokstav är liten. Om det är så fixar vi felet för dem.

 returfunktion (prop) om (prop i div.style) returnerar true; prop = prop.replace (/ ^ [a-z] /, funktion (val) return val.toUpperCase ();); ;

Regelbundna uttryck till räddningen! Ovan kontrollerar vi om det finns en enda liten bokstav i början av strängen (^). Endast under förutsättning att man hittas använder vi toUpperCase () funktion för att aktivera brevet.


Steg 6

Vi måste sedan filtrera genom säljare array och test om det finns en matchning. Till exempel, om box-shadow är klar, vi borde testa om stil attribut av div innehåller något av följande:

  • MozBoxShadow
  • WebkitBoxShadow
  • MsBoxShadow
  • OBoxShadow
  • KhtmlBoxShadow

Om en match hittas kan vi returnera sant, eftersom webbläsaren verkligen ger stöd för boxskuggor!

 returfunktion (prop) om (prop i div.style) returnerar true; prop = prop.replace (/ ^ [a-z] /, funktion (val) return val.toUpperCase ();); medan (len--) om (leverantörer [len] + prop i div.style) return true; ;

Även om vi kunde använda a för uttalande att filtrera genom array, det finns inget verkligt behov i det här fallet.

  • Ordern är inte viktig
  • medan uttalanden är snabbare att skriva och kräver färre tecken
  • Det är en liten prestationsförbättring

Var inte förvirrad av leverantörer [len] + prop; helt enkelt ersätta de namnen med deras verkliga värden: MozBoxShadow.


Steg 7

Men, om inget av dessa värden matchar? I så fall tycks webbläsaren inte stödja fastigheten, i vilket fall vi borde returnera falskt.

 medan (len--) om (leverantörer [len] + prop i div.style) return true;  returnera false;

Det borde göra det för vår funktion! Låt oss testa det genom att tillämpa en klassnamn till html element, om webbläsaren stöder, säg, text-stroke egendom (som endast webkit gör).

 om (stöder ('textStroke')) document.documentElement.className + = 'textStroke'; 

Steg 8: Användning

Med en klass namn som vi kan nu krok på, låt oss prova det i vårt stilark.

 / * fallback * / h1 färg: svart;  / * text-stroke support * / .textStroke h1 färg: vit; -webkit-text-stroke: 2px svart; 

Slutlig källkod

 var stöder = (funktion () var div = document.createElement ('div'), säljare = 'Khtml Ms O Moz Webkit'.split ("), len = vendors.length, return function i div.style) returnera true; prop = prop.replace (/ ^ [az] /, funktion (val) return val.toUpperCase ();); medan (len--) if (leverantörer [len] + prop i div.style) // webbläsare stöder boxskugga. Gör vad du behöver. // Eller använd ett bang (!) för att testa om webbläsaren inte. returnera true; return false;;) (); om (stöder ('textShadow')) document.documentElement.className + = 'textShadow';

För en mer omfattande lösning, se Modernizr-biblioteket.