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


94

Я шукав навколо і не міг цього знайти. Я намагаюся отримати ширину div, але якщо вона має десяткову крапку, вона округлює число.

Приклад:

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

Якщо я $('#container').width();це зроблю, це поверне 543 замість 543,5. Як мені змусити його не округляти число і повернути повне 543,5 (або якесь інше число).


2
Чому у вас десяткова ширина пікселів? Вони все одно округляються до цілих чисел. Не можна мати півпікселя.
Moin Zaman

Навіщо вам це? Без цієї інформації це питання безглуздо.
Хуан Мендес,

2
@JuanMendes У моєму випадку на дисплеї HiDPI Chrome 38 обчислює нецілу ширину вікна. Отже, якщо $ .ширина округлюється, скажімо, від 1250,6 до 1251, і я роблю розрахунки на основі 1251, у мене виникають проблеми. Округлення - це не така велика проблема.
JKS

Відповіді:


196

Використовуйте рідний, Element.getBoundingClientRectа не стиль елемента. Він був представлений в IE4 і підтримується всіма браузерами:

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

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


9
+1 Якщо ви встановлюєте ширину іншого елемента, обов’язково змініть його ширину таким чином: $ ("# other"). Css ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + "px"); Якщо ви використовуєте jQuery width (), значення буде округлено.
лепе

1
У відповідності з цим подібним питанням , що widthі heightвластивості не підтримуються у всіх версіях IE, тому в деяких випадках вони повинні бути розраховані , перш ніж вони можуть бути використані: stackoverflow.com/questions/11907514 / ...
flyingL123

Приємно! те саме питання щодо externalWidth (true)? :) невелике зауваження: `У IE8 і нижче об'єкт DOMRect, повернутий методом getBoundingClientRect (), не має властивостей висоти та ширини. Крім того, додаткові властивості (включаючи висоту та ширину) не можуть бути додані до цих об'єктів
DOMRect.

5
Зверніть увагу, що getBoundingClientRect()обчислює розміри після застосування перетворень CSS .
user1620220

Після тестування я виявив, що цей метод не працює для прихованих елементів ( display: none).
Джорі Хогевен

9

Просто хотів додати тут свій досвід, хоча питання старе: консенсус вище, схоже, полягає в тому, що округлення jQuery фактично настільки ж добре, як необгрунтований розрахунок - але, здається, це не так у тому, що я робив .

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

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

викликає певну забаву, як між різницею фактичної ширини та обчисленою шириною існують різниці в пікселях. (Зокрема, я побачу, як слово переходить з одного рядка тексту на інший, вказуючи, що ширина була змінена, а не просто заблокована.) З іншого питання - Отримання фактичної ширини елемента з плаваючою точкою - я знайшов , що window.getComputedStyle(element).widthповерне необгрунтований розрахунок. Тож я змінив наведений вище код на щось на зразок

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

І з ТИМ кодом - ніяких смішних стрибків! Здається, цей досвід свідчить про те, що неокруглене значення насправді має значення для браузера, так? (У моєму випадку версія Chrome 26.0.1410.65.)


Поточний документ для .css () jQuery вказує, що getComputedStyle () називається runtimeStyle () i IE, і заявляє, що однією з переваг .css () є цей уніфікований інтерфейс.
норвезька

9

Відповідь Росса Аллена є хорошою відправною точкою, але використання getBoundingClientRect (). Ширина також включатиме відступ і ширину меж, що не стосується функції ширини 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());

Ви не повинні .replace("px", "")як parseIntслід видаляти це для вас.
Steve Schrab

Це питання, яке стосується запобігання округленню, мене бентежить явним припущенням, що округлення - це нормально для значень заповнення. Чому б ви по-іншому ставилися до значень ширини ?! Використовувати, parseFloat()можливо?
phils

Подібним чином, innerWidth()будучи частиною вихідної проблеми, я боюся, що обчислення ширини меж тут також працює над округленими значеннями.
phils


-1

Використовуйте наступне, щоб отримати точну ширину:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;

чому ви хочете, щоб evne хотів, щоб jquery отримав вашу обчислювану ширину, якщо ви насправді встановили її і надали її доступною вstyle.width
user151496
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.