.width()によって返された値を丸めないようにjQueryを作成するにはどうすればよいですか?


94

私は周りを検索しましたが、これを見つけることができませんでした。divの幅を取得しようとしていますが、小数点がある場合は数値を丸めます。

例:

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

実行$('#container').width();すると、543.5ではなく543が返されます。数値を四捨五入せずに、完全な543.5(またはそれが何であるか)を返すにはどうすればよいですか。


2
小数のピクセル幅があるのはなぜですか?彼らはとにかく整数に丸められます。ピクセルを半分にすることはできません。
Moin Zaman、2010

なぜこれが必要なのですか?その情報がなければ、この質問は無意味です。
ファンメンデス

2
@JuanMendes私の場合、HiDPIディスプレイでは、Chrome 38は整数以外のウィンドウ幅を計算します。したがって、たとえば$ .widthが1250.6から1251に切り上げられ、1251に基づいて計算すると、問題が発生します。切り捨てはそれほど問題ではありません。
JKS 2014年

回答:


196

Element.getBoundingClientRect要素のスタイルではなく、ネイティブを使用します。IE4で導入され、すべてのブラウザでサポートされています。

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

注:IE8以下については、MDNドキュメントの「ブラウザの互換性」のメモを参照してください。


9
+1別の要素の幅を設定する場合は、その幅を次のように変更してください:$( "#other")。css( "width"、$( '#container')。get(0).getBoundingClientRect( ).width + "px"); jQuery width()を使用する場合、値は丸められます。
lepe 2014年

1
この同様の質問によるwidthheightプロパティはIEのすべてのバージョンでサポートされていないので、いくつかのケースでは、彼らが使用することができます前に計算する必要があります stackoverflow.com/questions/11907514/...
flyingL123

いいね!outerWidth(true)について同じ質問ですか?:)小さな注釈: `IE8以前では、getBoundingClientRect()によって返されるDOMRectオブジェクトには、高さと幅のプロパティがありません。また、(高さと幅を含む)追加の特性は、これらDOMRectのobjects.`に付加することができない
TecHunter

5
getBoundingClientRect()は、CSS変換の適用後に寸法を計算することに注意してください。
user1620220

テストの結果、この方法は非表示の要素(display: none)では機能しないことがわかりました。
Jory Hogeveen 2017年

9

質問は古いですが、ここに私の経験を追加したいと思います:上記のコンセンサスは、jQueryの丸めが丸められていない計算と同じくらい効果的であるようです-しかし、私が行っていることにはそうではないようです。

私の要素には一般的に流動的な幅がありますが、AJAXを介して動的に変化するコンテンツです。コンテンツを切り替える前に、要素のサイズを一時的にロックして、トランジション中にレイアウトが跳ね回らないようにします。次のようなjQueryを使用していることがわかりました。

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

実際の幅と計算された幅の間にサブピクセルの違いがあるように、いくつかのおかしさを引き起こしています。(具体的には、テキストの1行から別の行に単語がジャンプし、ロックされただけでなく、幅が変更されたことを示します。)別の質問から- 要素の実際の浮動小数点幅を取得 -見つけましたアウトwindow.getComputedStyle(element).width丸められていない計算を返します。だから私は上のコードを次のようなものに変更しました

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

そして、そのコードで- 面白いバウンスはありません!その経験は、丸められていない値が実際にすることを示唆しているようだ、右、ブラウザに問題?(私の場合、Chromeバージョン26.0.1410.65。)


jQueryの.css()の現在のドキュメントは、getComputedStyle()がruntimeStyle()i IEと呼ばれることを指摘しており、.css()の利点の1つはこの統一されたインターフェースであると主張しています。
norwebian 2013

9

Ross Allenの答えは良い出発点ですが、getBoundingClientRect()。widthを使用すると、jqueryの幅関数ではないパディングと境界線の幅も含まれます

返されるTextRectangleオブジェクトには、パディング、スクロールバー、およびボーダーが含まれますが、マージンは含まれません。Internet Explorerでは、外接する四角形の座標には、クライアント領域の上下の境界が含まれます。

width正確に値を取得することが目的である場合は、次のようにパディングと境界を削除する必要があります。

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

あなたはべきではない.replace("px", "")として、parseIntあなたのためにそれを削除する必要があります。
Steve Schrab

この質問はすべて丸めの防止に関するものですが、ここでは、パディング値には丸めが適切であるという明示的な仮定に戸惑いました。幅の値と異なる扱いをするのはなぜですか?parseFloat()多分使う?
phils 2018年

同様に、innerWidth()元の問題の一部であるため、ここでの境界線幅の計算も丸められた値で機能しているのではないかと心配しています。
phils 2018年


-1

以下を使用して、正確な幅を取得します。

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

実際に設定してjqueryで計算された幅を取得し、それを使用できるようにしたい理由style.width
user151496
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.