Як отримати просто числову частину властивості CSS за допомогою jQuery?


158

Мені потрібно зробити числовий обчислення на основі властивостей CSS. Однак коли я використовую це для отримання інформації:

$(this).css('marginBottom')

він повертає значення "10px". Чи є трюк , щоб просто отримати число частину вартості незалежно від того , чи є він pxабо %чи emабо що - то?

Відповіді:


163

Це очистить усі нецифрові, не крапкові та знаки "мінус" із рядка:

$(this).css('marginBottom').replace(/[^-\d\.]/g, '');

ОНОВЛЕНО для негативних значень


4
Це чудово, якщо ви не маєте справу з негативними цифрами. Я не гуру регексу, тому не можу надати кращого зразка :)
gary

39
Подумайте про використання parseFloat, який обробляє всі символи, дозволені в числах з плаваючою комою, а також повертає число замість рядка - див . Відповідь maximelebreton .
Олівер

6
Це не має бути прийнятою відповіддю, оскільки вона не відповідає правильно на питання. Рішення parseFloat / parseInt краще. Питання задається стосовно чисельних обчислень . Ця відповідь повертає рядок. Це означає, що "20" + 20 = "2020", що не годиться ні для кого.
mastaBlasta

@zakovyrya ви могли б пояснити використаний RegExp/[^-\d\.]/g
Олександр

1
@ Квартирні дужки з Олександром Олександром з каретою означають НЕ: [^ <що ви тут помістите>]. У цьому регулярному виразі він відповідає будь-якому символу, який НЕ є мінусом, цифрою чи крапкою. По суті видаляє все, що не може входити до числа
закиря

284
parseInt($(this).css('marginBottom'), 10);

parseInt автоматично ігнорує одиниці.

Наприклад:

var marginBottom = "10px";
marginBottom = parseInt(marginBottom, 10);
alert(marginBottom); // alerts: 10

1
Це, здається, працює дуже добре у всіх випадках, в які я натрапив, і я вважаю його набагато легше читати, ніж будь-які рішення для регулярного виведення.
Маркус Амальтея Магнусон

3
ви можете додати radix (10) до розбору, якщо ви використовуєте це рішення.
asawilliams

47
Ви можете використовувати parseFloat замість parseIntобліку випадку, коли ви отримуєте не ціле значення - як у відповіді maximelebreton .
Олівер

3
Насправді, parseInt не потребує параметра "10" радіації, оскільки 10 є типовим. Менше параметрів = краща читабельність, коротший код, менше помилок.
Вказівник Null

2
10 є типовим для parseInt, якщо число не можна інтерпретувати як вісімковий (наприклад, '0700' буде розбирати як 448, а не 700, що, мабуть, є бажаним).
Роберт Ч. Барт

122

У методі заміни ваше значення css - це рядок, а не число.

Цей спосіб більш чистий, простий і повертає число:

parseFloat($(this).css('marginBottom'));

2
Це найкраще рішення, оскільки ОП просить можливі не цілі одиниці ( %, em)
Андре Фігейредо

14
parseFloat($(this).css('marginBottom'))

Навіть якщо marginBottom визначений у em, значення всередині parseFloat вище буде в px, оскільки це розраховане властивість CSS.


3
parseFloat має лише один аргумент - радикс (10), який ви вказали тут, буде проігноровано. Тож більш правильною відповіддю буде максимелебретон .
Олівер

Чи потрібно розібратисяFloat ($ (this) .css ('marginBottom'), 10)
user1736947

9
$(this).css('marginBottom').replace('px','')

2
Це стосується лише випадку "px". Тому я думаю, що для кожного з інших суфіксів слід зробити окрему заміну.
Grzegorz Oledzki

3
Будьте уважні, подумайте - інші суфікси не в пікселях, тому, якщо ви очікуєте, pxале дано, emвам потрібно конвертувати.
Аріель

ось що я думав - чи існують бібліотечні процедури для цього? Начебто я думаю, що це цілком розумна умова очікувати px, але з метою надійності, які наші варіанти ...? (Просто розмірковуючи, тут - я не збираюся занадто сильно з цим заважати, оскільки контролюю значення)
lol

