简体   繁体   中英

Javascript: horizontal autoscroll

If the user is dragging an element in container close to horizontal edge, I need to autoscroll container to the end in respective direction.

How the code below can be improved?

const scrollSpeed = 10;
const scrollSensitivity = 10;

let scrollInterval = null;

const scrollContainer = document.getElementById("scrollContainer");
scrollContainer.addEventListener("touchmove", autoScroll);

function disableAutoScrolling() {

    clearInterval(scrollInterval);
    scrollInterval = null;
}

function autoScroll(event) {

    // pointer offset
    const offsetX = event.targetTouches[0].pageX;
    const offsetY = event.targetTouches[0].pageY;

    // container offset relative to viewport
    const rect = scrollContainer.getBoundingClientRect();

    // pointer is over right / left edge of a scrollContainer
    const SCROLL_RIGHT = ( rect.width + rect.left - offsetX <= scrollSensitivity ) && ( offsetY > rect.top );
    const SCROLL_LEFT =  ( offsetX - rect.left <= scrollSensitivity ) && ( offsetY > rect.top );

    disableAutoScrolling();

    // the container should scroll
    if (SCROLL_RIGHT) {
        scrollInterval = setInterval(() => {
            scrollContainer.scrollLeft += scrollSpeed;
        }, 10);
    }

    if (SCROLL_LEFT) {
        scrollInterval = setInterval(() => {
            scrollContainer.scrollLeft -= scrollSpeed;
        }, 10);
    }
}

Thanks for your help.

I do not know if the current code works, but here is a more organized version.

const scroller={
    speed: 10,
    sensitivity: 10,
    container: document.getElementById("scrollContainer"),
    rect: scroller.container.getBoundingClientRect(),
    interval: null,
    offsetX: 0,
    offsetY: 0
};

scroller.container.addEventListener("touchmove",function(e){
    clearInterval(scroller.interval);
    scroller.interval = null; // May not be needed

    // pointer offset
    scroller.offsetX = e.targetTouches[0].pageX;
    scroller.offsetY = e.targetTouches[0].pageY;

    // the container should scroll
    // pointer is over right / left edge of a scroller.container
    if((scroller.rect.width+scroller.rect.left-scroller.offsetX<=scroller.sensitivity)&&(scroller.offsetY>scroller.rect.top))scroller.interval=setInterval(()=>{scroller.container.scrollLeft+=scroller.speed;},10);
    if((scroller.offsetX-scroller.rect.left<=scroller.sensitivity)&&(scroller.offsetY>scroller.rect.top))scroller.interval=setInterval(()=>{scroller.container.scrollLeft-=scroller.speed;},10);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM