Vue+css用上v-for命令和:style=“{}“-实现信息一条一条出现的动画效果~~

使用的东西就不讲其他了,流程如下,最后有 总结 和 注意点 的贴士。

首先是定义一个动画

在中

@keyframes sliding-box{

        0%{ transform:translateY(100%);opacity:0; }

        10%{ opacity:0; }

        90%{ opacity:1; }//此时走了90%的距离,差不多该显现了

        100%{ transform:translateY(0);opacity:1; }//最后到达原位

}

然后给消息盒子设置动画效果,注意选择器中不要使用'-',否则之后:class="{}"中用不了,因为不允许,可以小驼峰命名

.info-box{

        xxxxx;

        opacity:0; //开始就要设置opacity:0;因为动画是延时触发的,不设置则会出现本来就出现了,然后忽然消失又出现的奇怪视觉效果。

        animation:sliding-box 1s ease-out 1s forwards; //forwards设置的是执行完毕后是动画最后的状态,不然最开始

        // animation:动画名称 动画时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时状态;

}

然后在模板中即

在中的相应盒子中使用,如:

然后在方法中写上

在的methods:{}中

getAnimationDelay(){

        return `{index*0.5}s`//注意使用的是模板字符串,{}中可以放表达式,还注意外头跟了个 s 为单位,0.5是间隔出现的秒数,自行决定

}

        animationDelay在CSS选择器中设置时是这样写的一个属性:animation-delay:延迟秒数s;

不过:style"{}"中不让有符号 '-' ,但是提供了animationDelay作为同等效果的属性。

我用的是vue2写的,如果有机会,我会更新vue3的写法,大体思想上应该大差不差

思想是

定义动画,给盒子设置动画,和opacity:0;最初为隐身状态,且因此动画属性中要设置forwards,即动画执行完毕后以状态为动画最终状态,即100%{}中所设置的opacity:1;且位置为动画完毕所处位置即transform:translateY(0);的状态。

v-for="(item,index) in 5" 由于这里还没有迭代的数据,就没写:key="",实际开发中,还是要记得写上:key=""然后里面建议写item.id,因为id是唯一的。v-for默认行为会尝试原地修改元素,比如从上到下有三个盒子,第一个有背景为orange,后面俩没有,但删除时,即把第一个盒子中数据删除后,实际上少的是最后一个盒子,然后后面的数据填到前两个盒子里来了。也就是这个橙色的盒子还在,这就叫原地修改元素。

v-for=""和其:key=""写好后,写:style="{animationDelay:getAnimationDelay(index)}"方法里的参数用index是因为index是从0开始,有顺序的每次加一。恰好符合进行计算相应延时然后呈现消息的需求

然后写方法,方法中采用模板字符串,用``括住,{}中可以写表达式,{}外面是字符串,方便且好用

getAnimationDelay(index):{

        return `{index*距上一条消息出现间隔时长比如0.5}s`

}

亮点是配合opacity控制盒子的显现,通过index结合:style=""和animationDelay属性实现租个显现的效果。需要注意的是animation属性要设置forwards,否则动画结束后回归盒子设置了的opacity:0;的状态,导致盒子动画结束,盒子隐身。

另外,我发现微信小程序中,这个动画只有最开始点进页面是才执行一次。可能有办法实现在微信小程序中每次进入本页面都执行动画效果~或许和微信小程序的声明周期有关...

如有改进或更好的建议,十分欢迎指出。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴为您提供解答。以下是使用Vue实现公告栏文字上下滚动效果的示例代码: ```html <template> <div class="notice"> <div v-for="(item, index) in notices" v-show="current === index" :key="item.id" class="notice-item"> {{ item.content }} </div> </div> </template> <script> export default { data() { return { notices: [ { id: 1, content: '公告1:欢迎来到我们的网站!' }, { id: 2, content: '公告2:请注意网站安全,不要泄露个人信息!' }, { id: 3, content: '公告3:我们将定期更新网站内容,敬请关注!' } ], current: 0, timer: null } }, mounted() { this.startRolling() }, destroyed() { this.stopRolling() }, methods: { startRolling() { this.timer = setInterval(() => { this.current = (this.current + 1) % this.notices.length }, 3000) }, stopRolling() { clearInterval(this.timer) } } } </script> <style scoped> .notice { height: 100px; overflow: hidden; } .notice-item { line-height: 100px; text-align: center; animation: rolling 10s linear infinite; } @keyframes rolling { 0% { transform: translateY(0); opacity: 1; } 25%, 75% { transform: translateY(-100%); opacity: 1; } 100% { transform: translateY(-100%); opacity: 0; } } </style> ``` 请将以上代码复制到Vue项目中的组件文件中。实现效果是:多条公告文字从下方出现,逐个向上滚动并逐渐变淡消失,滚动完毕后从下方再次出现下一条公告文字。实现方式是通过设置定时器控制当前正在滚动的公告文字索引,利用CSS动画实现滚动效果,再通过v-show指令动态控制公告文字的显隐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值