如何写一个数字老虎机滚轮

devtools/2024/12/22 22:05:50/

需求描述

写一个数字滚轮,实现类似老虎机的效果,可以指定数字

实现思路

这个数字滚动组件的核心实现思路可以概括为:

  1. 视觉原理
  • 每个数字位用一个固定高度的容器,通过 overflow: hidden 只显示一个数字
  • 容器内部包含完整的 0-9 序列,通过上下平移显示不同数字
  • 重复放置首尾数字(0)实现无缝滚动效果
  1. 动画实现
  • 使用 CSS animation 实现两个关键动画:
    • 滚动中:无限循环向上平移实现滚动效果
    • 停止时:精确平移到目标数字的位置
  1. 控制逻辑
  • Vue 管理组件状态(rolling)控制动画切换
  • 通过 CSS 变量(–num)动态计算每个数字的最终停止位置
  • 使用 setTimeout 控制滚动持续时间

实现细节

页面结构

每一位数字都是这么个结构

在这里插入图片描述

滚动效果的实现

所谓的滚动其实就是那一长溜的数字不断重复从上到下或者从下到上这个操作,所以外层realtive,内层absolute,加上动画

那一长溜的数字最终的停止位置是需要根据这一位上的显示数字来确定的,因此需要动态算出来,在这个组件里面是下面标黄的来算

javascript"><div:class="['TigerNumbers', rolling ? 'rolling' : 'stop']":style="{ '--num': ((n || 10) - 10) * 1.5 + 'em' }">

动画分为两种:

  • 滚动的动画。translateY从0到-100%,不断循环
@keyframes NumberRoll {0% {transform: translateY(0);}100% {transform: translateY(-100%);}
}
  • 最终的停止动画。就是translateY从0到算出来的要停下来的位置
@keyframes NumberStop {0% {transform: translateY(0);}100% {transform: translateY(calc(var(--num)));}
}

数据设计

  • 用一个数组来存要显示的数字
  • 用一个rolling变量来标记现在是滚动状态还是停止滚动状态

组件代码

vue"><!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><script src="./js/vue.min.js"></script><title>Title</title></head><body><div id="vue_root"><div class="Tiger"><div v-for="(n, index) in numbers" :key="index" class="TigerItem"><div:class="['TigerNumbers', rolling ? 'rolling' : 'stop']":style="{ '--num': ((n || 10) - 10) * 1.5 + 'em' }"><div>0</div><div>9</div><div>8</div><div>7</div><div>6</div><div>5</div><div>4</div><div>3</div><div>2</div><div>1</div><div>0</div></div></div></div></div></body><script>let vm = new Vue({el: "#vue_root",data() {return {rolling: true,numbers: [5, 3, 8], // 你可以根据需要修改数字数组delaySec: 2, // 你可以根据需要修改 delaySec 的默认值};},mounted() {setTimeout(() => {this.rolling = false;}, this.delaySec * 1000);},})</script><style>.Tiger {display: flex;}.TigerItem {width: 1em;height: 1.5em;position: relative;overflow: hidden;background-color: lightgreen;margin-right: 0.5em;}.TigerNumbers {position: absolute;width: 100%;text-align: center;}.TigerNumbers > div {line-height: 1.5em;height: 1.5em;}.TigerNumbers.rolling {animation: NumberRoll 0.3s infinite linear;}.TigerNumbers.stop {animation: NumberStop 0.6s forwards;}@keyframes NumberRoll {0% {transform: translateY(0);}100% {transform: translateY(-100%);}}@keyframes NumberStop {0% {transform: translateY(0);}100% {transform: translateY(calc(var(--num)));}}</style>
</html>

效果演示

在这里插入图片描述


http://www.ppmy.cn/devtools/144491.html

相关文章

leecode474.一和零

这道题感觉像是01背包问题的进阶&#xff0c;容量有两个维度&#xff0c;一个是m个0&#xff0c;一个是n个1 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m1,vector<int>(n1,0));for(…

基于ceres优化的3d激光雷达开源算法

以下是一些基于CERES优化的开源激光雷达SLAM或相关算法&#xff1a; (1) LOAM (Lidar Odometry And Mapping) 简介: LOAM是一种经典的激光雷达里程计和建图算法&#xff0c;它通过提取特征点&#xff08;角点和平面点&#xff09;&#xff0c;利用ICP&#xff08;Iterative Cl…

Java图片拼接

最近遇到一个挺离谱的功能&#xff0c;某个表单只让上传一张图&#xff0c;多图上传会使导出失败。跟开发沟通后表示&#xff0c;这个问题处理不了。我... 遂自己思考&#xff0c;能否以曲线救国的方式拯救一下&#xff0c;即不伤及代码之根本&#xff0c;又能解决燃眉之急。灵…

【计算机网络2】计算机网络的性能能指标

目录 一 、计算机网络的性能指标 二、具体介绍 1、速 率 2、带 宽 3、吞 吐 量 4、时 延 5、时延带宽积 6、往 返 时 延 7、信道利用率 一 、计算机网络的性能指标 计算机网络的性能指标就是从不同方面度量计算机网络的性能&#xff0c;有如下7个指标&#xff1a; 速…

易快报-飞书-金蝶云星空集成项目技术分享

本文深入探讨了浙江某科技集团有限公司如何通过技术集成实现易快报、飞书和金蝶云星空的数据对接&#xff0c;重点分析了项目在安全性、时效性和细节处理方面的技术实现&#xff0c;并展示了项目成果。 1. 企业背景 浙江某科技集团有限公司&#xff0c;作为一家专注于新能源应…

Vue3之路由(Router)介绍

在构建单页面应用&#xff08;SPA&#xff09;时&#xff0c;我们需要一种有效的方式来处理不同的视图&#xff08;页面&#xff09;之间的导航&#xff0c;而无需重新加载整个页面。Vue.js 提供了一个官方的路由库 Vue Router&#xff0c;正是为了解决这一问题。Vue Router 使…

wpf mvvm 数据绑定数据(按钮文字表头都可以),根据长度进行换行,并把换行的文字居中

今天遇到了一个问题&#xff0c;就是数据表头按钮的文字换行后不能居中&#xff0c;如何查找资料后&#xff0c;也是挺简单的&#xff0c;就是绑定控件的文字&#xff0c;进行进行操作&#xff0c;下来我们以按钮为例。 在WPF中使用MVVM模式时&#xff0c;可以通过绑定按钮的文…

牛客网 SQL36查找后排序

SQL36查找后排序 select device_id,age from user_profile order by age asc #select [字段1,字段2] from [表名] order by [字段1] [升序(asc)/降序(desc)],[字段2] [升序(asc)/降序(desc)] #select&#xff1a;查询 #order by 排序 每日问题 如何实现对象的克隆&#xff1…