2013-06-04 14 views
16

C'è un modo per rilevare la distanza di scorrimento verticale con una query multimediale?query multimediale per scorrimento verticale

Sembra che le query sui media siano progettate attorno al rilevamento del mezzo (destra scioccante: P), quindi cose come l'altezza del browser sono testabili, ma non specificatamente fino a che punto della pagina scorre.

Se non è possibile, ma si conosce un modo in JS (non jQuery) sentitevi liberi di postare!

risposta

8

Non credo sia possibile con una query multimediale CSS, ma so che l'altezza di scorrimento può essere trovata in JavaScript utilizzando window.pageYOffset. Se si voleva correre questo valore tramite una funzione ogni volta che gli utenti scorrono verso l'alto o verso il basso in una pagina, si potrebbe fare qualcosa di simile

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

O semplicemente:

window.onscroll = scrollFunctionHere; 

Se la funzione stessa controllò la valore di window.pageYOffset.

Per ulteriori consigli su come utilizzare window.onscroll in modo efficiente in JavaScript, fare riferimento a mynameistechno's answer.

Nota importante sull'efficienza: l'esecuzione di una funzione ogni volta che viene emesso un evento di scorrimento può far scorrere i cicli della CPU se nel callback viene eseguita un'operazione non banale. Invece, è buona norma consentire solo a un callback di essere eseguito tante volte al secondo. Questo è stato definito "debouncing".

Semplice codice per il gestore di eventi di scorrimento debounced di seguito. Si noti come il testo si alterna tra "Ciao" e "mondo" ogni 250ms, piuttosto che ogni singolo fotogramma:

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 buona risposta. – iConnor

+0

Non funziona. Vedere la mia risposta – mynameistechno

+0

Ho corretto l'errore di capitalizzazione nella mia risposta e aggiunto qualcosa che si riferisce alla tua risposta per ulteriori informazioni sull'uso di 'window.onscroll'. Per la cronaca, ho scelto di non aggiungere più informazioni alla mia risposta perché presumo che gli sviluppatori che volevano utilizzare la tecnica JavaScript avrebbero fatto le loro ricerche su 'window.onscroll'. @mynameistechno –

19

Prima di tutto, la risposta accettata non funziona.

Il nome corretto è

window.onscroll 

e non

window.onScroll 

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

In secondo luogo, questo è terribilmente inefficiente come la funzione viene chiamata modo più di quanto dovrebbe e può fare la pagina laggy quando scorre. Da John Resig:

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

molto meglio utilizzare un timer che viene eseguito ogni 150 ms o giù di lì - qualcosa di simile:

var scrolled = false; 

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

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

Questo probabilmente sarebbe stato meglio come commento sulla risposta accettata. – Boaz

+2

Un timer è un'idea incredibilmente fragile e cattiva da implementare. Se per qualche ragione stai eseguendo calcoli incredibilmente computazionalmente onerosi su scroll, dovresti utilizzare Date(), performance.now() o persino un contatore per controllare il tempo trascorso. Comunque '.onscroll' è _designed_ da sovrascrivere, cambiare una semplice proprietà CSS sullo scroll non sarebbe per nulla laggoso – Downgoat

+0

Indipendentemente dal fatto che' onscroll' è * progettato * per essere ignorato o meno, è un gestore di eventi, e lo scorrimento * è noto * per innescare molti eventi, quindi fare un sacco di cose nel gestore è una cattiva idea per questo motivo (e non per il merito di scavalcare). Su una nota correlata, per questo motivo, ad esempio, iOS non ha attivato l'evento 'scroll' finché l'utente * non termina * lo scorrimento. Non fino alle versioni recenti se la memoria mi serve correttamente. – amn

1

in jQuery è necessario il metodo .scrollTop()

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

Questo esempio consente di fare uno scroll con il scroll della finestra.

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