探讨JavaScript实现类似弹幕的跑马灯效果

简介: 探讨JavaScript实现类似弹幕的跑马灯效果

在现代网页设计中,类似弹幕的跑马灯效果是一种非常吸引眼球的动态展示方式。它可以用于显示公告、新闻标题、用户评论等不断滚动的信息。本文将详细介绍如何使用JavaScript实现类似弹幕的跑马灯效果,并提供多个实际代码案例。

1. 基本的跑马灯效果

案例1:简单的水平滚动

首先,让我们从一个简单的水平滚动效果开始,这种效果会不断滚动一行文本。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Simple Marquee</title>
    <style>
        .marquee {
            width: 100%;
            overflow: hidden;
            white-space: nowrap;
            box-sizing: border-box;
        }
        .marquee span {
            display: inline-block;
            padding-left: 100%;
            animation: marquee 10s linear infinite;
        }
        @keyframes marquee {
            0%   { transform: translateX(0); }
            100% { transform: translateX(-100%); }
        }
    </style>
</head>
<body>
    <div class="marquee">
        <span>This is a simple marquee effect using CSS and JavaScript.</span>
    </div>
</body>
</html>

在这个示例中,我们使用了CSS动画来实现基本的跑马灯效果。@keyframes定义了一个从右到左滚动的动画。

2. 使用JavaScript控制跑马灯

虽然CSS动画可以实现简单的跑马灯效果,但在某些情况下,我们需要更灵活的控制,如动态添加内容或调整滚动速度。我们可以使用JavaScript来增强功能。

案例2:使用JavaScript动态控制跑马灯

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JavaScript Controlled Marquee</title>
    <style>
        .marquee {
            width: 100%;
            overflow: hidden;
            white-space: nowrap;
            box-sizing: border-box;
            border: 1px solid #000;
            padding: 10px;
        }
        .marquee span {
            display: inline-block;
            padding-left: 100%;
        }
    </style>
</head>
<body>
    <div class="marquee" id="marquee">
        <span id="marqueeContent">This is a JavaScript controlled marquee effect.</span>
    </div>
    <button onclick="addContent()">Add Content</button>
    <script>
        var marquee = document.getElementById('marquee');
        var marqueeContent = document.getElementById('marqueeContent');
        function startMarquee() {
            var width = marquee.offsetWidth;
            var contentWidth = marqueeContent.offsetWidth;
            var pos = width;
            function step() {
                if (pos <= -contentWidth) {
                    pos = width;
                } else {
                    pos--;
                }
                marqueeContent.style.transform = 'translateX(' + pos + 'px)';
                requestAnimationFrame(step);
            }
            step();
        }
        function addContent() {
            var newContent = document.createElement('span');
            newContent.textContent = ' New content added!';
            marqueeContent.appendChild(newContent);
        }
        startMarquee();
    </script>
</body>
</html>

在这个示例中,我们使用JavaScript来控制跑马灯的滚动,并提供了一个按钮来动态添加内容。requestAnimationFrame用于创建平滑的动画效果。

3. 基于多个元素的跑马灯

有时,我们需要展示多个元素,而不仅仅是一行文本。这种情况下,我们可以使用JavaScript来创建基于多个元素的跑马灯效果。

案例3:展示多个元素的跑马灯

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Multi-Element Marquee</title>
    <style>
        .marquee {
            width: 100%;
            overflow: hidden;
            white-space: nowrap;
            box-sizing: border-box;
            border: 1px solid #000;
            padding: 10px;
        }
        .marquee div {
            display: inline-block;
            padding-left: 100%;
            margin-right: 20px;
        }
    </style>
</head>
<body>
    <div class="marquee" id="marquee">
        <div>Item 1</div>
        <div>Item 2</div>
        <div>Item 3</div>
        <div>Item 4</div>
    </div>
    <script>
        var marquee = document.getElementById('marquee');
        var items = Array.from(marquee.children);
        function startMarquee() {
            var width = marquee.offsetWidth;
            var totalWidth = items.reduce((sum, item) => sum + item.offsetWidth + 20, 0); // 20 is the margin-right
            var pos = width;
            function step() {
                if (pos <= -totalWidth) {
                    pos = width;
                } else {
                    pos--;
                }
                items.forEach(item => {
                    item.style.transform = 'translateX(' + pos + 'px)';
                });
                requestAnimationFrame(step);
            }
            step();
        }
        startMarquee();
    </script>
