在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 相关文章推荐
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue中watch的用法汇总
Dec 28 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
Vue SPA 首屏优化方案
Feb 26 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
vue实现在data里引入相对路径
Jun 05 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
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
jquery UI 1.72 之datepicker
2009/12/29 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python可变参数用法实例分析
2017/04/02 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
python 日期排序的实例代码
2019/07/11 Python
使用django实现一个代码发布系统
2019/07/18 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Python测试线程应用程序过程解析
2019/12/31 Python
python全局变量引用与修改过程解析
2020/01/07 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
质检部职责
2013/12/28 职场文书
企业总经理职责
2014/02/02 职场文书
个人工作表现评语
2014/04/30 职场文书
争先创优演讲稿
2014/09/15 职场文书
2015年电工工作总结
2015/04/10 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers