Bagaimana cara membuat jQuery menjadi nilai bulat yang dikembalikan oleh .width ()?

94

Saya telah mencari-cari dan tidak dapat menemukan ini. Saya mencoba untuk mendapatkan lebar div, tetapi jika memiliki koma desimal itu membulatkan angka.

Contoh:

#container{
    background: blue;
    width: 543.5px;
    height: 20px;
    margin: 0;
    padding: 0;
}

Jika saya melakukannya, $('#container').width();itu akan menghasilkan 543, bukan 543,5. Bagaimana cara mendapatkannya agar tidak membulatkan angka dan mengembalikan 543,5 penuh (atau angka berapapun itu).

MoDFoX
sumber
2
Mengapa Anda memiliki lebar piksel desimal? Mereka tetap dibulatkan menjadi bilangan bulat. Anda tidak boleh memiliki setengah piksel.
Moin Zaman
Mengapa Anda membutuhkan ini? Tanpa info itu, pertanyaan ini tidak ada gunanya.
Juan Mendes
2
@JuanMendes Dalam kasus saya, pada tampilan HiDPI, Chrome 38 menghitung lebar jendela non-integer. Jadi, jika $ .width membulatkan, katakanlah, 1250,6 menjadi 1251, dan saya membuat kalkulasi berdasarkan 1251, saya punya masalah. Pembulatan tidak terlalu menjadi masalah.
JKS

Jawaban:

198

Gunakan native Element.getBoundingClientRectdaripada gaya elemen. Itu diperkenalkan di IE4 dan didukung oleh semua browser:

$("#container")[0].getBoundingClientRect().width

Catatan: Untuk IE8 dan yang lebih lama, lihat catatan "Kompatibilitas Browser" di dokumen MDN.

Ross Allen
sumber
9
+1 Jika Anda menyetel lebar elemen lain, pastikan untuk mengubah lebarnya seperti ini: $ ("# other"). Css ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + "px"); Jika Anda menggunakan jQuery width () nilainya akan dibulatkan.
lepe
1
Berdasarkan pertanyaan serupa ini, properti widthdan heighttidak didukung di semua versi IE, jadi dalam beberapa kasus properti dan perlu dihitung sebelum dapat digunakan: stackoverflow.com/questions/11907514/…
flyingL123
Bagus! pertanyaan yang sama untuk outerWidth (true)? :) komentar kecil: `Di IE8 dan di bawahnya, objek DOMRect yang dikembalikan oleh getBoundingClientRect () tidak memiliki properti tinggi dan lebar. Selain itu, properti tambahan (termasuk tinggi dan lebar) tidak dapat ditambahkan ke objek
DOMRect ini.`
5
Perhatikan bahwa getBoundingClientRect()menghitung dimensi setelah menerapkan transformasi CSS .
pengguna1620220
Setelah pengujian saya menemukan bahwa metode ini tidak berfungsi untuk elemen tersembunyi ( display: none).
Jory Hogeveen
10

Jawaban Ross Allen adalah titik awal yang baik, tetapi menggunakan getBoundingClientRect (). Width juga akan menyertakan padding dan lebar batas yang bukan merupakan fungsi lebar jquery :

Objek TextRectangle yang dikembalikan menyertakan padding, scrollbar, dan perbatasan, tetapi tidak termasuk margin. Di Internet Explorer, koordinat persegi panjang pembatas mencakup batas atas dan kiri dari area klien.

Jika maksud Anda adalah mendapatkan widthnilai dengan presisi, Anda harus menghapus padding dan border seperti ini:

var a = $("#container");
var width = a[0].getBoundingClientRect().width;

//Remove the padding width (assumming padding are px values)
width -= (parseInt(a.css("padding-left")) + parseInt(a.css("padding-right")));

//Remove the border width
width -= (a.outerWidth(false) - a.innerWidth());
The_Black_Smurf
sumber
Anda seharusnya tidak .replace("px", "")seperti yang parseIntharus menghapusnya untuk Anda.
Steve Schrab
Pertanyaan ini semua tentang mencegah pembulatan, saya bingung dengan asumsi eksplisit di sini bahwa pembulatan baik-baik saja untuk nilai padding. Mengapa Anda memperlakukannya secara berbeda dengan nilai lebar ?! Gunakan parseFloat()mungkin?
phils
Demikian pula, dengan innerWidth()menjadi bagian dari masalah awal, saya khawatir penghitungan lebar batas di sini juga bekerja pada nilai yang dibulatkan.
phils
9

Hanya ingin menambahkan pengalaman saya di sini, meskipun pertanyaannya sudah lama: Konsensus di atas tampaknya adalah bahwa pembulatan jQuery secara efektif sama baiknya dengan perhitungan yang tidak dibulatkan - tetapi tampaknya itu tidak terjadi pada sesuatu yang telah saya lakukan .

Elemen saya memiliki lebar yang dapat berubah-ubah, secara umum, tetapi konten yang berubah secara dinamis melalui AJAX. Sebelum mengganti konten, saya mengunci sementara dimensi elemen sehingga tata letak saya tidak terpental selama transisi. Saya telah menemukan bahwa menggunakan jQuery seperti ini:

$element.width($element.width());

menyebabkan beberapa kelucuan, seperti ada perbedaan sub-piksel antara lebar sebenarnya dan lebar yang dihitung. (Secara khusus, saya akan melihat sebuah kata melompat dari satu baris teks ke baris lain, yang menunjukkan bahwa lebarnya telah diubah, tidak hanya dikunci.) Dari pertanyaan lain - Mendapatkan lebar floating-point aktual dari suatu elemen - Saya menemukan keluar yang window.getComputedStyle(element).widthakan mengembalikan kalkulasi tidak bulat. Jadi saya mengubah kode di atas menjadi seperti

var e = document.getElementById('element');
$('#element').width(window.getComputedStyle(e).width);

Dan dengan kode ITU - tidak ada pantulan lucu! Pengalaman itu sepertinya menunjukkan bahwa nilai yang tidak di-ground benar - benar penting bagi browser, bukan? (Dalam kasus saya, Chrome Versi 26.0.1410.65.)

davidtheclark
sumber
Dokumen saat ini untuk .css () jQuery menunjukkan bahwa getComputedStyle () disebut runtimeStyle () i IE, dan mengklaim salah satu keuntungan dari .css () adalah antarmuka terpadu ini.
norwebian
2

Anda dapat menggunakannya getComputedStyleuntuk itu:

parseFloat(window.getComputedStyle($('#container').get(0)).width)
Anton Chukanov
sumber
-1

Gunakan berikut ini untuk mendapatkan lebar yang akurat:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;
Ali Hasan
sumber
mengapa Anda bahkan ingin jquery mendapatkan lebar yang dihitung jika Anda benar-benar menyetelnya dan membuatnya tersedia distyle.width
user151496