2012-01-10 12 views
11

En una aplicación donde ciertos elementos tienen propiedades de CSS personalizadas, ¿hay alguna forma de recuperar dicho valor a través de JavaScript?Obtener las propiedades de css personalizadas del elemento (-mystyle) usando JavaScript

p. Ej.

<div id="myDiv" style="color:#f00;-my-custom-property:upsidedown;" /> 

puedo tener acceso al atributo de color a través de estos dos métodos:

$('myDiv').style.getPropertyValue("color") 
$('myDiv').style.color 

Pero estos no funcionan para las propiedades personalizadas. ¿Esto es compatible?

+0

¿Está utilizando jQuery? –

+1

¿Qué marco estás usando? Actualmente estoy adivinando Prototype.js. Si es así, etiquetarlo prototype.js. Para responder a su pregunta, no se pueden obtener propiedades CSS inexistentes, ya que se ignoran. –

+0

No, estoy usando Prototype.Pero me gustaría ver una solución jQuery, aunque solo sea para darme ideas. –

Respuesta

12

Los valores CSS no utilizados por el navegador se descartan y no se pueden obtener a través del .style. Las otras dos opciones están disponibles, sin embargo:

1. atributo personalizado

Usar un atributo personalizado, según la definición de HTML5. Entonces, simplemente recupera el valor de ese atributo. Esta es la ruta recomendada.

HTML <div id="myDiv" style="color:#f00;" data-custom-property="upsidedown" />

2. Analizar style Atributo

Recuperar el valor del atributo style (no .style) y analizarlo en pares nombre/valor. Luego use el valor que se establece con el nombre -my-custom-property. Mientras esto funciona, es un poco complicado, y desaconsejo su uso.

+3

Esto no proporciona una cascada, que es una especie de punto. Es mejor "tomar prestado" un atributo CSS válido que puede tomar cualquier valor y tiene un comportamiento heredable. –

+3

"Mejor" pedir prestado "un atributo de CSS válido que puede tomar cualquier valor y tiene un comportamiento heredable" - como? –

+0

"contenido" haría el truco. No aplica ningún estilo, se conecta en cascada y acepta cualquier valor. –

7

Las propiedades de CSS no reconocidas se ignorarán cuando se incluyan en el atributo style, o en la propiedad style.cssText.

Si desea definir una propiedad a un elemento específico, recomiendo data-attributes:
HTML:

<div id="myDiv" style="color:#f00;" data-custom-property="upsidedown" /> 

JavaScript:

//jQuery's method to retrieve value: 
$("#myDiv").data("custom-property"); 
//jQuery, without parsing: 
$("#myDiv").attr("data-custom-property"); 

// Modern browsers, native JS: 
document.getElementById("myDiv").dataset["custom-property"]; 
// Older browsers, native JS: 
document.getElementById("myDiv").getAttribute("data-custom-property"); 
-2

No puede utilizar Data- * atributos (html5)? Eso al menos sería válido y no un hack extraño.

1
function getCustomCssProperty(elementID, propertyName){ 
    var style = document.getElementById(elementID).getAttribute("style"); 
    var entries = style.split(";"); 

for (var i=0; i<entries.length; i++){ 
    var entry = entries[i].split(":"); 
    if(entry[0] == propertyName){ 
    return entry[1]; 
    } 
} 

return null; 

} 
+1

Esto es bueno, pero sería propenso a error en el caso de que un punto y coma estuviera entre comillas en el atributo de estilo (por ejemplo, como parte de una url). –

2

Esto es en realidad ahora es posible para todos los navegadores que utilizan un truco CSS especializada a través de la etiqueta content CSS. En este artículo se explica cómo hacerlo:

http://www.yearofmoo.com/2015/04/cross-browser-custom-css-properties.html

+0

Interesante, pero como este es un truco (complejo, para algunos) y no por especificación, sigo creyendo que la respuesta "correcta" es no usar CSS para las propiedades personalizadas y, en su lugar, usar el atributo de datos. +1 para el consejo, ¡siempre es bueno aprender un nuevo truco! :) –

6

CSS:

:root { 
    --custom-property: #000000; 
} 

Javascript:

var custom_property = window.getComputedStyle(document.body).getPropertyValue('--custom-property').trim() 
+1

Brillante. ¡No sabía sobre el método window.getComputedStyle de acceder a estos a través de JS! Gracias a un molino – Ryan

+0

Esto definitivamente parece ser la respuesta correcta, porque la mayoría de las alternativas requieren cambiar el documento (no solo el CSS). Sin embargo, parece que vale la pena mencionar que (a) los nombres de propiedades personalizadas tienen que comenzar con guiones; y (b) dichos valores se heredan, por lo que su ejemplo puede obtener una propiedad raíz del cuerpo. – TextGeek

Cuestiones relacionadas