¿Cómo hacer que jQuery no redondee el valor devuelto por .width ()?

94

He buscado alrededor y no pude encontrar esto. Estoy tratando de obtener el ancho de un div, pero si tiene un punto decimal, redondea el número.

Ejemplo:

#container{
    background: blue;
    width: 543.5px;
    height: 20px;
    margin: 0;
    padding: 0;
}

Si lo hago $('#container').width();, devolverá 543 en lugar de 543,5. ¿Cómo consigo que no redondee el número y devuelva el 543,5 completo (o el número que sea)?

MoDFoX
fuente
2
¿Por qué tiene anchos de píxeles decimales? De todos modos, se redondean a números enteros. No puedes tener medio píxel.
Moin Zaman
¿Por qué necesitas esto? Sin esa información, esta pregunta no tiene sentido.
Juan Mendes
2
@JuanMendes En mi caso, en una pantalla HiDPI, Chrome 38 calcula un ancho de ventana no entero. Entonces, si $ .width se redondea, digamos, 1250.6 a 1251, y hago cálculos basados ​​en 1251, tengo problemas. Redondear a la baja no es un gran problema.
JKS

Respuestas:

196

Utilice el estilo nativo en Element.getBoundingClientRectlugar del estilo del elemento. Se introdujo en IE4 y es compatible con todos los navegadores:

$("#container")[0].getBoundingClientRect().width

Nota: Para IE8 y versiones anteriores, consulte las notas de "Compatibilidad del navegador" en los documentos de MDN.

Ross Allen
fuente
9
+1 Si está configurando el ancho de otro elemento, asegúrese de cambiar su ancho de esta manera: $ ("# otro"). Css ("ancho", $ ('# contenedor'). Get (0) .getBoundingClientRect ( ) .width + "px"); Si usa jQuery width (), el valor se redondeará.
lepe
1
De acuerdo con esta pregunta similar, las propiedades widthy heightno son compatibles con todas las versiones de IE, por lo que en algunos casos es necesario calcularlas antes de poder
usarlas
¡Agradable! la misma pregunta para outerWidth (verdadero)? :) pequeña observación: `En IE8 y versiones anteriores, el objeto DOMRect devuelto por getBoundingClientRect () carece de propiedades de altura y ancho. Además, las propiedades adicionales (incluida la altura y el ancho) no se pueden agregar a estos objetos DOMRect. '
TecHunter
5
Tenga en cuenta que getBoundingClientRect()calcula las dimensiones después de aplicar transformaciones CSS .
user1620220
Después de probar, descubrí que este método no funciona para elementos ocultos ( display: none).
Jory Hogeveen
9

Solo quería agregar mi experiencia aquí, aunque la pregunta es vieja: el consenso anterior parece ser que el redondeo de jQuery es efectivamente tan bueno como un cálculo no redondeado, pero ese no parece ser el caso en algo que he estado haciendo .

Mi elemento tiene un ancho fluido, en general, pero un contenido que cambia dinámicamente a través de AJAX. Antes de cambiar el contenido, bloqueo temporalmente las dimensiones del elemento para que mi diseño no rebote durante la transición. Descubrí que usar jQuery así:

$element.width($element.width());

está causando algo de gracia, como si hubiera diferencias de subpíxeles entre el ancho real y el ancho calculado. (Específicamente, veré una palabra saltar de una línea de texto a otra, lo que indica que se ha cambiado el ancho, no solo bloqueado). De otra pregunta: obteniendo el ancho real de punto flotante de un elemento , encontré out que window.getComputedStyle(element).widthdevolverá un cálculo sin redondear. Así que cambié el código anterior a algo como

var e = document.getElementById('element');
$('#element').width(window.getComputedStyle(e).width);

Y con ESE código, ¡ no hay rebotes divertidos! Esa experiencia parece sugerir que el valor no redondeado realmente es importante para el navegador, ¿verdad? (En mi caso, Chrome versión 26.0.1410.65.)

Davidtheclark
fuente
El documento actual para .css () de jQuery señala que getComputedStyle () se llama runtimeStyle () i IE, y afirma que una de las ventajas de .css () es esta interfaz unificada.
norwebian
9

La respuesta de Ross Allen es un buen punto de partida, pero el uso de getBoundingClientRect (). Width también incluirá el relleno y el ancho del borde, que no es el caso de la función de ancho de jquery :

El objeto TextRectangle devuelto incluye el relleno, la barra de desplazamiento y el borde, pero excluye el margen. En Internet Explorer, las coordenadas del rectángulo delimitador incluyen los bordes superior e izquierdo del área del cliente.

Si su intención es obtener el widthvalor con precisión, tendrá que eliminar el relleno y el borde de esta manera:

var a = $("#container");
var width = a[0].getBoundingClientRect().width;

//Remove the padding width (assumming padding are px values)
width -= (parseInt(a.css("padding-left")) + parseInt(a.css("padding-right")));

//Remove the border width
width -= (a.outerWidth(false) - a.innerWidth());
El_Pitufo_Negro
fuente
No debería el .replace("px", "")as parseIntdebería eliminarlo por usted.
Steve Schrab
Esta pregunta trata sobre la prevención del redondeo, estoy desconcertado por la suposición explícita aquí de que el redondeo está bien para los valores de relleno. ¿Por qué tratarías eso de manera diferente a los valores de ancho? ¿Usar parseFloat()quizás?
phils
De manera similar, al innerWidth()ser parte del problema original, me temo que el cálculo del ancho del borde aquí también funciona con valores redondeados.
phils
2

Puede utilizar getComputedStylepara ello:

parseFloat(window.getComputedStyle($('#container').get(0)).width)
Anton Chukanov
fuente
-1

Utilice lo siguiente para obtener un ancho preciso:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;
Ali Hasan
fuente
¿Por qué evne querría que jquery obtenga su ancho calculado si realmente lo configura y lo tiene disponible enstyle.width
user151496