html怎么设置y轴,Y轴方向跑马灯的实现
跑马灯是比较常见的页面展现元素。写这篇博客的目的主要是掘金上面关于前端跑马灯的教程基本没有,仅有的一个也是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;
}
复制代码
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);
}
}
复制代码
为了保证滚动的顺滑, 还需要在尾部加一个
在尾部。
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)
复制代码
注: 以上仍然需要在最后添加
来实现顺滑效果
优化
如果使用margin-top来改变位置, 将会频繁触发浏览器的重排重绘, 而且需要手动在末尾添加item, 并且无法设置停顿时间
基于此, 我写了一个优化版本, 优化了下列几项
使用transfrom中的translateY属性替代margin-top, 可以生成一个合成层, 由GPU控制,支持硬件加速,并不需要软件方面的渲染
clone第一个节点, 自动追加于最后, 不需要手动添加
支持自定义设置停顿时间
translateY的对高度的控制是独立的, 因此必须在item外部再套一层div, 通过控制该层div来控制高度。
复制代码
实现的思路与上面一样, 代码如下
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轴方向跑马灯的实现相关推荐
- matplotlib 笔记:设置x轴 y轴文字
原本的图: import numpy as np import matplotlib.pyplot as plt lst=range(10000) a=np.random.choice(lst,150 ...
- Echarts图表设置x轴y轴均随滚轮滚动缩+放 区域缩放
文章目录 echarts中设置x轴和y轴均随滚轮进行缩放 当数据实时渲染时,也可进行区域缩放 echarts中设置x轴和y轴均随滚轮进行缩放 dataZoom 组件 用于区域缩放,从而能自由关注细节的 ...
- PHP怎么设置字体走马灯效果,html跑马灯/走马灯效果
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入"滚动的文字"语句,它的效果如下所示: 滚动的文字 适当的运用标签的参数,可以表现 ...
- 数据可视化之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 ...
- echarts 设置X轴Y轴字体大小不成功问题处理
在网上看到的error代码 axisLabel: {show: true,textStyle: {color: '#FFFFFF',fontSize: '38',//字体大小},}, 正确的代码 ax ...
- echarts x轴像直尺一样设置刻度_Python matplotlib画图y轴数值不按大小排列问题
matplotlib 画图的时候经常会出现y轴数据不按大小排列的问题,很混乱,这主要是因为数据类型的错误,导致的!大家可以仔细阅读下以下两个案例,就应该有答案了: 案例一: 昨天偶然做一个爬取数据,做 ...
- Android X轴Y轴Z轴旋转
Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,一个简单的办法就是重写Animation.这里只是以Y轴旋转进行下说明,至于X轴.Z轴和Y轴的原理是一样的. ...
- python绘制折线图数值小数点太长_Python matplotlib画图y轴数值不按大小排列问题
matplotlib 画图的时候经常会出现y轴数据不按大小排列的问题,很混乱,这主要是因为数据类型的错误,导致的!大家可以仔细阅读下以下两个案例,就应该有答案了: 案例一: 昨天偶然做一个爬取数据,做 ...
- Android TextView设置多样式文本,跑马灯以及霓虹灯效果
1.设置TextView字体颜色 1)使用Html标签方式设置 代码如下: tvTest1.setText(Html.fromHtml("电影<font color = blue> ...
最新文章
- 特斯拉“撞死”机器人,是炒作还是事故?
- matlab 画函数图像
- Spring Boot + BeetlSQL + H2数据库项目整合
- php aapt apk 包名,aapt 命令可应用于查看apk包名、主activity、版本等很多信息
- python实现字典树 时间复杂度_Python实现字典树
- [Windows驱动开发](二)基础知识——数据结构
- epoll和select的区别
- 如何成为数据科学家_成为数据科学家的5大理由
- JAVA自学笔记08
- mysql master 监控_可用于监控 mysql Master Slave 状态的python代码
- 史上最新最全的来自成都的Azure系列文章,助你上云!老少皆宜,童叟无欺!
- vue里面的mvvm双向绑定(高级语法糖)
- 夏普 DN7C3A006 PM2.5 传感器测量步骤及存在问题
- 在 keil MDK_V5中加入arm7,arm9等一些芯片型号
- IPO | 经纬恒润登科创板,好赛道下隐患依然很突出
- 免费下载380套大型商业源码
- ITIL4服务管理的新思路与实践案例介绍
- 美团外卖与饿了么竞品分析
- NVIDIA Quadro专业图形显卡
- linux下drcom无法上网,安装drcom出现问题
热门文章
- 火山引擎:构建面向异构算力的边缘计算云平台
- Mac OS X运行程序出现bad interpreter: operation not permitted的解决方案
- 在直播软件开发过程中,常用的几种视频封装格式
- VSCODE(Visual Studio Code)编写C51代码,环境配置,实现自动补全,C51关键字处理方法
- 网页中嵌入 Flash 的方法 满足W3C
- 电影制作和上映有什么不可控的因素?
- 中国制造创意配件 - iPad 三合一读卡接口
- 敏感关键词 词库_【店铺技能】1688会员新手如何去优化关键词!
- FusionCharts Free中文开发指南 第十一章--FCF中的基本数字格式
- 品牌如何利用受众心理打造节日宣传方案?