CSSルールのパーセンテージ値をjQueryで取得します


98

ルールが次のとおりだとします。

.largeField {
    width: 65%;
}

ピクセル値ではなく、どういうわけか「65%」を取り戻す方法はありますか?

ありがとう。

編集:残念ながら、他のスタイルシートをインポートするスタイルシートがあり、結果としてcssRulesパラメータがnullまたは未定義の値で終わるため、DOMメソッドの使用は私の場合は信頼できません

このアプローチは、しかし、最も簡単な例(1つのスタイルシート、内部に複数の独立したスタイルシート宣言でうまくいくヘッド文書のタグを)。


1
要素自体にこのデータをシードし、それが将来どのように変化するかを追跡するのが最善です。
Travis J

回答:


51

組み込みの方法はありません、私は恐れています。あなたはこのようなことをすることができます:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';

19
明確にするために、これはあなたのスタイルの価値を教えてくれません、それはあなたに計算された価値を与えます
Anthony Johnston

2
@shevski正常に動作します。class="largeField"スパンに追加する必要があります。現在、空のセットを選択しています。
アダムラセク2012年

私はそれで何がうまくいっていないかを知っています、そしてそれがそれが反例である理由です。
シェフスキー2012年

2
@shevski私の例では、Anthonyが1年前にすでに指摘したように、ページ上の既存の要素の計算値を示しています。あなたのコメントは不必要です。
アダムラセク

@ AdamLassek、Anthonyはそれが最も存在するとは言いませんでした。
シェフスキー2012年

116

最も簡単な方法

$('.largeField')[0].style.width

// >>> "65%"

50
ただ注意:これは、要素に直接適用されたcssでのみ機能します(例:)style="width:65%"
brianreavis 2012

3
すごい!!数値のみを返すには:parseInt($( '。largeField')[0] .style.width、10);
ティアゴ2013年

4
ティアゴ、parseFloat()を使うだけです。
Gavin

@brianreavisが言ったように、これはインラインスタイルでのみ機能します。
Akansh 2017

84

これは間違いなく可能です!

最初に親要素を非表示にする必要があります。これにより、JavaScriptが子要素のピクセルを計算できなくなります。

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

私の例を見てください。

さて...私はこのハックを最初に発見したのだろうか:)

更新:

一発ギャグ

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

</body>タグの前に、必要に応じて非表示要素を残すことができます.remove()

ワンライナーの例をご覧ください。

私はより良いアイデアに心を開いています!


1
これは受け入れられる解決策です。また、他の回答が最初に割り当てられたパーセンテージの値を取得しない場合に、それが機能することを確認できます。
EricP 2013年

1
ちらつきを回避するには、子のクローンを作成し、親を非表示にしてから、幅を取得します。var clone = $( '。child')。clone();
user1491819 2014

3
更新:関数getCssWidth(childSelector){return jQuery(childSelector).parent()。clone()。hide()。find(childSelector).width(); } console.log( 'child width:' + getCssWidth( '。child'));;
user1491819 2014

1
素晴らしいソリューション!これは、スクリプトjsfiddle.net/Sjeiti/2qkftdjdに
Sjeiti

1
$(...)[0] .style.widthの答えが機能する場合、それは受け入れられる解決策ではありませんか?このソリューションは洗練されていますが、パフォーマンス上の欠点がいくつかあります。
ミハイダニーラ2016年

44

document.styleSheetsオブジェクトにアクセスできます:

<style type="text/css">
    .largeField {
        width: 65%;
    }
</style>
<script type="text/javascript">
    var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
    for (var i=0; i < rules.length; i++) {
        var rule = rules[i];
        if (rule.selectorText.toLowerCase() == ".largefield") {
            alert(rule.style.getPropertyValue("width"));
        }
    }
</script>

8
+1 DOMメソッドの適切な使用法(jQueryが答えにならない場合もあります)
bobince 2009

1
+1正確さを期するため、ここにいます。各ブラウザがこれをサポートする方法について知りたいのですが、これが正解です。
cgp 2009

FFとIE7の両方の単純なケースではうまく機能しますが、私には適していません(上記の編集を参照)。
モントリオール

