50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { raf, cancelRaf } from "@vant/use";
 | 
						|
import { getScrollTop, setScrollTop } from "../utils/index.mjs";
 | 
						|
function scrollLeftTo(scroller, to, duration) {
 | 
						|
  let rafId;
 | 
						|
  let count = 0;
 | 
						|
  const from = scroller.scrollLeft;
 | 
						|
  const frames = duration === 0 ? 1 : Math.round(duration * 1e3 / 16);
 | 
						|
  let scrollLeft = from;
 | 
						|
  function cancel() {
 | 
						|
    cancelRaf(rafId);
 | 
						|
  }
 | 
						|
  function animate() {
 | 
						|
    scrollLeft += (to - from) / frames;
 | 
						|
    scroller.scrollLeft = scrollLeft;
 | 
						|
    if (++count < frames) {
 | 
						|
      rafId = raf(animate);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  animate();
 | 
						|
  return cancel;
 | 
						|
}
 | 
						|
function scrollTopTo(scroller, to, duration, callback) {
 | 
						|
  let rafId;
 | 
						|
  let current = getScrollTop(scroller);
 | 
						|
  const isDown = current < to;
 | 
						|
  const frames = duration === 0 ? 1 : Math.round(duration * 1e3 / 16);
 | 
						|
  const step = (to - current) / frames;
 | 
						|
  function cancel() {
 | 
						|
    cancelRaf(rafId);
 | 
						|
  }
 | 
						|
  function animate() {
 | 
						|
    current += step;
 | 
						|
    if (isDown && current > to || !isDown && current < to) {
 | 
						|
      current = to;
 | 
						|
    }
 | 
						|
    setScrollTop(scroller, current);
 | 
						|
    if (isDown && current < to || !isDown && current > to) {
 | 
						|
      rafId = raf(animate);
 | 
						|
    } else if (callback) {
 | 
						|
      rafId = raf(callback);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  animate();
 | 
						|
  return cancel;
 | 
						|
}
 | 
						|
export {
 | 
						|
  scrollLeftTo,
 | 
						|
  scrollTopTo
 | 
						|
};
 |