当前位置:首页 > VUE

vue实现消息无缝滑动

2026-02-23 03:15:48VUE

Vue 实现消息无缝滑动

使用 CSS 动画实现无缝滚动

通过 CSS 的 @keyframesanimation 属性实现消息的无缝滑动效果。将消息列表包裹在一个容器中,通过动画控制其垂直或水平移动。

<template>
  <div class="message-container">
    <div class="message-list" :style="animationStyle">
      <div v-for="(message, index) in messages" :key="index" class="message-item">
        {{ message }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      messages: ['消息1', '消息2', '消息3', '消息4', '消息5'],
      animationDuration: 10 // 动画持续时间(秒)
    };
  },
  computed: {
    animationStyle() {
      return {
        animation: `scroll ${this.animationDuration}s linear infinite`
      };
    }
  }
};
</script>

<style>
.message-container {
  height: 100px;
  overflow: hidden;
}

.message-list {
  display: inline-block;
}

@keyframes scroll {
  0% {
    transform: translateY(0);
  }
  100% {
    transform: translateY(-100%);
  }
}
</style>

使用 JavaScript 动态控制滚动

通过 JavaScript 动态计算消息列表的位置,实现更灵活的无缝滑动效果。适用于需要动态更新消息内容的场景。

<template>
  <div class="message-container" ref="container">
    <div class="message-list" ref="list">
      <div v-for="(message, index) in messages" :key="index" class="message-item">
        {{ message }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      messages: ['消息1', '消息2', '消息3', '消息4', '消息5'],
      scrollSpeed: 1, // 滚动速度(像素/帧)
      animationFrameId: null
    };
  },
  mounted() {
    this.startScrolling();
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationFrameId);
  },
  methods: {
    startScrolling() {
      const container = this.$refs.container;
      const list = this.$refs.list;
      let position = 0;

      const scroll = () => {
        position -= this.scrollSpeed;
        if (position <= -list.offsetHeight) {
          position = 0;
        }
        list.style.transform = `translateY(${position}px)`;
        this.animationFrameId = requestAnimationFrame(scroll);
      };

      scroll();
    }
  }
};
</script>

<style>
.message-container {
  height: 100px;
  overflow: hidden;
}

.message-list {
  transition: transform 0.1s linear;
}
</style>

使用第三方库实现高级效果

如果需要更复杂的效果(如平滑暂停、动态加载消息),可以使用第三方库如 vue-seamless-scroll

安装库:

npm install vue-seamless-scroll

示例代码:

<template>
  <vue-seamless-scroll :data="messages" class="message-container">
    <div v-for="(message, index) in messages" :key="index" class="message-item">
      {{ message }}
    </div>
  </vue-seamless-scroll>
</template>

<script>
import vueSeamlessScroll from 'vue-seamless-scroll';

export default {
  components: { vueSeamlessScroll },
  data() {
    return {
      messages: ['消息1', '消息2', '消息3', '消息4', '消息5']
    };
  }
};
</script>

<style>
.message-container {
  height: 100px;
  overflow: hidden;
}
</style>

动态更新消息列表

在消息列表动态变化时,确保无缝滑动效果不被中断。通过监听消息列表的变化,重置动画或重新计算滚动位置。

vue实现消息无缝滑动

<template>
  <div class="message-container" ref="container">
    <div class="message-list" ref="list">
      <div v-for="(message, index) in messages" :key="index" class="message-item">
        {{ message }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      messages: ['消息1', '消息2', '消息3'],
      scrollSpeed: 1,
      animationFrameId: null
    };
  },
  watch: {
    messages() {
      cancelAnimationFrame(this.animationFrameId);
      this.startScrolling();
    }
  },
  mounted() {
    this.startScrolling();
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationFrameId);
  },
  methods: {
    startScrolling() {
      const container = this.$refs.container;
      const list = this.$refs.list;
      let position = 0;

      const scroll = () => {
        position -= this.scrollSpeed;
        if (position <= -list.offsetHeight) {
          position = 0;
        }
        list.style.transform = `translateY(${position}px)`;
        this.animationFrameId = requestAnimationFrame(scroll);
      };

      scroll();
    }
  }
};
</script>

以上方法可以根据实际需求选择,CSS 动画适合简单场景,JavaScript 动态控制更灵活,第三方库则提供开箱即用的高级功能。

标签: 消息vue
分享给朋友:

相关文章

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const Bas…

vue树形实现

vue树形实现

Vue 树形组件实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身的方式,可以轻松构建多层嵌套的树形结构。 <template> &l…

vue实现modal

vue实现modal

Vue 实现 Modal 弹窗组件 使用 Vue 实现 Modal 弹窗组件可以通过多种方式,包括原生 Vue 组件、第三方库或自定义指令。以下是几种常见方法: 原生 Vue 组件实现 创建一个基础…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…

vue实现active

vue实现active

Vue 实现 active 状态的方法 在 Vue 中实现 active 状态可以通过以下几种方式实现,具体取决于使用场景和需求。 使用 v-bind:class 动态绑定类名 通过 v-bind:…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for动态生成菜单 通过数据驱动的方式动态渲染菜单项,适合菜单内容可能变化的场景: <t…