跑马灯是比较常见的页面展现元素。写这篇博客的目的主要是掘金上面关于前端跑马灯的教程基本没有,仅有的一个也是x轴方向的,今天写一个y轴方向的。

首先我们需要定义 html 结构和 css,我将 box 的高度和 item 的高度都设置了 40px,这些都是可更改的。

.box{

overflow: hidden;

margin-top: 200px;

width: 500px;

height: 40px;

border: 1px solid #000;

box-sizing: border-box;

color: #fff;

background-color: #000;

}

.item{

display: flex;

align-items: center;

padding-left: 10px;

color: #fff;

cursor: pointer;

}

y轴跑马灯实现
前端实现
可能使用margin-top
短暂停留

复制代码

CSS实现

使用 @keyframes 可以定位帧动画, 通过设置 infinite 来实现不间断轮播的效果, 设置item滚动, 当item为最后一个时, 重置。

以下是定义的@keyframes

.box{

...

animation: run 8.4s infinite;

}

@keyframes run {

0%{

transform: translateY(0px);

}

25%{

transform: translateY(-40px);

}

50%{

transform: translateY(-80px);

}

75%{

transform: translateY(-120px);

}

100%{

transform: translateY(-160px);

}

}

复制代码

为了保证滚动的顺滑, 还需要在尾部加一个

y轴跑马灯实现

在尾部。

JavaScript实现

上面的动画高度依赖于item的条数, 如果item有很多条, 并且实际开发中需求大概是滚动到哪一条, 停顿, 过会后再滚动。这些如果用CSS写将会特别麻烦甚至无法实现。因此我们用js来实现。

有以下的思路

设置一个定时器setInterval, 定义步进距离, 步进时间, 来模拟帧动画

当一个item完全滚动到可视区, 清除计时器, 再添加一个setTimeout, 停顿时间结束后再重启计时器

当滚动到最后的item时, 重置高度

使用margin-top来动态改变item的位置, 只需要设置第一个item的规则, 后面的item会自动排布, 为了知道当第一个item的margin-top为多少时重置, 还需要给定item的数量

function runYMarquee(firstNode, nodeNum, step = 1, time = 20) {

let ch = firstNode.clientHeight

const start = marginTop => {

let mt = marginTop

let interval = setInterval(()=>{

// 判断不是第一项和最后一项

if(Number.isInteger(mt/ch) && mt !== marginTop && mt !== - (ch * nodeNum) ){

clearInterval(interval)

setTimeout(()=>{

start(mt)

}, 1000)

}else if(mt === - (ch * nodeNum)){

// 到达最后一项,归零

clearInterval(interval)

// 恢复原来的位置

firstNode.style.marginTop = '0'

setTimeout(()=>{

start(0)

},1000)

}else {

// 如果是start的第一个执行此项

mt -= step

firstNode.style.marginTop = `${mt}px`

}

}, time)

}

// 这里设置setTimeout是为了首条item的延迟滚动

setTimeout(()=>{

start(0)

}, 1000)

}

let i = document.querySelector('.item')

runYMarquee(i, 4)

复制代码

注: 以上仍然需要在最后添加

y轴跑马灯实现

来实现顺滑效果

优化

如果使用margin-top来改变位置, 将会频繁触发浏览器的重排重绘, 而且需要手动在末尾添加item, 并且无法设置停顿时间

基于此, 我写了一个优化版本, 优化了下列几项

使用transfrom中的translateY属性替代margin-top, 可以生成一个合成层, 由GPU控制,支持硬件加速,并不需要软件方面的渲染

clone第一个节点, 自动追加于最后, 不需要手动添加

支持自定义设置停顿时间

translateY的对高度的控制是独立的, 因此必须在item外部再套一层div, 通过控制该层div来控制高度。

y轴跑马灯实现
前端实现
可能使用margin-top
短暂停留

复制代码

实现的思路与上面一样, 代码如下

function runMarquee(node, step = 1, time = 20, stopTime = 1000) {

// 最后追加子节点

let firstNode = node.children[0]

let newNode = firstNode.cloneNode(true)

node.append(newNode)

// 获取children的数量

let childNodeNum = node.children.length

// 获取此时的node高度

let ch = node.clientHeight

// 子节点的高度

let cnh = ch / childNodeNum

// 最后停止的高度

let lastHeight = ch * ((childNodeNum - 1) / childNodeNum)

const start = initTY => {

// 初始化translateY

let ty = initTY

let interval = setInterval(()=>{

// 判断不是第一项或最后一项

if(Number.isInteger(ty / cnh) && ty !== initTY && ty !== -lastHeight ){

clearInterval(interval)

setTimeout(()=>{

start(ty)

}, stopTime)

}else if(ty === -lastHeight){

clearInterval(interval)

node.style.transform = `translateY(0)`

setTimeout(()=>{

start(0)

},stopTime)

}else {

ty -= step

node.style.transform = `translateY(${ty}px)`

}

}, time)

}

setTimeout(()=>{

start(0)

}, stopTime)

}

