如何在vue中实现列表交错过渡
当只用 JavaScript 过渡的时候,在 enter 和 leave 中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。
newVue({
el:"#app",
data:()=>({
num:0
}),
methods:{
//让我们在beforeEnterenterafterEnter钩子里,把vue帮我们做的事,自己做一遍:
//添加移除class类名,监听transitionend事件。
beforeEnter(dom){
dom.classList.add('list-enter','list-enter-active');
},
enter(dom,done){
letdelay=dom.dataset.delay;
setTimeout(function(){
dom.classList.remove('list-enter');
dom.classList.add('list-enter-to');
//监听transitionend事件
vartransitionend=window.ontransitionend?"transitionend":"webkitTransitionEnd";
dom.addEventListener(transitionend,functiononEnd(){
dom.removeEventListener(transitionend,onEnd);
done();//调用done()告诉vue动画已完成,以触发afterEnter钩子
});
},delay)
},
afterEnter(dom){
dom.classList.remove('list-enter-to','list-enter-active');
}
}
})目前来说,运行良好,实现了交错过渡的效果,也不用写大量的 css。
回头看看我们一共做了2件事,用 .list-enter .list-enter-to 和 setTimeout
告诉浏览器,在不同的时间把列表项,从opacity 0 translateY(100%) 过渡到,opacity 1 translateY(0)。
告诉浏览器元素的不同状态,除了类名之外,
我们可以直接操作dom,把样式写到内联,
除了完全不用写css类名之外,
还可以有更多的编程性。
style
html
newVue({
el:"#app",
data:()=>({
num:0
}),
methods:{
beforeEnter(dom){
let{x=0,y=0,s=1,opacity=0}=dom.dataset;
dom.style.cssText=`transition:.3s;opacity:${opacity};transform:scale(${s})translateX(${x})translateY(${y});`;
},
enter(dom,done){
letdelay=dom.dataset.delay;
setTimeout(function(){
dom.style.cssText=`transition:.3s;opacity:1;transform:scale(1)translateX(0)translateY(0);`;
//监听transitionend事件
vartransitionend=window.ontransitionend?"transitionend":"webkitTransitionEnd";
dom.addEventListener(transitionend,functiononEnd(){
dom.removeEventListener(transitionend,onEnd);
done();//调用done()告诉vue动画已完成,以触发afterEnter钩子
});
},delay)
},
afterEnter(dom){
dom.style.cssText="";
}
}
})html
getRandom(){
varrate=Math.floor(Math.random()*90+10);
returnMath.random()>0.5?rate:-1*rate;
}看完上述内容,你们掌握如何在vue中实现列表交错过渡的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注恰卡编程网行业资讯频道,感谢各位的阅读!
