js实现文字走马灯

 走马灯是一种常见的网页效果,可以用来展示图片或文字的循环滚动。

1. 关于HTML结构

添加可视区域用户可见部分,给走马灯文字内容制作了个盒子来存放他

<div class="notice">
			<img src="./img/7.jpg" alt="通知图标" />
			<!-- 走马灯可视区域 -->
			<div class="notice_view">
				<!-- 走马灯内容区域 -->
				<div class="notice_banner">
					燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢?
				</div>
			</div>
		</div>
2. 关于CSS样式 
	        /* 初始化 */
			* {
				margin: 0;
				padding: 0;
			}
 
			/* 走马灯 */
			.notice {
				width: 90%;
				height: 50px;
				margin: 2.5% 5%;
				background-color: rgba(255, 255, 255, 0.5);
				border-radius: 8px 8px 0px 0px;
				position: fixed;
				/* fixed定位 */
				top: 10px;
				display: flex;
				padding: 0 10px;
			}
 
			.notice>img {
				width: 6%;
				height: 20px;
				margin: 4.5% 2%;
			}
 
			/* 走马灯可视区域 */
			.notice_view {
				width: 85%;
				height: 50px;
				line-height: 50px;
				overflow: hidden;
			}
 
			/* 走马灯内容区域 */
			.notice_banner {
				white-space: nowrap;
			}

3. 关于JavaScript部分 
 
在 animation 函数中使用定时器 setInterval 实现滚动效果,速度和效果可以根据需求进行调整。如果你想要在走马灯内容完全滚动完后重置位置,可以考虑在每次滚动结束时重新启动定时器,避免因为浏览器的重绘导致性能问题。
为了提高代码的可维护性和性能,可以使用 requestAnimationFrame 替代 setInterval,这能实现更加平滑的动画效果。

// 走马灯功能
			function marquee(res) {
				console.log(res);
				// 获取走马灯内容
				let marqueeFont = res.data.announ[0].content;
 
				// 获取走马灯可视区域
				let marqueeView = document.getElementsByClassName('notice_view')[0];
				// 获取走马灯内容区域
				let marqueeContent = document.getElementsByClassName('notice_banner')[0];
 
				// 将获取到的内容插入到走马灯长条里
				marqueeContent.innerHTML = marqueeFont;
 
				// 获取可视区域宽度
				let viewWidth = marqueeView.offsetWidth;
				// 获取走马灯内容区域宽度
				let contentWidth = marqueeContent.scrollWidth;
 
				// 判断内容是否超出可视区域
				if (contentWidth > viewWidth) {
					animation(marqueeContent, contentWidth, viewWidth);
				}
			}
 
			function animation(marqueeContent, contentWidth, viewWidth) {
				let locations = viewWidth;
				let speed = 1; // 设置移动速度
 
				// 使用 requestAnimationFrame 实现平滑动画
				function move() {
					locations -= speed; // 每次移动的距离
 
					// 判断内容是否超出可视区域
					if (locations < -contentWidth) {
						locations = viewWidth;
					}
 
					marqueeContent.style.transform = `translateX(${locations}px)`;
 
					// 继续动画
					requestAnimationFrame(move);
				}
 
				move(); // 启动动画
			}
			// 假设数据
			const mockResponse = {
				data: {
					announ: [{
						content: "燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢?
我不知道他们给了我多少日子;但我的手确乎是渐渐空虚了。在心里默默算着,八千多日子已经从我手中溜去;像针尖上一滴水滴在大海里,我的日子滴在时间的流里,没有声音,也没有影子。我不禁头涔涔而泪潸潸了。
去的尽管去了,来的尽管来着;去来的中间,又怎样地匆匆呢?早上我起来的时候,小屋里射进两三方斜斜的太阳。太阳他有脚啊,轻轻悄悄地挪移了;我也茫茫然跟着旋转。于是——洗手的时候,日子从水盆里过去;吃饭的时候,日子从饭碗里过去;默默时,便从凝然的双眼前过去。我觉察他去的匆匆了,伸出手遮挽时,他又从遮挽着的手边过去,天黑时,我躺在床上,他便伶伶俐俐地从我身上跨过,从我脚边飞去了。等我睁开眼和太阳再见,这算又溜走了一日。我掩着面叹息。但是新来的日子的影儿又开始在叹息里闪过了。
在逃去如飞的日子里,在千门万户的世界里的我能做些什么呢?只有徘徊罢了,只有匆匆罢了;在八千多日的匆匆里,除徘徊外,又剩些什么呢?过去的日子如轻烟,被微风吹散了,如薄雾,被初阳蒸融了;我留着些什么痕迹呢?我何曾留着像游丝样的痕迹呢?我赤裸裸来到这世界,转眼间也将赤裸裸的回去罢?但不能平的,为什么偏要白白走这一遭啊?
你聪明的,告诉我,我们的日子为什么一去不复返呢?"
					}]
				}
			};
 
			// 初始化走马灯
			marquee(mockResponse);

4. 其他说明
这个代码走马灯的内容是通过某种方式(如API请求)动态传入的,mockResponse 是示例数据。如果你使用的是实际的 API 请求(如 fetch 或 axios),只需替换 mockResponse 为真实的 API 返回数据即可。
requestAnimationFrame 替代 setInterval 的好处在于,它可以在浏览器空闲时自动调用,确保动画的平滑性,并且不会像 setInterval 那样产生不必要的 CPU 占用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值