Smooth vertical scrolling on mouse wheel in vanilla javascript?

后端 未结 3 535
夕颜
夕颜 2020-12-04 17:07

I am a huge fan for vanilla javascript, currently I am working on a project where I need to implement smooth scrolling on mouse wheel scroll. I want to implement this using

相关标签:
3条回答
  • 2020-12-04 17:39

    How about this:

    function init(){
    	new SmoothScroll(document,120,12)
    }
    
    function SmoothScroll(target, speed, smooth) {
    	if (target === document)
    		target = (document.scrollingElement 
                  || document.documentElement 
                  || document.body.parentNode 
                  || document.body) // cross browser support for document scrolling
          
    	var moving = false
    	var pos = target.scrollTop
      var frame = target === document.body 
                  && document.documentElement 
                  ? document.documentElement 
                  : target // safari is the new IE
      
    	target.addEventListener('mousewheel', scrolled, { passive: false })
    	target.addEventListener('DOMMouseScroll', scrolled, { passive: false })
    
    	function scrolled(e) {
    		e.preventDefault(); // disable default scrolling
    
    		var delta = normalizeWheelDelta(e)
    
    		pos += -delta * speed
    		pos = Math.max(0, Math.min(pos, target.scrollHeight - frame.clientHeight)) // limit scrolling
    
    		if (!moving) update()
    	}
    
    	function normalizeWheelDelta(e){
    		if(e.detail){
    			if(e.wheelDelta)
    				return e.wheelDelta/e.detail/40 * (e.detail>0 ? 1 : -1) // Opera
    			else
    				return -e.detail/3 // Firefox
    		}else
    			return e.wheelDelta/120 // IE,Safari,Chrome
    	}
    
    	function update() {
    		moving = true
        
    		var delta = (pos - target.scrollTop) / smooth
        
    		target.scrollTop += delta
        
    		if (Math.abs(delta) > 0.5)
    			requestFrame(update)
    		else
    			moving = false
    	}
    
    	var requestFrame = function() { // requestAnimationFrame cross browser
    		return (
    			window.requestAnimationFrame ||
    			window.webkitRequestAnimationFrame ||
    			window.mozRequestAnimationFrame ||
    			window.oRequestAnimationFrame ||
    			window.msRequestAnimationFrame ||
    			function(func) {
    				window.setTimeout(func, 1000 / 50);
    			}
    		);
    	}()
    }
    p{
      font-size: 16pt;
      margin-bottom: 30%;
    }
    <body onload="init()">
      <h1>Lorem Ipsum</h1>
      
      <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
      
      <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
      
      <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
    </body>

    Use it by calling new SmoothScroll(target,speed,smooth)

    Arguments:

    1. target: the element to be scrolled smoothly - can be a div or document
    2. speed: the amout of pixels to be scrolled per mousewheel step
    3. smooth: the smoothness factor, the higher the value, the more smooth.

    Thanks to @Phrogz for the mousewheel normalization.

    EDIT: Since Chrome 73 it is required to mark the event listener for the mousewheel event as non-passive in order to be able to call preventDefault() on it. Thanks to @Fred K for this.

    0 讨论(0)
  • 2020-12-04 17:40

    A pure JavaScript onscroll event will work:

    var container = document.getElementById('myScrollingSurface');
    var lastY = 0;
    container.onscroll = function () {
      doSomethingCool(container.scrollTop - lastY);
      lastY = container.scrollTop;
    };
    
    0 讨论(0)
  • 2020-12-04 17:45

    The code you published is almost vanilla js. Just some ajustement

    if you have some time Take a look at The wheel event

    here the new thing will be the animate function

    // Code goes here
    
    document.addEventListener('wheel',function (event){
      //only vertical scroll
      if (event.deltaY > 0)
      {
        event.preventDefault();
        smoothScroll(document.documentElement,100,1000)
      }
    })
    function smoothScroll (domElement,pixel,delay)
    {
      const intervalToRepeat = 25;
      const step = (intervalToRepeat * pixel) / delay;
      if ( step < pixel)
      {
        domElement.scrollTop += step;
        setTimeout(function (){
          smoothScroll(domElement,pixel - step,delay)
        },intervalToRepeat);
      }
      
      
    }
      
    <!DOCTYPE html>
    <html>
    
      <head>
        <link rel="stylesheet" href="style.css">
        <script src="script.js"></script>
      </head>
    
      <body>
        <h1>Hello Plunker!</h1>
        
        <div style="width:400px;height:200px;" >
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          <br>
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          <br>
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some <br>
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some <br>
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          lorem ipsum some lorem ipsum some lorem ipsum some lorem ipsum some 
          
        </div>
      </body>
    
    </html>

    0 讨论(0)
提交回复
热议问题