2013-06-04 49 views
16

有没有一种方法来检测与媒体查询垂直滚动的距离?媒体查询垂直滚动

看来,媒体查询检测周围介质(右令人震惊:P)设计,所以像浏览器的高度是可测试的,但没有具体多远向下滚动页面时。

如果是不可能的,但你知道JS(不是jQuery的)的方式随意张贴!

回答

8

我不相信这是可能使用CSS媒体查询,但我知道的是,滚动高度可以使用JavaScript window.pageYOffset被发现。如果你想通过一个函数在每次用户向上或向下滚动页面上的时间来运行这个值,你可以不喜欢

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

或者只是:

window.onscroll = scrollFunctionHere; 

如果函数本身检查的window.pageYOffset值。

有关如何做使用window.onscroll在JavaScript有效,是指mynameistechno's answer更多的建议。

关于效率的重要注意事项:每次运行一个函数时,如果在回调中执行了任何不平凡的事情,则发出滚动事件可能会破坏CPU周期。相反,最好每次只允许回调运行很多次。这被称为“debouncing”。

简单的去抖滚动事件处理程序下面的代码。请注意文本“Hello”和“世界”每250毫秒之间如何切换,而不是每一个帧:

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好答案。 – iConnor

+0

不起作用。查看我的回答 – mynameistechno

+0

我在回答中修正了大小写错误,并添加了一些引用您的答案的内容,以获取有关使用'window.onscroll'的更多信息。为了记录,我选择不在我的答案中添加更多信息,因为我认为想要使用JavaScript技术的开发人员可以自行研究window.onscroll。 @mynameistechno –

19

首先,公认的答案无效。

正确名称是

window.onscroll 

,而不是

window.onScroll 

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

第二,这是可怕的低效的,因为函数被调用比它需要的方式更多,可以使滚动时页面laggy。从约翰Resig的:

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

好得多使用运行每隔150毫秒左右的计时器 - 喜欢的事:

var scrolled = false; 

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

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

这对于接受的答案可能会更好。 – Boaz

+2

一个计时器是一个令人难以置信的脆弱和坏主意来实现这一点。如果你出于某种原因在滚动上做了一些计算上昂贵的计算,你会想使用Date(),performance.now()或甚至计数器来检查时间。然而,'.onscroll'被_designed_重写,在scroll上改变一个简单的CSS属性并不会有什么影响 – Downgoat

+0

无论'onscroll'是*设计*是否被覆盖或不是,它是一个事件处理器,滚动*是已知*引发了很多事件,因此在处理程序中做很多事情是一个坏主意(因为这样做的原因并不是因为重写的优点)。在相关说明中,因此,例如,iOS在用户*完成滚动之前不会触发'scroll'事件。直到最近的版本,如果内存正确地服务我。 – amn

1

jQuery中你有方法.scrollTop()

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

这个例子使与窗口滚动一个div滚动。

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