Nilai padding atau margin dalam piksel sebagai integer menggunakan jQuery

207

jQuery memiliki fungsi height () en width () yang mengembalikan tinggi atau lebar piksel sebagai bilangan bulat ...

Bagaimana saya bisa mendapatkan nilai padding atau margin elemen dalam piksel dan sebagai integer menggunakan jQuery?

Ide pertama saya adalah melakukan hal berikut:

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

Tetapi jika padding diberikan dalam ems misalnya, bagaimana saya bisa mendapatkan nilai dalam pixel?


Melihat ke plugin JSizes yang disarankan oleh Chris Pebble saya menyadari bahwa versi saya sendiri adalah yang benar :). jQuery selalu mengembalikan nilai dalam pixel, jadi hanya menguraikannya ke integer adalah solusinya.

Terima kasih kepada Chris Pebble dan Ian Robinson

Malik Amurlayev
sumber
Bisakah Anda memilih jawaban dari antara jawaban yang tersedia di bawah ini?
Wes Mode
4
Catatan untuk orang-orang di utas ini: selalu tentukan radix saat Anda menggunakannya parseInt. Mengutip MDN: " radix Int antara 2 dan 36 yang mewakili radix (dasar dalam sistem angka matematika) dari string yang disebutkan di atas. Tentukan 10 untuk sistem angka desimal. Selalu tentukan parameter ini untuk menghilangkan kebingungan pembaca dan untuk menjamin perilaku yang dapat diprediksi Implementasi yang berbeda menghasilkan hasil yang berbeda ketika radix tidak ditentukan, biasanya nilai defaultnya menjadi 10. " Lihat: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Jawaban:

226

Anda harus dapat menggunakan CSS ( http://docs.jquery.com/CSS/css#name ). Anda mungkin harus lebih spesifik seperti "padding-left" atau "margin-top".

Contoh:

CSS

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

JS

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

Hasilnya adalah 10px.

Jika Anda ingin mendapatkan nilai integer, Anda dapat melakukan hal berikut:

parseInt($("a").css("margin-top"))
Ian Robinson
sumber
5
Saya belum memeriksa apakah metode jQuery benar-benar mengembalikan akhiran "px" atau tidak, namun JSizesplugin dari jawaban lain (yang akhirnya saya gunakan) mengembalikan bilangan bulat ketika nilai kembali dilewatkan ParseInt(...), hanya FYI.
Dan Herbert
12
FYI: jQuery menambahkan 'px', sehingga solusi Ian berfungsi dan juga akan mengembalikan bilangan bulat ketika diteruskan ke parseInt () - dan tidak memerlukan plugin:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust
56
parseInt lebih cepat daripada mengganti ('px', '') sebesar 49% di chrome jsperf.com/replace-vs-parseint
Bank
17
Jika padding / margin dinyatakan sebagai em atau pt dalam CSS, apakah .css()masih akan mengembalikan nilai dengan "px" di akhir?
ingredient_15939
22
@ ingredient_15939 - Baru mencobanya dan ya; itu menghitung nilai piksel aktual dan mengembalikannya dengan px. Sama untuk lebar perbatasan. Pertanyaan lama yang saya tahu, tetapi karena tidak ada yang menjawab pertanyaan Anda, saya pikir saya akan melakukannya untuk membantu para
pendatang baru
79

Bandingkan tinggi / lebar luar dan dalam untuk mendapatkan total margin dan bantalan:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());
svinto
sumber
tip yang bagus! Membantu saya keluar
Abe Petrillo
1
Aku tidak menyadari keberadaan luar. Terima kasih banyak!
AlexMorley-Finch
6
Ingat bahwa outerWidth / Height termasuk lebar perbatasan juga
electrichead
7
innertWidth / innerHeight juga termasuk padding dalam perhitungannya, untuk mendapatkan lebar / tinggi tanpa padding, Anda perlu menggunakan .width () dan .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley
2
that.outerHeight(true) - that.outerHeight()akan memberikan total margin vertikal, karena outerHeight () akan mencakup paddings dan borders tetapi mengecualikan margin. Lihat api.jquery.com/outerWidth/ .
Aximili
35

Fungsi parseInt memiliki parameter "radix" yang mendefinisikan sistem angka yang digunakan pada konversi, sehingga memanggil parseInt(jQuery('#something').css('margin-left'), 10); mengembalikan margin kiri sebagai Integer.

Inilah yang digunakan JSize.

