前言
记一次vue 组件中使用 transition 和 transition-group 设置过渡动画,总结来说可分为分为 name 版, js 钩子操作类名版, js 钩子操作行内样式版...
template模板结构
// 单个元素
<transition name="自定义名字">
<p v-if="show">hello</p>
</transition>
// 列表元素: 注意group的直接子元素是v-for渲染出来的
<ul class="list">
<transition-group name="list">
<li v-for="(item, index) in gameList" :key="item.id">
<app-horizontal :itemData="item"></app-horizontal>
</li>
</transition-group>
</ul>
name 版,name 为组件中的属性
出现的过程: name-enter(初始态) => name-enter-active(中间态) => name-enter-to(终止态)
消失的过程: name-leave => name-leave-active => name-leave-to
以进场过渡动画为例子
我们可以分别设置 enter 阶段 和 enter-to 阶段的动画
1.设置进入时需要过渡的属性
.name-enter
{
opacity: 0;
transform: translateY(30px)
}
2.然后在 name-enter-active中设置过渡时间
.name-enter-active {
transition: all .3s;
}
3.最后在 name-enter-to 中写上终止态属性
其实终止态的opacity: 1;transform: none; 是默认的,可以不用写
.name-enter-to {
opacity: 1;
transform: translateY(0);
}
如果要给列表中的元素设置交错的效果, 元素不多的话可以添加 delay 属性
.name-enter-active:nth-child(3n+1) {
transition-delay: 0s;
}
.name-enter-active:nth-child(3n+2) {
transition-delay: .1s;
}
.name-enter-active:nth-child(3n+3) {
transition-delay: .2s;
}
离场动画同理...
js 钩子实现过渡动画: 通过操作类名; 就是 name 版的 js 实现
// 例如实现上述列表依次显示
<ul class="list">
<transition-group
v-bind:css="false"
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter">
<li v-for="(item, index) in gameList"
:key="item.id"
:data-delay="index*100"
>
<app-horizontal :itemData="item"></app-horizontal>
</li>
</transition-group>
</ul>
//
methods: {
// 事先定义上述类名
// 在beforeEnter enter afterEnter 钩子中手动操作上述类名
// 初始态
beforeEnter(dom) {
dom.classList.add('list-enter', 'list-enter-active');
},
// 中间态
enter(dom,done) {
// 通过 setTimeout + dataset 实现过渡
let delay = dom.dataset.delay;
setTimeout(function () {
dom.classList.remove('list-enter');
dom.classList.add('list-enter-to');
//监听 transitionend 事件
var transitionend = window.ontransitionend "transitionend" : "webkitTransitionEnd";
dom.addEventListener(transitionend, function onEnd() {
// 移除事件
dom.removeEventListener(transitionend, onEnd);
//调用done(),表示动画已完成
done()
});
}, delay)
},
// 终止态
afterEnter(dom) {
dom.classList.remove('list-enter-to', 'list-enter-active');
}
}
js 钩子过渡动画: 通过操作行内属性, 自定义动画
<ul class="list">
<transition-group
v-bind:css="false"
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter">
<li v-for="(item, index) in gameList"
:key="item.id"
:data-delay="index*100"
data-y = "100%"
>
<app-horizontal :itemData="item"></app-horizontal>
</li>
</transition-group>
</ul>
// 对应的操作方法; 添加自定义的 dataset,给dom设置css样式;根据需求添加
methods: {
// 初始态
beforeEnter(dom) {
let { x = 0, y = 0, opacity = 0 } = dom.dataset;
dom.style.cssText = `transition: .3s;opacity: ${opacity};transform: translateX(${x}) translateY(${y});`;
},
// 中间态
enter(dom,done) {
let delay = dom.dataset.delay;
setTimeout(function () {
dom.style.cssText = `transition: .3s;opacity: 1;transform: translateX(0) translateY(0);`;
//监听 transitionend 事件
var transitionend = window.ontransitionend "transitionend" : "webkitTransitionEnd";
dom.addEventListener(transitionend, function onEnd() {
dom.removeEventListener(transitionend, onEnd);
done();
});
}, delay)
},
// 终止态
afterEnter(dom) {
dom.style.cssText = "";
}
}
这里记录一下监听css3的animation动画和transition事件:
webkit-animation动画有三个事件: 开始事件: webkitAnimationStart 结束事件: webkitAnimationEnd 重复运动事件: webkitAnimationIteration css3的过渡属性transition: 一个事件 过渡结束: webkitTransitionEnd
总结
以上所述是小编给大家介绍的vue 组件中使用 transition 和 transition-group实现过渡动画 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。