Comment faire en sorte que jQuery ne arrondisse pas la valeur retournée par .width ()?

94

J'ai cherché et je n'ai pas trouvé ça. J'essaie d'obtenir la largeur d'un div, mais s'il a un point décimal, il arrondit le nombre.

Exemple:

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

Si je le fais, $('#container').width();il retournera 543 au lieu de 543,5. Comment faire pour ne pas arrondir le nombre et renvoyer le 543,5 complet (ou quel que soit le nombre).

MoDFoX
la source
2
Pourquoi avez-vous des largeurs de pixels décimales? Ils sont arrondis de toute façon à des nombres entiers. Vous ne pouvez pas avoir un demi-pixel.
Moin Zaman
Pourquoi en avez-vous besoin? Sans cette information, cette question est inutile.
Juan Mendes
2
@JuanMendes Dans mon cas, sur un écran HiDPI, Chrome 38 calcule une largeur de fenêtre non entière. Donc, si $ .width arrondit, disons, 1250,6 à 1251, et que je fais des calculs basés sur 1251, j'ai des problèmes. Arrondir n'est pas aussi un problème.
JKS

Réponses:

197

Utilisez le natif Element.getBoundingClientRectplutôt que le style de l'élément. Il a été introduit dans IE4 et est pris en charge par tous les navigateurs:

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

Remarque: pour IE8 et les versions antérieures, reportez-vous aux notes «Compatibilité du navigateur» dans la documentation MDN.

Ross Allen
la source
9
+1 Si vous définissez la largeur d'un autre élément, veillez à modifier sa largeur de cette manière: $ ("# other"). Css ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + "px"); Si vous utilisez jQuery width (), la valeur sera arrondie.
lepe
1
Selon cette question similaire, les propriétés widthet heightne sont pas prises en charge dans toutes les versions d'IE, donc dans certains cas, elles doivent être calculées avant de pouvoir être utilisées: stackoverflow.com/questions/11907514/…
flyingL123
Agréable! même question pour externalWidth (vrai)? :) petite remarque: `Dans IE8 et ci-dessous, l'objet DOMRect renvoyé par getBoundingClientRect () n'a pas de propriétés de hauteur et de largeur. De plus, des propriétés supplémentaires (y compris la hauteur et la largeur) ne peuvent pas être ajoutées à ces objets DOMRect. »
TecHunter
5
Notez que getBoundingClientRect()calcule les dimensions après l'application des transformations CSS .
user1620220
Après avoir testé, j'ai trouvé que cette méthode ne fonctionne pas pour les éléments cachés ( display: none).
Jory Hogeveen
10

La réponse de Ross Allen est un bon point de départ, mais utiliser getBoundingClientRect (). Width inclura également le remplissage et la largeur de la bordure, ce qui n'est pas le cas de la fonction width de jquery :

L'objet TextRectangle retourné inclut le remplissage, la barre de défilement et la bordure, mais exclut la marge. Dans Internet Explorer, les coordonnées du rectangle englobant incluent les bordures supérieure et gauche de la zone cliente.

Si votre intention est d'obtenir la widthvaleur avec la précision, vous devrez supprimer le remplissage et la bordure comme ceci:

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());
Le_Black_Smurf
la source
Vous ne devriez pas le .replace("px", "")comme parseIntdevez supprimer pour vous.
Steve Schrab
Cette question concerne uniquement la prévention de l'arrondi, je suis perplexe devant l'hypothèse explicite ici que l'arrondi convient aux valeurs de remplissage. Pourquoi traiteriez-vous cela différemment des valeurs de largeur?! Utiliser parseFloat()peut-être?
phils
De même, en innerWidth()faisant partie du problème d'origine, je crains que le calcul de la largeur de la bordure ici ne fonctionne également sur des valeurs arrondies.
phils
9

Je voulais juste ajouter mon expérience ici, bien que la question soit ancienne: le consensus ci-dessus semble être que l'arrondi de jQuery est en fait aussi bon qu'un calcul non arrondi - mais cela ne semble pas être le cas dans quelque chose que j'ai fait .

Mon élément a une largeur fluide, généralement, mais un contenu qui change dynamiquement via AJAX. Avant de changer de contenu, je verrouille temporairement les dimensions de l'élément afin que ma mise en page ne rebondisse pas pendant la transition. J'ai trouvé que l'utilisation de jQuery comme ceci:

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

provoque une certaine drôle, comme il y a des différences de sous-pixels entre la largeur réelle et la largeur calculée. (Plus précisément, je vais voir un mot sauter d'une ligne de texte à une autre, indiquant que la largeur a été modifiée, pas seulement verrouillée.) D'une autre question - Obtenir la largeur réelle en virgule flottante d'un élément - j'ai trouvé qui window.getComputedStyle(element).widthrenverra un calcul non arrondi. J'ai donc changé le code ci-dessus en quelque chose comme

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

Et avec CE code - pas de rebond drôle! Cette expérience semble indiquer que la valeur unrounded effectivement fait affaire au navigateur, non? (Dans mon cas, Chrome Version 26.0.1410.65.)

davidtheclark
la source
La documentation actuelle pour le .css () de jQuery souligne que getComputedStyle () s'appelle runtimeStyle () i IE, et affirme que l'un des avantages de .css () est cette interface unifiée.
norwebian
2

Vous pouvez utiliser getComputedStylepour cela:

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

Utilisez ce qui suit pour obtenir une largeur précise:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;
Ali Hasan
la source
pourquoi voudriez-vous que jquery obtienne votre largeur calculée si vous la définissez et l'avez disponible dansstyle.width
user151496