obtener el valor porcentual de la regla CSS en jQuery

98

Digamos que la regla es la siguiente:

.largeField {
    width: 65%;
}

¿Hay alguna manera de recuperar el '65% 'de alguna manera, y no el valor de píxel?

Gracias.

EDITAR: Desafortunadamente, el uso de métodos DOM no es confiable en mi caso, ya que tengo una hoja de estilo que importa otras hojas de estilo y, como resultado, el parámetro cssRules termina con un valor nulo o indefinido .

Este enfoque, sin embargo, podría funcionar en la mayoría de los casos sencillos (una hoja de estilo, múltiples declaraciones de estilos separada dentro de la cabeza de la etiqueta del documento).

montrealista
fuente
1
Sería mejor sembrar estos datos en el propio elemento y luego rastrear cómo cambia en el futuro.
Travis J

Respuestas:

51

No hay forma incorporada, me temo. Puedes hacer algo como esto:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Adam Lassek
fuente
19
para que quede claro, esto no te dice el valor de tu estilo, te da un valor calculado
Anthony Johnston
2
@shevski funciona bien, debe agregar class="largeField"al intervalo, actualmente está seleccionando un conjunto vacío.
Adam Lassek
Sé lo que no funciona y por eso es un contraejemplo.
shevski
2
@shevski mi ejemplo da un valor calculado de un elemento existente en la página, como Anthony ya señaló hace un año. Tus comentarios son superfluos.
Adam Lassek
@AdamLassek, Anthony no dijo que la mayoría existe.
shevski
116

La forma más fácil

$('.largeField')[0].style.width

// >>> "65%"
redexp
fuente
50
Solo una nota: esto solo funcionará con CSS aplicado directamente en el elemento (por ejemplo style="width:65%").
brianreavis
3
¡¡Excelente!! Para devolver solo los números: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago
4
Tiago, puedes usar parseFloat ().
Gavin
Esto solo funciona en el estilo en línea como dijo @brianreavis.
Akansh
84

¡Esto es definitivamente posible!

Primero debe ocultar () el elemento padre. Esto evitará que JavaScript calcule píxeles para el elemento secundario.

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

Mira mi ejemplo .

Ahora ... me pregunto si soy el primero en descubrir este truco :)

Actualizar:

Un trazador de líneas

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

Dejará un elemento oculto antes de la </body>etiqueta, que es posible que desee .remove().

Vea un ejemplo de una sola línea .

¡Estoy abierto a mejores ideas!

timofey.com
fuente
1
Esta debería ser la solución aceptada. También puedo confirmar que funciona para mí cuando las otras respuestas no obtienen el valor porcentual asignado originalmente.
EricP
1
Para evitar el parpadeo, clone el hijo, oculte el padre y luego recupere el ancho. var clone = $ ('. hijo'). clone ();
user1491819
3
Actualización: función getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('child width:' + getCssWidth ('. child')) ;;
user1491819
1
¡Solución impresionante! Aquí hay un equivalente en pure-js del script jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti
1
Si la respuesta $ (...) [0] .style.width funciona, ¿no debería ser esa la solución aceptada? Esta solución, aunque elegante, adolece de algunas deficiencias de rendimiento.
Mihai Danila
44

Podrías acceder al document.styleSheetsobjeto:

<style type="text/css">
    .largeField {
        width: 65%;
    }
</style>
<script type="text/javascript">
    var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
    for (var i=0; i < rules.length; i++) {
        var rule = rules[i];
        if (rule.selectorText.toLowerCase() == ".largefield") {
            alert(rule.style.getPropertyValue("width"));
        }
    }
</script>
Gumbo
fuente
8
+1 uso adecuado de los métodos DOM (a veces jQuery no es la respuesta)
bobince
1
+1 Estoy contigo aquí para mayor precisión. Tengo curiosidad por saber cómo lo admite cada navegador, pero esta es la respuesta correcta.
cgp
Funciona bien en casos más simples, tanto FF como IE7, pero no para mí (ver EDITAR arriba).
montrealist
1
¿También ha intentado revisar todas las hojas de estilo? Mi ejemplo acaba de usar el primer ( styleSheets[0]).
Gumbo
Lo siento si esta es una pregunta de novato, pero ¿cómo for (var i=0; rules.length; i++)funcionaría? ¿No debería serfor (var i=0; i<rules.length; i++)
Sbichenko
18

