Заполнение или значение поля в пикселях в виде целого числа с использованием jQuery

207

В jQuery есть функции height () и width (), которые возвращают высоту или ширину в пикселях в виде целого числа ...

Как я могу получить отступ или значение поля элемента в пикселях и как целое число, используя jQuery?

Моей первой идеей было сделать следующее:

var padding = parseInt(jQuery("myId").css("padding-top"));

Но если, например, в ems дано дополнение, как я могу получить значение в пикселях?


Глядя на плагин JSizes, предложенный Крисом Пебблом, я понял, что моя собственная версия была правильной :). jQuery всегда возвращает значение в пикселях, так что просто разобрать его в целое число было решением.

Благодаря Крис Пеббл и Ян Робинсон

Малик Амурлаев
источник
Можете ли вы выбрать ответ из числа доступных ниже?
Уэс Модс
4
Примечание для людей в этой теме: всегда указывайте основание при использовании parseInt. Цитируя MDN: " radix Int от 2 до 36, представляющее основание (основание в математических системах счисления) вышеупомянутой строки. Укажите 10 для десятичной системы счисления. Всегда указывайте этот параметр, чтобы избежать путаницы читателя и гарантировать предсказуемое поведение Разные реализации дают разные результаты, когда основание не указано, обычно значение по умолчанию равно 10 ". См .: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Ответы:

226

Вы должны быть в состоянии использовать CSS ( http://docs.jquery.com/CSS/css#name ). Возможно, вам придется быть более конкретным, например, «padding-left» или «margin-top».

Пример:

CSS

a, a:link, a:hover, a:visited, a:active {color:black;margin-top:10px;text-decoration: none;}

JS

$("a").css("margin-top");

Результат 10px.

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

parseInt($("a").css("margin-top"))
Ян Робинсон
источник
5
Я не проверял, действительно ли метод jQuery возвращает суффикс «px» или нет, однако JSizesплагин из другого ответа (который я в итоге использовал) возвращает целое число, когда возвращаемое значение передается ParseInt(...), только FYI.
Дэн Герберт
12
К вашему сведению: jQuery добавляет «px», поэтому решение Яна работает, а также возвращает целое число при передаче в parseInt () - и для него не требуется плагин:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust
56
parseInt быстрее, чем заменить ('px', '') на 49% в chrome jsperf.com/replace-vs-parseint
Банк
17
Если padding / margin в CSS выражается как em или pt, все .css()равно будет возвращать значение с «px» в конце?
ингридиент_15939
22
@ ингридиент_15939 - Только что попробовал и да; он вычисляет фактическое значение пикселя и возвращает его с px. То же самое для ширины границы. Старый вопрос, который я знаю, но поскольку никто не ответил на ваш вопрос, я подумал, что сделаю это, чтобы помочь другим опоздавшим ...
Whelkaholism
79

Сравните внешнюю и внутреннюю высоту / ширину, чтобы получить общий запас и отступ:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());
svinto
источник
отличный совет! Выручил меня
Абэ Петрильо
1
я не понял, что ExternalHeight существует. Большое спасибо!
AlexMorley-Finch
6
Помните, что externalWidth / Height также включает ширину границ
electrichead
7
innertWidth / innerHeight также включают в свои вычисления отступы, чтобы получить ширину / высоту без заполнения, вам нужно использовать .width () и .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Эндрю Энсли
2
that.outerHeight(true) - that.outerHeight()даст общие вертикальные поля, потому что externalHeight () будет включать отступы и границы, но исключать поля. См. Api.jquery.com/outerWidth/ .
Аксимили
35

Функция parseInt имеет параметр radix, который определяет систему счисления, используемую при преобразовании, поэтому вызов parseInt(jQuery('#something').css('margin-left'), 10);возвращает левое поле как целое число.

Это то, что использует JSizes.

guigouz
источник
3
Спасибо за это, я ненавижу включать плагины для крошечных кусочков функциональности.
Брайан
2
Вам даже не нужно передавать «основание», поскольку по умолчанию оно равно 10.
Александр Берд
5
Имейте в виду, что parseInt может возвращать NaN (что, в свою очередь, приводит к ошибкам вычислений на основе этой переменной) - добавьте проверку isNaN впоследствии! Пример дела: parseInt('auto', 10);( autoявляется действительным margin-left).
Томас
@sethAlexanderBird Вы правы, утверждая, что основание будет по умолчанию равным 10, однако, если для вас важно (и, вероятно, должно быть) ограничение кода, jsLint и jsHint будут кричать на вас, если вы его опустите.
Грег
30

ПОЖАЛУЙСТА, не загружайте другую библиотеку только для того, чтобы сделать то, что уже доступно изначально!

jQuery .css()для начала конвертирует% и em в пиксельные эквиваленты, parseInt()удаляет 'px'из конца возвращаемой строки и конвертирует в целое число:

http://jsfiddle.net/BXnXJ/

$(document).ready(function () {
    var $h1 = $('h1');
    console.log($h1);
    $h1.after($('<div>Padding-top: ' + parseInt($h1.css('padding-top')) + '</div>'));
    $h1.after($('<div>Margin-top: ' + parseInt($h1.css('margin-top')) + '</div>'));
});
RavenHursT
источник
11

