为什么我这里的轮播动画,如果用同步写法没有动画效果,只有用异步写法才有?

发布于 2022-09-07 16:00:30 字数 1277 浏览 11 评论 0

//组合继承  部分代码
    //构造函数 传入一个id 生成一个轮播图对象
    function Slider (id) {
        this.create(id)
    };
    //定义原型
    Slider.prototype = {
        create: function (id) {
            this.container = document.getElementById(id);
            this.list = document.getElementById('list');
            this.buttons = document.getElementById('buttons').getElementsByTagName('span');
            this.prev = document.getElementById('prev');
            this.next = document.getElementById('next');
            this.index = 1;   //控制圆点
            this.swapPageTime = 2000
            this.timer=null;
        },
        animate: function (offset,animateDuration) {
            //获取的是style.left,是相对左边获取距离,所以第一张图后style.left都为负值,
            //且style.left获取的是字符串,需要用parseInt()取整转化为数字。
            this.list.style.transition = `left ${animateDuration} linear`;//看这里!
            var newLeft = parseInt(this.list.style.left) + offset;
            this.list.style.left = newLeft + 'px';  //看这里!
        },
    };
    var slider = new Slider('container');
    setTimeout(function () {
        slider.animate(-300,'1s')
    },0)  //有效,刷新有动画
    //    slider.animate(-300,'1s') 无效,没有动画,刷新直接跳转
    
    


为什么会出现这种情况
animate函数执行完,浏览器渲染的时候list的left,transition我认为应该是都设置上去了的呀?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

疯狂的代价 2022-09-14 16:00:30

同步js代码,设置动画起始和结束之间的代码如果不能引起浏览器reflow,动画后面的设置将会覆盖前面的设置,动画不会发生
解决方法1.settimeout ==>异步导致重排
解决方法2. var slider = new Slider('container');
slider.list.offsetWidth ==>人为同步重排
slider.animate(-300,'1s')

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文