当前位置:首页 > VUE

vue实现抽奖名单滚动

2026-01-20 22:51:18VUE

实现抽奖名单滚动效果

在Vue中实现抽奖名单滚动效果可以通过多种方式完成,以下是一种常见的实现方法:

使用CSS动画和Vue数据绑定

创建滚动动画效果可以通过CSS的@keyframestransform属性实现:

vue实现抽奖名单滚动

<template>
  <div class="lottery-container">
    <div class="roll-list" :style="{ transform: `translateY(${translateY}px)` }">
      <div v-for="(item, index) in items" :key="index" class="item">
        {{ item.name }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: '张三' },
        { name: '李四' },
        { name: '王五' },
        // 更多名单...
      ],
      translateY: 0,
      animationInterval: null
    }
  },
  mounted() {
    this.startRolling()
  },
  beforeDestroy() {
    this.stopRolling()
  },
  methods: {
    startRolling() {
      this.animationInterval = setInterval(() => {
        this.translateY -= 1
        if (Math.abs(this.translateY) >= this.items.length * 50) {
          this.translateY = 0
        }
      }, 50)
    },
    stopRolling() {
      clearInterval(this.animationInterval)
    }
  }
}
</script>

<style scoped>
.lottery-container {
  height: 200px;
  overflow: hidden;
  position: relative;
  border: 1px solid #eee;
}

.roll-list {
  transition: transform 0.1s linear;
}

.item {
  height: 50px;
  line-height: 50px;
  text-align: center;
  font-size: 18px;
}
</style>

使用Vue过渡效果

Vue提供了内置的过渡系统,可以用来创建更平滑的滚动效果:

vue实现抽奖名单滚动

<template>
  <div class="lottery-container">
    <transition-group name="roll" tag="div">
      <div v-for="(item, index) in visibleItems" :key="item.id" class="item">
        {{ item.name }}
      </div>
    </transition-group>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: '张三' },
        { id: 2, name: '李四' },
        { id: 3, name: '王五' },
        // 更多名单...
      ],
      currentIndex: 0,
      visibleCount: 5,
      animationInterval: null
    }
  },
  computed: {
    visibleItems() {
      const result = []
      for (let i = 0; i < this.visibleCount; i++) {
        const index = (this.currentIndex + i) % this.items.length
        result.push(this.items[index])
      }
      return result
    }
  },
  mounted() {
    this.startRolling()
  },
  beforeDestroy() {
    this.stopRolling()
  },
  methods: {
    startRolling() {
      this.animationInterval = setInterval(() => {
        this.currentIndex = (this.currentIndex + 1) % this.items.length
      }, 200)
    },
    stopRolling() {
      clearInterval(this.animationInterval)
    }
  }
}
</script>

<style scoped>
.lottery-container {
  height: 250px;
  overflow: hidden;
  position: relative;
}

.item {
  height: 50px;
  line-height: 50px;
  text-align: center;
  font-size: 18px;
}

.roll-enter-active, .roll-leave-active {
  transition: all 0.5s;
}
.roll-enter {
  transform: translateY(-50px);
  opacity: 0;
}
.roll-leave-to {
  transform: translateY(50px);
  opacity: 0;
}
</style>

使用第三方库实现

对于更复杂的效果,可以考虑使用第三方动画库如GSAP:

<template>
  <div ref="container" class="lottery-container">
    <div ref="list" class="roll-list">
      <div v-for="(item, index) in items" :key="index" class="item">
        {{ item.name }}
      </div>
    </div>
  </div>
</template>

<script>
import { gsap } from 'gsap'

export default {
  data() {
    return {
      items: [
        { name: '张三' },
        { name: '李四' },
        { name: '王五' },
        // 更多名单...
      ],
      animation: null
    }
  },
  mounted() {
    this.startRolling()
  },
  beforeDestroy() {
    this.stopRolling()
  },
  methods: {
    startRolling() {
      const containerHeight = this.$refs.container.clientHeight
      const listHeight = this.$refs.list.clientHeight

      this.animation = gsap.to(this.$refs.list, {
        y: -(listHeight - containerHeight),
        duration: 10,
        ease: "none",
        repeat: -1
      })
    },
    stopRolling() {
      if (this.animation) {
        this.animation.kill()
      }
    }
  }
}
</script>

<style scoped>
.lottery-container {
  height: 200px;
  overflow: hidden;
  position: relative;
}

.item {
  height: 50px;
  line-height: 50px;
  text-align: center;
  font-size: 18px;
}
</style>

实现随机停止功能

添加随机停止功能可以让抽奖更加真实:

methods: {
  startRolling() {
    this.rolling = true
    this.animationInterval = setInterval(() => {
      this.currentIndex = (this.currentIndex + 1) % this.items.length
    }, 100)
  },
  stopRolling() {
    // 先减速
    clearInterval(this.animationInterval)
    const slowDownInterval = setInterval(() => {
      this.currentIndex = (this.currentIndex + 1) % this.items.length
    }, 200)

    // 随机停止
    setTimeout(() => {
      clearInterval(slowDownInterval)
      this.rolling = false
      this.$emit('stopped', this.items[this.currentIndex])
    }, 1000 + Math.random() * 2000)
  }
}

以上方法提供了不同复杂度的实现方案,可以根据项目需求选择合适的实现方式。CSS动画方案简单轻量,Vue过渡效果提供了更平滑的动画,而GSAP则适合需要复杂动画控制的场景。

标签: 名单vue
分享给朋友:

相关文章

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <templ…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…

vue实现快手

vue实现快手

Vue 实现类似快手的功能 Vue.js 是一个渐进式 JavaScript 框架,适合构建复杂的单页应用。要实现类似快手的功能,可以结合 Vue 和相关技术栈进行开发。 核心功能模块 视频流展示…

vue实现pc

vue实现pc

Vue 实现 PC 端应用开发 Vue.js 是一个流行的前端框架,适用于构建 PC 端 Web 应用。以下是关键步骤和最佳实践: 项目初始化 使用 Vue CLI 或 Vite 创建项目:…

vue实现导入

vue实现导入

Vue 实现文件导入功能 使用 <input type="file"> 元素 在 Vue 模板中添加一个文件输入元素,绑定 change 事件处理函数。 <template>…