文字无限循环滚动

23 篇文章 0 订阅
3 篇文章 0 订阅

 

在项目实现过程中,需要实现文字垂直循环滚动,第一时间想到使用css实现,不过先介绍一下js实现.

注:以下代码是基于vue的

1.js实现

原理:

       实际上就是一个计时器定时执行 top ++ ,当执行到底部时,top 值置0,回到顶部继续执行滚动,但这个会有一个明显的缺点,用户会明显的的感觉到,滚动到底部时,有一个跳跃到顶部的过程

实现:      

const timer = setInterval(autoScrollLine,30)

    /*单行向上滚动效果*/

function autoScrollLine() {

    /*判断滚动内容是否已经滚完,滚完了则滚动的值重新设置到0

    否则就每隔30毫秒向上滚动1px*/

    if(box.scrollTop>=parent.offsetHeight){

        box.scrollTop=0;

    }else{

        box.scrollTop++;

    }
}

关键点:

     1.判断是否到达底部

      2.超出父级高度的内容隐藏,overflow: hidden;

2.css3实现

     原理: 利用css3的动画实现

    实现: 

          

// css 代码

.rolling {
  height: 100%;
  ul.animation {
    animation: moving 40s linear infinite;
  }
  /*定义动画*/
  @keyframes moving {
    form {
      transform: translateY(0);
    }
    to {
      transform: translateY(-50%);
    }
  }
}

 为了在循环的时候显示更自然,需要copy一份,当循环到底部时,紧跟着出现的是copy的第一条信息,这样就不会存在js实现中的那种缺陷,使滚动更圆滑,体验会更好.

值得注意的是,并不是任何时候都需要滚动,如果数据比较少,不足以撑满整个div,这个时候就不需要copy一份数据了,这个在下面的代码力都有体现

this.isRolling = this.$refs.rollingContainer.offsetHeight - this.rollingHeight > 0

父级高度通过内容高度 * 2动态设置,这样就不需要关注具体的内容行高和数据的多少,体验会更流畅

this.$refs.rollingContainer.style.height = this.$refs.rollingContainer.offsetHeight * 2 + 'px';

 

 

 

 

​
<template>
  <div class="rolling overflow-hide" :style="{height: rollingHeight + 'px'}">
    <ul ref="rollingContainer" :class="{animation: isRolling}">
      <li v-for="(item, index) in eventWarning" :key="index" :class="{'warning': item.isRisk, 'flex': true}">
        {{item}}
      </li>
      <div v-if="isRolling">
        <li v-for="(item, index) in eventWarning" :key="index" :class="{'warning': item.isRisk, 'flex': true}">
          {{item}}
        </li>
      </div>
    </ul>
  </div>
</template>

<script>
import './index.scss'
export default {
  name: 'Rolling',
  props: {
    // 需要滚动内容列表, 默认数组
    eventWarning: {
      type: Array,
      default: () => {
        return []
      }
    },
    // 需要滚动内容的高度,默认Number
    rollingHeight: {
      type: Number,
      default: 0
    }
  },
  data () {
    return {
      isRolling: false
    }
  },
  watch: {
    rollingHeight (val, oldVal) {
      if (val && val !== oldVal) {
        this.isRolling = this.$refs.rollingContainer.offsetHeight - this.rollingHeight > 0
        this.$refs.rollingContainer.style.height = this.$refs.rollingContainer.offsetHeight * 2 + 'px';
      }
    }
  }
}
</script>

​

当然以上的通过稍微修改也是适用于table或者其他形式的文字滚动的.

 

这样的设计使不需要关注内容是什么格式,内容过长自动换行也好,正好占满一行也好,内容不足不滚动,内容较多,自动复制,并启动滚动,省去了一些无用的操作,当然如果你不是使用vue实现,也没关系,原理就是这样,做适当的改变就可以完美使用.

 

总结,项目实现中,遇到很多奇怪的滚动,这个方式还是可以完美实现滚动的,当然代码的优雅度需要改善,但是功能是可以实现的,不存在卡顿和跳跃的情况,当然如果有什么好的建议欢迎指正,不喜勿喷.

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值