Как получить только числовую часть свойства CSS с помощью jQuery?


158

Мне нужно сделать численный расчет на основе свойств CSS. Однако, когда я использую это, чтобы получить информацию:

$(this).css('marginBottom')

возвращает значение «10px». Есть ли хитрость в том, чтобы просто получить числовую часть значения, независимо от того, является оно pxили %или emили иным?

Ответы:


163

Это очистит все не-цифры, не-точки и не-минус из строки:

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

ОБНОВЛЕНО для отрицательных значений


4
Это здорово, если вы не имеете дело с отрицательными числами. Я не гуру регулярных выражений, поэтому не могу предоставить лучший образец :)
Гэри

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) к parseInt, если вы используете это решение.
asawilliams

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

3
На самом деле, parseInt не нуждается в радикальном параметре "10", так как 10 по умолчанию. Меньше параметров = лучшая читаемость, более короткий код, меньше ошибок.
Указатель нулевой

2
10 используется по умолчанию только для parseInt, если число не может быть интерпретировано как восьмеричное (например, «0700» будет анализировать как 448, а не 700, что, вероятно, является желаемым).
Роберт С. Барт,

122

При использовании метода replace значение css является строкой, а не числом.

Этот метод более чистый, простой и возвращает число:

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

2
Это лучшее решение, так как OP запрашивает возможные нецелочисленные единицы ( %, em)
Andre Figueiredo

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

Даже если marginBottom определен в em, значение внутри parseFloat выше будет в px, так как это вычисляемое свойство CSS.


3
У parseFloat есть только один аргумент - указанная вами radix (10) будет проигнорирована. Таким образом, более правильный ответ будет maximelebreton .
Оливер

Должно ли это быть parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947

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

2
Это будет обрабатывать только случай «px». Поэтому я думаю, что для каждого из оставшихся «суффиксов» должна быть сделана отдельная замена.
Гжегож Оледзки

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

Предположим, у вас установлено свойство margin-bottom 20px / 20% / 20em. Чтобы получить значение в виде числа, есть два варианта:

Опция 1:

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

Функция parseInt () анализирует строку и возвращает целое число. Не изменяйте 10 в приведенной выше функции (известной как «основание»), если вы не знаете, что делаете.

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

Вариант 2 (лично я предпочитаю этот вариант)

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

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

Функция parseFloat () анализирует строку и возвращает число с плавающей запятой.

Функция parseFloat () определяет, является ли первый символ в указанной строке числом. Если это так, он анализирует строку, пока не достигнет конца числа, и возвращает число как число, а не как строку.

Преимущество варианта 2 состоит в том, что если вы получите возвращенные десятичные числа (например, 20.32322px), вы получите возвращаемое число со значениями после десятичной точки. Полезно, если вам нужно вернуть конкретные числа, например, если нижнее поле установлено в em или %


4

parseintбудет обрезать любые десятичные значения (например, 1.5emдает 1).

Попробуйте replaceфункцию с регулярным выражением, например

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

4

Идти за:

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

Не универсальное решение. Я думаю, что в большинстве случаев я хочу знать, является ли marginэто негативом или позитивом!
Андре Фигейредо

3

Самый простой способ получить ширину элемента без единиц измерения:

target.width()

Источник: https://api.jquery.com/width/#width2


Отлично подходит для ширины и высоты. $ (селектор) .width () и $ (селектор) .height () действительно являются числами. Не полезно для других css реквизитов: margin, padding.
эон

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.