dapatkan nilai persentase aturan CSS di jQuery

98

Misalkan aturannya adalah sebagai berikut:

.largeField {
    width: 65%;
}

Apakah ada cara untuk mendapatkan kembali '65% ', dan bukan nilai pikselnya?

Terima kasih.

EDIT: Sayangnya menggunakan metode DOM tidak dapat diandalkan dalam kasus saya, karena saya memiliki stylesheet yang mengimpor stylesheet lain, dan sebagai hasilnya parameter cssRules berakhir dengan nilai null atau tidak ditentukan .

Namun, pendekatan ini akan berfungsi di sebagian besar kasus langsung (satu stylesheet, beberapa deklarasi stylesheet terpisah di dalam tag head dokumen).

montrealist
sumber
1
Akan lebih baik jika memasukkan data ini ke elemen itu sendiri dan kemudian melacak bagaimana perubahannya di masa depan.
Travis J

Jawaban:

51

Tidak ada cara bawaan, saya khawatir. Anda bisa melakukan sesuatu seperti ini:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Adam Lassek
sumber
19
hanya untuk memperjelas, ini tidak memberi tahu Anda nilai dalam gaya Anda, ini memberi Anda nilai yang dihitung
Anthony Johnston
2
@shevski berfungsi dengan baik, Anda harus menambahkan class="largeField"ke span, saat ini Anda memilih satu set kosong.
Adam Lassek
Saya tahu apa yang tidak berhasil di dalamnya dan itulah mengapa ini adalah contoh tandingan.
shevski
2
@shevski contoh saya memberikan nilai yang dihitung dari elemen yang ada di halaman, seperti yang ditunjukkan Anthony setahun yang lalu. Komentar Anda tidak berguna.
Adam Lassek
@AdamLassek, Anthony tidak mengatakan itu paling ada.
shevski
116

Cara paling mudah

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

// >>> "65%"
redexp
sumber
50
Sekadar catatan: ini hanya akan bekerja dengan css yang langsung diterapkan pada elemen (misalnya style="width:65%").
Brianreavis
3
Bagus!! Untuk mengembalikan angka: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago
4
Tiago, Anda bisa menggunakan parseFloat ().
Gavin
Ini hanya berfungsi dalam gaya sebaris seperti yang dikatakan @brianreavis.
Akansh
84

Ini sangat mungkin!

Anda harus terlebih dahulu menyembunyikan () elemen induk. Ini akan mencegah JavaScript menghitung piksel untuk elemen anak.

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

Lihat contoh saya .

Sekarang ... Saya ingin tahu apakah saya pertama kali menemukan peretasan ini :)

Memperbarui:

Satu baris

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

Ini akan meninggalkan elemen tersembunyi sebelum </body>tag, yang mungkin Anda inginkan .remove().

Lihat contoh satu baris .

Saya terbuka untuk ide yang lebih baik!

timofey.com
sumber
1
Ini harus menjadi solusi yang diterima. Saya juga dapat mengonfirmasi bahwa ini berfungsi untuk saya di mana jawaban lain tidak mendapatkan nilai persentase yang awalnya ditetapkan.
EricP
1
Untuk menghindari kedipan, klon anak, sembunyikan induk, lalu ambil lebarnya. var clone = $ ('. child'). clone ();
user1491819
3
Perbarui: function getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('lebar anak:' + getCssWidth ('. child')) ;;
pengguna1491819
1
Solusi luar biasa! Berikut adalah murni-js yang setara dengan skrip jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti
1
Jika jawaban $ (...) [0] .style.width berhasil, bukankah itu harus menjadi solusi yang diterima? Solusi ini, meskipun elegan, mengalami beberapa kekurangan kinerja.
Mihai Danila
44

Anda dapat mengakses document.styleSheetsobjek:

