Значення прокладки або поля в пікселях як ціле число, використовуючи jQuery


207

jQuery має функцію висоти () та ширини (), яка повертає висоту чи ширину в пікселях як ціле число ...

Як я можу отримати прокладку або значення поля в пікселях і як ціле число за допомогою jQuery?

Першою моєю ідеєю було зробити наступне:

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

Але якщо, наприклад, накладка задана в ems, як я можу отримати значення в пікселях?


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

Завдяки Крісу Пебблу та Ian Robinson


Чи можете ви обрати відповідь із наведених нижче відповідей?
Wes Modes

4
Примітка людям у цій темі: завжди вказуйте радіус при використанні parseInt. Цитуючи MDN: " radix Інт між 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");

Результат - 10 пікселів.

Якщо ви хочете отримати ціле значення, ви можете зробити наступне:

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

5
Я не перевіряв, чи метод jQuery насправді повертає суфікс "px" чи ні, проте JSizesплагін з іншої відповіді (який я в кінцевому підсумку використовував) повертає ціле число, коли значення повернення передається ParseInt(...)просто FYI.
Ден Герберт

12
FYI: jQuery додає 'px', тому рішення Ian працює і також поверне ціле число при передачі в parseInt () - і для нього не потрібен плагін:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust

56
parseInt швидше, ніж замінити ('px', '') на 49% на chrome jsperf.com/replace-vs-parseint
банк

17
Якщо padding / margin виражається як em або pt у CSS, все .css()одно поверне значення з "px" на кінці?
інгредієнт_15939

22
@ інгредієнт_15939 - просто спробував і так; він обчислює фактичне значення пікселя і повертає його з px. Те ж саме для ширини бордюру. Старе запитання я знаю, але, як ніхто не відповів на ваше запитання, я думав, що я зроблю це, щоб допомогти іншим
запізнілим

79

Порівняйте зовнішню і внутрішню висоту / ширину, щоб отримати загальний запас і прокладку:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());

чудова порада! Допомогли мені
Абе Петрілло,

1
Я не розумів зовнішньої висоти. Велике спасибі!
AlexMorley-Finch

6
Пам'ятайте, що зовнішня ширина / висота також включає ширину меж
електрична

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.


3
Дякую за це, я ненавиджу включати плагіни для мініатюрних фрагментів функціоналу.
Брайан

2
Вам навіть не потрібно пропускати "радикс", оскільки він за замовчуванням до 10.
Олександр Птах

5
Майте на увазі, що parseInt може повернути NaN (який, в свою чергу, робити обчислення на основі цієї змінної, не вдасться) - додайте перевірку isNaN після цього! Приклад випадку: parseInt('auto', 10);( autoє дійсним margin-left).
Томас

@sethAlexanderBird ваше правильне твердження про те, що радіокс за замовчуванням дорівнює 10, однак, якщо для вас важливо пов'язування коду (і це, мабуть, повинно бути), jsLint і jsHint заграють у вас, якщо ви не залишите його.
Грег

30

БУДЬ ЛАСКА, не завантажуйте іншу бібліотеку, щоб зробити щось, що вже є у продажу!

jQuery .css()перетворює% s та 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>'));
});

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 :)


true = включати маржу. +1000 інтернет
гліф

Це найкраще рішення, оскільки воно також працює IE 7. Див: stackoverflow.com/questions/590602 / ...
Leniel Маккаферрі

9

Ця проста функція зробить це:

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

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

var padding = $('#myId').pixels('paddingTop');

3
не враховує auto, inheritа %значення
Томас

3
@Thomas: Неправда. Здається, jsfiddle.net/nXyFN jQuery завжди повертає результат у пікселях.
квітня 1212

4
@Mark jsfiddle.net/BNQ6S IE7:, NaNце залежить від браузера. Наскільки я знаю, jQuery не нормалізується .css()на відміну від .width()&.height()
Thomas

1
@Thomas: Цікаво. Таке ж завдання має і рішення Яна (з найвищим рейтингом). Рішення svinto, мабуть, найкраще.
1212


9

Ви можете просто захопити їх, як і будь-який атрибут CSS :

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

Ви можете встановити їх за допомогою другого атрибута в методі css:

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

EDIT: Якщо вам потрібно лише значення пікселя, використовуйте parseInt(val, 10):

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

3

добре, щоб відповісти на початкове запитання:

Ви можете отримати прокладку як ціле число, яке можна використовувати:

var padding = parseInt ($ ("myId"). css ("padding-top"). замінити ("ems", ""));

Якщо ви визначили інше вимірювання, наприклад, px, просто замініть "ems" на "px". parseInt трактує stringpart як неправильне значення, тому важливо замінити його на ... нічим.


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

2
На жаль, це не дає тобі верхнього та лівого поля, а скоріше загальнийВертикальний та загальний горизонтальні поля
Code Commander

Однак це могло бути відредаговано за допомогою функції parseInt в одному з інших рішень, щоб дозволити більш безперебійну функцію поля, що з'являється
Брайан

1

Не використовуйте string.replace ("px", ""));

Використовуйте parseInt або parseFloat!




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;
  }
});

Таким чином, ми враховуємо розміри та автоматичне / успадковане.


Зверніть увагу, що parseInt()це неправильно, ширина або висота можуть бути плаваючими точками.
Алексіс Вілке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.