variable tag javascript css css3 browser-feature-detection css-variables

javascript - tag - js dom element



¿Cómo puedo detectar el soporte de CSS Variable con JavaScript? (4)

Establezca un estilo CSS con variables CSS y getComputedStyle() con Javascript y getComputedStyle() si está configurado ... getComputedStyle() es compatible con muchos navegadores: http://caniuse.com/#feat=getcomputedstyle

HTML

<div class="css-variable-test"></div>

CSS

:root { --main-bg-color: rgb(1, 2, 3); /* or something else */ } .css-variable-test { display: none; background-color: var(--main-bg-color); }

JavaScript

var computedStyle = getComputedStyle(document.getElementsByClassName(''css-variable-test'')[0], null); if (computedStyle.backgroundColor == "rgb(1, 2, 3)") { // or something else alert(''CSS variables support''); }

FIDDLE: http://jsfiddle.net/g0naedLh/6/

La última versión de Firefox es compatible con las Variables CSS , pero Chrome, IE y muchos otros navegadores no. Debería ser posible acceder a un nodo DOM o escribir un pequeño método que devuelva si el navegador admite esta función, pero no he podido encontrar nada que actualmente pueda hacer esto. Lo que necesito es una solución que pueda usar como condición para ejecutar el código si el navegador no es compatible con la función, como por ejemplo:

if (!browserCanUseCssVariables()) { // Do stuff... }


No necesita tener Javascript para detectar si un navegador admite propiedades personalizadas, a menos que Do stuff... sea ​​el propio Javascript. Ya que para lo que estás detectando soporte es CSS, asumo que todo lo que estás tratando de hacer es todo CSS . Por lo tanto, si hay una manera de eliminar JS de este problema específico, recomendaría consultas de características .

@supports (display: var(--prop)) { h1 { font-weight: normal; } /* all the css, even without var() */ }

Consultas de características de prueba de soporte para sintaxis. No tienes que consultar para la display ; Usted podría utilizar cualquier propiedad que desee. Del mismo modo, el valor de --prop ni siquiera existe. Todo lo que está haciendo es verificar si el navegador sabe cómo leer esa sintaxis.

(Simplemente elegí display porque casi todos los navegadores lo admiten. Si usas flex-wrap o algo así, no verás los navegadores que admiten accesorios personalizados pero que no son compatibles con flexbox).

Nota: Prefiero llamarlas Propiedades personalizadas porque eso es exactamente lo que son: propiedades definidas por el autor. Sí, puede usarlos como variables, pero hay ciertas ventajas para ellos como propiedades, como la herencia DOM:

body { --color-heading: green; } article { --color-heading: blue; } h1 { color: var(--color-heading); } /* no need for descendant selectors */


Podemos hacer esto con CSS.supports . Esta es la implementación de JavaScript de la regla @supports de CSS que está disponible actualmente en Firefox, Chrome, Opera y Android Browser (ver ¿Puedo usar ... ).

Los métodos estáticos CSS.supports() devuelven un valor booleano que indica si el navegador admite una función CSS determinada o no.
- CSS.supports

Con esto, podemos simplemente:

CSS.supports(''color'', ''var(--fake-var)'');

El resultado de esto será true si el navegador admite variables CSS, y false si no lo es.

(Es posible que piense que CSS.supports(''--fake-var'', 0) funcionaría, pero como se indica en los comentarios de esta respuesta, Safari parece tener un error que hace que falle).

Ejemplo de JavaScript puro

En Firefox, este fragmento de código producirá un fondo verde, ya que nuestra llamada CSS.supports anterior devuelve true . En los navegadores que no admiten las variables CSS, el fondo será rojo.

var body = document.getElementsByTagName(''body'')[0]; if (window.CSS && CSS.supports(''color'', ''var(--fake-var)'')) { body.style.background = ''green''; } else { body.style.background = ''red''; }

Tenga en cuenta que aquí también he agregado comprobaciones para ver si existe window.CSS : esto evitará que se window.CSS errores en los navegadores que no admiten esta implementación de JavaScript y también lo consideran false . ( CSS.supports se introdujo al mismo tiempo que se introdujo CSS global, por lo que tampoco es necesario verificarlo).

Creando la función browserCanUseCssVariables()

En su caso, podemos crear la función browserCanUseCssVariables() simplemente ejecutando la misma lógica. Este fragmento a continuación alertará si es true o false dependiendo del soporte.

function browserCanUseCssVariables() { return window.CSS && CSS.supports(''color'', ''var(--fake-var)''); } if (browserCanUseCssVariables()) { alert(''Your browser supports CSS Variables!''); } else { alert(''Your browser does not support CSS Variables and/or CSS.supports. :-(''); }

Los resultados (todos probados solo en Windows)

Firefox v31

Cromo v38

Internet Explorer 11


Tuve problemas para conseguir que el método window.CSS.supports funcione para probar las variables css en Chrome 49 (aunque tiene soporte nativo). Acabé haciendo esto:

var supportsCssVars = function() { var s = document.createElement(''style''), support; s.innerHTML = ":root { --tmp-var: bold; }"; document.head.appendChild(s); support = !!(window.CSS && window.CSS.supports && window.CSS.supports(''font-weight'', ''var(--tmp-var)'')); s.parentNode.removeChild(s); return support; } console.log("Supports css variables:", supportsCssVars());

Parece funcionar en todos los navegadores que he probado. Probablemente el código puede ser optimizado sin embargo.