vue实现无缝滚动组件,排名,统计等轮播

用vue实现排名统计向上滚动效果,并且像轮播一样无缝衔接,直接上效果图。

        

已经封装为一个组件,需要的可以按照自己的要求修改,话不多说,先上组件代码!

<template>
  <div>
    <div class="rankingTable">
      <div class="title">
        <span class="text">报警数排名</span>
      </div>
      <div class="rankingTableList" ref="tableBox" :style="{ width, height: itemHeight * numPage +'px' }">
        <div class="rankingTableListBox" :style="{ height: itemHeight + 'px' }" v-for="(item, index) in tableList"
          :key="index">
          <div class="boxName">{{ item.name }}</div>
          <div class="rectangularStrip">
            <div class="rectangle1" :style="{ width: item.percentage }"></div>
            <div class="rectangle2"></div>
          </div>
          <div class="boxNumber">{{ item.num }}(次)</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
let timer = null
export default {
  props: { tableList: Array, speed: Number, width: String, height: String, numPage: Number, itemHeight: Number },
  destroyed () {
    clearInterval(timer)
  },
  created () {
    // 此处为了实现无缝滚动需要复制第一页的数据
    if (this.tableList.length > this.numPage) {
      const tableList = this.tableList.slice(0, this.numPage, 1)
      // eslint-disable-next-line vue/no-mutating-props
      this.tableList = this.tableList.concat(tableList)
    }
  },
  mounted () {
    if (this.tableList.length > this.numPage) {
      let i = 0
      timer = setInterval(() => {
        this.$refs.tableBox.scrollTo({
          top: i * this.itemHeight,
          behavior: 'smooth' // 添加这个参数可以实现平滑滚动
        })
        i++
        if (i > this.tableList.length - (this.numPage - 1)) {
          i = 2
          this.$refs.tableBox.scrollTo({
            top: 0 * this.itemHeight
          })
          this.$refs.tableBox.scrollTo({
            top: 1 * this.itemHeight,
            behavior: 'smooth' // 添加这个参数可以实现平滑滚动
          })
        }
      }, this.speed)
    }
  }
}
</script>
<style scoped lang="less">
.rankingTable {
  margin-top: 16px;
}

.rankingTableList {
  margin-top: 2px;
  background: rgba(139, 175, 175, 0.1);
  overflow: hidden;

}

.rankingTableListBox {
  padding-top: 10px;
  padding-bottom: 10px;
  display: flex;
  align-items: center;
  box-sizing: border-box;

}

.boxName {
  width: 80px;
  margin-left: 16px;
  color: white;
  font-weight: 800;
  font-size: 14px;
}

.rectangularStrip {
  margin-left: 12px;
  margin-right: 8px;
  display: flex;
  align-items: center;
  flex: 1;
  height: 4px;
  background: rgba(255, 255, 255, 0.3);
  border-radius: 8px 8px 8px 8px;
  opacity: 1;

}

.rectangle1 {
  height: 4px;
  background: linear-gradient(270deg, #EE7827 0%, rgba(238, 120, 39, 0) 100%);
  border-radius: 8px 8px 8px 8px;
  opacity: 1;
}

.rectangle2 {
  width: 5px;
  height: 15px;
  background-color: #EE7827;
  transform: skew(-211deg);
  border-radius: 1px 1px 1px 1px;
  opacity: 1;
}

.boxNumber {
  width: 80px;
  margin-right: 10px;
  font-size: 14px;
  font-weight: 400;
  color: white;
}
</style>

然后是组件示例引用,tableList是数据。speed是切换速度,单位毫秒。width为容器的宽。numPage为一页展示多少数据,itemHeight为每条数据占据的高度,

<template>
    <div>
       <ScrollData :tableList="tableList" :speed=1000 width="480px" :numPage=6 :itemHeight=40></ScrollData>
    </div>
  </template>
<script>
import ScrollData from '@/components/scrollData.vue'
export default {
  components: { ScrollData },
  data () {
    return {
      tableList: [
        {
          name: '广安作业区1',
          num: 510,
          percentage: '100%'
        },
        {
          name: '广安作业区2',
          num: 120,
          percentage: '30%'
        },
        {
          name: '广安作业区3',
          num: 230,
          percentage: '40%'
        },
        {
          name: '广安作业区4',
          num: 3460,
          percentage: '50%'
        },
        {
          name: '广安作业区5',
          num: 450,
          percentage: '60%'
        },
        {
          name: '广安作业区6',
          num: 650,
          percentage: '70%'
        },
        {
          name: '广安作业区7',
          num: 670,
          percentage: '80%'
        },
        {
          name: '广安作业区8',
          num: 780,
          percentage: '90%'
        }
      ]
    }
  }
}
</script>
<style scoped>

</style>

样式请自行修改,组件传输的几个参数请按照规定类型传入,避免出错,数据条数请大于页面一页展示数量,不然没有滚动!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现vue轮播无缝滚动,可以使用vue-awesome-swiper插件。以下是实现步骤: 1.安装vue-awesome-swiper插件 ``` npm install vue-awesome-swiper --save ``` 2.引入插件 在需要使用轮播图的组件中引入swiper和swiper样式: ```javascript import { swiper, swiperSlide } from 'vue-awesome-swiper' import 'swiper/dist/css/swiper.css' ``` 3.编写轮播组件 ```html <template> <swiper :options="swiperOption" ref="mySwiper"> <swiper-slide v-for="(item, index) in list" :key="index"> <!-- 轮播图内容 --> </swiper-slide> </swiper> </template> <script> export default { data() { return { list: [], // 轮播图数据 swiperOption: { // swiper配置 loop: true, // 开启循环模式 navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' } } } }, components: { swiper, swiperSlide }, mounted() { this.$nextTick(() => { this.$refs.mySwiper.$swiper.update() // 更新swiper }) } } </script> ``` 4.添加css样式 ```css .swiper-slide { position: relative; width: 100%; height: 100%; overflow: hidden; } .swiper-slide img { width: 100%; height: 100%; display: block; } .swiper-slide::before { content: ""; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background-color: #fff; z-index: 1; opacity: 0.8; } .swiper-slide::after { content: ""; position: absolute; top: 0; right: -100%; width: 100%; height: 100%; background-color: #fff; z-index: 1; opacity: 0.8; } .swiper-slide-duplicate::before { left: 100%; } .swiper-slide-duplicate::after { right: 100%; } ``` 这样就可以实现vue轮播无缝滚动了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值