jQuery'de CSS kuralının yüzde değerini alın


98

Diyelim ki kural şöyle:

.largeField {
    width: 65%;
}

Bir şekilde "% 65" i geri almanın bir yolu var mı, piksel değerini değil mi?

Teşekkürler.

DÜZENLEME: Ne yazık ki DOM yöntemlerini kullanmak benim durumumda güvenilmez, çünkü diğer stil sayfalarını içe aktaran bir stil sayfam var ve sonuç olarak cssRules parametresi null veya tanımsız değerle sonuçlanıyor .

Bununla birlikte, bu yaklaşım, çoğu basit durumda işe yarayacaktır (bir stil sayfası, belgenin head etiketinin içinde birden çok ayrı stil sayfası bildirimi ).


1
Bu verileri öğenin kendisine yerleştirmek ve ardından gelecekte nasıl değiştiğini izlemek en iyisidir.
Travis J

Yanıtlar:


51

Korkarım yerleşik bir yol yok. Bunun gibi bir şey yapabilirsiniz:

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

19
sadece açık olmak gerekirse, bu size tarzınızın değerini söylemiyor, size hesaplanmış bir değer veriyor
Anthony Johnston

2
@shevski iyi çalışıyor class="largeField", aralığa eklemeniz gerekiyor, şu anda boş bir set seçiyorsunuz .
Adam Lassek

İçinde neyin işe yaramadığını biliyorum ve bu yüzden bu bir karşı örnek.
shevski

2
@shevski örneğim, Anthony'nin bir yıl önce işaret ettiği gibi, sayfadaki mevcut bir öğenin hesaplanmış değerini veriyor. Yorumlarınız gereksizdir.
Adam Lassek

@AdamLassek, Anthony en çok var olduğunu söylemedi.
shevski

116

En kolay yol

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

// >>> "65%"

50
Sadece bir not: bu sadece doğrudan öğeye uygulanan css ile çalışacaktır (örn. style="width:65%").
brianreavis

3
Harika!! Yalnızca sayıları döndürmek için: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago

4
Tiago, sadece parseFloat () kullanabilirsiniz.
Gavin

@Brianreavis'in dediği gibi bu yalnızca satır içi stillerde çalışır.
Akansh

84

Bu kesinlikle mümkün!

Önce ana öğeyi gizlemelisiniz (). Bu, JavaScript'in alt öğe için pikselleri hesaplamasını engelleyecektir.

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

Benim Bkz örnek .

Şimdi ... Bu hack'i ilk keşfeden ben miyim merak ediyorum :)

Güncelleme:

Tek astarlı

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

</body>Etiketinden önce arkasında isteyebileceğiniz gizli bir öğe bırakacaktır .remove().

Tek satırlık bir örneğe bakın .

Daha iyi fikirlere açığım!


1
Kabul edilen çözüm bu olmalıdır. Ayrıca, diğer yanıtların başlangıçta atanan yüzde değerini almadığı durumlarda bunun benim için çalıştığını onaylayabilirim.
EricP

1
Titremeyi önlemek için çocuğu klonlayın, ana öğeyi gizleyin ve ardından genişliği geri alın. var klon = $ ['. çocuk']. clone ();
user1491819

3
Güncelleme: fonksiyon getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('child width:' + getCssWidth ('. child')) ;;
user1491819

1
Harika çözüm! İşte jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

1
$ (...) [0] .style.width cevabı işe yararsa, kabul edilen çözüm bu olmamalı mı? Bu çözüm zarif olsa da bazı performans eksikliklerine sahiptir.
Mihai Danila

44

document.styleSheetsNesneye erişebilirsiniz :

<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
DOM yöntemlerinin +1 doğru kullanımı (bazen jQuery cevap değildir)
bobince

1
+1 Doğruluk için buradayım. Her tarayıcının bunu nasıl desteklediğini merak ediyorum, ancak bu doğru cevap.
cgp

Hem FF hem de IE7 gibi daha basit durumlarda iyi çalışıyor, ancak benim için değil (yukarıdaki DÜZENLE'ye bakın).
montrealist

1
Tüm stil sayfalarında da çalışmayı denediniz mi? Örneğim sadece ilkini ( styleSheets[0]) kullandı.
Gumbo

Bu çaylak bir soruysa özür dilerim, ama nasıl for (var i=0; rules.length; i++)çalışır? Olmamalıfor (var i=0; i<rules.length; i++)
sbichenko

18

Geç, ancak daha yeni kullanıcılar için, css stili bir yüzde içeriyorsa şunu deneyin :

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

CSS yazı tipi boyutu için bir cazibe gibi çalıştı. $ element.prop ('stil') ['yazı tipi boyutu];
Jason

10

Adams yanıtına dayalı bir jQuery eklentisi:

(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" döndürür. Yalnızca isterseniz daha iyi çalışması için yuvarlanmış sayıları döndürür (genişlik == '% 65') Adams'ın cevabını doğrudan kullanacak olsaydın, bu işe yaramadı (64.93288590604027 gibi bir şey aldım). :)


3

Timofey'nin mükemmel ve şaşırtıcı çözümünü temel alan işte tam bir Javascript uygulaması:

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;
}

Umarım birine yardımcı olur.


bir sözdizimi hatası, {ilk satırın sonunda unuttunuz .
Akansh

div için genişlik ayarlanmadığında yalnızca bu çözüm doğru şekilde 'otomatik' gösterir, jquery css ('genişlik') '0px' döndürür. diğer tüm cevaplar yanlış ...
Alexey Obukhov


0

JQuery ile erişmeniz gereken stilleri şunlardan birine koyabilirsiniz:

  1. doğrudan belgenin başı
  2. bir dahil, hangi sunucu tarafı komut dosyasını daha sonra kafaya koyar

Daha sonra, belge başlığındaki stil etiketleri içindeki her şeyi ayrıştırmak ve ihtiyacınız olan değeri döndürmek için bir js işlevi yazmanız (her ne kadar kolay olmasa da) mümkün olmalıdır.



0

JQuery'de hiçbir şey yoktur ve javascript'te bile basit bir şey yoktur. Timofey'in cevabını alıp onunla koşarak, istediğiniz özellikleri elde etmek için çalışan bu işlevi yarattım:

// 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

Çapraz çarpma kullanarak piksellerden yüzdeye dönüştürme .

Formül Kurulumu:

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

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

Gerçek kod:

<script>

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

</script>
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.