Vue2横向文字滚动

简介: 这篇文章介绍了如何在Vue 2框架中实现一个横向滚动文本的组件,允许自定义滚动文本内容、滚动区域尺寸和滚动速度等属性。

可自定义设置以下属性:

  • 滚动文字数组(sliderData),必传
  • 滚动区域总宽度(totalWidth),默认1200px
  • 滚动区域高度(totalHeight),默认45
  • 滚动区域展示条数(amount),默认4条

效果如下图:

①创建HorizontalTextSlider.vue组件:

<template>
  <div class="m-slider" :style="`height: ${height}px; width: ${totalWidth}px;`" @mouseenter="onStop" @mouseleave="onStart">
    <a
      :style="`will-change: transform; transform: translateX(${-left}px); line-height: ${height}px; width: ${width-20}px;`"
      class="u-slide-title"
      v-for="(item, index) in sliderData"
      :key="index"
      :title="item.title"
      :href="item.link"
      @click="onClick(item.title)">
      {
  
  { item.title || '--' }}
    </a>
  </div>
</template>
<script>
export default {
  name: 'HorizontalTextSlider',
  props: {
    sliderData: { // 滚动文字数组
      type: Array,
      required: true,
      default: () => {
        return []
      }
    },
    totalWidth: { // 滚动区域总宽度
      type: Number,
      default: 1200
    },
    height: { // 滚动区域高度
      type: Number,
      default: 45
    },
    amount: { // 滚动区域展示条数
      type: Number,
      default: 4
    }
  },
  data () {
    return {
      left: 0,
      fpsRaf: null, // fps回调标识
      moveRaf: null, // 一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义
      start: 0,
      end: 0,
      step: 1 // 默认移动参数(120fps: 0.5, 60fps: 1)
    }
  },
  computed: {
    width () { // 滚动文字每条的固定宽度
      return Math.floor(this.totalWidth / this.amount)
    }
  },
  created () {
    this.fpsRaf = requestAnimationFrame(this.getFPS)
  },
  methods: {
    getFPS (timestamp) {
      // 单位ms,用1000ms/两个时间的间隔≈刷新频率fps
      // console.log('timestamp:', timestamp)
      if (this.fpsRaf === 2) {
        this.start = timestamp
      }
      if (this.fpsRaf === 3) {
        this.end = timestamp
        // 计算屏幕刷新率
        const fps = Math.floor(1000 / (this.end - this.start))
        if (fps === 120) {
          this.step = 0.5
        }
        console.log('fps:', fps)
        console.log('step:', this.step)
      }
      this.fpsRaf = requestAnimationFrame(this.getFPS)
      if (this.fpsRaf > 3) {
        cancelAnimationFrame(this.fpsRaf)
        this.onStart()
      }
    },
    onClick (title) { // 通知父组件点击的标题
      this.$emit('click', title)
    },
    onStop () { // 暂停动画
      cancelAnimationFrame(this.moveRaf)
    },
    onStart () { // 开始动画
      if (this.sliderData.length > this.amount) { // 超过amount条开始滚动
        this.moveRaf = requestAnimationFrame(this.moveLeft)
      }
    },
    moveLeft () {
      if (this.left >= this.width) {
        this.sliderData.push(this.sliderData.shift()) // 将第一条数据放到最后
        this.left = 0
      } else {
        this.left += this.step // 每次移动step(px)
      }
      this.moveRaf = requestAnimationFrame(this.moveLeft)
    }
  }
}
</script>
<style lang="less" scoped>
@themeColor: #1890FF;
.m-slider {
  margin: 60px auto;
  background: #FFFFFF;
  box-shadow: 0px 0px 5px #D3D3D3;
  border-radius: 5px;
  white-space: nowrap;
  overflow: hidden;
  .u-slide-title {
    display: inline-block;
    margin-left: 20px;
    font-size: 14px;
    color: #333;
    font-weight: 400;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    cursor: pointer;
    &:hover {
      color: @themeColor;
    }
  }
}
</style>

②在要使用的页面引入:

<HorizontalTextSlider :sliderData="sliderData" @click="onClick" :totalWidth="1200" :amount="4" :height="50" />
import HorizontalTextSlider from '@/components/HorizontalTextSlider'
components: {
    HorizontalTextSlider
},
sliderData: [
    {
        title: '美国作家杰罗姆·大卫·塞林格创作的唯一一部长篇小说',
        link: 'javascript:;'
    },
    {
        title: '首次出版于1951年',
        link: 'javascript:;'
    },
    {
        title: '塞林格将故事的起止局限于16岁的中学生霍尔顿·考尔菲德从离开学校到纽约游荡的三天时间内',
        link: 'javascript:;'
    },
    {
        title: '并借鉴了意识流天马行空的写作方法,充分探索了一个十几岁少年的内心世界',
        link: 'javascript:;'
    },
    {
        title: '愤怒与焦虑是此书的两大主题,主人公的经历和思想在青少年中引起强烈共鸣',
        link: 'javascript:;'
    }
]
onClick (title) { // 获取点击的标题
    console.log('title:', title)
}
相关文章
|
9月前
|
前端开发 JavaScript
Vue中使用纯CSS实现全屏网格加渐变色背景布局
Vue中使用纯CSS实现全屏网格加渐变色背景布局
272 0
|
6月前
|
移动开发 资源调度 JavaScript
Vue2使用触摸滑动插件(Swiper)
这篇文章介绍了在Vue 3框架中如何使用Swiper插件来创建不同类型的触摸滑动组件,包括轮播图、淡入淡出效果和走马灯效果,并提供了详细的配置选项和使用示例。
491 1
|
1月前
|
前端开发 JavaScript UED
React 滚动条组件 Scrollbar
本文介绍了在 React 中创建和使用滚动条组件的方法。首先,通过设置 `overflow: auto` 等 CSS 属性实现基础滚动功能。接着,推荐了如 `react-custom-scrollbars` 和 `react-perfect-scrollbar` 等第三方库以增强滚动条的功能与外观。针对常见问题,如样式不一致、无法正常工作及性能瓶颈,提供了相应的解决方案,包括自定义样式、确保容器高度和优化渲染逻辑。最后,强调了避免滚动事件绑定错误和不合理嵌套滚动的重要性,帮助开发者打造流畅、美观的用户界面。
70 16
|
6月前
Vue2竖向文字滚动
这是一个基于Vue3的文字滚动组件(TextScroll),支持自定义滚动文字数组、滚动间隔时间、展示宽度及高度等属性。该组件通过VerticalTextSlider.vue实现,提供了平滑过渡动画,并允许鼠标悬停时暂停滚动。适用于多种场景下的文字轮播需求。
135 0
|
6月前
Vue2时间轴(横向)
该横向时间轴组件 `HorizonTimeLine` 可自定义时间轴数据 (`timelineData`) 和初始选中年份 (`activeYear`)。通过点击不同的年份,可以改变当前激活的年份,并有相应的视觉反馈。该组件支持均匀自适应排列,且易于在其他页面中引入和使用。
581 0
Vue2时间轴(横向)
|
4月前
|
JavaScript API
|
6月前
|
JavaScript API UED
Vue3使用触摸滑动插件(Swiper)
本文介绍如何在Vue2项目中使用Swiper插件实现触摸滑动功能,并封装了两种轮播图展示形式:首页轮播图(`type: banner`)和走马灯轮播图(`type: carousel`),以及信息展播模式(`type: broadcast`)。支持自定义轮播图片、区域尺寸、动画效果等属性。通过示例代码展示了不同切换动画及自定义效果,并提供了在线预览。适用于多种应用场景,提升用户体验。
179 1
Vue3使用触摸滑动插件(Swiper)
|
4月前
|
资源调度 JavaScript 前端开发
在 Vue 3 中实现流畅的 Swiper 滑动效果
本文介绍了如何在 Vue 3 项目中集成 Swiper,涵盖了从安装、基本用法到丰富的配置选项。通过简单的示例,读者将学习如何创建响应式的图片轮播,利用 Swiper 的循环、自动播放和自定义分页功能,提升用户体验。无论是简单的幻灯片还是复杂的滑块效果,Swiper 都能轻松实现,帮助开发者快速构建出美观的滑动组件。
1160 0
|
6月前
|
JavaScript
Vue3文字滚动(TextScroll)
这是一个可定制的文字滚动组件,支持水平和垂直滚动。主要属性包括滚动文字数组 `scrollText`、是否启用单条文字滚动 `single`、滚动区域宽高 `width` 和 `height`、滚动区域和文字样式 `boardStyle` 和 `textStyle`、滚动条数 `amount`、间距 `gap`、动画间隔 `interval` 和 `step`、以及垂直滚动时间间隔 `verticalInterval`。组件内置多种样式调整功能,并提供在线预览示例。
205 0
|
6月前
|
JavaScript
Vue2走马灯扩展版(Carousel)
这篇文章介绍了如何在Vue 3框架中创建一个可自定义的走马灯(Carousel)组件,支持自动播放、导航、分页和响应用户交互等功能。
322 0
Vue2走马灯扩展版(Carousel)