guigouz
sumber
3
Terima kasih untuk ini, saya benci harus menyertakan plugin untuk fungsi kecil.
Brian
2
Anda bahkan tidak perlu melewati "radix" karena standarnya adalah 10.
Alexander Bird
5
Ketahuilah bahwa parseInt dapat mengembalikan NaN (yang kemudian membuat perhitungan berdasarkan variabel tersebut gagal) - tambahkan cek isNaN sesudahnya! Contoh kasus: parseInt('auto', 10);( autovalid margin-left)
Thomas
@sethAlexanderBird Anda benar dalam menyatakan bahwa radix akan default ke 10, namun jika kode linting penting bagi Anda (dan mungkin seharusnya) jsLint dan jsHint akan menertawakan Anda jika Anda meninggalkannya.
Greg
30

TOLONG jangan pergi memuat perpustakaan lain hanya untuk melakukan sesuatu yang sudah tersedia secara native!

jQuery .css()mengonversi %'s dan em's ke piksel yang setara dengan awalnya, dan parseInt()akan menghapus 'px'dari ujung string yang dikembalikan dan mengubahnya menjadi integer:

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
sumber
11

Inilah cara Anda mendapatkan dimensi di sekitarnya:

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

Perhatikan bahwa setiap variabel, paddingTopBottommisalnya, berisi jumlah margin pada kedua sisi elemen; yaitu paddingTopBottom == paddingTop + paddingBottom,. Saya bertanya-tanya apakah ada cara untuk mendapatkannya secara terpisah. Tentu saja, jika mereka sama, Anda dapat membagi dengan 2 :)

FireAphis
sumber
true = termasuk margin. +1000 internet
mesin terbang
Ini adalah solusi terbaik karena ini juga berfungsi IE 7. Lihat: stackoverflow.com/questions/590602/...
Leniel Maccaferri
9

Fungsi sederhana ini akan melakukannya:

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

Pemakaian:

var padding = $('#myId').pixels('paddingTop');
Mpen
sumber
3
tidak memperhitungkan auto, inheritdan %nilai
Thomas
3
@ Thomas: Tidak benar. jsfiddle.net/nXyFN jQuery sepertinya selalu mengembalikan hasilnya dalam piksel.
mpen
4
@ Mark jsfiddle.net/BNQ6S IE7 :,NaN itu tergantung pada browser. Sejauh yang saya tahu jQuery tidak menormalkan .css()tidak seperti .width()&.height()
Thomas
1
@ Thomas: Menarik. Solusi Ian (peringkat teratas) juga memiliki masalah yang sama. solusi svinto mungkin yang terbaik.
Mpen
9

Parse int

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

mengembalikan 0 untuk 0px

a53-416
sumber
9

Anda bisa mengambilnya dengan atribut CSS apa pun :

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

Anda dapat mengaturnya dengan atribut kedua dalam metode css:

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

EDIT: Jika Anda hanya perlu nilai piksel, gunakan parseInt(val, 10):

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

ok hanya untuk menjawab pertanyaan awal:

Anda bisa mendapatkan lapisan sebagai integer yang dapat digunakan seperti ini:

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

Jika Anda telah menetapkan pengukuran lain seperti px, ganti saja "ems" dengan "px". parseInt mengartikan stringpart sebagai nilai yang salah sehingga penting untuk menggantinya dengan ... tidak ada.

EeKay
sumber
2

Anda juga dapat memperluas kerangka jquery sendiri dengan sesuatu seperti:

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

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

Dengan demikian menambahkan fungsi pada objek jquery Anda yang disebut margin (), yang mengembalikan koleksi seperti fungsi offset.

fx.

$("#myObject").margin().top
cralexns
sumber
2
Sayangnya ini tidak memberi Anda margin atas dan kiri, melainkan margin total Vertikal dan total horisontal
Code Commander
Namun itu bisa diedit menggunakan fungsi parseInt di salah satu solusi lain untuk memungkinkan fungsi margin yang lebih mulus
Brian
1

Jangan gunakan string.replace ("px", ""));

Gunakan parseInt atau parseFloat!

RubbelDeCatc
sumber
0

Saya mungkin menggunakan plugin jithery github.com/bramstein/jsizes untuk paddings dan margin dengan cara yang sangat nyaman, Terima kasih ...

Mustafah
sumber
0

Bukan untuk necro tapi saya membuat ini yang dapat menentukan piksel berdasarkan berbagai nilai:

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

Dengan cara ini, kami memperhitungkan ukuran, dan otomatis / mewarisi.

Nijikokun
sumber
Perhatikan bahwa parseInt()itu salah, lebar atau tinggi bisa menjadi titik mengambang.
Alexis Wilke