vue3 数字滚动效果

news2025/1/8 6:13:29

效果图
在这里插入图片描述

代码

<template>
  <div class="number-scroller">
    <div
      class="viewport"
      :style="{ width: width + 'px', height: height + 'px' }"
    >
      <div class="number-scroller-box" ref="num">
        <div v-for="number in numbers" :key="number" class="number-item">
          {{ number }}
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted, watch } from 'vue';

const props = defineProps({
  width: {
    type: Number,
    default: 60
  },
  height: {
    type: Number,
    default: 60
  },
  // 目标数字
  targetNumber: {
    type: Number,
    default: 5
  },
  // 动画持续时间
  animationDuration: {
    type: Number,
    default: 10
  },
  // 动画缓动函数
  easing: {
    type: String,
    default: 'cubic-bezier(.5,.13,.01,.35)'
  },
  // 动画延迟时间
  delay: {
    type: Number,
    default: 1
  },
  // 旋转方向
  direction: {
    type: String,
    default: 'vertical', // 默认横向旋转
    validator: value => ['horizontal', 'vertical'].includes(value)
  }
});

const numbers = ref([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
const num = ref();

/**
 * rotateToTarget 旋转到目标数字
 */
function rotateToTarget (targetNumber, direction) {
  const angle = 360 / numbers.value.length;
  const targetIndex = numbers.value.indexOf(targetNumber);
  if (targetIndex === -1) return; // 如果目标数字不存在,直接返回
  const randomCircles = Math.floor(Math.random() * 3) + 1; // 随机生成1到3圈
  const totalAngle = 360 * randomCircles - targetIndex * angle;
  const rotateAxis = direction === 'horizontal' ? 'Y' : 'X';
  document.body.getBoundingClientRect();
  num.value.style.transition = `transform ${props.animationDuration}s ${props.easing} ${props.delay}s`;
  num.value.style.transform = `rotate${rotateAxis}(${totalAngle}deg)`;
}
/**
 * layout 页面布局
 */
const layout = () => {
  const angle = 360 / numbers.value.length;
  const radius = props.width / (2 * Math.sin(Math.PI / numbers.value.length)); // 旋转半径计算

  numbers.value.forEach((_, index) => {
    const item = num.value.children[index];
    const rotateAxis = props.direction === 'horizontal' ? 'Y' : 'X';
    item.style.transform = `rotate${rotateAxis}(${index * angle}deg) translateZ(${radius}px)`;
  });
}

onMounted(() => {
  layout()
  rotateToTarget(props.targetNumber, props.direction);
});
</script>

<style lang="less" scoped>
.number-scroller {
  display: flex;
  align-items: center;
  position: relative;
  perspective: 1000px;

  .viewport {
    overflow: hidden;
    position: relative;
  }
  .number-scroller-box {
    position: relative;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    transform-style: preserve-3d;
    box-sizing: border-box;
    transition: all 3s;
    .number-item {
      position: absolute;
      left: 0;
      top: 0;
      box-sizing: border-box;
      width: 100%;
      height: 100%;
      line-height: 100%;
      padding: 10px;
      border: 1px solid #ccc;
      border-radius: 4px;
      display: flex;
      align-items: center;
      justify-content: center;
      backface-visibility: hidden;
    }
  }
}
</style>




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《软件测试技术》习题参考答案 -2

目录 第6章 黑盒测试 一、选择题 1、黑盒法是根据程序的&#xff08; C &#xff09;来设计测试用例的。 2、黑盒测试用例设计方法包括&#xff08;B &#xff09;等 )。 3、( A )是一种黑盒测试方法&#xff0c;它是把程序的输入域划分成若干部分&#xff0c;然后从每个部…

十年后LabVIEW编程知识是否会过时?

在考虑LabVIEW编程知识在未来十年内的有效性时&#xff0c;我们可以从几个角度进行分析&#xff1a; ​ 1. 技术发展与软件更新 随着技术的快速发展&#xff0c;许多编程工具和平台不断更新和改进&#xff0c;LabVIEW也不例外。十年后&#xff0c;可能会有新的编程语言或平台…

数据库课设——网上花店销售管理系统(上)

声明&#xff1a;此次课设为本人专业课课设报告内容&#xff0c;仅供参考&#xff0c;不要照搬 1 问题的提出 随着互联网发展与电子商务普及&#xff0c;网上花店兴起&#xff0c;其突破地域限制、提供便捷购物体验且市场呈快速增长趋势。该系统需具备多方面功能以满足花店运营…

外驱功率管电流型PWM控制芯片CRE6281B1

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6281B1工作在固定频率(65kHz)模式。在负载较低时&#xff0c;CRE6281B1采用节能模式&#xff0c;实现较高的…

mapbox基础,加载高德栅格底图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀加载高德栅格底图1. ☘️实现思路2. ☘…

【大数据】(选修)实验4 安装熟悉HBase数据库并实践

实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一&#xff1a;可以使用管理员权限进行安装。方法二&#xff1a;更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发&#xff0c;今日着手准备开发一个新的 vue 项目时&#xff0c;在…

前端JS中var、let、const之间的区别

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、var 二、let 三、const 四、区别 变量…

STM32+ADC+DMA快速循环转换

测试平台&#xff1a;STM32F405RGT6 uint32_t AD_Buf[100]{0}; HAL_ADC_Start_DMA(&hadc2,(uint32_t *)AD_Buf,100); while(1) {printf("AD_Buf:%d\n",AD_Buf[0]); }

Unity中 Xlua使用整理(一)

1.安装: 从GitHub上下载Xlua源码 Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com) 下载Xlua压缩包&#xff0c;并解压将Aseet文件夹中的Xlua和Plugins文件夹复制到Unit…

js高阶-函数闭包this

闭包 一等公民 在js中函数是一等公民 函数使用很灵活,可以作为参数,也可以作为返回值 高阶函数 函数接收函数作为参数或者返回函数,则该函数称为高阶函数 eg: array.filter/reduce/find/findIndex/map.forEach 函数与方法 独立使用的 Function 做为对象的属性 method Wh…

Ubuntu 24.04.1 LTS nginx配置maccms

之前在Ubuntu 20.04中搭建过&#xff0c;现在换了新操作系统&#xff0c;顺便整理一下。 相关文章 《Ubuntu 20.04.1 LTS搭建nginx php7.4运行环境》 https://blog.csdn.net/lxyoucan/article/details/144850572《linux nginx maccms管理后台无法进入页面不存在和验证码不显…

【Ubuntu】想知道怎么通过命令行查看笔记本电池健康程度吗?

你想在 Ubuntu 中通过命令行检查电池健康状态&#xff0c;而不需要额外安装任何工具吗&#xff1f; 其实&#xff0c;你可以做到。 大多数在笔记本电脑上使用 Ubuntu 的用户都会通过顶部栏来监控电池电量&#xff08;我总是在顶部栏启用电池百分比显示&#xff0c;以便一目了…

ue5动画重定向,一键重定向。ue4小白人替换成ue5

这就是我们下载的 初学者动画内容包 点击设置选中列 绿色的是动画 黄色的关卡 蓝色是蓝图 ctrla 全选 ctrl鼠标左键 选中所有动画 重定向动画资产 不要选错&#xff0c;只要绿色 选择目标网格体 选择所有的绿色 动画 导出动画 添加前缀ycn 导出 一定要提前新建好存放的…

05容器篇(D2_集合 - D6_容器源码分析篇 - D1_ArrayList)

目录 本章目标 一、基本介绍 二、原理分析 1. 数据结构源码分析 2. 默认容量&最大容量 为什么最大容量要-8呢&#xff1f; 3. 为什么ArrayList查询快&#xff0c;增删慢&#xff1f; 4. 初始化容量 1> 创建ArrayList对象分析&#xff1a;无参数 2> 创建Arra…

TVbox 手机、智能电视节目一网打尽

文章目录 一、简要介绍二、下载地址 一、简要介绍 TVbox是目前最火爆的多端、多源的电视影音工具&#xff0c;是一款开源的自定义添加站源的影音工具。TVBox&#xff0c;支持电视频道直播。一款TV端影视工具&#xff0c;软件本身不具有任何影视资源&#xff0c;但可以通过配置…

IP Anycast 与 CDN

基于名字寻址而不是基于地址寻址早就不是什么新鲜事&#xff0c;我们日常生活中的寻址基本都是找名字&#xff0c;比如找厕所&#xff0c;找连锁店&#xff0c;我们倾向于去具有同样称呼的最近那家。IP 网络中的这种机制叫 Anycast。 是不是一下子就不需要过多解释了。所有具有…

【0x006D】HCI_Write_LE_Host_Support命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Write_LE_Host_Support命令格式 2.2. LE_Supported_Host 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令执行流程 4.1. 命令发起阶段&#xff08;主机端&#xff09; 4.2. 命令处理阶段…

Harmony OS开发之ArkUI框架速成九弹性布局和层叠布局

> 程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; --- 1.弹性布局&#xff08;Flex&#xff09; 弹性布局分为单行布局和多行…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 &#xff08;1&#xff09;在国家方面&#xff0c;是国产的系统&#xff0c;受国家支持不会有限制的情况。   &#xff08;2&#xff09;设备互连18N(1:手机 8&#xff1a;平板、PC、vr设备、可穿戴设备、智慧…