当前位置: 首页 > news >正文

微信小程序animation动画,微信小程序animation动画无限循环播放

需求是酱紫的:

在这里插入图片描述
页面顶部的喇叭通知,内容不固定,宽度不固定,就是做走马灯(轮播)效果,从左到右的走马灯(轮播),每播放一遍暂停 1500ms ~ 2000ms

刚开始想的是 css 的 position: relative + animation,如果宽度固定还好说,宽度不固定,用百分比的话,想象很美好,现实很骨感,百分比相对的是父元素宽度…,所以 pass 掉

又想到动态生成 keyframes ,这样动态获取子元素宽度,再动态生成 keyframes ,动态传入 偏移量,这样就好了,可是这是小程序…,如果web端倒是可以动态操作 cssRule,小程序端,我真不会

然后从小程序文档直接搜索 animation ,还真找到了
Animation API

于是就理所当然的用上啦

看结果

不唠叨,直接点击查看代码片段:https://developers.weixin.qq.com/s/Ju3T3amk7oKc

思路:

页面结构

<view class="integral-notice common-flex-between"><view class="integral-notice-left"><image class="integral-notice-left-icon" src="icon-horn.png" mode="aspectFill"></image></view><view class="integral-notice-right common-flex-start"><view class="integral-notice-right-item notice_1" animation="{{animationData}}">各位憧橙会员大家好,积分商城发货周期为一个月2次,每个月15号和30号发货,有问题请联系客服,谢谢!</view><!-- 这里之所以放两个一样的,是为了无缝衔接的滚动 --><view class="integral-notice-right-item notice_1" animation="{{animationData}}">各位憧橙会员大家好,积分商城发货周期为一个月2次,每个月15号和30号发货,有问题请联系客服,谢谢!</view></view>
</view>

样式代码


/*通用flex水平方向垂直居中布局*/
.common-flex-between {display: flex;justify-content: space-between;align-items: center;flex-wrap: nowrap;
}.common-flex-around {display: flex;justify-content: space-around;align-items: center;flex-wrap: nowrap;
}.common-flex-center {display: flex;justify-content: center;align-items: center;flex-wrap: nowrap;
}.common-flex-start {display: flex;justify-content: flex-start;align-items: center;flex-wrap: nowrap;
}
.integral-notice{position: fixed;left: 0;top: 0;background: #FEF6F0;width: 750rpx;height: 98rpx;box-sizing: border-box;padding-left: 24rpx;padding-right: 24rpx;
}
.integral-notice-left{box-sizing: border-box;padding-right: 20rpx;
}
.integral-notice-left-icon{display: block;width: 38rpx;height: 34rpx;
}
.integral-notice-right{overflow: hidden;
}
.integral-notice-right-item{white-space: nowrap;color: #141418;font-size: 28rpx;letter-spacing: 2rpx;height: 32rpx;line-height: 34rpx;position: relative;left: 0;top: 0;
}

第一步: 让它动起来

js代码

  /*** 页面的初始数据*/data: {animationData: {},},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {const query = wx.createSelectorQuery()query.selectAll('.notice_1').boundingClientRect((res)=>{let noticeWidth = res[0].widththis.startAnimation(noticeWidth)})query.exec()},startAnimation(left, duration = 10000) {this.animation = wx.createAnimation()let offset = -leftthis.animation.left(offset).step({duration,timingFunction: 'linear'})this.setData({animationData: this.animation.export()})},

备注:这里你会发现,是动起来了,就执行了一次

