首页 > 其他分享 >抽奖滚动功能

抽奖滚动功能

时间:2025-01-14 16:58:59浏览次数:3  
标签:功能 抽奖 container null height 滚动 sumHeight const audio

代码

<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 = 5
                if (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的这个数字上。

标签:功能,抽奖,container,null,height,滚动,sumHeight,const,audio
From: https://blog.csdn.net/bbkhhvv/article/details/145142657

相关文章

  • 网站视频播放功能无法正常使用的原因及解决方法
    当您发现网站上的视频无法正常播放时,可能是由多种因素引起的。为了快速定位并解决问题,您可以按照以下步骤进行排查和修复:检查MIME类型配置:MIME类型是浏览器用来识别文件类型的机制。如果服务器未正确配置MIME类型,浏览器可能无法正确解析视频文件。确保服务器配置了正确的MIME......
  • vue-easy-tree解决大量数据卡死问题 虚拟滚动
    //定义一个函数来遍历树形数据并设置节点的checked、半选和disabled状态setNodeStates(nodes,selectedIds){consttreeRef=this.$refs["from-tree"];//获取vue-easy-tree的引用if(treeRef){nodes.forEach(node=>{constisSelected......
  • 每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能
    Cursor插件系统与扩展功能一、课程概述今天我们将学习CursorAI的插件系统,了解如何通过插件扩展和增强IDE功能。由于CursorAI基于VSCode开发,我们可以利用丰富的VSCode插件生态系统。1.1学习目标了解插件系统原理掌握插件安装管理使用常用开发插件二、插件系统基础......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • 什么是视差滚动?如何实现视差滚动的效果?
    视差滚动(ParallaxScrolling)是一种前端开发技术,用于创建多层背景以不同速度移动的效果,从而形成立体的运动感和出色的视觉体验。这种技术广泛应用于网页设计和视频游戏中,以增加视觉吸引力和用户参与度。实现视差滚动效果的方法主要有以下几种:使用CSS属性:通过设置background-a......
  • 你知道全屏滚动的原理是什么吗?它用到了CSS的哪些属性?
    全屏滚动的原理主要依赖于JavaScript的事件监听和CSS的布局属性。以下是其原理和所用到的关键CSS属性的详细解释:全屏滚动的原理监听滚动事件:通过JavaScript监听用户的滚动事件,如鼠标滚轮滚动或触摸滑动。控制滚动位置:根据用户的滚动行为(向上或向下),使用JavaScript控制页面平滑......
  • Android 10.0 监听某个app启动或者退出功能实现
    1.前言在进行10.0的系统定制开发中,在某些app的定制过程中,需要知道某个app的启动记录和退出记录,所以就需要监听某个app的启动和退出的过程,需要在Activity的生命周期中来实现监听功能2.监听某个app启动或者退出功能实现的核心类frameworks\base\core\java\android\app\Activi......
  • 推荐4款基于.NET开源、功能强大的CMS建站系统
    前言CMS系统作为一种强大的内容管理工具,在数字化时代发挥着越来越重要的作用。无论是个人博客还是大型企业官网,选择一个合适的CMS都能极大地提高效率和用户体验。今天大姚给大家推荐4款基于.NET开源、免费、功能强大的CMS建站系统,希望可以帮助到有需要的同学。SSCMSSSCMS内容......
  • 在 PowerShell 中,管理 Active Directory 域服务(AD DS)涉及到很多命令,这些命令可以根据
    在PowerShell中,管理ActiveDirectory域服务(ADDS)涉及到很多命令,这些命令可以根据不同的功能进行分类。下面是一个按功能分类的PowerShell命令表格,帮助你快速找到相关命令。功能分类命令描述域和信任管理Get-ADDomain获取当前域的配置信息。 Set-ADDomain......
  • 为你的Blazor程序加入本地化多语言功能
    本地化本地化是为给定语言和地区定制应用程序的过程.BootstrapBlazor组件允许您将其UI元素转换为所需的语言。这包括按钮、过滤器操作符属性等文本。组件内部默认使用当前请求UI文化语言,本文将向您展示如何在应用程序中使用此功能:BootstrapBlazor组件库简介BootstrapBl......