Вот как вы можете получить окружающие размеры:

var elem = $('#myId');

var marginTopBottom  = elem.outerHeight(true) - elem.outerHeight();
var marginLeftRight  = elem.outerWidth(true)  - elem.outerWidth();

var borderTopBottom  = elem.outerHeight() - elem.innerHeight();
var borderLeftRight  = elem.outerWidth()  - elem.innerWidth();

var paddingTopBottom  = elem.innerHeight() - elem.height();
var paddingLeftRight  = elem.innerWidth()  - elem.width();

Обратите внимание, что каждая переменная, paddingTopBottomнапример, содержит сумму полей с обеих сторон элемента; то есть paddingTopBottom == paddingTop + paddingBottom. Интересно, есть ли способ получить их отдельно. Конечно, если они равны, вы можете разделить на 2 :)

FireAphis
источник
true = включить маржу. +1000 интернетов
символ
Это лучшее решение, потому что оно также работает IE 7. См .: stackoverflow.com/questions/590602/…
Лениэль Маккаферри
9

Эта простая функция сделает это:

$.fn.pixels = function(property) {
    return parseInt(this.css(property).slice(0,-2));
};

Использование:

var padding = $('#myId').pixels('paddingTop');
mpen
источник
3
не учитывает auto, inheritа %ценности
Томас
3
@ Томас: Не правда. jsfiddle.net/nXyFN jQuery всегда возвращает результат в пикселях.
mpen
4
@Mark jsfiddle.net/BNQ6S IE7: NaNэто зависит от браузера. Насколько я знаю, jQuery не нормализуется в .css()отличие от .width()&.height()
Thomas
1
@ Томас: Интересно. Решение Яна (с самым высоким рейтингом) тоже имеет ту же проблему. Решение Свинто, вероятно, лучшее.
mpen
9

Parse int

parseInt(canvas.css("margin-left")); 

возвращает 0 для 0px

a53-416
источник
9

Вы можете просто взять их, как с любым атрибутом CSS :

alert($("#mybox").css("padding-right"));
alert($("#mybox").css("margin-bottom"));

Вы можете установить их с помощью второго атрибута в методе css:

$("#mybox").css("padding-right", "20px");

РЕДАКТИРОВАТЬ: Если вам нужно только значение пикселя, используйте parseInt(val, 10):

parseInt($("#mybox").css("padding-right", "20px"), 10);
Роб Грант
источник
3

хорошо, просто чтобы ответить на оригинальный вопрос:

вы можете получить отступ как целое число, которое можно использовать следующим образом:

var padding = parseInt ($ ("myId"). css ("padding-top"). replace ("ems", ""));

Если вы определили другое измерение, например, px, просто замените «ems» на «px». parseInt интерпретирует строковую часть как неправильное значение, поэтому важно заменить его ... ничем.

EeKay
источник
2

Вы также можете расширить фреймворк jquery чем-то вроде:

jQuery.fn.margin = function() {
var marginTop = this.outerHeight(true) - this.outerHeight();
var marginLeft = this.outerWidth(true) - this.outerWidth();

return {
    top: marginTop,
    left: marginLeft
}};

Тем самым добавляется функция в ваши объекты jquery под названием margin (), которая возвращает коллекцию, например функцию смещения.

FX.

$("#myObject").margin().top
cralexns
источник
2
К сожалению, это не дает вам верхний и левый поля, а скорее поля totalVertical и totalHorizontals
Code Commander
Однако его можно отредактировать с помощью функции parseInt в одном из других решений, чтобы позволить более плавно отображаться на полях
Brian
1

Не используйте string.replace ("px", ""));

Используйте parseInt или parseFloat!

RubbelDeCatc
источник
0

Я, вероятно, использую github.com/bramstein/jsizes плагин jquery для отступов и полей очень удобным способом, спасибо ...

Mustafah
источник
0

Не до некро, но я сделал это, что может определять пиксели на основе различных значений:

$.fn.extend({
  pixels: function (property, base) {
    var value = $(this).css(property);
    var original = value;
    var outer = property.indexOf('left') != -1 || property.indexOf('right') != -1 
      ? $(this).parent().outerWidth()
      : $(this).parent().outerHeight();

    // EM Conversion Factor
    base = base || 16;

    if (value == 'auto' || value == 'inherit') 
        return outer || 0;

    value = value.replace('rem', '');
    value = value.replace('em', '');

    if (value !== original) {
       value = parseFloat(value);
       return value ? base * value : 0;
    }

    value = value.replace('pt', '');

    if (value !== original) {
       value = parseFloat(value);
       return value ? value * 1.333333 : 0; // 1pt = 1.333px
    }

    value = value.replace('%', '');

    if (value !== original) {
      value = parseFloat(value);
      return value ? (outer * value / 100) : 0;
    }

    value = value.replace('px', '');
    return parseFloat(value) || 0;
  }
});

Таким образом, мы учитываем размер и авто / наследование.

Nijikokun
источник
Обратите внимание, что parseInt()это неправильно, ширина или высота могут быть плавающими точками.
Алексис Уилке