当前位置:首页 > VUE

vue实现抽奖名单滚动

2026-01-20 22:51:18VUE

实现抽奖名单滚动效果

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

使用CSS动画和Vue数据绑定

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

<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提供了内置的过渡系统,可以用来创建更平滑的滚动效果:

<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>

实现随机停止功能

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

vue实现抽奖名单滚动

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 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…

vue实现treetable

vue实现treetable

Vue实现TreeTable的方法 使用第三方组件库(如Element UI) Element UI的el-table组件支持树形表格展示,通过设置row-key和tree-props属性即可实现。…

vue实现搜索提示

vue实现搜索提示

Vue实现搜索提示的方法 使用v-model绑定输入框 通过v-model将输入框的值与Vue实例中的数据进行双向绑定,实时获取用户输入内容。 <input v-model="searchQu…

vue实现word在线

vue实现word在线

Vue 实现 Word 在线编辑与预览 方案一:使用 docx.js 与前端解析 安装依赖库 docx 和 file-saver,用于生成和下载 Word 文件: npm install docx…