1.前言

当一段文本需要单行显示,但是又限于容器宽度无法完全展示时,我们需要对其滚动展示,所以就有了这个插件,如图:

2.封装思路

  • 使用js模拟循环滚动的动画,容器宽度固定且超出隐藏,文本元素禁止换行,为其动态设定位移
  • 通过Vue指令开启该效果
  • 对比容器宽度和文本宽度,当文本宽度大于容器宽度是,开启定时器为文本元素动态设定位移,定时器id可以存储到容器标签中
  • 位移的终点位于取决于文本宽度与容器宽度的差值
  • 当指令的值发生变动时,要重新计算容器宽度和文本宽度,重置定时器

3.代码

function autoScroll(el) {
//找到容器装载文本的容器
var content_box = el.querySelector('span')
//计算容器宽度
var wrap_width = el.clientWidth
//console.log('容器宽度 = ', wrap_width)
//console.log('文本宽度 = ', content_box.clientWidth)
//判断内容是否溢出
if (content_box.clientWidth > wrap_width) {
//如果内容移除 //外层容器超出隐藏
el.style.overflow = 'hidden' var now_position = 0 //当前位置 默认0
var direction = 'left' //移动方向 一开始向左移动,到顶后向右移动
var target = wrap_width - content_box.clientWidth //向左移动时,到哪个位置就返回
var rest_time = 40 //动画暂停时间
//使用定时器实时修改位移
var timer = setInterval(() => {
//判断是否处于暂停状态 只有不是暂时状态才进行移动
if (rest_time <= 0) {
//方向判断
if (direction == 'left') {
now_position--
} else {
now_position++
}
//如果左移到底 则调转方向向右
if (now_position < target) {
direction = 'right'
//重置暂停动画的时间
rest_time = 20
}
//如果右移到底 则调转方向向左 并暂停一段时间
if (now_position > 0) {
direction = 'left'
//重置暂停动画的时间
rest_time = 40
}
//更新位置
content_box.style.transform = `translateX(${now_position}px)`
}
//减少暂时状态的时间
if(rest_time > 0){
rest_time--
}
}, 50)
//console.log('定时器id = ', timer)
//将定时器id挂载到容器中
el.scroll_id = timer
} else {
//定时器id
el.scroll_id = null
}
}
//Vue指令注册
Vue.directive('scroll', {
// 当被绑定的内容插入到 DOM 中时……
inserted: function (el, binding) {
//创建容器装载文本
var content_box = document.createElement('span')
content_box.style.display = 'inline-block'
//不允许换行
content_box.style.whiteSpace = 'nowrap'
//将内容填入容器中
content_box.innerHTML = binding.value
//将文本容器添加到元素中
el.appendChild(content_box)
//开启功能
autoScroll(el)
},
update: function (el, binding) {
//找到定时器id
var timer = el.scroll_id
console.log('定时器id = ', timer)
//清除定时器
clearInterval(timer)
//找到容器装载文本的容器
var content_box = el.querySelector('span')
//文本替换
content_box.innerHTML = binding.value
//样式重置
content_box.style.transform = `translateX(0)`
//开启功能
autoScroll(el)
}
})

4.使用方法

  • 当前标签使用v-scroll指令传值
  • 设定固定的容器宽度,当前标签不要设定padding,如果需要,那就在外面再包一层
<div v-scroll="msg" style="width:200px;"></div>

Vue.js 文本交替滚动的更多相关文章

  1. js文本公告滚动展示,图片轮播....

    1.引入文件 <link rel="stylesheet" href="/css/liMarquee.css"> <script src=&q ...

  2. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

    通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...

  3. vue.js国际化vue-i18n插件的使用问题,在模版文本、组件方法、jsf方法里的使用

    vue.js国际化vue-i18n插件的使用问题,在模版文本.组件方法.jsf方法里的使用 1.在文本里使用{{$t("xxx")}} <span>{{$t(" ...

  4. 2018-11-23 手工翻译Vue.js源码:尝试重命名标识符与文本

    续前文: 手工翻译Vue.js源码第一步:14个文件重命名 对core/instance/索引中的变量, 方法进行重命名如下(题图): import { 混入初始化 } from './初始化' im ...

  5. 基于animate.css动画库的全屏滚动小插件,适用于vue.js(移动端、pc)项目

    功能简介 基于animate.css动画库的全屏滚动,适用于vue.js(移动端.pc)项目. 安装 npm install vue-animate-fullpage --save 使用 main.j ...

  6. MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录

    注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...

  7. 从零开始学 Web 之 Vue.js(一)Vue.js概述,基本结构,指令,事件修饰符,样式

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  8. 【Vue】转-Vue.js经典开源项目汇总

    版权声明:本文为EnweiTech原创文章,未经博主允许不得转载. https://blog.csdn.net/English0523/article/details/88694219 Vue是什么? ...

  9. vue.js相关UI组件收集

    内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 ###UI组件 element ★9689 - 饿了么出品的Vue2的web UI工具套件 Vux ★6927 - 基于Vu ...

  10. 【前端】Vue.js经典开源项目汇总

    Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) ...

随机推荐

  1. TypeScript – Decorator Metadata

    前言 在 TypeScript – Decorator 装饰器 里,我有提到 TypeScript 只实现了 decorate 的特性,把 metadata 的特性独立了出来. 本来我以为还需要等待很 ...

  2. DOM – Event Listener (bubble, capture, passive, custom event)

    前言 老掉牙的东西, 主要是想写 passive, 随便也写一点 bubble, capture 和 custom event 吧. Bubble Dom 监听事件是会冒泡的. 什么意思 ? 上图有 ...

  3. CSS – Position

    前言 定位是 CSS 里蛮重要的一课. 图片黑影 (overlay), back to top button, header, footer 紧贴在屏幕上下方等效果都是靠 position 完成的. ...

  4. String 的 intern() 方法

    问题: String s1 = "a" + "b"; //创建了几个对象? String s2 = new String("ab"); // ...

  5. BOOST库array使用 类似std库的vector

    BOOST库的array,  类似std库的vector. 下图所示书籍的下载地址,我的另一篇博客内有记载: https://www.cnblogs.com/happybirthdaytoyou/p/ ...

  6. Nacos 配置加密

    Nacos 配置加密 nacos配置加密官网 官网介绍太简单,而且GitHub 网络受限,随缘访问.Gitee 发现有镜像仓库,同步的最新版本 Gitee nacos 镜像仓库 但是官网中提到的加密插 ...

  7. Centos LNMP 安装日记

    环境介绍 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) mysql8.0.12_b ...

  8. 【赵渝强老师】使用Docker Compose进行服务编排

    一.什么是Docker Compose? Docker Compose是一个用来定义和运行复杂应用的Docker工具.一个使用Docker容器的应用,通常由多个容器组成.使用Docker Compos ...

  9. 使用VNC连接ubuntu16.4错误Authentication Failure问题

    解决办法:是因为vnc用一套自己的密码系统,不要去输入ssh登录时的密码,所以只需要进入远程服务器中,设置一哈vnc的密码即可! 在终端输入命令:vncpasswd 到此可以试试远程

  10. windows下安装部署 hadoop

    一.安装下载 1.首先在hadoop官网下载一个稳定版本,选择binary包 官网地址:https://hadoop.apache.org/releases.html 下载下来是tar.gz文件,用w ...