2010-08-20 12 views
16

Al tratar de calcular el ancho de un elemento oculto encontré que jquery.width() devuelve 0 para el ancho de ese elemento.Convertir cadena de ancho css al número normal

Descubrí que usar jquery.css ('ancho') devolvería el ancho correcto utilizando el ancho de estilo declarado (incluso si ese valor es diferente de la hoja de estilo inicial). El problema es que el método css ('ancho') devuelve una cadena, generalmente en forma de "100px". Mi pregunta se resuelve en: ¿cómo recuperar el número de la cadena "100px"? ¿Hay alguna manera fácil?

+0

Modificación: El elemento que estoy tratando de calcular el ancho se puede cambiar de tamaño y se puede ocultar durante la ejecución, por lo tanto, su ancho cambiará con el tiempo. – vitorhsb

Respuesta

23

Si siempre devuelve en formato px, "100px", "50px", etc (es decir, no "em" o porcentaje), usted podría ...

var width = parseInt($("#myelem").css("width"),10); // always use a radix 

o

var width = parseInt(element.style.width,10); // always use a radix 

Ignora el sufijo "px" por lo que deberías estar listo.

Aunque en el fondo estoy pensando que algo no está bien si $ ("# myelem"). Width() no funciona.

Nota sobre elementos ocultos.

Si está agregando jQuery para mejorar progresivamente su página, el elemento que está calculando debe estar visible cuando la página se carga por primera vez. Entonces debería obtener el ancho antes de ocultar inicialmente el elemento. Al hacer esto, $ ("# myelem"). Width() funcionará.

var myWidth = 0; 

$(document).ready(function() { 
    myWidth = $("#myelem").width(); 
    $("#myelem").hide(); 
}); 
+1

La razón por la cual '.width()' no funciona es que si los objetos están ocultos por '.hide()' ('display: none') no contribuyen al diseño y, por lo tanto, no tienen ancho. –

+0

Ah. Proporcionaré una solución para eso ... – Fenton

+0

El elemento que estoy tratando de calcular el ancho es redimensionable y puede ocultarse durante la ejecución, por lo tanto su ancho cambiará eventualmente. Así, como sugirió, puedo usar una variable para mantener su valor que se calcula en el evento '.ready()' de la página y en cada evento de devolución de llamada de redimensionamiento debo recalcular, usando '.width()' - y aplicar el nuevo valor. Por lo tanto, incluso cuando el elemento esté oculto, tendré el valor actual. – vitorhsb

1

Ah, se me ocurrió:
new Number($elem.css('width').slice(0, -2));
//to extract the 'px' and return a regular number

Ahora sólo espero que jQuery devuelve Allways la misma manera cadena: "100px"

+1

Lo hará si los ha definido todos como 'px'. Sin embargo, si tiene algunos anchos como '%', volverá a aparecer como '50%' y su función de corte recortará el dígito más a la derecha. Puede usar 'indexOf' para probar' px' por seguridad. – Pat

+1

o puede eliminar elementos no numéricos con una expresión regular. Esto funciona independientemente de cómo defina el ancho ('px',' em', '%', 'pt') js:' Number (elem.style.width.replace (/ [^ \ d \.]/G, '')); 'o jQuery:' Number ($ elem.css ('width'). replace (/ [^ \ d \.]/g, '')); ' – hofnarwillie

0

que se pegaba a .width(), ya que en realidad recibe el ancho calculado en lugar de ancho css. En lugar de ocultarlo con .hide() (display: none), podría ocultarlo con .css('visible', 'hidden') y luego .width() debería funcionar.

de mi comentario Si no desea cambiar su de entonces se podría aplicar visible: hidden y posteriormente .show() y luego medir la altura .hide(). Después de haberlo medido, invierte eso. Los objetos aún afectan el diseño de la página cuando están ocultos por visible: hidden - ten cuidado con eso.

Para evitar las etiquetas que alteran el diseño, puede establecer la posición en absoluta, moverla a la etiqueta del cuerpo y luego medir.

+0

Acepto usar el ancho calculado. De hecho, el elemento estaba oculto en el evento de la página de carga, más unos pocos más .hide. Cambié el CSS de "pantalla: ninguno" a "visibilidad: oculto" y luego pude leer los mismos valores usando .width(). Súper. Ahora, todo lo que tengo que hacer es cambiar todos los extractos de .hide() en su .css('visible', 'hidden') sugerido. Sospecho que también necesito cambiar el .show() en .css('visibility', 'visible'). Gracias. – vitorhsb

+0

en lugar de hacer todo ese trabajo. Luego puede aplicar 'visible: hidden' y luego' .show() 'y luego medir el ancho. Después de haberlo medido, invierte eso. Entonces no tienes que cambiar tanto. Los objetos aún afectan la página cuando están ocultos por 'visible: hidden' - ten cuidado con eso. –

2

Puede eliminar elementos no numéricos con una expresión regular y luego simplemente convertir a un número. Esto funciona independientemente de cómo defina el ancho (px, em, %, pt). Conserva puntos decimales también

vainilla Javascript

Number(elem.style.width.replace(/[^\d\.\-]/g, '')); 

jQuery

Number($elem.css('width').replace(/[^\d\.\-]/g, '')); 
0

En la llanura de JavaScript:

parseInt('100px', 10) 

Obras con "100em", "100%", e incluso con : "100". No es necesario ningún patrón de Expresión regular.

Cuestiones relacionadas