runMarquee(document.querySelector('#marquee-box'))

复制代码

使用需满足两个条件

外部box的高度必须与item相同

step必须能被item的高度整除

如果这篇文章对你有用, 请给我点个赞吧, 有疑问欢迎在下方评论区交流。

html怎么设置y轴,Y轴方向跑马灯的实现相关推荐

  1. matplotlib 笔记:设置x轴 y轴文字

    原本的图: import numpy as np import matplotlib.pyplot as plt lst=range(10000) a=np.random.choice(lst,150 ...

  2. Echarts图表设置x轴y轴均随滚轮滚动缩+放 区域缩放

    文章目录 echarts中设置x轴和y轴均随滚轮进行缩放 当数据实时渲染时,也可进行区域缩放 echarts中设置x轴和y轴均随滚轮进行缩放 dataZoom 组件 用于区域缩放,从而能自由关注细节的 ...

  3. PHP怎么设置字体走马灯效果,html跑马灯/走马灯效果

    实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入"滚动的文字"语句,它的效果如下所示: 滚动的文字 适当的运用标签的参数,可以表现 ...

  4. 数据可视化之matplotlib实战:plt.xlabel() ylabel()函数 设置x轴y轴的标签文本

    import matplotlib.pyplot as plt import numpy as npx = np.linspace(0.05,10,1000) y = np.sin(x)plt.plo ...

  5. echarts 设置X轴Y轴字体大小不成功问题处理

    在网上看到的error代码 axisLabel: {show: true,textStyle: {color: '#FFFFFF',fontSize: '38',//字体大小},}, 正确的代码 ax ...

  6. echarts x轴像直尺一样设置刻度_Python matplotlib画图y轴数值不按大小排列问题

    matplotlib 画图的时候经常会出现y轴数据不按大小排列的问题,很混乱,这主要是因为数据类型的错误,导致的!大家可以仔细阅读下以下两个案例,就应该有答案了: 案例一: 昨天偶然做一个爬取数据,做 ...

  7. Android X轴Y轴Z轴旋转

    Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,一个简单的办法就是重写Animation.这里只是以Y轴旋转进行下说明,至于X轴.Z轴和Y轴的原理是一样的. ...

  8. python绘制折线图数值小数点太长_Python matplotlib画图y轴数值不按大小排列问题

    matplotlib 画图的时候经常会出现y轴数据不按大小排列的问题,很混乱,这主要是因为数据类型的错误,导致的!大家可以仔细阅读下以下两个案例,就应该有答案了: 案例一: 昨天偶然做一个爬取数据,做 ...

  9. Android TextView设置多样式文本,跑马灯以及霓虹灯效果

    1.设置TextView字体颜色 1)使用Html标签方式设置 代码如下: tvTest1.setText(Html.fromHtml("电影<font color = blue> ...

最新文章

  1. 特斯拉“撞死”机器人,是炒作还是事故?
  2. matlab 画函数图像
  3. Spring Boot + BeetlSQL + H2数据库项目整合
  4. php aapt apk 包名,aapt 命令可应用于查看apk包名、主activity、版本等很多信息
  5. python实现字典树 时间复杂度_Python实现字典树
  6. [Windows驱动开发](二)基础知识——数据结构
  7. epoll和select的区别
  8. 如何成为数据科学家_成为数据科学家的5大理由
  9. JAVA自学笔记08
  10. mysql master 监控_可用于监控 mysql Master Slave 状态的python代码
  11. 史上最新最全的来自成都的Azure系列文章,助你上云!老少皆宜,童叟无欺!
  12. vue里面的mvvm双向绑定(高级语法糖)
  13. 夏普 DN7C3A006 PM2.5 传感器测量步骤及存在问题
  14. 在 keil MDK_V5中加入arm7,arm9等一些芯片型号
  15. IPO | 经纬恒润登科创板,好赛道下隐患依然很突出
  16. 免费下载380套大型商业源码
  17. ITIL4服务管理的新思路与实践案例介绍
  18. 美团外卖与饿了么竞品分析
  19. NVIDIA Quadro专业图形显卡
  20. linux下drcom无法上网,安装drcom出现问题

热门文章

  1. 火山引擎:构建面向异构算力的边缘计算云平台
  2. Mac OS X运行程序出现bad interpreter: operation not permitted的解决方案
  3. 在直播软件开发过程中,常用的几种视频封装格式
  4. VSCODE(Visual Studio Code)编写C51代码,环境配置,实现自动补全,C51关键字处理方法
  5. 网页中嵌入 Flash 的方法 满足W3C
  6. 电影制作和上映有什么不可控的因素?
  7. 中国制造创意配件 - iPad 三合一读卡接口
  8. 敏感关键词 词库_【店铺技能】1688会员新手如何去优化关键词!
  9. FusionCharts Free中文开发指南 第十一章--FCF中的基本数字格式
  10. 品牌如何利用受众心理打造节日宣传方案?