vue-seamless-scroll 一个简单的基于 vue.js 的无缝滚动

发布于 2022-05-05 21:30:46 字数 7610 浏览 1170 评论 0

特点

多样化配置

支持目前支持上下左右无缝滚动,单步滚动,以及支持水平方向的手动切换功能。

兼容多平台

IE9+、Firefox、Chrome、Safari、iOS、Android。

多技术栈版本支持

目前有 Vue2、JavaScript 版本。

安装

NPM

npm install vue-seamless-scroll --save

Yarn

yarn add vue-seamless-scroll

browser

<!-- https://cdn.jsdelivr.net/npm/vue-seamless-scroll@latest/dist/vue-seamless-scroll.min.js -->
<script src="vue-seamless-scroll.min.js"></script>

使用

注册组件

// **main.js**
// 1.全局 install
import Vue from 'vue'
import scroll from 'vue-seamless-scroll'
Vue.use(scroll)

// 或者你可以自己设置全局注册的组件名 默认注册的组件名是 vue-seamless-scroll
Vue.use(scroll,{componentName: 'scroll-seamless'})

// 2.单个.vue文件局部注册
<script>
  import vueSeamlessScroll from 'vue-seamless-scroll'
   export default {
      components: {
        vueSeamlessScroll
      }
   }
</script>

使用组件

<template>
  <vue-seamless-scroll:data="listData" class="warp">
    <ulclass="item">
      <liv-for="(item, index) in listData" :key="index">
        <spanclass="title" v-text="item.title"></span>
        <spanclass="date" v-text="item.date"></span>
      </li>
    </ul>
  </vue-seamless-scroll>
</template>

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

  export default {
    name: 'Example01Basic',
    components: {
      vueSeamlessScroll
    },
    data () {
      return {
        listData: [{
          'title': '无缝滚动第一行无缝滚动第一行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第二行无缝滚动第二行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第三行无缝滚动第三行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第四行无缝滚动第四行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第五行无缝滚动第五行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第六行无缝滚动第六行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第七行无缝滚动第七行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第八行无缝滚动第八行',
          'date': '2017-12-16'
        }, {
          'title': '无缝滚动第九行无缝滚动第九行',
          'date': '2017-12-16'
        }],
      }
    },
  }</script>

<stylelang="scss" scoped>.warp {
    height: 270px;
    width: 360px;
    margin: 0 auto;
    overflow: hidden;
    ul {
      list-style: none;
      padding: 0;
      margin: 0 auto;
      li,
      a {
        display: block;
        height: 30px;
        line-height: 30px;
        display: flex;
        justify-content: space-between;
        font-size: 15px;
      }
    }
  }</style>

组件配置

data

  • type: Array
  • required: true

无缝滚动 list 数据。

组件内部只关注 data 数组的 length。

classOption

step

  • type: Number
  • required: false
  • default:1

数值越大速度滚动越快。

step 值不建议太小,不然会有卡顿效果(如果设置了单步滚动,step 需是单步大小的约数,否则无法保证单步滚动结束的位置是否准确。~~~~~,比如单步设置的 30,step 不能为 4)。

limitMoveNum

  • type: Number
  • required: false
  • default:5

开启无缝滚动的数据量。

hoverStop

  • type: Boolean
  • required: false
  • default:false

是否启用鼠标 hover 控制。

direction

  • type: Number
  • required: false
  • default:1

方向: 0 往下 1 往上 2 向左 3 向右。

openTouch

  • type: Boolean
  • required: false
  • default:true

移动端开启 touch 滑动。

singleHeight

  • type: Number
  • required: false
  • default:0

单步运动停止的高度(默认值 0 是无缝不停止的滚动),direction 为 0|1 时生效。

singleWidth

  • type: Number
  • required: false
  • default:0

单步运动停止的宽度(默认值 0 是无缝不停止的滚动),direction 为 2|3 时生效。

waitTime

  • type: Number
  • required: false
  • default:1000

单步停止等待时间(默认值 1000ms)。

switchOffset

  • type: Number
  • required: false
  • default:30

左右切换按钮距离左右边界的边距(px)。

autoPlay

  • type: Boolean
  • required: false
  • default:true

需要实现手动切换左右滚动的时候,必须设置autoPlay:false(1.1.17 版本开始,只需要设置navigation:false),目前不支持环路。

switchSingleStep

  • type: Number
  • required: false
  • default:134

手动单步切换 step 值(px)。

switchDelay

  • type: Number
  • required: false
  • default:400

单步切换的动画时间(ms)。

switchDisabledClass

  • type: String
  • required: false
  • default:disabled

不可以点击状态的 switch 按钮父元素的类名。

isSingleRemUnit

  • type: Boolean
  • required: false
  • default:false

singleHeight and singleWidth 是否开启 rem 度量。

navigation

  • type: Boolean
  • required: false
  • default:false

左右方向的滚动是否显示控制器按钮,true 的时候 autoPlay 自动变为 false。

回调事件

<template>
  <vue-seamless-scroll :data="listData" @ScrollEnd="ScrollEnd" class="warp">
    <ul class="item">
      <li v-for="(item, index) in listData" :key="index">
        <span class="title" v-text="item.title"></span>
        <span class="date" v-text="item.date"></span>
      </li>
    </ul>
  </vue-seamless-scroll>
</template>

ScrollEnd

ScrollEnd: function(){
      console.log("ScrollEnd")
    }

注意项

1.最外层容器需要手动设置 width、height、overflow:hidden

2.左右的无缝滚动需要给主内容区域(即默认 slot 插槽提供)设定合适的 css width 属性(否则无法正确计算实际宽度)。 也可以通过给他设置为 display:flex; 无需设置 css width 属性

3.step 值不建议太小,不然会有卡顿效果(如果设置了单步滚动,step 需是单步大小的约数,否则无法保证单步滚动结束的位置是否准确,比如单步设置的 30,step 不能为 4)

4.需要实现手动切换左右滚动的时候,必须设置 autoPlay:false(1.1.17 版本开始,只需要设置 navigation:false),目前不支持环路

5.提供了 slot left-switch || right-switch 可以自由定义需要的按钮样式 外层有div已经定位了位置居中,距离两边侧的距离可以通过switchOffset参数调整

6.当按钮到达边界位置,会自动为无法点击状态按钮加上定义的 switchDisabledClass: 'disabled',可以按需配置

常见 Issues

1、事件无法被复制的问题

组件本身没有对 copy 的 html 做一个节点的深度事件复制(类似 jq 的 clone(true))

解决方法

1.事件代理,给父元素绑定对应事件,在需要的子元素上进行事件补获。(推荐)

2.简单的直接原生 js 进行addEventListener,存在异步数据无法绑定上问题。(不推荐)

项目地址:https://github.com/chenxuan0000/vue-seamless-scroll

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

Gabu-gabumon

文章 0 评论 0

qq_CgiN62

文章 0 评论 0

荔枝明

文章 0 评论 0

¤→小豸慧

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文