Tarde, pero para los usuarios más nuevos, intente esto si el estilo CSS contiene un porcentaje :

$element.prop('style')['width'];
ddanona
fuente
Funcionó como un encanto para el tamaño de fuente css. $ element.prop ('estilo') ['tamaño de fuente];
Jason
10

Un complemento de jQuery basado en la respuesta de Adams:

(function ($) {

    $.fn.getWidthInPercent = function () {
        var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
        return Math.round(100*width)+'%';
    };

})(jQuery);

$('body').html($('.largeField').getWidthInPercent());​​​​​

Devolverá '65% '. Solo devuelve números redondeados para que funcione mejor si te gusta if (ancho == '65%'). Si hubiera usado la respuesta de Adams directamente, eso no había funcionado (obtuve algo como 64.93288590604027). :)

Leonard Pauli
fuente
3

Sobre la base de la excelente y sorprendente solución de timofey, aquí hay una implementación pura de Javascript:

function cssDimensions(element)
  var cn = element.cloneNode();
  var div = document.createElement('div');
  div.appendChild(cn);
  div.style.display = 'none';
  document.body.appendChild(div);
  var cs = window.getComputedStyle
    ? getComputedStyle(cn, null)
    : cn.currentStyle;
  var ret = { width: cs.width, height: cs.height };
  document.body.removeChild(div);
  return ret;
}

Espero que sea de ayuda para alguien.

Gregory Magarshak
fuente
un error de sintaxis, lo olvidó {al final de la primera línea.
Akansh
solo esta solución muestra correctamente 'auto' cuando el ancho para div no está establecido, jquery css ('width') devuelve '0px'. todas las demás respuestas incorrectas ...
Alexey Obukhov
0

Puede poner los estilos a los que necesita acceder con jQuery en:

  1. el encabezado del documento directamente
  2. en una inclusión, qué script del lado del servidor coloca en el encabezado

Entonces debería ser posible (aunque no necesariamente fácil) escribir una función js para analizar todo dentro de las etiquetas de estilo en el encabezado del documento y devolver el valor que necesita.

whereresrhys
fuente
0

Puede usar la función css (ancho) para devolver el ancho actual del elemento.

es decir.

var myWidth = $("#myElement").css("width");

Véase también: http://api.jquery.com/width/ http://api.jquery.com/css/

user267867
fuente
¿Por qué está marcado? hay un error abierto en este bugs.jquery.com/ticket/4772 , parece que hay alguna inconsistencia al llamar esto dependiendo de si pones tu estilo en línea o en una hoja de estilo jsfiddle.net/boushley/MSyqR/2
Anthony Johnston
1
No puedo obtener% con esto
alguien inútil
0

No hay nada en jQuery y nada sencillo incluso en javascript. Tomando la respuesta de timofey y ejecutándola, creé esta función que funciona para obtener las propiedades que desee:

// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for 
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
    if(!(properties instanceof Array)) properties = [properties]

    var parent = domNode.parentNode
    if(parent) {
        var originalDisplay = parent.style.display
        parent.style.display = 'none'
    }
    var computedStyles = getComputedStyle(domNode)

    var result = {}
    properties.forEach(function(prop) {
        result[prop] = computedStyles[prop]
    })

    if(parent) {
        parent.style.display = originalDisplay
    }

    return result
}
BT
fuente
0

Convierta de píxeles a porcentaje mediante la multiplicación cruzada .

Configuración de fórmula:

1.) (element_width_pixels / parent_width_pixels) = (element_width_percentage / 100)

2.) element_width_percentage = (100 * element_width_pixels) / parent_width_pixels

El código real:

<script>

   var $width_percentage = (100 * $("#child").width()) / $("#parent").width();

</script>
Zachary Horton
fuente