走马灯是一种常见的网页效果,可以用来展示图片或文字的循环滚动。
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 占用。