JQuery'nin .width () tarafından döndürülen değeri yuvarlamaması nasıl sağlanır?


94

Etrafı araştırdım ve bulamadım. Bir div'in genişliğini elde etmeye çalışıyorum, ancak ondalık noktası varsa sayıyı yuvarlar.

Misal:

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

Ben yaparsanız $('#container').width();o 543 yerine 543.5 dönecektir. Sayıyı yuvarlamamayı ve tam 543.5'i (ya da herhangi bir sayı) döndürmemesini nasıl sağlayabilirim?


2
Neden ondalık piksel genişliklerine sahipsiniz? Yine de tam sayılara yuvarlanırlar. Yarım pikseliniz olamaz.
Moin Zaman

buna ne için ihtiyacın var? Bu bilgi olmadan, bu soru anlamsız.
Juan Mendes

2
@JuanMendes Benim durumumda, bir HiDPI ekranında, Chrome 38 tamsayı olmayan bir pencere genişliğini hesaplar. Yani, diyelim ki $ .width 1250.6'dan 1251'e yuvarlanırsa ve 1251'e göre hesaplamalar yaparsam, problemlerim olur. Aşağı yuvarlama bir sorun değildir.
JKS

Yanıtlar:


197

Element.getBoundingClientRectÖğenin stili yerine yerel olanı kullanın . IE4'te tanıtıldı ve tüm tarayıcılar tarafından destekleniyor:

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

Not: IE8 ve altı için MDN belgelerindeki "Tarayıcı Uyumluluğu" notlarına bakın.


9
+1 Başka bir elemanın genişliğini ayarlıyorsanız, genişliğini şu şekilde değiştirdiğinizden emin olun: $ ("# diğer"). Css ("genişlik", $ ('# kapsayıcı'). Get (0) .getBoundingClientRect ( ) .width + "px"); JQuery width () kullanırsanız, değer yuvarlanacaktır.
lepe

1
Bu benzer soruya göre widthve heightözellikleri
IE'nin

Güzel! OuterWidth için aynı soru (doğru)? :) küçük açıklama: `IE8 ve altında getBoundingClientRect () tarafından döndürülen DOMRect nesnesi yükseklik ve genişlik özelliklerinden yoksundur. Ayrıca, bu DOMRect nesnelerine ek özellikler (yükseklik ve genişlik dahil) eklenemez.`
TecHunter

5
Not getBoundingClientRect()hesaplar boyutları CSS dönüşümleri uygulandıktan sonra .
user1620220

Test ettikten sonra bu yöntemin gizli elemanlar ( display: none) için çalışmadığını buldum .
Jory Hogeveen

10

Ross Allen'ın cevabı iyi bir başlangıç ​​noktasıdır, ancak getBoundingClientRect () kullanımı , jquery'nin genişlik işlevi olmayan dolgu ve kenarlık genişliğini de içerecektir :

Döndürülen TextRectangle nesnesi, dolguyu, kaydırma çubuğunu ve kenarlığı içerir, ancak kenar boşluğunu hariç tutar. Internet Explorer'da, sınırlayıcı dikdörtgenin koordinatları, istemci alanının üst ve sol kenarlıklarını içerir.

Amacınız widthdeğeri hassasiyetle elde etmekse, dolguyu ve kenarlığı şu şekilde kaldırmanız gerekir:

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

Sen olmamalıdır .replace("px", "")olarak parseIntsizin için kaldırmalısınız.
Steve Schrab

Bu soru tamamen yuvarlamayı önlemekle ilgili olduğundan, burada yuvarlamanın dolgu değerleri için iyi olduğu şeklindeki açık varsayım beni şaşkına çevirdi. Neden buna genişlik değerlerinden farklı davranıyorsunuz ?! parseFloat()Belki kullan ?
phils

Benzer şekilde, innerWidth()asıl sorunun bir parçası olmakla birlikte , buradaki sınır genişliği hesaplamasının da yuvarlatılmış değerler üzerinde çalıştığından korkuyorum.
phils

9

Sadece deneyimlerimi buraya eklemek istedim, soru eski olsa da: Yukarıdaki fikir birliği, jQuery'nin yuvarlamasının etkili bir şekilde yuvarlak olmayan bir hesaplama kadar iyi olduğu gibi görünüyor - ama yaptığım bir şeyde durum böyle görünmüyor .

Öğemin genel olarak akışkan bir genişliği var, ancak içeriği AJAX aracılığıyla dinamik olarak değişiyor. İçeriği değiştirmeden önce, öğenin boyutlarını geçici olarak kilitliyorum, böylece geçiş sırasında düzenim zıplamaz. Bunu jQuery kullanarak şu şekilde buldum:

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

gerçek genişlik ile hesaplanan genişlik arasında alt piksel farklılıkları olduğu gibi biraz komikliğe neden oluyor. (Özellikle, metnin bir satırından diğerine atlayan bir kelimenin, yalnızca kilitli değil, genişliğin değiştirildiğini belirten bir kelime göreceğim.) Başka bir sorudan - Bir öğenin gerçek, kayan nokta genişliğini elde etmek - buldum dikkat window.getComputedStyle(element).widthbir unrounded hesaplama dönecektir. Bu yüzden yukarıdaki kodu aşağıdaki gibi değiştirdim

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

Ve bu kodla - komik zıplama yok! Bu deneyim unrounded değeri aslında önermek görünüyor yapar sağ tarayıcıya olsun? (Benim durumumda, Chrome Sürümü 26.0.1410.65.)


JQuery'nin .css () belgesine ilişkin mevcut belge, getComputedStyle () 'ın runtimeStyle () i IE olarak adlandırıldığına işaret etmektedir ve .css ()' nin avantajlarından birinin bu birleşik arabirim olduğunu iddia etmektedir.
norwebian

2

Bunun için kullanabilirsiniz getComputedStyle:

parseFloat(window.getComputedStyle($('#container').get(0)).width)

-1

Doğru bir genişlik elde etmek için aşağıdakileri kullanın:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;

Eğer gerçekten ayarladıysanız ve içinde style.width
mevcutsa jQuery'nin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.