木事,改代码,让它执行完的时候回到起点

  startAnimation(left, duration = 10000) {this.animation = wx.createAnimation()let offset = -leftthis.animation.left(offset).step({duration,timingFunction: 'linear'})this.setData({animationData: this.animation.export()})// 这里,让它回去起点,便于后边无限循环setTimeout(() => {this.animation.left(0).step({duration: 0, // 时间为 0timingFunction: 'step-start' // 这个是 动画第一帧就跳至结束状态直到结束})this.setData({animationData: this.animation.export()})}, duration)},

看到这里,无限循环播放的动画就知道怎么做了吧,做个递归不就好啦?不信咱试试?

  startAnimation(left, duration = 10000) {this.animation = wx.createAnimation()let offset = -leftthis.animation.left(offset).step({duration,timingFunction: 'linear'})this.setData({animationData: this.animation.export()})setTimeout(() => {this.animation.left(0).step({duration: 0,timingFunction: 'step-start'})this.setData({animationData: this.animation.export()})// 递归,无限循环播放this.startAnimation(left, duration)}, duration)},

注意:你会发现时好时坏,没事,加延迟,加异步,因为虽然是同步执行的代码,代码执行+运行也要时间啊,1ms、5ms、10ms 也是时间

  startAnimation(left, duration = 10000, wait = 2000) {this.animation = wx.createAnimation()let offset = -leftthis.animation.left(offset).step({duration,timingFunction: 'linear'})this.setData({animationData: this.animation.export()})setTimeout(() => {this.animation.left(0).step({duration: 0,timingFunction: 'step-start'})this.setData({animationData: this.animation.export()})// 加上延迟,加上需求上的等待时间 waitlet minWait = 12 // 之所以给了个 minWait,是防止 bug,就是那个代码执行/运行时间,经测试,我这里 12ms 的延迟比较合适setTimeout(() => {this.startAnimation(left, duration, wait)}, wait < minWait ? minWait : wait)}, duration)},

欧啦,大功告成,
在这里插入图片描述

相关文章:

微信小程序animation动画,微信小程序animation动画无限循环播放

需求是酱紫的&#xff1a; 页面顶部的喇叭通知&#xff0c;内容不固定&#xff0c;宽度不固定&#xff0c;就是做走马灯&#xff08;轮播&#xff09;效果&#xff0c;从左到右的走马灯&#xff08;轮播&#xff09;&#xff0c;每播放一遍暂停 1500ms &#xff5e; 2000ms 刚…...

node.js

什么是Node.js Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,使开发者可以搭建服务器端的JavaScript应用程序 概念: 使用Node.js编写后端程序 // 支持前端工程化 ​ 后端程序&#xff1a;提供接口和数据 &#xff0c;网页资源 ​ 前端工程化:对代码压缩&…...

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息 第七章 小程序远程数据请求、获取个人信息 文章目录 【微信小程序创作之路】- 小程序远程数据请求、获取个人信息前言一、远程数据请求1.本地环境2.正式域名 二、获取用户个人信息1.展示当前用户的身份信息2.获取用…...

XML基础知识讲解

文章目录 1. xml简介2. xml快速入门3. xml的元素(标签)定义4. xml标签的命名规范5. xml的属性定义和注释6. 转义字符7. CDATA区8. xml的处理指令9. xml的约束 1. xml简介 XML&#xff08;eXtensible Markup Language&#xff09;是一种用于描述数据的标记语。 它以纯文本的方…...

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移&#xff0c;HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件&#xff1a;ZooKeeper 和 ZKFailoverController &#xff08;ZKFC&…...

Ubuntu下载deb包及其依赖包

一、简介 有时我们需要在离线环境使用提前准备好的deb包&#xff0c;然后只需要在新机器使用dpkg -i安装即可。 二、命令 apt-get download $(apt-rdepends &#xff08;需要下载的包&#xff0c;可以有多个&#xff09; | grep -v "^ " | sed s/debconf-2.0/debco…...

Ubuntu中解/压缩命令

一、zip文件 #解压 unzip filename.zip #压缩 zip filename.zip dirname # 递归处理&#xff0c;将指定目录下的所有文件和子目录一并压缩 zip -r filename.zip dirname 二、tar文件 # 解压 tar xvf FileName.tar # 压缩&#xff0c;将DirName和其下所有文件(夹)打包非压…...

剑指 Offer 12. 矩阵中的路径(回溯 DFS)

文章目录 题目描述思路分析完整代码 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff…...

iceberg对比hive优势

1.事务性 从事务性上来说&#xff0c;iceberg具有更高的数据质量。 因为iceberg本质是一种table format&#xff0c;屏蔽了底层的存储细节&#xff0c;写入数据时候需要严格按照schema写入。而hive可以先写入底层数据&#xff0c;然后使用load partition的方式来加载分区。这样…...

ProgressBar基本使用

作用&#xff1a;进度条&#xff0c;用于展示某个任务的完成情况&#xff0c; 常用属性&#xff1a; 设定进度条的最大、最小值、自增步长 常用事件&#xff1a; 后台代码&#xff1a; private void progressBar1_Click(object sender, EventArgs e){Thread t;//使用线程执行…...

spring boot java使用XEasyPdf生成pdf文档

java使用XEasyPdf生成pdf文档 spring boot java使用XEasyPdf生成pdf文档第一步导入maven坐标,pom.xml全部贴上第二步编写代码代码实战&#xff1a; spring boot java使用XEasyPdf生成pdf文档 第一步导入maven坐标,pom.xml全部贴上 <?xml version"1.0" encoding…...

自定义elementui的主题

通常情况下&#xff0c;我们使用elementui框架的时候默认组件的主题都是白色的&#xff0c;比如&#xff1a; 但是如果想自定义主题&#xff0c;改变主题颜色&#xff0c;以及各种默认颜色&#xff0c;其实也不难&#xff1a; 配置默认主题&#xff0c;选好后点击下载 在vu…...

eNSP interface g0/0/0 报错解决办法

文章目录 1 报错截图2 解决办法2.1 排查设备是否有 GM 接口2.2 更换适合的路由器&#xff0c;并验证 1 报错截图 2 解决办法 2.1 排查设备是否有 GM 接口 查看下设备是否支持 GM 接口&#xff08;GigabitEthernet&#xff09; 方式一&#xff1a;右键路由器设备 - 设置 - 查看…...

Metric3D:Towards Zero-shot Metric 3D Prediction from A Single Image

参考代码&#xff1a;Metric3D 介绍 在如MiDas、LeReS这些文章中对于来源不同的深度数据集使用归一化深度作为学习目标&#xff0c;则在网络学习的过程中就天然失去了对真实深度和物体尺寸的度量能力。而这篇文章比较明确地指出了影响深度估计尺度变化大的因素就是焦距 f f f…...

k8s ingress获取客户端客户端真实IP

背景 在Kubernetes中&#xff0c;获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中&#xff0c;原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点&#xff1a; 安全性&#xff1a;基于客户端IP进行访问控制和认证授…...

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…...

Leaflet入门,地图平移跳转到指定位置和飞行到指定位置效果

前言 本章讲解如何Leaflet如何实现操作地图平移到指定位置或者飞行到指定位置效果。 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到leaflet对象,方便调用leaflet的api》 vue3如何使用:《L…...

iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

手边有一闲置的linux开发板iMX6ULL一直在吃灰&#xff0c;不用来搞点事情&#xff0c;总觉得对不住它。业余打发时间就玩起来吧&#xff0c;总比刷某音强。从某多多上买来一个usb接口的游戏手柄&#xff0c;让开发板支持以下它&#xff0c;后续就可以接着在上面玩童年经典游戏啦…...

Java 实现 SCP 携带密码拷贝文件

背景说明 涉及通过程序进行机器间的文件Copy的场景&#xff0c;我们一般会使用ssh连接机器&#xff0c;通过scp命令进行文件copy。 此种方案的前提是&#xff1a;机器间事先要配置免密码互通。 但是&#xff0c;如果客户现场机器数量过多&#xff0c;配置免密操作比较麻烦&a…...

Flink CEP(三)pattern动态更新

线上运行的CEP中肯定经常遇到规则变更的情况&#xff0c;如果每次变更时都将任务重启、重新发布是非常不优雅的。尤其在营销或者风控这种对实时性要求比较高的场景&#xff0c;如果规则窗口过长&#xff08;一两个星期&#xff09;&#xff0c;状态过大&#xff0c;就会导致重启…...

STM32驱动OV7670摄像头,从寄存器配置到LCD显示的避坑全记录

STM32与OV7670摄像头实战&#xff1a;从寄存器配置到LCD显示的全链路解析 1. 项目背景与硬件架构设计 在嵌入式视觉系统中&#xff0c;OV7670作为一款低成本CMOS图像传感器&#xff0c;与STM32的组合常被用于智能门禁、工业检测等场景。本项目的核心挑战在于解决传感器输出数据…...

FPGA硬解 vs 软件模拟:实测MiSTer在延迟和画质上到底强在哪?

FPGA硬解 vs 软件模拟&#xff1a;实测MiSTer在延迟和画质上到底强在哪&#xff1f; 在复古游戏的世界里&#xff0c;每一帧的延迟都可能决定《拳皇97》中一个连招的成败&#xff0c;每一像素的偏差都会影响《魂斗罗》子弹轨迹的判断。当硬核玩家们争论FPGA方案与软件模拟孰优孰…...

Display Driver Uninstaller:专业显卡驱动清理工具完全指南

Display Driver Uninstaller&#xff1a;专业显卡驱动清理工具完全指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninsta…...

Sunshine开发者指南:理解项目架构和代码实现原理

Sunshine开发者指南&#xff1a;理解项目架构和代码实现原理 【免费下载链接】sunshine Host for Moonlight Streaming Client 项目地址: https://gitcode.com/gh_mirrors/sun/sunshine Sunshine是一个开源的游戏串流主机项目&#xff0c;专为Moonlight客户端设计。作为…...

MCUXpresso for VS Code集成J-Link脚本的三种工程化方法详解

1. 项目概述&#xff1a;为什么要在IDE里折腾脚本&#xff1f;如果你是一位使用NXP MCU的嵌入式开发者&#xff0c;大概率对MCUXpresso IDE和SEGGER J-Link调试器这对黄金搭档不陌生。在传统的MCUXpresso IDE&#xff08;基于Eclipse&#xff09;里&#xff0c;通过图形界面配置…...

手把手教你用STM32F103驱动TLC7528双路DAC(附完整代码与避坑指南)

手把手教你用STM32F103驱动TLC7528双路DAC&#xff08;附完整代码与避坑指南&#xff09; 在嵌入式开发中&#xff0c;数字模拟转换器&#xff08;DAC&#xff09;是实现数字信号到模拟信号转换的关键组件。TLC7528作为一款经典的双路8位DAC芯片&#xff0c;以其高性价比和简单…...

GPT-4V食物识别实测:准确率真能到87.5%?我们复现了那篇论文的实验

GPT-4V食物识别技术深度测评&#xff1a;从实验室数据到真实场景的挑战 当一张摆盘精致的牛排照片被上传到GPT-4V界面&#xff0c;三秒后系统不仅识别出"肋眼牛排"&#xff0c;还精确标注出"约350克"和"780千卡"时&#xff0c;这种看似科幻的场景…...

PlotSquared完整指南:5分钟掌握Minecraft领地管理神器 [特殊字符]

PlotSquared完整指南&#xff1a;5分钟掌握Minecraft领地管理神器 &#x1f3ae; 【免费下载链接】PlotSquared PlotSquared - Reinventing the plotworld 项目地址: https://gitcode.com/gh_mirrors/pl/PlotSquared PlotSquared是一个革命性的Minecraft领地管理插件&am…...

无王无帝定乾坤,来自田间第一人 凰标传世照千秋

无王无帝定乾坤 ——来自田间第一人华夏文明千年流转&#xff0c;王朝霸业此起彼伏。 无数帝王功业随岁月风化&#xff0c;无数朝堂规制随朝代更迭消散。 真正能够跨越岁月、贯穿古今、安定世道、照亮千秋的&#xff0c; 从不是一时的权位霸业&#xff0c;而是亘古不变的公道正…...

别再只用ARIMA了!用Facebook Prophet快速搞定业务时间序列预测(附Python实战代码)

用Facebook Prophet三行代码完成高精度业务预测&#xff1a;电商场景实战指南 当市场部门的同事又在周五下午5点发来"下周销售预测急用"的邮件时&#xff0c;你是否还在为ARIMA模型的参数调优焦头烂额&#xff1f;时间序列预测本应是数据科学中最具商业价值的技能之一…...