Apa cara tercepat untuk memeriksa apakah suatu elemen memiliki bilah gulir?
Satu hal tentu saja adalah memeriksa apakah elemen lebih besar dari viewport-nya, yang dapat dengan mudah dilakukan dengan memeriksa dua nilai berikut:
el.scrollHeight > el.offsetHeight || el.scrollWidth > el.offsetWidth
tetapi itu tidak berarti bahwa ia juga memiliki scrollbar (jadi itu sebenarnya dapat di-scroll oleh manusia).
Pertanyaan
Bagaimana cara memeriksa scrollbar dalam 1 browser silang dan 2 javascript saja (seperti tidak ada jQuery )?
Hanya Javascript, karena saya memerlukan overhead sekecil mungkin, karena saya ingin menulis filter pemilih jQuery yang sangat cepat
// check for specific scrollbars
$(":scrollable(x/y/both)")
// check for ANY scrollbar
$(":scrollable")
Saya kira saya harus memeriksa overflow
pengaturan gaya tetapi bagaimana saya melakukannya dengan cara lintas browser?
Pengeditan tambahan
Tidak hanya overflow
pengaturan gaya. Memeriksa apakah suatu elemen memiliki scrollbar tidak sesederhana kelihatannya. Rumus pertama yang saya tulis di atas berfungsi dengan baik ketika elemen tidak memiliki perbatasan, tetapi ketika itu terjadi (terutama ketika perbatasan memiliki lebar yang cukup), offset
dimensi bisa lebih besar dari scroll
dimensi tetapi elemen masih bisa digulir. Kami sebenarnya harus mengurangi batas dari offset
dimensi untuk mendapatkan viewport aktual yang dapat digulir dari elemen dan membandingkannya dengan scroll
dimensi.
Untuk referensi di masa mendatang
:scrollable
Filter pemilih jQuery disertakan dalam .scrollintoview()
plugin jQuery saya . Kode lengkap dapat ditemukan di posting blog saya jika ada yang membutuhkannya. Meskipun tidak memberikan solusi sebenarnya, kode Soumya sangat membantu saya menyelesaikan masalah. Ini mengarahkan saya ke arah yang benar.
sumber
overflow:hidden
terpasang di atasnya? Akan ada konten berlebih tetapi masih tidak dapat di-scroll. Masalahnya sejauh ini tidak sesederhana kelihatannya.div.scrollHeight>div.clientHeight && !(div.style.overflow && div.style.overflow == 'hidden')
)?Mencoba:
Untuk scroll bar vertikal
Untuk scrollbar horizontal
Saya tahu ini berfungsi setidaknya untuk IE8 dan Firefox 3.6+.
sumber
overflow:hidden
dan tidak akan bisa digulir lagi.overflow:hidden
di dalamnya ... ini masih jawaban yang benar menurut saya, karena ini yang paling sederhana.Ini mungkin tampak (atau menjadi) sedikit hackish, tetapi Anda dapat menguji properti
scrollTop
danscrollLeft
.Jika lebih besar dari 0, Anda tahu ada scrollbar. Jika nilainya 0, setel ke 1, dan uji lagi untuk melihat apakah Anda mendapatkan hasil 1. Kemudian setel kembali ke 0.
Contoh: http://jsfiddle.net/MxpR6/1/
Saya yakin ada properti yang berbeda untuk IE, jadi saya akan memperbaruinya sebentar lagi.EDIT: Muncul seolah-olah IE mungkin mendukung properti ini. (Saya tidak dapat menguji IE sekarang.)
http://msdn.microsoft.com/en-us/library/ms534618(VS.85).aspx
sumber
offsetHeight
danclientHeight
. Yang terakhir ini selalu lebih kecil dari ukuran scrollbar saat scrollbar ada.overflow:scroll
, Anda ingin itu dilaporkan sebagai scrollable apakah scrollbar diaktifkan atau tidak. Tentu saja solusi saya bisa bermasalah jika ada acara onscroll yang dilampirkan.Ini solusi lainnya:
Seperti yang ditunjukkan oleh beberapa orang, membandingkan offsetHeight dan scrollHeight saja tidak cukup karena keduanya berbeda pada elemen dengan overflow hidden, dll., Yang masih tidak memiliki scrollbar. Jadi di sini saya juga memeriksa apakah overflow adalah scroll atau otomatis pada gaya yang dihitung untuk elemen tersebut:
sumber
overflow*
iniscroll
akan selalu ada scrollbar, jadi saya pikir Anda inginvertical: overflowY === 'scroll' || overflowY === 'auto' && node.scrollHeight > node.clientHeight
, dll (yaitu menghapus kurung sehinggascroll*
vsclient*
hanya diuji ketikaoverflow*
adalahauto
). Jika tidak, ini tampaknya solusi yang paling tepat.Saya mungkin sedikit terlambat ke pesta, tapi ...
Saya yakin Anda dapat mendeteksi scrollbar dengan e.offsetWidth vs. e.clientWidth. Lebar offset termasuk batas dan bilah gulir, bantalan dan lebar. Lebar klien termasuk bantalan dan lebar. Silahkan lihat:
https://developer.mozilla.org/en/DOM/element.offsetWidth (gambar kedua) https://developer.mozilla.org/en/DOM/element.clientWidth (gambar kedua)
Anda perlu memeriksa:
Lakukan hal yang sama untuk vertikal (offset / clientHeight).
IE7 melaporkan clientHeight 0 untuk beberapa elemen (saya belum memeriksa mengapa), oleh karena itu Anda selalu memerlukan pemeriksaan overflow pertama.
Semoga ini membantu!
sumber
Ada beberapa masalah dalam hal memeriksa keberadaan scrollbar salah satunya adalah di mac Anda tidak memiliki scrollbar yang terlihat sehingga kedua solusi di atas tidak akan memberi Anda jawaban yang akurat.
Jadi karena rendering browser tidak terlalu sering, Anda dapat memeriksa scrolling dengan mengubah scroll dan kemudian mengaturnya kembali:
sumber
Hanya main-main di sini karena tidak ada solusi di atas yang berhasil untuk saya (sejauh ini). Saya telah menemukan beberapa keberhasilan dengan membandingkan scrollheight Div dengan offsetHeight-nya
Tampaknya memberi saya perbandingan yang akurat ... sejauh ini. Apakah ada yang tahu apakah ini sah?
sumber
Untuk IE11 (Internet Explorer 11) saya harus mengubah logika menjadi:
Ini karena IE melaporkan scrollHeight sebagai 1 lebih besar dari clientHeight ketika tidak ada scrollbar tetapi kira-kira 9 lebih besar saat scrollbar ada
sumber
Jika Anda perlu mengetahui apakah ada scrollbar untuk seluruh halaman web dan dengan dukungan browser lengkap, Anda dapat menggunakan ini:
Ini penting untuk digunakan
window.innerHeight
daripadadocument.body.clientHeight
karena di beberapa browser seluler clientHeight tidak akan mendapatkan ukuran bilah alamat tetapi scrollHeight akan melakukannya, jadi Anda mendapatkan perhitungan yang salah.sumber
tidak ada dari jawaban ini yang benar. Anda harus menggunakan ini:
sumber
Tambahkan elemen lebar 100% di dalamnya. Kemudian setel overflow menjadi hidden. Jika gaya komputasi elemen (dari jQ) berubah, induk memiliki bilah gulir.
EDIT: Sepertinya Anda menginginkan metode lintas browser seperti getComputedStyle . Mencoba:
sumber
$(el).css("overflow/overflowX/overflowY")
dan melihat apakah itu diatur ke otomatis atau gulir . Tapi saya ingin menghindari penggunaan jQuery.computedStyle = el.currentStyle || document.defaultView.getComputedStyle(el, null);