Javascript ile kaydırma çubuğu konumu nasıl alınır?


191

Geçerli görünümde sayfada nerede olduğuna karar vermek için JavaScript ile tarayıcının kaydırma çubuğunun konumunu tespit etmeye çalışıyorum. Benim tahminim, parçanın başparmağının nerede olduğunu ve ardından parçanın toplam yüksekliğinin bir yüzdesi olarak başparmağın yüksekliğini tespit etmem gerektiğidir. Aşırı karmaşık mıyım yoksa JavaScript bundan daha kolay bir çözüm sunuyor mu? Herhangi bir fikir kod bilge?

Yanıtlar:


210

Sen kullanabilirsiniz element.scrollTopve element.scrollLeftofset dikey ve yatay sırasıyla bu kaydırıldığını olsun. tüm sayfayı önemsiyorsanız elementolabilir document.body. Sen karşılaştırabilirsiniz element.offsetHeightve element.offsetWidth(yine elementsen yüzdeleri gerekiyorsa vücut olabilir).


2
Hangi tarayıcıyı kullanıyorsunuz? Vücudu almak farklı tarayıcılarda farklı yapılır ( elementve document.bodysadece örneklerdir). Ayrıntılar için howtocreate.co.uk/tutorials/javascript/browserwindow adresine bakın.
Max Shawabkeh

8
Firefox 3.6 ile bana doğru değeri vermek için aldım window.pageYOffset, ama IE7 üzerinde çalışan bir şey alamıyorum. Güvenilir window.pageYOffset, document.body.scrollTop, document.documentElement.scrollTop,element.scrollTop
Paul

1
scrollTop sadece parantez eklediğimde benim için çalıştı ... $ (". scrollBody"). scrollTop ()
maia

9
'Window' Öğesi ile uğraşıyorsanız window.scrollTop yerine window.scrollY kullanabilirsiniz
Janis Jansen

6
Sanırım document.bodyçoğu modern tarayıcıda kaydırma konumu açık değil - genellikle document.documentElementşimdi açık. Chrome'un geçişi için bugs.chromium.org/p/chromium/issues/detail?id=157855 adresine bakın .
fzzfzzfzz

134

Bunu <div>Chrome'da bir için yaptım .

element .scrollTop - kaydırma nedeniyle üstte gizlenmiş piksellerdir. Kaydırma olmadan değeri 0'dır.

element .scrollHeight - tüm div'in pikselidir .

element .clientHeight - tarayıcınızda gördüğünüz piksellerdir.

var a = element.scrollTop;

pozisyon olacak.

var b = element.scrollHeight - element.clientHeight;

scrollTop için maksimum değer olacaktır .

var c = a / b;

[0'dan 1'e] kaydırma yüzdesi olacaktır .


3
Bu neredeyse doğru. var b için window.innerHeight öğesini element.clientHeight değil.
Kahless

51
document.getScroll = function() {
    if (window.pageYOffset != undefined) {
        return [pageXOffset, pageYOffset];
    } else {
        var sx, sy, d = document,
            r = d.documentElement,
            b = d.body;
        sx = r.scrollLeft || b.scrollLeft || 0;
        sy = r.scrollTop || b.scrollTop || 0;
        return [sx, sy];
    }
}

iki tamsayı içeren bir dizi döndürür- [scrollLeft, scrollTop]


4
Bu işlevin bir örnekle nasıl kullanılacağını göstermek harika olurdu.
user18490

1
Sanırım bu lastscroll kullanabilirsiniz = getScroll (); window.scrollTo (lastscroll [0], lastscroll [1]);
Dinesh Rajan

Harika çalışıyor ama benim için biraz daha mantıklı çünkü x ve y tuşları ile bir nesneye dönüş değiştirdi.
xd6_

@ User18490 adlı kullanıcının yorumunu takip ederek düzenlendi.
Davide Cannizzo

ReferenceError: Değişken bulunamıyor: element
Jonny

33

bunun gibi :)

window.addEventListener("scroll", function (event) {
    var scroll = this.scrollY;
    console.log(scroll)
});

11

2018 için cevap :

Bunun gibi şeyler yapmanın en iyi yolu Kesişim Gözlemci API'sını kullanmaktır .

Kesişim Gözlemcisi API'si, bir hedef öğenin bir üst öğe veya üst düzey bir belgenin görünüm alanı ile kesişimindeki değişiklikleri eşzamansız olarak gözlemlemek için bir yol sağlar.

