抽奖滚动功能

embedded/2025/1/16 4:42:55/

代码

javascript"><template><div class="box"><video class="video" src="../../assets/video/底层.mp4" loop autoplay muted></video><img class="choujiang" src="../../assets/image/抽奖1.png" alt="" srcset=""><!-- <img class="btn" src="../../assets/image/aaa.gif" alt="" srcset=""> --><div class="btn" @click="work">奖</div><div class="number1" ref="numberOne"><div class="sum" v-for="(item, index) in number" :key="index">{{ item }}</div></div><div class="number2" ref="numberTwo"><div class="sum" v-for="(item, index) in number" :key="index">{{ item }}</div></div><div class="number3" ref="numberThree"><div class="sum" v-for="(item, index) in number" :key="index">{{ item }}</div></div></div>
</template>
<script>
export default {// 组件名字name: 'App',// 状态数据data() {return {number: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],scrollPosition: 0,scrollPosition2: 0,scrollPosition3: 0,isScrolling: true,animationFrameId: null,animationFrameId2: null,animationFrameId3: null,targetNumber: null,audio: null,}},mounted() {this.start()// let playButton = document.createElement('button');this.audio = document.createElement('audio');this.audio.src = require('../../assets/music/祖海 - 好运来.ogg');// playButton.addEventListener('click',()=>{this.audio.play().then(() => {this.audio.loop = true;}).catch(error => {console.log('播放音频失败:', error);});// })},beforeDestroy() {if (this.audio) {this.audio.pause();document.body.removeChild(this.audio); // 移除 audio 元素}},methods: {work() {if (this.isScrolling) {this.targetNumber = 5if (this.targetNumber !== null) {const container = this.$refs.numberOne;const sumHeight = container.querySelector('.sum').offsetHeight;const targetIndex = this.number.indexOf(this.targetNumber);const targetPosition = targetIndex * sumHeight;this.stop()container.scrollTop = targetPosition;}} else {this.start()}this.isScrolling = !this.isScrolling},start() {this.animationFrameId = requestAnimationFrame(this.scroll);this.animationFrameId2 = requestAnimationFrame(this.scroll2);this.animationFrameId3 = requestAnimationFrame(this.scroll3);},stop() {cancelAnimationFrame(this.animationFrameId);this.animationFrameId = null;cancelAnimationFrame(this.animationFrameId2);this.animationFrameId2 = null;cancelAnimationFrame(this.animationFrameId3);this.animationFrameId3 = null;},scroll() {this.$nextTick(() => {const container = this.$refs.numberOne;const sumHeight = container.querySelector('.sum').offsetHeight;const totalHeight = sumHeight * this.number.length;this.scrollPosition = (this.scrollPosition + sumHeight) % totalHeight;container.scrollTop = this.scrollPosition;setTimeout(() => {if (this.isScrolling) {this.animationFrameId = requestAnimationFrame(this.scroll);}}, 50);});},scroll2() {this.$nextTick(() => {const container = this.$refs.numberTwo;const sumHeight = container.querySelector('.sum').offsetHeight;const totalHeight = sumHeight * this.number.length;this.scrollPosition2 = (this.scrollPosition2 + sumHeight) % totalHeight;container.scrollTop = this.scrollPosition2;setTimeout(() => {if (this.isScrolling) {this.animationFrameId2 = requestAnimationFrame(this.scroll2);}}, 60);});},scroll3() {this.$nextTick(() => {const container = this.$refs.numberThree;const sumHeight = container.querySelector('.sum').offsetHeight;const totalHeight = sumHeight * this.number.length;this.scrollPosition3 = (this.scrollPosition3 + sumHeight) % totalHeight;container.scrollTop = this.scrollPosition3;setTimeout(() => {if (this.isScrolling) {this.animationFrameId3 = requestAnimationFrame(this.scroll3);}}, 70);});}}}
</script>
<style lang="scss" scoped>
.box {position: relative;
}.video {width: 100vw;height: 100vh;position: relative;z-index: -99;object-fit: cover;
}.choujiang {position: absolute;z-index: 99;width: 100%;height: 1000px;
}.btn {cursor: pointer;position: absolute;bottom: 100px;width: 300px;text-align: center;left: 50%;transform: translateX(-50%);z-index: 99;font-size: 100px;border: 1px solid black;border-radius: 50%;color: #fff;text-shadow: 0 0 5px red, 0 0 10px red, 0 0 15px red, 0 0 20px red, 0 0 25px red, 0 0 30px red, 0 0 35px red;/* 阴影效果,模拟发光 */
}.number1 {position: absolute;width: 250px;height: 220px;overflow: hidden;top: 170px;left: 590px;text-align: center;line-height: 220px;display: flex;flex-direction: column;
}.number2 {position: absolute;width: 250px;height: 220px;overflow: hidden;top: 170px;left: 840px;text-align: center;line-height: 220px;display: flex;flex-direction: column;
}.number3 {position: absolute;width: 250px;height: 220px;overflow: hidden;top: 170px;left: 1090px;text-align: center;line-height: 220px;display: flex;flex-direction: column;
}.sum {width: 250px;height: 220px;font-size: 100px;font-family: 'pangmenzhengdao';
}
</style>

刚进入页面开始滚动,点击按钮暂停滚动,再次点击继续滚动

此外我给他加了背景音乐,当进入这个页面会自动响起音乐,离开页面的时候自动关闭音乐。

第一个数字我此外让它固定滚动到5的这个数字上。


http://www.ppmy.cn/embedded/154306.html

相关文章

利用Java爬虫获取淘宝商品描述item_get_descAPI接口

一、引言 在电子商务领域&#xff0c;商品描述是消费者了解商品详情的重要信息来源&#xff0c;对于商家的销售和消费者的购买决策都具有关键影响。淘宝作为国内领先的电商平台&#xff0c;其商品描述数据具有极高的价值。虽然淘宝开放平台提供了API接口&#xff0c;但这些接口…

react Hooks 父组件调用子组件函数、获取子组件属性

子组件 import { forwardRef, useImperativeHandle } from react// 定义子组件的 ref 类型 export interface ChildRef {childMethod: () > voidchildValue: string }const Child forwardRef<ChildRef>((props, ref) > {// 暴露给父组件的方法和属性useImperativ…

2024年开发语言热度排名

随着技术的不断发展和变化&#xff0c;编程语言的热度也在不断演变。2024年即将到来&#xff0c;我们有必要回顾和展望当前和未来的开发语言市场。本文将基于多个因素&#xff0c;包括行业需求、社区支持、流行度以及新兴趋势&#xff0c;对2024年的开发语言热度进行排名和分析…

Windows下安装和配置Go开发环境

文章目录 1. 介绍了SDK2. 下载 SDK工具包3. windows 下配置 Golang 环境变量 1. 介绍了SDK SDK 的全称(Software Development Kit 软件开发工具包)SDK是提供给开发人员使用的&#xff0c;其中包含了对应开发语言的工具包 2. 下载 SDK工具包 Go语言的官网为&#xff1a;https…

Nginx 配置支持 HTTPS 代理

个人博客地址&#xff1a;Nginx 配置支持 HTTPS 代理 | 一张假钞的真实世界 本文描述的是Nginx HTTPS反向代理的情况&#xff08;即后端服务是HTTP的&#xff09;。 使用openssl配置ssl证书 生成服务器端的私钥&#xff08;key 文件&#xff09;&#xff1a; # openssl gen…

分布式缓存redis

分布式缓存redis 1 redis单机&#xff08;单节点&#xff09;部署缺点 &#xff08;1&#xff09;数据丢失问题&#xff1a;redis是内存存储&#xff0c;服务重启可能会丢失数据 &#xff08;2&#xff09;并发能力问题&#xff1a;redis单节点&#xff08;单机&#xff09;部…

70_Redis数据结构-RedisObject

1.RedisObject介绍 在Redis中,所有数据类型的键和值均会被封装成一个称为Redis对象(RedisObject)的结构。什么是RedisObject呢?RedisObject(或简称robj)是Redis内部用于统一表示不同类型值的一个通用数据结构。 从Redis使用者的视角来看,一个Redis节点可以包含多个数据…

12 USART串口通讯

1 串口物理层 两个设备的“DB9接口”之间通过串口信号建立连接&#xff0c;串口信号线中使用“RS232标准”传输数据信号。由于RS232电平标准的信号不能直接被控制器直接识别&#xff0c;所以这些信号会经过“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号&#xff…