vue商品列表滚动效果_vue+帧动画 实现 获奖奖品列表滚动循环展示
实现效果
初级方法:
实现原理:
由于列表的总数是变化的,所以不能用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"
>
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"
>
class="prize_ul"v-if="info.joinList && info.joinList.length" >
class="prize_item"v-for="(item, index) in info.joinList":key="index"
>
这里使用复制两个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+帧动画 实现 获奖奖品列表滚动循环展示相关推荐
- res-----不同图片实现动画效果(帧动画)
1.准备几张图片(可命名为a1-a6) 2.在drawable文件夹下新建xml,内容如下 <?xml version="1.0" encoding="utf-8& ...
- vue怎么实现手风琴效果_Vue动画实现简易手风琴组件
1.需求描述 最近做Vue项目有个需求,用手风琴效果实现对企业信息的展示,具体是在鼠标移入时,图片拉伸放大,其中包含标题及简述的浮现,流畅度要高.经过一番思考研究终于完成了,下面上代码. 2.代码部分 ...
- vue 实现数据滚动显示_vue实现动态添加数据滚动条自动滚动到底部的示例代码...
在使用vue实现聊天页面的时候,聊天数据动态加到页面中,需要实现滚动条也自动滚动到底部.这时我找到网上有个插件 vue-chat-scroll 但是安装后发现是用不了的,报错信息如下: VM14383 ...
- vue怎么实现手风琴效果_Vue中使用v-for制作动态手风琴效果
export default { data () { return { Faq: [ { isSubShow: false, about: 'Q:非公司员工是否可通过次入口申请公司客房?', answ ...
- android数字滚动动画,数字滚动效果 RollingText
RollingTextView 特性 使用简单,API与TextView类似,setText方法可带有上下滚动的动画 支持xml设置android:textSize/android:textColor ...
- 超棒的视差滚动效果javascript类库 - Jarallax
为什么80%的码农都做不了架构师?>>> 日期:2012-9-27 来源:GBin1.com 如果你没有听说过视差滚动的话,说明你真out了,作为2011年最流行的网站设计效 ...
- android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍
0. 前言 Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图像的 ...
- 【Axure交互教程】 锚点滚动效果
作品名称:锚点滚动效果 作品编号:Case006 软件版本:Axure9 作品类型:交互案例 锚点滚动效果即点击锚点,页面滚动到指定的位置的效果,经常与导航结合起来运用.锚点滚动在Axure中有多种实 ...
- android 张口逐帧动画,Android中实现一个简单的逐帧动画(附代码下载)
场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 实现 首先准备一组不同表情的照片,放在res/drawable下,然后在此目录下新建动画资源文件fairy.xml 这 ...
最新文章
- Visual Studio 2005 SP1安装 关键点
- android优化最强软件,最强大的安卓优化工具诞生,让手机流畅度提升75%
- javascript继承机制
- Django(part42)--限制IP请求次数
- gradle java_Java EE,Gradle和集成测试
- Base64编码的原理与常用实现
- 在阿里云上试用 Knative
- aes加密字符串c++_springboot2.2.X手册:防抓包?快速实现API接口数据加密
- 真正的创业者和伪创业者的区别在哪里?
- 八皇后问题程序及注解
- 黑莓7290软件_黑莓7290,我买的是情怀
- oracle数据库rtf内容替换,如何将RTF转换为纯文本?
- win7远程桌面连接 简易教程
- wex5 ajax,关于Ajax请求 - WeX5开发者论坛 - 起步软件技术论坛 - Powered by Discuz!
- lucas–kanade_Lucas–Kanade光流算法学习
- 苹果设计思维案例研究,困难期生存的关键
- 我见过的最糟糕代码,看了都说好!
- Set 集合以及Set集合的一些常用方法
- 项目管理中的成本绩效方法
- 考试用计算机反思800字,考试后的反思
热门文章
- notepad++ :正则表达式系统教程(zz)
- 简单循迹小车实验心得_智能循迹小车总结 智能循迹小车报告.doc
- Python使用matplotlib设置pandas绘制的饼状图扇形标签
- python 螺旋数组_人工智能首选语言是什么 究竟Python有多强大
- 后端连接oracle,【后端开发】php怎么远程连接oracle
- DBMS连接不上 —— 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
- linux for循环套for循环格式_4.20 for循环 break、continue关键字
- 56. 合并区间(javascript)
- java中求组快速排序函数,如何在Java中实现快速排序?
- mysql 5.6.31 配置_MySQL5.6.31 winx64.zip 安装配置教程详解