</body>
</html>

在这个示例中,我们使用多个<div>元素来展示不同的内容,并使用JavaScript进行滚动控制。所有元素一起滚动,实现类似弹幕的效果。

4. 支持暂停和恢复的跑马灯

在某些情况下,我们可能需要让用户暂停和恢复跑马灯。我们可以使用JavaScript来实现这些功能。

案例4:支持暂停和恢复的跑马灯

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pause and Resume Marquee</title>
    <style>
        .marquee {
            width: 100%;
            overflow: hidden;
            white-space: nowrap;
            box-sizing: border-box;
            border: 1px solid #000;
            padding: 10px;
        }
        .marquee span {
            display: inline-block;
            padding-left: 100%;
        }
    </style>
</head>
<body>
    <div class="marquee" id="marquee">
        <span id="marqueeContent">This marquee effect supports pause and resume.</span>
    </div>
    <button onclick="toggleMarquee()">Pause/Resume</button>
    <script>
        var marquee = document.getElementById('marquee');
        var marqueeContent = document.getElementById('marqueeContent');
        var animationId;
        var pos = 0;
        var running = true;
        function startMarquee() {
            var width = marquee.offsetWidth;
            var contentWidth = marqueeContent.offsetWidth;
            function step() {
                if (running) {
                    if (pos <= -contentWidth) {
                        pos = width;
                    } else {
                        pos--;
                    }
                    marqueeContent.style.transform = 'translateX(' + pos + 'px)';
                }
                animationId = requestAnimationFrame(step);
            }
            step();
        }
        function toggleMarquee() {
            running = !running;
            if (running) {
                startMarquee();
            } else {
                cancelAnimationFrame(animationId);
            }
        }
        startMarquee();
    </script>
</body>
</html>

在这个示例中,我们添加了一个按钮用于暂停和恢复跑马灯。通过设置running变量,我们可以控制动画的暂停和恢复。

结语

本文介绍了如何使用JavaScript实现类似弹幕的跑马灯效果。我们通过多个实际代码案例,展示了不同场景下的解决方案,包括基本的水平滚动、动态控制、展示多个元素以及支持暂停和恢复的跑马灯。希望这些示例能帮助你更好地理解和应用JavaScript中的跑马灯效果。

目录
相关文章
|
3月前
|
JavaScript 前端开发
javascript开发的简单的弹幕插件
这是一个原生javascript开发的简单的弹幕插件,具有美观、易用,占用的资源较低等特点,可以给弹幕设置内容、颜色、头像、链接地址等属性,鼠标悬停等,简单实用,欢迎下载!
54 5
|
8月前
|
前端开发 JavaScript
杨校老师课堂之JavaScript案例之跑马灯左右无缝连接图片自动轮播
杨校老师课堂之JavaScript案例之跑马灯左右无缝连接图片自动轮播
36 2
|
9月前
|
前端开发 JavaScript 调度
原生JavaScript实现弹幕组件
原生JavaScript实现弹幕组件
|
JavaScript 前端开发
JS实现无缝隙跑马灯
JS实现无缝隙跑马灯
128 0
|
JavaScript
如何用原生JS实现跑马灯效果
如何用原生JS实现跑马灯效果
224 0
如何用原生JS实现跑马灯效果
|
JavaScript
html+css+js实现无缝隙跑马灯
html+css+js实现无缝隙跑马灯
188 0
|
JavaScript 前端开发
vue js文字跑马灯基础版本
提供两种解决思路
305 1
|
JavaScript 前端开发 CDN
哇哦,弹幕居然是这么弄出来的,一文学会如何用js制作一个弹幕效果
哇哦,弹幕居然是这么弄出来的,一文学会如何用js制作一个弹幕效果
286 0
哇哦,弹幕居然是这么弄出来的,一文学会如何用js制作一个弹幕效果
|
JavaScript 前端开发
杨校老师课堂之JavaScript案例之跑马灯左右无缝连接图片自动轮播
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/80177295  JavaScript案例之跑马灯左右无缝连接 效果图: 思路:     1.
920 0
|
JavaScript 前端开发

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    40
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    27
  • 3
    Node.js 中实现多任务下载的并发控制策略
    33
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    55