Как заставить jQuery не округлять значение, возвращаемое .width ()?

94

Я поискал и не нашел этого. Я пытаюсь получить ширину div, но если в нем есть десятичная точка, он округляет число.

Пример:

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

Если я это сделаю, $('#container').width();он вернет 543 вместо 543,5. Как мне заставить его не округлять число и возвращать полное 543,5 (или любое другое число).

MoDFoX
источник
2
Почему у вас десятичная ширина в пикселях? В любом случае они округляются до целых чисел. У вас не может быть и половины пикселя.
Moin Zaman
зачем вам это? Без этой информации этот вопрос не имеет смысла.
Хуан Мендес
2
@JuanMendes В моем случае на дисплее HiDPI Chrome 38 вычисляет нецелую ширину окна. Итак, если $ .width округляется, скажем, от 1250,6 до 1251, и я делаю вычисления на основе 1251, у меня возникают проблемы. Округление в меньшую сторону - не такая уж большая проблема.
JKS

Ответы:

198

Используйте собственный Element.getBoundingClientRectстиль, а не стиль элемента. Он был представлен в IE4 и поддерживается всеми браузерами:

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

Примечание. Для IE8 и ниже см. Примечания «Совместимость браузера» в документации MDN.

Росс Аллен
источник
9
+1 Если вы устанавливаете ширину другого элемента, обязательно измените его ширину следующим образом: $ ("# other"). Css ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + "px"); Если вы используете jQuery width (), значение будет округлено.
lepe
1
В соответствии с этим подобным вопросом , что widthи heightсвойства не поддерживаются во всех версиях IE, поэтому в некоторых случаях они должны быть рассчитаны , прежде чем они могут быть использованы: stackoverflow.com/questions/11907514/...
flyingL123
Ницца! тот же вопрос для outerWidth (true)? :) небольшое замечание: `В IE8 и ниже объекту DOMRect, возвращаемому getBoundingClientRect (), не хватает свойств высоты и ширины. Кроме того, к этим объектам DOMRect нельзя добавить дополнительные свойства (включая высоту и ширину) »,
TecHunter,
5
Обратите внимание, что getBoundingClientRect()размеры вычисляются после применения преобразований CSS .
user1620220
После тестирования обнаружил, что этот метод не работает для скрытых элементов ( display: none).
Jory Hogeveen 07
10

Ответ Росса Аллена - хорошая отправная точка, но использование getBoundingClientRect (). Width также будет включать отступы и ширину границы, что не относится к функции ширины jquery :

Возвращенный объект TextRectangle включает отступ, полосу прокрутки и границу, но исключает поле. В Internet Explorer координаты ограничивающего прямоугольника включают верхнюю и левую границы клиентской области.

Если вы хотите получить widthзначение с точностью, вам придется удалить отступ и границу следующим образом:

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());
The_Black_Smurf
источник
Вы не должны , .replace("px", "")как parseIntследует удалить , что для вас.
Стив Шраб
Этот вопрос касается предотвращения округления, поэтому меня смущает явное предположение, что округление подходит для значений заполнения. Почему вы по-другому относитесь к значениям ширины ?! parseFloat()Возможно, использовать ?
Филс
Точно так же, innerWidth()будучи частью исходной проблемы, я опасаюсь, что расчет ширины границы здесь также работает с округленными значениями.
Филс
9

Просто хотел добавить сюда свой опыт, хотя вопрос старый: консенсус, приведенный выше, похоже, заключается в том, что округление jQuery эффективно так же хорошо, как и необоснованный расчет, но это не похоже на то, что я делал .

Обычно мой элемент имеет плавную ширину, но содержимое изменяется динамически через AJAX. Перед переключением содержимого я временно блокирую размеры элемента, чтобы мой макет не раскачивался во время перехода. Я обнаружил, что с помощью jQuery вот так:

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

вызывает некоторую забавность, например, есть субпиксельные различия между фактической шириной и расчетной шириной. (В частности, я увижу, как слово перескакивает с одной строки текста на другую, указывая на то, что ширина была изменена, а не просто заблокирована.) Из другого вопроса - Получение фактической ширины элемента с плавающей запятой - я обнаружил out, window.getComputedStyle(element).widthкоторый вернет необоснованный расчет. Поэтому я изменил приведенный выше код на что-то вроде

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

А с ЭТОМ кодом - никаких забавных подпрыгиваний! Этот опыт, кажется, предполагает, что необоснованное значение действительно имеет значение для браузера, верно? (В моем случае это версия Chrome 26.0.1410.65.)

Дэвидтекларк
источник
Текущий документ для jQuery .css () указывает, что getComputedStyle () называется runtimeStyle () i IE, и утверждает, что одним из преимуществ .css () является этот унифицированный интерфейс.
Norwebian
2

Для этого можно использовать getComputedStyle:

parseFloat(window.getComputedStyle($('#container').get(0)).width)
Антон Чуканов
источник
-1

Используйте следующее, чтобы получить точную ширину:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;
Али Хасан
источник
Зачем вам нужно, чтобы jquery получал вашу вычисленную ширину, если вы действительно установили ее и сделали ее доступной вstyle.width
user151496