在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下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
vue里使用create, mounted调用方法
Apr 26 Vue.js
vue生命周期钩子函数以及触发时机
Apr 26 Vue.js
关于vue-router-link选择样式设置
Apr 30 Vue.js
vue使用watch监听属性变化
Apr 30 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python 将字符串转换成字典dict
2013/03/24 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python实现豆瓣图片下载的方法
2015/05/25 Python
Python切换pip安装源的方法详解
2016/11/18 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
实习销售业务员自我鉴定
2013/09/21 职场文书
审计专业自荐信范文
2014/04/21 职场文书
求职信名称怎么写
2014/05/26 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书