javascript - Angular 4在div内平滑滚动

标签 javascript angular scroll

我试图在点击事件的 div 内滚动时创建平滑的滚动效果。我有点让它工作,但我无法正确配置它。

目标是创建一种轮播,当用户单击按钮向右时,只有包含轮播项目的 div 才会水平滚动。

但是,当我点击按钮时,滚动太流畅了,大约需要 2-3 秒才能完成。

这是我的代码:

private parentEl;

ngOnInit() {
    this.parentEl = document.getElementsByClassName('carousel_wrap');
}

public goRight(): void {
    const el = this.parentEl[0];
    const endPosition = el.scrollLeft + this.scrollFactor; // scrollFactor is the width of the child items on the carousel

    let interval = setInterval(() => {
        el.scrollLeft++;

        if ( el.scrollLeft === endPosition ) {
            clearInterval(interval);
        }
    });
}

如果我给 setInterval 一个延迟,例如 setInterval(() => {...}, 16); 那么它将需要更长的时间才能完成。

例如,我期望的是在总共 300 毫秒内执行整个动画。有谁知道如何解决这个问题?或者我做错了什么?

最佳答案

setInterval 的每一步中,您只添加一个要滚动的像素。

您需要获取要滚动的总距离(以像素为单位)并除以时间,这样您就可以得到速度(物理,谁会想到!?)

    public goRight(): void {
    const el = this.parentEl[0];
    const endPosition = el.scrollLeft + this.scrollFactor; // scrollFactor is the width of the child items on the carousel

    const time = 300;
    const scrollVelocity = endPosition / time;

    let interval = setInterval(() => {
        el.scrollLeft += scrollVelocity;

        if ( el.scrollLeft >= endPosition ) {
            clearInterval(interval);
        }
    });
}

编辑:

正如我在评论中所说,我放了一点jsFiddle来展示如何使用css结合scrollLeft来实现它。 如果用户不需要滚动滚动部分,则甚至可能会丢弃scrollLeft部分。

https://jsfiddle.net/y5m2xvzg/

简而言之,有一个具有 overflow:hidden 和固定大小的外部元素。里面有一个内部元素,它会随着内容的增长而增长。 当您使用 go() 时,该内部元素将使用 css 进行动画处理。完成后,scrollLefttransform 属性已正确设置。

关于javascript - Angular 4在div内平滑滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630788/

相关文章:

javascript - 如何添加从存储桶中删除对象的方法?

javascript - 如何在我的 Angular 4 组件中添加 toastr.js

macos - 基于 NSTableview View 的滚动性能

javascript - 滚动时淡出多个 div

html - 封面页高度设置为 100% 一半

html - 防止图像换行但使用滚动

javascript - ajaxStart 取消 jQuery 自动完成

javascript - 如何从 PouchDB 函数获取变量到 JS 变量

javascript - JQuery 点击函数没有被调用

angular - Concat 可观察对象