5

Я використовую простий плагін jQuery, щоб повернути числове значення будь-якого властивості CSS.

Це стосується parseFloatзначення, поверненого методом jQuery за замовчуванням css.

Визначення плагіна:

$.fn.cssNum = function(){
  return parseFloat($.fn.css.apply(this,arguments));
}

Використання:

var element = $('.selector-class');
var numericWidth = element.cssNum('width') * 10 + 'px';
element.css('width', numericWidth);

5

Припустимо, у вас властивість в нижній частині поля встановлено на 20 пікселів / 20% / 20ем. Щоб отримати значення як число, є два варіанти:

Варіант 1:

parseInt($('#some_DOM_element_ID').css('margin-bottom'), 10);

Функція parseInt () аналізує рядок і повертає ціле число. Не змінюйте 10 знайдених у вищевказаній функції (відомі як "радіакс"), якщо ви не знаєте, що ви робите.

Приклад Вихід буде: 20 (якщо граничне нижнє значення встановлено в px) для% і em, воно виведе відносне число на основі поточного розміру елемента / шрифту батьків.

Варіант 2 (я особисто віддаю перевагу цьому варіанту)

parseFloat($('#some_DOM_element_ID').css('margin-bottom'));

Приклад Вихід буде: 20 (якщо граничне нижнє значення встановлено в px) для% і em, воно виведе відносне число на основі поточного розміру елемента / шрифту батьків.

Функція parseFloat () аналізує рядок і повертає число з плаваючою комою.

Функція parseFloat () визначає, чи є першим символом у вказаному рядку число. Якщо це так, він аналізує рядок, поки не досягне кінця числа, і повертає число як число, а не як рядок.

Перевага Варіанту 2 полягає в тому, що якщо ви отримаєте десяткові числа, що повертаються (наприклад, 20.32322px), ви отримаєте повернене число зі значеннями за десятковою комою. Корисно, якщо вам потрібні певні номери, які повертаються, наприклад, якщо ваш нижній запас встановлений в em або %


4

parseintскоротить будь-які десяткові значення (наприклад, 1.5emдає 1).

Спробуйте replaceфункцію з regex, наприклад

$this.css('marginBottom').replace(/([\d.]+)(px|pt|em|%)/,'$1');

4

Я хочу:

Math.abs(parseFloat($(this).css("property")));

Не загальне рішення. У більшості випадків, я думаю, я хочу знати, що marginце негативний чи позитивний!
Andre Figueiredo

3

Найпростіший спосіб отримати ширину елемента без одиниць:

target.width()

Джерело: https://api.jquery.com/width/#width2


Чудово підходить для ширини та висоти. $ (selector) .width () та $ (selector) .height () - це дійсно числа. Не корисний для інших реквізитів css: маржа, підкладка.
eon

3

Ви можете реалізувати цей дуже простий плагін jQuery :

Визначення плагіна:

(function($) {
   $.fn.cssValue = function(p) {
      var result;
      return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
   };
})(jQuery);

Він стійкий до NaNзначень, які можуть виникнути в старій версії IE (повернеться 0замість цього)

Використання:

$(this).cssValue('marginBottom');

Насолоджуйтесь! :)


1
Це гарна ідея, але пам’ятайте, що слідкуйте за такими побічними ефектами, як виклик функції невідомої вартості більше, ніж потрібно. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Ніколь

2

Для покращення прийнятої відповіді скористайтеся цим:

Number($(this).css('marginBottom').replace(/[^-\d\.]/g, ''));

2

Якщо це лише для "px", ви також можете використовувати:

$(this).css('marginBottom').slice(0, -2);

0

Потрібно видалити одиниці при збереженні десятків.

var regExp = new RegExp("[a-z][A-Z]","g");
parseFloat($(this).css("property").replace(regExp, ""));

-1

використання

$(this).cssUnit('marginBottom');

які повертають масив. перший індекс повертає значення нижнього поля (приклад 20 для 20 пікселів), а другий індекс повертає одиницю нижньої межі поля (наприклад, px для 20 пікселів )


1
cssUnit насправді є частиною jQueryUI, а не jQuery.
cvkline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.