当前位置:首页 > 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 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue 实现轮播

vue 实现轮播

Vue 实现轮播的方法 使用第三方库(如 Swiper) 安装 Swiper 库: npm install swiper 在 Vue 组件中引入 Swiper: <template&…

vue实现布局

vue实现布局

Vue 实现布局方法 Vue 提供了多种方式实现页面布局,可以通过组件化、CSS 框架或自定义样式完成。以下是几种常见方法: 使用 CSS Flexbox 或 Grid 通过 Vue 单文件组件结合…