Tarihsel olarak, bir öğenin görünürlüğünü veya iki öğenin birbiriyle ilişkili göreli görünürlüğünü tespit etmek, çözümlerin güvenilir olmadığı ve tarayıcının ve kullanıcının eriştiği sitelerin halsizleşmesine neden olmaya zorlandığı zor bir iş olmuştur. Ne yazık ki, web olgunlaştıkça, bu tür bilgilere duyulan ihtiyaç artmıştır. Kavşak bilgisine aşağıdakiler gibi birçok nedenden dolayı ihtiyaç duyulur:

  • Bir sayfa olarak görüntülerin veya diğer içeriklerin tembel olarak yüklenmesi kaydırma yapar.
  • Siz kaydırdıkça daha fazla içeriğin yüklendiği ve oluşturulduğu "sonsuz kaydırma" web sitelerinin uygulanması, böylece kullanıcının sayfalar arasında gezinmesi gerekmez.
  • Reklam gelirlerini hesaplamak için reklamların görünürlüğünün raporlanması.
  • Kullanıcının sonucu görüp görmeyeceğine göre görevlerin veya animasyon işlemlerinin gerçekleştirilip gerçekleştirilmeyeceğine karar verme.

Geçmişte kavşak algılamanın uygulanması, etkilenen her öğe için gerekli bilgileri oluşturmak üzere olay işleyicileri ve döngüler çağıran yöntemleri Element.getBoundingClientRect () içeriyordu. Tüm bu kod ana iş parçacığında çalıştığından, bunlardan biri bile performans sorunlarına neden olabilir. Bir site bu testlerle yüklendiğinde, işler çirkinleşebilir.

Aşağıdaki kod örneğine bakın:

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');
observer.observe(target);

Çoğu modern tarayıcı IntersectionObserver'ı destekler , ancak geriye dönük uyumluluk için çoklu dolguyu kullanmalısınız .



3

JQuery kullanıyorsanız sizin için mükemmel bir işlev vardır: .scrollTop ()

burada doküman -> http://api.jquery.com/scrollTop/

not: bu işlevi almak için VEYA konumu ayarlamak için kullanabilirsiniz.

ayrıca bkz: http://api.jquery.com/?s=scroll


25
Ham JS'de bunu yapmak tamamen mümkün ve hatta uygun olduğunda, JS ile ilgili bir soruyu neden JS için bir kütüphane ile cevaplayalım? Ondan ek yükleme süresi eklemesini ve tamamen gereksiz bir şey için biraz depolama alanı kullanmasını istiyorsunuz. Ayrıca, javascript ne zamandan beri JQuery anlamı başladı?
DaemonOfTheWest

4
Eğer ayrı ayrı sormak jQuery hiç sevmedim ve ben bu soruyu cevaplamadım ama Vanilla JS zaten bazı arkadaşlar bu iş parçacığında lezzetli bir baharat eklediyseniz ne sorun var o zaman başka arkadaşlar tarafından verilen cevaplar var. jQuery kullanıyorsunuz)
Ravinder Payal

@ R01010010 çünkü günümüzde JQuery işe yaramaz ve üretken değil, JQuery'deki tüm özellikler VanilaJS ile kolayca uygulanabiliyor, ayrıca JQuery'nin içerisine neyin bağlı olduğuna, VanillsaJS'de bulunan yeni özelliklerle, sadece örnek olarak güncellenmeyeceksiniz , şimdi VanillaJS'de eski XHR'nin yerini alan fetch adında yeni bir API var, eğer sadece JQuery dünyasında olsaydınız getirme avantajlarını asla görmeyecek ve jQuery.ajax () kullanmaya devam edeceksiniz. JQuery kullanarak öğrenmeyi bıraktılar çünkü. Ayrıca VanillaJS daha hızlı vanilla-js.com
John Balvin Arias

@JohnBalvinArias getirme hakkında konuşuyor, ie11 hatta Edge'de ne var?
Ben

Yanılıyorsam beni düzeltin, ama getirme "modern" yani düzgün çalışmaz, yani hala yaygın olarak kullanılır. Eğer jquery kullanıyor olsaydım, o zaman ilerlemeye teşvik edilemez
Ben

3

Kaydırma pozisyonunu almanın diğer yolu

const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

0

Aşağıdaki fonksiyonun kaydırma koordinat değerlerine sahip olmasına yardımcı olabileceğini düşünüyorum:

const getScrollCoordinate = (el = window) => ({
  x: el.pageXOffset || el.scrollLeft,
  y: el.pageYOffset || el.scrollTop,
});

Bu fikri küçük bir değişiklikle bu cevaptan aldım .

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.