实现效果

初级方法:

实现原理:

由于列表的总数是变化的,所以不能用css把动画写死,通过定时器移动列表,实现动画效果

计算总高度,建一个变量存储移动距离,两者之前比较,当移动距离>=总高度 就把移动距离重置为0

在css中给列表盒子绝对定位,通过移动top值实现动画

注意事项:由于需要循环滚动,可以把获取到的数组在复制一份放到列表里,做到无缝衔接

html:

ref="prizeRef"class="prize_ul"v-if="info.joinList && info.joinList.length"

>

class="prize_item"v-for="(item, index) in info.joinList":key="index"

>

{{ item.mobile | mobileFilter }}
{{ item.name }}

js:

// 获取活动信息

getData() {

this.fetch

.get("TjModule/GetActivityInfo", {

activityId: this.id

})

.then(res => {

if (res.data && res.data.success) {

this.$setTitle(res.data.result.activityName);

this.info = res.data.result;

let arr = [];

if (res.data.result.joinList.length) {

arr = res.data.result.joinList;

arr.map(i => {

arr.push(i);

});

}

this.info.joinList = arr;

console.log(this.info.joinList);

this.$nextTick(() => {

this.changeAnimation(this.info.joinList.length);

});

}

})

.catch(error => {

if (error.response && error.response.status === 500) {

this.$toast(error.response.data.error.message);

}

});

},

// 编写动画

changeAnimation(d) {

console.log(9090);

let total = 25.5 * d/2

let every = 0

const dm = this.$refs.prizeRef;

this.timers = setInterval(()=>{

every += 5

if(every < total){

dm.style.top = - every + ‘px‘

}else{

dm.style.top = 0

every = 0

}

},120)

},

// 关闭定时器

beforeDestroy() {

clearInterval(this.timers)

},

css:

.prize_container {

overflow: hidden;

position: absolute;

height:90%;

width:100%;

padding: 30px0;

}

.prize_ul {

width:100%;

color: #fff;

position: absolute;

padding: 0px 80px;//animation: opacityShow linear 5s infinite;

.prize_item {

width:100%;

display: flex;

justify-content: space-between;

margin-bottom: 12px;

}

}

在changeAnimation函数中, let total = 25.5 * d/2  这个25.5是每行的高度,通过 every(移动距离) 与 total(总高度) 比较,实现循环

缺点:

滚动的时候总是感觉一卡一卡的效果,不够流畅( 原因: 浏览器每秒刷新的次数 和 每次移动距离的时间频率 不一致,导致视觉上产生卡顿效果 )

通过top值进行移动,比较损耗性能,每次改变都会影响布局

获取总高度total,不要手动计算,应该通过 clientHeight 动态获取比较好

高级方法:

使用一个属性: 帧动画  window.requestAnimationFrame()告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

这个方法挂载在window上,很方便我们的使用

实现原理:

通过控制 transform 的 translateY值进行移动动画

动态获取列表高度,padding,margin去掉,否则会在计算高度的时候,有误差,循环衔接点会有卡顿

requestAnimationFrame与animate函数相互调用,执行帧动画requestAnimationFrame时,调用移动动画的函数,实现同频率改变    requestAnimationFrame(this.animate)

animate() {

requestAnimationFrame(this.animate);

this.changeAnimation();

},

html:

ref="prizeUl"class="prize_ul"v-if="info.joinList && info.joinList.length" >

class="prize_item"v-for="(item, index) in info.joinList":key="index"

>

{{ item.mobile | mobileFilter }}
{{ item.name }}

class="prize_ul"v-if="info.joinList && info.joinList.length" >

class="prize_item"v-for="(item, index) in info.joinList":key="index"

>

{{ item.mobile | mobileFilter }}
{{ item.name }}

这里使用复制两个ul元素,不在js中操作复制列表

js:

data(){

prizeUlHeight:0, //滚动ref高度

$prizeUl:null, //滚动的ref

ulLeft:0, //移动参数

}

beforeDestroy() {

cancelAnimationFrame(this.times); //清理原生的监听

},

methods:{//获取活动信息

getData() {this.fetch

.get("TjModule/GetActivityInfo", {

activityId:this.id

})

.then(res=>{if (res.data &&res.data.success) {this.$setTitle(res.data.result.activityName);this.info =res.data.result;this.$nextTick(() =>{this.$prizeUl = this.$refs.prizeUl;this.prizeUlHeight = this.$prizeUl.clientHeight;this.times = requestAnimationFrame(this.animate);

});

}

})

.catch(error =>{if (error.response && error.response.status === 500) {this.$toast(error.response.data.error.message);

}

});

},

animate() {

requestAnimationFrame(this.animate);this.changeAnimation();

},//编写动画

changeAnimation(d) {if( this.ulLeft == this.prizeUlHeight ){this.ulLeft = 0;

}else{this.ulLeft += 1;

}

},

}

css:

.prize_container {

overflow: hidden;

position: absolute;

height:90%;

width:100%;

}

.prize_ul {

width:100%;

color: #fff;//position: absolute;

padding: 0px 80px;

.prize_item {

width:100%;

display: flex;

line-height: 58px;

justify-content: space-between;

}

}

这样就完美解决了循环滚动动画,

使用帧动画还有一个优点:

每次切换页面的时候,帧动画会暂停执行,直到切换回该页面,才会继续执行动画,这样就比定时器更加保护性能

其实还有一个方案:

用css + js

css中写动画,把动画属性分开写, animation-duration 动态计算:根据每行花费几秒 * 几行 这样动态赋值

css中通过控制 transform 的 translateY值进行移动50%即可

//写动画

@keyframes opacityShow {

from {

transform: translateY(0);

}

to {

transform: translateY(-50%);

}

}

.prize_ul {

width: 100%;

color: #fff;

padding: 0px 80px;

animation-name: opacityShow;

animation-iteration-count: infinite;

.prize_item {

width: 100%;

display: flex;

line-height: 58px;

justify-content: space-between;

}

}

使用

原文:https://www.cnblogs.com/huangaiya/p/12668345.html

vue商品列表滚动效果_vue+帧动画 实现 获奖奖品列表滚动循环展示相关推荐

  1. res-----不同图片实现动画效果(帧动画)

    1.准备几张图片(可命名为a1-a6) 2.在drawable文件夹下新建xml,内容如下 <?xml version="1.0" encoding="utf-8& ...

  2. vue怎么实现手风琴效果_Vue动画实现简易手风琴组件

    1.需求描述 最近做Vue项目有个需求,用手风琴效果实现对企业信息的展示,具体是在鼠标移入时,图片拉伸放大,其中包含标题及简述的浮现,流畅度要高.经过一番思考研究终于完成了,下面上代码. 2.代码部分 ...

  3. vue 实现数据滚动显示_vue实现动态添加数据滚动条自动滚动到底部的示例代码...

    在使用vue实现聊天页面的时候,聊天数据动态加到页面中,需要实现滚动条也自动滚动到底部.这时我找到网上有个插件 vue-chat-scroll 但是安装后发现是用不了的,报错信息如下: VM14383 ...

  4. vue怎么实现手风琴效果_Vue中使用v-for制作动态手风琴效果

    export default { data () { return { Faq: [ { isSubShow: false, about: 'Q:非公司员工是否可通过次入口申请公司客房?', answ ...

  5. android数字滚动动画,数字滚动效果 RollingText

    RollingTextView 特性 使用简单,API与TextView类似,setText方法可带有上下滚动的动画 支持xml设置android:textSize/android:textColor ...

  6. 超棒的视差滚动效果javascript类库 - Jarallax

    为什么80%的码农都做不了架构师?>>>    日期:2012-9-27  来源:GBin1.com 如果你没有听说过视差滚动的话,说明你真out了,作为2011年最流行的网站设计效 ...

  7. android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍

    0. 前言 Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图像的 ...

  8. 【Axure交互教程】 锚点滚动效果

    作品名称:锚点滚动效果 作品编号:Case006 软件版本:Axure9 作品类型:交互案例 锚点滚动效果即点击锚点,页面滚动到指定的位置的效果,经常与导航结合起来运用.锚点滚动在Axure中有多种实 ...

  9. android 张口逐帧动画,Android中实现一个简单的逐帧动画(附代码下载)

    场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 实现 首先准备一组不同表情的照片,放在res/drawable下,然后在此目录下新建动画资源文件fairy.xml 这 ...

最新文章

  1. Visual Studio 2005 SP1安装 关键点
  2. android优化最强软件,最强大的安卓优化工具诞生,让手机流畅度提升75%
  3. javascript继承机制
  4. Django(part42)--限制IP请求次数
  5. gradle java_Java EE,Gradle和集成测试
  6. Base64编码的原理与常用实现
  7. 在阿里云上试用 Knative
  8. aes加密字符串c++_springboot2.2.X手册:防抓包?快速实现API接口数据加密
  9. 真正的创业者和伪创业者的区别在哪里?
  10. 八皇后问题程序及注解
  11. 黑莓7290软件_黑莓7290,我买的是情怀
  12. oracle数据库rtf内容替换,如何将RTF转换为纯文本?
  13. win7远程桌面连接 简易教程
  14. wex5 ajax,关于Ajax请求 - WeX5开发者论坛 - 起步软件技术论坛 - Powered by Discuz!
  15. lucas–kanade_Lucas–Kanade光流算法学习
  16. 苹果设计思维案例研究,困难期生存的关键
  17. 我见过的最糟糕代码,看了都说好!
  18. Set 集合以及Set集合的一些常用方法
  19. 项目管理中的成本绩效方法
  20. 考试用计算机反思800字,考试后的反思

热门文章

  1. notepad++ :正则表达式系统教程(zz)
  2. 简单循迹小车实验心得_智能循迹小车总结 智能循迹小车报告.doc
  3. Python使用matplotlib设置pandas绘制的饼状图扇形标签
  4. python 螺旋数组_人工智能首选语言是什么 究竟Python有多强大
  5. 后端连接oracle,【后端开发】php怎么远程连接oracle
  6. DBMS连接不上 —— 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
  7. linux for循环套for循环格式_4.20 for循环 break、continue关键字
  8. 56. 合并区间(javascript)
  9. java中求组快速排序函数,如何在Java中实现快速排序?
  10. mysql 5.6.31 配置_MySQL5.6.31 winx64.zip 安装配置教程详解