我试图用
javascript检测一个有意的额外顶部/底部滚动. $(window).scrollTop()和window.pageYOffset没用,因为它们停在Top 0,我想达到类似top -X的东西.对于底部,假设我的文档高度为500,底部就像底部5XX.
编辑:
示例代码可以是:
- $(window).scroll(function(){
- if(intentionalScrollTop){
- // Do something
- }else if(intentionalScrollDown){
- // Do something
- }
- });
解决方法
我从你的问题中理解的不仅是“检测到过度滚动”……
但也可以用它来创建你在问题中显示的动画.
但也可以用它来创建你在问题中显示的动画.
- $(document).ready(function(){
- var at_Top=true;
- var at_Bottom=false;
- var prevIoUs_scrolled;
- var triggerTime=0;
- var scroll_dir=false; // false=>Down true=>up
- var scrolled_bottom = $("body").height() - $(window).height();
- var animationDelay = 300;
- var animationTimeout = 350; //Max delay between 2 triggers is 1 sec.
- //So keep this value under 400ms
- //Because one complete animation is 300ms+350ms+300ms.
- //To have longer animation delays,add time to the triggerDelay
- var triggerDelay=0; // You can add more delay to allow the next trigger (in seconds).
- $(window).scroll(function(){
- var scrolled=$(window).scrollTop();
- // Reached the top?
- if(scrolled==0){
- at_Top=true;
- }else{
- at_Top=false;
- }
- // Reached the bottom?
- if(scrolled==scrolled_bottom){
- at_Bottom=true;
- }else{
- at_Bottom=false;
- }
- // Scroll direction
- if( $(this).scrollTop() > prevIoUs_scrolled ){
- scroll_dir=false; //scroll down
- }else{
- scroll_dir=true; //scroll up
- }
- // Keep prevIoUs scrollTop position in memory
- prevIoUs_scrolled = $(this).scrollTop();
- animationTrigger();
- });
- function animationTrigger(){
- if(at_Top && scroll_dir){
- console.log("Scrolling when at top.");
- $("#wrapper").stop().animate({"margin-top":"3em"},animationDelay);
- setTimeout(function(){
- $("#wrapper").stop().animate({"margin-top":0},animationDelay);
- },animationTimeout);
- clearTimeout(clearConsole);
- var clearConsole = setTimeout(function(){
- console.clear();
- },3000);
- }
- if(at_Bottom && !scroll_dir){
- console.log("Scrolling when at bottom.")
- $("#header").stop().animate({"height":0},animationDelay);
- $("#footer-spacer").stop().animate({"height":"3em"},animationDelay);
- setTimeout(function(){
- $("#header").stop().animate({"height":"3em"},animationDelay);
- $("#footer-spacer").stop().animate({"height":0},3000);
- }
- }
- // KEYBOARD ARROWS UP/DOWN AND PAGE UP/DOWN SCROLLING
- $(window).on("keydown",function(e){
- //console.log(e.which);
- if( (e.which==38) || (e.which==33) ){ // Arrow up or Page up
- scroll_dir=true;
- }
- if( (e.which==40) || (e.which==34) ){ // Arrow down or Page down
- scroll_dir=false;
- }
- // Limit triggers to 1 per second... Because when holding a key down for long,it triggers too fast...
- var thisSecond = new Date().getSeconds()
- if( (triggerTime != thisSecond) || (triggerTime < (thisSecond - triggerDelay) ) ){
- animationTrigger();
- triggerTime=thisSecond;
- }
- })
- // WHEEL SCROLLING
- // Inspired from this SO answer: https://stackoverflow.com/a/7309786/2159528
- //Firefox
- $(window).bind('DOMMouseScroll',function(e){
- var scrolled2=$(window).scrollTop();
- if(e.originalEvent.detail > 0) {
- scroll_dir=false; //scroll down
- //console.log("down");
- }else {
- scroll_dir=true; //scroll up
- //console.log("up");
- }
- // Limit triggers to 1 per second... Because wheel turns quite fast.
- var thisSecond = new Date().getSeconds()
- if( (triggerTime != thisSecond) || (triggerTime < (thisSecond - triggerDelay) ) ){
- animationTrigger();
- triggerTime=thisSecond;
- }
- });
- //IE,Opera,Safari
- $(window).bind('mousewheel',function(e){
- if(e.originalEvent.wheelDelta < 0) {
- scroll_dir=false; //scroll down
- }else {
- scroll_dir=true; //scroll up
- }
- // Limit triggers to 1 per second... Because wheel turns quite fast.
- var thisSecond = new Date().getSeconds()
- if( (triggerTime != thisSecond) || (triggerTime < (thisSecond - triggerDelay) ) ){
- animationTrigger();
- triggerTime=thisSecond;
- }
- });
- }); // End Document.ready
- body,wrapper{
- padding:0;
- margin:0;
- height:100;
- }
- #page{
- height:1500px;
- width:100%;
- }
- #header,#footer{
- height:3em;
- padding:0.5em;
- background-color:cyan;
- }
- #content{
- height:calc(100% - 8em); /* -8em for header and footer... (height: 3em + padding: 2x 0,5em) */
- padding:0 0.5em;
- overflow:hidden;
- }
- #footer-spacer{
- height:0px;
- }
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
- <div id="wrapper">
- <div id="page">
- <div id="header">
- This is the page's top
- </div>
- <div id="content">
- <h1>Scroll this page to see the overscroll effect at top and bottom</h1>
- <br>
- <ul>
- <li>using the mouse wheel</li>
- <li>keyboard arrows</li>
- <li>keyboard page up/down</li>
- </ul>
- <br>
- <br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- Content...<br>
- </div>
- <div id="footer">
- This is the page's bottom
- </div>
- <div id="footer-spacer"></div>
- </div>
- </div>
当页面位于顶部或底部时检测滚动尝试…
用它来设置你展示的动画是另一个.
顶部的方法:
包装器的边距从0em到3em动画,将标题和内容向下推.
因此页面“看起来”像过度滚动.
底部的方法:
这是一个挑战……
不能与包装器的margin-bottom顶部相同,因为它可以工作……但是在视口下面,这不是我们想要的.
所以在这种情况下,我将“内容”定义为height:calc(100% – 8em)(页眉和页脚都有高度:3em和填充:0.5em)只是为了确保包装器100%填充.动画的空div在页脚下…当它的高度从0em到3em时,它通过向上推动页脚来创建过度滚动“幻觉”.
请注意,标题会在同一时间缩回,以释放空间.此时,标题不可见,为什么不呢?
拖动滚动条,旋转鼠标滚轮并按下键盘上4个“常用”键中的1个(箭头和向上/向下翻页)时,此脚本可以正常工作.
我留下了很多console.log(),您可以使用它来探索它是如何工作的,并改进动画并使其成为您的品味.