2013-06-04 3 views
16

Gibt es eine Möglichkeit, vertikale Scrolldistanz bei einer Medienabfrage zu erkennen?Medienabfrage für vertikales Scrollen

Es scheint, dass Medienabfragen rund um die Erkennung des Mediums (schockierend rechts: P) so Dinge wie Browserhöhe testbar sind, aber nicht speziell, wie weit die Seite gescrollt ist.

Wenn nicht möglich ist, aber Sie wissen einen Weg in JS (nicht jQuery) fühlen sich frei zu posten!

Antwort

8

Ich glaube nicht, dass es mit einer CSS-Medienabfrage möglich ist, aber ich weiß, dass die Scroll-Höhe in JavaScript mit window.pageYOffset gefunden werden kann. Wenn Sie diesen Wert durch eine Funktion jedes Mal der Benutzer gescrollt nach oben oder unten auf einer Seite ausführen möchten, können Sie so etwas wie

window.onscroll = function() { 
    scrollFunctionHere(window.pageYOffset); 
}; 

Oder einfach tun:

window.onscroll = scrollFunctionHere; 

Wenn die Funktion selbst die aufgegebenen Wert von window.pageYOffset.

Weitere Hinweise zur effizienten Verwendung von window.onscroll in JavaScript finden Sie unter mynameistechno's answer.

Wichtiger Hinweis zur Effizienz: Das Ausführen einer Funktion jedes Mal, wenn ein Scroll-Ereignis ausgegeben wird, kann CPU-Zyklen durchbrechen, wenn im Callback nicht-triviale Vorgänge ausgeführt werden. Stattdessen sollten Sie zulassen, dass ein Rückruf nur so oft pro Sekunde ausgeführt wird. Dies wurde als "Entprellen" bezeichnet.

Einfach entprellt Scroll Event Handler-Code unten. Beachten Sie, wie der Text wechselt zwischen „HALLO“ und „Welt“ alle 250ms, anstatt jeden einzelnen Rahmen:

var outputTo = document.querySelector(".output"); 
 
var timeout_debounce; 
 

 
window.addEventListener("scroll", debounce); 
 

 
function debounce(event) { 
 
    if(timeout_debounce) { 
 
     return; 
 
    } 
 

 
    timeout_debounce = setTimeout(clearDebounce, 250); 
 
// Pass the event to the actual callback. 
 
    actualCallback(event); 
 
} 
 

 
function clearDebounce() { 
 
    timeout_debounce = null; 
 
} 
 

 
function actualCallback(event) { 
 
// Perform your logic here with no CPU hogging. 
 
    outputTo.innerText = outputTo.innerText === "HELLO" 
 
    ? "WORLD" 
 
    : "HELLO"; 
 
}
p { 
 
    padding: 40vh; 
 
    margin: 20vh; 
 
    background: blue; 
 
    color: white; 
 
}
<p class="output">Test!</p>

+0

+1 Gute Antwort. – iConnor

+0

Funktioniert nicht. Siehe meine Antwort – mynameistechno

+0

Ich habe den Großbuchungsfehler in meiner Antwort behoben und etwas hinzugefügt, das sich auf Ihre Antwort bezieht, um weitere Informationen zur Verwendung von 'window.onscroll' zu erhalten. Nur zur Erinnerung, ich habe beschlossen, meiner Antwort keine weiteren Informationen hinzuzufügen, da ich davon ausgehe, dass Entwickler, die die JavaScript-Technik verwenden wollten, ihre eigenen Recherchen zu 'window.onscroll' durchführen würden. @mynameistechno –

19

Zunächst einmal, die akzeptierte Antwort nicht funktioniert.

Der richtige Name

window.onscroll 

und nicht

window.onScroll 

https://developer.mozilla.org/en-US/docs/Web/API/window.onscroll

Zweitens ist, dann ist dies schrecklich ineffizient, da die Funktion Art und Weise mehr genannt wird, als es braucht, und das machen kann Seite laggy beim Scrollen. Von John Resig:

http://ejohn.org/blog/learning-from-twitter/

Viel besser einen Timer zu verwenden, die alle 150 ms oder so läuft - so etwas wie:

var scrolled = false; 

window.onscroll = function() { 
    scrolled = true; 
} 

setInterval(function(){ 
    if (scrolled) { 
    scrolled = false; 
    // scrollFunction() 
    } 
}, 150); 
+10

Dies wäre wahrscheinlich besser als Kommentar auf die angenommene Antwort gewesen. – Boaz

+2

Ein Timer ist eine unglaublich zerbrechliche und schlechte Idee, dies zu implementieren. Wenn Sie aus irgendeinem Grund eine unglaublich rechenintensive Berechnung auf Scroll durchführen, sollten Sie Date(), performance.now() oder sogar einen Zähler verwenden, um die verstrichene Zeit zu überprüfen. Allerdings ist das '.onscroll' _designed_ überschrieben, das Ändern einer einfachen CSS-Eigenschaft bei scroll würde überhaupt nicht verzögert sein. – Downgoat

+0

Egal ob 'onscroll' entworfen * ist, um überschrieben zu werden oder nicht, es ist ein Event-Handler und Scrollen * ist bekannt, * eine Menge Ereignisse anzuzünden, so eine Menge Sachen in der Handler zu tun ist eine schlechte Idee aus diesem Grund (und nicht wegen des Verdienstes des Überschreibens). Aus diesem Grund hat iOS zum Beispiel das 'scroll'-Ereignis nicht ausgelöst, bis der Benutzer * scrollt. Nicht bis zu den letzten Versionen, wenn der Speicher mir richtig dient. – amn

1

In Jquery haben Sie die Methode .scrollTop()

http://api.jquery.com/scrolltop/

In diesem Beispiel wird ein Div-Scroll mit dem Fenster Scroll durchgeführt.

$(window).scroll(function(){    
     $("div").css("margin-top", $(window).scrollTop()) 
});