在Vue中使用CSS3实现内容无缝滚动的示例代码


Posted in Vue.js onNovember 27, 2020

一、效果预览

最近在做一个活动页面,遇到幸运用户中奖的滚动公告需求。下面是实现效果:

在Vue中使用CSS3实现内容无缝滚动的示例代码

(gif录制略显卡顿,实际效果很流畅)

二、无缝滚动原理

1、容器宽高固定,超出内容隐藏;
2、内容准备2份,现参与滚动的内容有A、B两份,向左滚动;
3、滑动过程中,B份紧随A份之后,营造出无缝滚动回来的效果;
4、在A部分内容完全滚出容器的一瞬间,立刻将AB内容位置复原,由于A、B内容一模一样,这个复原过程很难看出来;
5、循环第3步;

在Vue中使用CSS3实现内容无缝滚动的示例代码

三、代码

1、html部分

<template>
  <div class="lucky-user">  <!-- 容器 -->
    <ul class="user-list" :style="`animation-duration: ${luckyUsers.length * 4}s;`">  <!-- 内容区容器 -->
     <li v-for="(item, index) in luckyUsers" :key="index">{{ item }}</li>   <!-- 内容A -->
     <li v-for="(item, index) in luckyUsers" :key="index+'copy'">{{ item }}</li>  <!-- 内容B -->
    </ul>
  </div>
</template>

2、CSS部分

.lucky-user {
  width: 540px; //容器定宽高
  height: 30px;
  margin: 0 auto;
  font-size: 18px;
  line-height: 30px;
  color: #E9B65F;
  overflow: hidden; //超出内容隐藏
  .user-list {
    width: fit-content; // Q1
    white-space: nowrap; // 内容不换行
    animation-name: seamless-scrolling; // Q3
    animation-timing-function: linear; // 动画速度曲线,匀速
    animation-iteration-count: infinite; // 动画循环无限次播放
    li {
      display: inline-block;
      margin-right: 30px;
    }
  }
}

@keyframes seamless-scrolling {
  0% {
    transform: translateX(0px);
  }
  100% {
    transform: translateX(-50%); //Q2
  }
}

Q1:因为滚动内容一般都不是固定的,需要接口获取,所以内容区的宽度也就无法确定,这里使用CSS3的新特性width: fit-content,使宽度自适应内部内容,至于为什么这里需要设置宽度属性,见下文
Q2:设置动画。由于内容区实际有AB两份,B是A的副本,所以一段动画的终点就是内容区向左位移50%(内容区width的50%),这也就解释了Q1中为什么一定要设置宽度属性了:如果不设置,width的值不会随内容撑开,此时的50%是父容器width的50%,终点值就错了
Q3:为什么animation不采用简写形式,而是拆开? 因为animation-duration 动画时长不能固定,如果接口获取到的数据很多,动画时长固定5s,那滚动地得有多快?所以animation-duration采用属性绑定形式,根据数据长度进行延长  :style="animation-duration: ${luckyUsers.length * 4}s;" 具体乘几看自己喜欢。
我也试过采用简写形式进行style属性绑定,结果发现动画不生效。

3、JS部分

export default {
 name: 'app',
  data() {
   return {
    luckyUsers: []
   }
  },
  created() {
   this.getLuckyUsersList()
  },
  methods: {
   getLuckyUsersList () {
     //调接口拿取数据
     this.luckyUsers = [
      '000000抽中了xxx奖品',
      '111111抽中了xxx奖品',
      '222222抽中了xxx奖品',
     ]
    }
  }
}

四、总结

无缝滚动的实现主要借助了css3中的animation、width:fit-content自适应属性、translate位移等特性;
从实现原理上看,其实就是一个欺骗眼睛的小伎俩而已~

到此这篇关于在Vue中使用CSS3实现内容无缝滚动的示例代码的文章就介绍到这了,更多相关Vue CSS3无缝滚动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
springboot+vue实现文件上传下载
Nov 17 Vue.js
vue实现广告栏上下滚动效果
Nov 26 Vue.js
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
vue 数据操作相关总结
Dec 17 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
vuex的数据渲染与修改浅析
Nov 26 #Vue.js
vue动态合并单元格并添加小计合计功能示例
Nov 26 #Vue.js
vue单元格多列合并的实现
Nov 26 #Vue.js
VUE项目实现主题切换的多种方法
Nov 26 #Vue.js
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 #Vue.js
vue实现广告栏上下滚动效果
Nov 26 #Vue.js
Vue组件生命周期运行原理解析
Nov 25 #Vue.js
You might like
php增删改查示例自己写的demo
2013/09/04 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
Python 获取当前所在目录的方法详解
2017/08/02 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
django实现类似触发器的功能
2019/11/15 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
PHP面试题大全
2015/10/16 面试题
电焊工工作岗位职责
2014/02/06 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
党的群众路线调研报告
2014/11/03 职场文书
业务员岗位职责
2015/02/03 职场文书
小鞋子观后感
2015/06/05 职场文书
贫困证明怎么写
2015/06/16 职场文书
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL
Element实现动态表格的示例代码
2021/08/02 Javascript