<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>
Gumbo
sumber
8
+1 penggunaan metode DOM yang tepat (terkadang jQuery bukan jawabannya)
bobince
1
+1 Saya bersamamu di sini untuk akurasi. Saya ingin tahu bagaimana setiap browser mendukung ini, tetapi ini adalah jawaban yang benar.
cgp
Bekerja dengan baik dalam kasus yang lebih sederhana, baik FF dan IE7, tetapi tidak untuk saya (lihat EDIT di atas).
montrealist
1
Sudahkah Anda mencoba menjalankan semua stylesheet juga? Contoh saya baru saja menggunakan yang pertama ( styleSheets[0]).
Gumbo
Maaf jika ini adalah pertanyaan noob, tapi bagaimana cara for (var i=0; rules.length; i++)kerjanya? Bukankah seharusnyafor (var i=0; i<rules.length; i++)
sbichenko
18

Terlambat, tetapi untuk pengguna baru, coba ini jika gaya css berisi persentase :

$element.prop('style')['width'];
ddanone
sumber
Bekerja seperti pesona untuk ukuran font css. $ element.prop ('style') ['font-size];
Jason
10

Sebuah plugin jQuery berdasarkan jawaban Adams:

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

Akan mengembalikan '65% '. Hanya mengembalikan angka yang dibulatkan untuk bekerja lebih baik jika Anda suka jika (lebar == '65%'). Jika Anda akan menggunakan jawaban Adams secara langsung, itu tidak berhasil (saya mendapatkan sesuatu seperti 64.93288590604027). :)

Leonard Pauli
sumber
3

Membangun solusi timofey yang sangat baik dan mengejutkan, berikut ini adalah implementasi Javascript murni:

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

Semoga bermanfaat bagi seseorang.

Gregory Magarshak
sumber
kesalahan sintaks, Anda lupa {di akhir baris pertama.
Akansh
hanya solusi ini dengan benar menampilkan 'auto' ketika lebar untuk div tidak disetel, jquery css ('width') mengembalikan '0px'. semua jawaban lain salah ...
Alexey Obukhov
1

Saya memiliki masalah serupa dalam Mendapatkan nilai stylesheet global di jQuery , akhirnya saya menemukan solusi yang sama seperti di atas .

Hanya ingin menghubungkan kedua pertanyaan tersebut sehingga orang lain bisa mendapatkan keuntungan dari temuan selanjutnya.

Horst Walter
sumber
2
Pertanyaan Anda dan pertanyaan ini sudah ditautkan (lihat sidebar "Linked" di sebelah kanan) berdasarkan komentar shesek atas pertanyaan Anda.
Chris Johnsen
0

Anda dapat menempatkan gaya yang perlu Anda akses dengan jQuery di:

  1. kepala dokumen secara langsung
  2. di include, yang kemudian ditempatkan skrip sisi server di head

Maka seharusnya dimungkinkan (meskipun tidak selalu mudah) untuk menulis fungsi js untuk mengurai semua yang ada di dalam tag gaya di kepala dokumen dan mengembalikan nilai yang Anda butuhkan.

di mana
sumber
0

Anda dapat menggunakan fungsi css (width) untuk mengembalikan lebar elemen saat ini.

yaitu.

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

Lihat juga: http://api.jquery.com/width/ http://api.jquery.com/css/

pengguna267867
sumber
mengapa ini ditandai? ada bug yang terbuka pada bug ini.jquery.com/ticket/4772 , sepertinya ada beberapa ketidakkonsistenan dalam memanggil ini tergantung pada apakah Anda meletakkan gaya Anda sebaris atau dalam lembar gaya jsfiddle.net/boushley/MSyqR/2
Anthony Johnston
1
saya tidak bisa mendapatkan% dengan ini
seseorang yang tidak berguna
0

Tidak ada apa pun di jQuery, dan tidak ada yang langsung bahkan di javascript. Mengambil jawaban timofey dan menjalankannya, saya membuat fungsi ini yang berfungsi untuk mendapatkan properti apa pun yang Anda inginkan:

// 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
}
BT
sumber
0

Ubah dari piksel menjadi persentase menggunakan perkalian silang .

Penyetelan Formula:

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

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

Kode sebenarnya:

<script>

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

</script>
Zachary Horton
sumber