2016-11-24 27 views
4

position: fixed要素の上でマウスボタンを押している間にビューポートを徐々にスクロールさせるにはどうすればよいですか?ここでマウスアップまで徐々にスクロールします

+0

スクロールするとき、マウスカーソルが押されている要素から外れませんか?保持しているのではなく、「クリックする」という意味だったら、これをチェックしてください:[jQueryを使わずにスムーズにスクロールする](https://stackoverflow.com/questions/10063380/javascript-smooth-scroll-without-theuse -f-jquery)または[this](https://www.sitepoint.com/smooth-scrolling-vanilla-javascript/) –

+0

ありがとうございますが、固定した要素になるでしょう。 –

答えて

2

あなたはsetTimeout()clearTimeout()との組み合わせでjQuery.animate()でこれを達成することができます

$('.button').on('mousedown', function() { 
    console.log('Start Animate'); 
    (function smoothSrcroll() { 
     console.log(Math.max($('html').scrollTop(), $('body').scrollTop())); 
     $('html, body').stop().animate({ 
      scrollTop: Math.max($('html').scrollTop(), $('body').scrollTop()) + 100 
     }, 1000, 'linear', function() { 
      window.timeout = setTimeout(smoothSrcroll(), 0); 
     }); 
    })(); 
}).on('mouseup', function() { 
    console.log('Stop Animate'); 
    $('html, body').stop(); 
    clearTimeout(window.timeout); 
}); 

CodePen Demo

それは、FirefoxとChromeの両方で動作するように私は$('html, body')をターゲットにしています。これは、2つのセレクタのためにanimate()が実際に2回実行されるため、ややこしいことになります。これを解決するために私はjQuery.stop()を使用しました。 Firefoxは$('html').scrollTop()を使用でき、Chromeは$('body').scrollTop()を使用するため、Math.max()を使用して増分を計算しました。この関数は完了時に自己実行し、マウスが離されるとclearTimeout()jQuery.stop()を使用します。

+0

素晴らしい、ありがとう!それは少しスムーズにする方法はありますか? –

+0

@ScottHunterデフォルトのjQueryライブラリのイージングに追加される補足的なスクリプトがあります。実際には線形、スイング、デフォルトの3つの設定しかありません。スムーズなトランジションを作成するスクリプトを見つけることができます。 – Daerik

関連する問題