2012-03-16 21 views
21

¿Cómo se puede obtener una propiedad CSS de elementos (por ejemplo, ancho/alto) tal como se estableció con reglas CSS? en cualquier unidad que se haya configurado (por ejemplo, por ciento/em/px)? (En Google Chrome, preferiblemente sin marcos).Obtiene el valor de propiedad del elemento CSS (ancho/alto) tal como se configuró (en porcentaje/em/px/etc)

El uso de getComputedStyle devuelve el valor actual en píxeles, igual que css() en jQuery.

Por ejemplo:

<div class="b">first</div> 
<div id="a" class="a">second</div> 

<style> 
    div  { width: 100px; } 
    x, div#a { width: 50%; } 
    .a  { width: 75%; } 
</style> 

Mientras iterar todos div elementos en este ejemplo, me gustaría ser capaz de obtener la segunda div s ancho que 50% (y el primero como 100px).


El inspector de elementos de Chrome puede mostrar el valor de la propiedad de CSS tal como se configuraron, por lo que debería ser posible en Chrome.

Chrome element inspector showing property value as they were set


No es un duplicado exacto de la cuestión vinculada, ya que la respuesta aceptada hay un truco simple que produce un ancho porcentaje no importa qué tipo de ancho se establece. Y para el resto, ¿tiene que saber el selector utilizado para hacer la regla activa? ¿Cómo lo sabría uno?

+1

este la respuesta podría ser lo que está buscando: http://stackoverflow.com/a/744450/684934 – bdares

+0

Esas respuestas no son del todo adecuadas ya que necesito obtener el valor de alguna manera a través del elemento, no en un selector específico. ** ¡No duplicado exacto! ** – Qtax

+0

% solo es relevante en el contexto de su elemento padre, por lo que tendría que resolverlo en función de los anchos comparativos de los elementos actuales y principales – Dan

Respuesta

1

¡Buenas noticias a todos! Parece que hay un CSS Typed OM en su camino en los borradores w3.

Al leer rápidamente este documento, parece que el objetivo de esta es la especificación de, para facilitar el acceso de los valores de CSSOM desde javascript.

La parte realmente importante de esto para nosotros aquí es que vamos a tener una API CSSUnitValue, que será capaz de analizar los valores CSS a un objeto de forma

{ 
    value: 100, 
    unit: "percent", // | "px" | "em" ... 
    type: "percent" // | "length" 
} 

y un método Window.getComputedStyleMap(), desde de lo cual podremos obtener los valores realmente aplicados en nuestros elementos.

A partir de hoy, parece que sólo Chrome se ha iniciado la implementación de él sin embargo, y hay que cambiar en la plataforma Web Experimental características bandera en about:flags ...

(() => { 
 
    if (!window.getComputedStyleMap && !Element.prototype.computedStyleMap) { 
 
    console.error("Your browser doesn't support CSS Typed OM"); 
 
    return; 
 
    } 
 
    document.querySelectorAll('.test') 
 
    .forEach((elem) => { 
 
     let styleMap; 
 
     // As defined in specs' drafts 
 
     if (window.getComputedStyleMap) { 
 
     styleMap = window.getComputedStyleMap(elem); 
 
     } 
 
     // Currently Chrome attaches it to the Element proto 
 
     else styleMap = elem.computedStyleMap(); 
 

 
     const widthValue = styleMap.get('width'); 
 
     console.log(elem, widthValue); 
 
    }); 
 

 
/* outputs 
 

 
    <div class="b test">first</div> 
 
    CSSUnitValue { 
 
    "type": "length", 
 
    "unit": "px", 
 
    "value": 100, 
 
    [__proto__] 
 
    } 
 
    
 
    <div id="a" class="a test">second</div> 
 
    CSSUnitValue { 
 
    "type": "percent", 
 
    "unit": "percent", 
 
    "value": 50, 
 
    [__proto__] 
 
    } 
 

 
*/ 
 

 
})();
div.test { width: 100px; } 
 
x,div#a { width: 50%; } 
 
.a { width: 75%; }
<div class="b test">first</div> 
 