1
すべてのスタイルシートも実行してみましたか?私の例では、最初の(styleSheets[0])を使用しました。
ガンボ

これがnoobの質問の場合は申し訳ありませんが、どのようにfor (var i=0; rules.length; i++)機能しますか?すべきではないfor (var i=0; i<rules.length; i++)
sbichenko

18

遅いですが、新しいユーザーの場合、CSSスタイルにパーセンテージが含まれている場合は、これを試してください。

$element.prop('style')['width'];

css font-sizeの魅力のように働きました。$ element.prop( 'style')['font-size];
Jason

10

Adamsの回答に基づくjQueryプラグイン:

(function ($) {

    $.fn.getWidthInPercent = function () {
        var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
        return Math.round(100*width)+'%';
    };

})(jQuery);

$('body').html($('.largeField').getWidthInPercent());​​​​​

「65%」を返します。必要に応じて(width == '65%')のように機能する場合にのみ、丸めた数値を返します。Adamsの回答を直接使用したとしたら、それはうまくいきませんでした(私は64.93288590604027のようなものを手に入れました)。:)


3

timofeyの優れた驚くべきソリューションに基づいて、純粋なJavascript実装を以下に示します。

function cssDimensions(element)
  var cn = element.cloneNode();
  var div = document.createElement('div');
  div.appendChild(cn);
  div.style.display = 'none';
  document.body.appendChild(div);
  var cs = window.getComputedStyle
    ? getComputedStyle(cn, null)
    : cn.currentStyle;
  var ret = { width: cs.width, height: cs.height };
  document.body.removeChild(div);
  return ret;
}

それが誰かに役立つことを願っています。


構文エラーの場合{、最初の行の終わりを忘れていました。
Akansh 2017

このソリューションでのみ、divの幅が設定されていない場合に「auto」が正しく表示され、jquery css( 'width')は「0px」を返します。その他すべての回答は正しくありません...
Alexey Obukhov

1

jQueryでグローバルスタイルシートの値を取得する際にも同様の問題がありますが、最終的には上記と同じソリューションを思いつきました。

他の人が後の調査結果から利益を得られるように、2つの質問を相互に関連付けたいと思っていました。


2
あなたの質問とこの質問は、shesekがあなたの質問にコメントしたおかげで、すでにリンクされています(右側の「リンクされた」サイドバーを参照)。
Chris Johnsen、2011

0

jQueryでアクセスする必要があるスタイルを次のいずれかに配置できます。

  1. 文書の頭
  2. インクルードでは、どのサーバー側スクリプトが先頭に置かれるか

次に、(必ずしも簡単ではありませんが)js関数を記述して、ドキュメントヘッドのスタイルタグ内のすべてを解析し、必要な値を返すことができるはずです。


0

css(width)関数を使用して、要素の現在の幅を返すことができます。

すなわち。

var myWidth = $("#myElement").css("width");

参照:http : //api.jquery.com/width/ http://api.jquery.com/css/


なぜこれがマークダウンされているのですか?このbugs.jquery.com/ticket/4772に未解決のバグがあり、スタイルをインラインに配置するか、スタイルシートjsfiddle.net/boushley/MSyqR/2
Anthonyに

1
私はこれで%を得ることができません
誰か役に立たない

0

jQueryには何もありませんし、JavaScriptにも簡単なものはありません。timofeyの答えを取り入れて実行し、必要なプロパティを取得するために機能するこの関数を作成しました。

// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for 
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
    if(!(properties instanceof Array)) properties = [properties]

    var parent = domNode.parentNode
    if(parent) {
        var originalDisplay = parent.style.display
        parent.style.display = 'none'
    }
    var computedStyles = getComputedStyle(domNode)

    var result = {}
    properties.forEach(function(prop) {
        result[prop] = computedStyles[prop]
    })

    if(parent) {
        parent.style.display = originalDisplay
    }

    return result
}

0

相互乗算を使用して、ピクセルからパーセントに変換します。

数式の設定:

1.)(element_width_pixels / parent_width_pixels)=(element_width_percentage / 100)

2.)element_width_percentage =(100 * element_width_pixels)/ parent_width_pixels

実際のコード:

<script>

   var $width_percentage = (100 * $("#child").width()) / $("#parent").width();

</script>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.