<div id="a" class="a test">second</div>

+0

Luce bien. ¿Qué resultado devolvería el ejemplo de código para el ancho? ¿Podría agregar eso a la respuesta para que sea más fácil ver lo que hace? – Qtax

+0

@Qtax buen punto, agregué el resultado como un comentario en el fragmento del código – Kaiido

21

no es tan tan simple como llamar a WebKits getMatchedCSSRules(), devuelve las reglas coincidentes por orden de prioridad (aunque no he visto ninguna mención de esta orden en los documentos), pero el orden no toma en cuenta la importancia de la propiedad. tant prioridad y no incluye estilos de elemento. Así que terminé con esta función:

getMatchedStyle

function getMatchedStyle(elem, property){ 
    // element property has highest priority 
    var val = elem.style.getPropertyValue(property); 

    // if it's important, we are done 
    if(elem.style.getPropertyPriority(property)) 
     return val; 

    // get matched rules 
    var rules = getMatchedCSSRules(elem); 

    // iterate the rules backwards 
    // rules are ordered by priority, highest last 
    for(var i = rules.length; i --> 0;){ 
     var r = rules[i]; 

     var important = r.style.getPropertyPriority(property); 

     // if set, only reset if important 
     if(val == null || important){ 
      val = r.style.getPropertyValue(property); 

      // done if important 
      if(important) 
       break; 
     } 
    } 

    return val; 
} 

Ejemplo

Teniendo en cuenta las siguientes reglas del código y de estilo:

<div class="b">div 1</div> 
<div id="a" class="a d2">div 2</div> 
<div id="b" class="b d3" style="width: 333px;">div 3</div> 
<div id="c" class="c d4" style="width: 44em;">div 4</div> 

<style> 
div  { width: 100px; } 
.d3  { width: auto !important; } 
div#b { width: 80%; } 
div#c.c { width: 444px; } 
x, div.a { width: 50%; } 
.a  { width: 75%; } 
</style> 

este JS código

var d = document.querySelectorAll('div'); 

for(var i = 0; i < d.length; ++i){ 
    console.log("div " + (i+1) + ": " + getMatchedStyle(d[i], 'width')); 
} 

da los siguientes anchos de las div s:

div 1: 100px 
div 2: 50% 
div 3: auto 
div 4: 44em 

(At jsFiddle)

+0

Es una gran función que ha escrito, pero solo devuelve las reglas de estilo en línea, no las reglas definidas en el CSS. ¿Cómo obtener esos? aunque es una función muy útil. – Pramod

+1

@Pramod, la función devuelve valores CSS escritos en reglas CSS (ese es el objetivo), como puede ver si observa más de cerca el ejemplo. Pero solo está hecho para navegadores compatibles con 'getMatchedCSSRules()', es decir Chrome y otros navegadores basados ​​en WebKit/Blink (como se solicitó en la pregunta). Lástima que más navegadores no lo admiten. Altho Mozilla tiene una solicitud de características para implementarlo: https://bugzilla.mozilla.org/show_bug.cgi?id=438278 – Qtax

+0

funciona en safari y en cromo ... no en FF ... enfermo todavía, ¡¡GRACIAS !!! –

2

Hay una entrada duplicada nueva con una gran respuesta here. Esa respuesta fue para jQuery, pero es fácil de implementar in pure js.

function getDefaultStyle(element, prop) { 
    var parent = element.parentNode, 
     computedStyle = getComputedStyle(element), 
     value; 
    parent.style.display = 'none'; 
    value = computedStyle.getPropertyValue(prop); 
    parent.style.removeProperty('display'); 
    return value; 
} 
+2

Esto no obtiene los valores en las mismas unidades que el autor, pero sí le da el ' px', '%' o 'auto', que puede ser lo suficientemente bueno para algunas aplicaciones. Entonces, el truco es configurar el padre para que no muestre ninguno y obtener el estilo calculado. Interesante. +1 – Qtax

+0

Esto es genial ... Me sorprende que funcione en absoluto, pero no parece funcionar para unidades de ventana (vh, vw, etc.). – Andrew

Cuestiones relacionadas