HTML+CSS+JavaScript制作弹幕效果

news2025/1/23 9:14:42

全屏弹幕

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WthBxEGK-1685321359567)(E:\前端\JavaScript\弹幕效果\弹幕效果.assets\image-20230409193631174.png)]

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>弹幕效果</title>
    <style>
        /* 设置弹幕的样式 */
        .bullet {
            position: absolute;
            font-size: 20px;
            color: white;
            text-shadow: 1px 1px 1px black;
            white-space: nowrap;
            overflow: hidden;
        }
    </style>
</head>
<body>
<div id="container"></div>
<script>
    // 获取弹幕容器
    var container = document.getElementById('container');
    // 定义弹幕数据
    var data = [
        { text: '这是第一条弹幕', color: 'red' },
        { text: '这是第二条弹幕', color: 'green' },
        { text: '这是第三条弹幕', color: 'blue' }
    ];
    // 定义弹幕速度
    var speed = 2;
    // 定义弹幕间隔
    var interval = 1000;
    // 定义弹幕位置
    var topArr = [];
    for (var i = 0; i < 10; i++) {
        topArr.push(i * 30);
    }
    // 定义弹幕索引
    var index = 0;
    // 定义弹幕定时器
    var timer = setInterval(function() {
        // 获取弹幕数据
        var bullet = data[index];
        // 创建弹幕元素
        var span = document.createElement('span');
        span.className = 'bullet';
        span.innerText = bullet.text;
        span.style.color = bullet.color;
        // 随机获取弹幕位置
        var top = topArr[Math.floor(Math.random() * topArr.length)];
        span.style.top = top + 'px';
        // 将弹幕元素添加到容器中
        container.appendChild(span);
        // 计算弹幕宽度
        var width = span.offsetWidth;
        // 定义弹幕起始位置
        var left = container.offsetWidth;
        span.style.left = left + 'px';
        // 定义弹幕移动定时器
        var bulletTimer = setInterval(function() {
            // 计算弹幕当前位置
            left -= speed;
            span.style.left = left + 'px';
            // 判断弹幕是否移出容器
            if (left < -width) {
                // 移除弹幕元素
                container.removeChild(span);
                // 清除弹幕移动定时器
                clearInterval(bulletTimer);
            }
        }, 10);
        // 更新弹幕索引
        index++;
        if (index >= data.length) {
            index = 0;
        }
    }, interval);
</script>
</body>
</html>

盒子弹幕

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXBnQIxE-1685321359568)(E:\前端\JavaScript\弹幕效果\弹幕效果.assets\image-20230409193750938.png)]

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Simple Danmaku Effect</title>
    <style>
        /*  danmaku容器的样式 */
        .danmaku-container {
            position: relative;
            height: 300px;
            background-color: black;
            color: white;
            font-size: 20px;
            overflow: hidden;
        }

        /* danmaku的样式 */
        .danmaku {
            position: absolute;
            top: 0;
            white-space: nowrap;
            opacity: 0.8;
        }
    </style>
</head>
<body>
<div class="danmaku-container"></div>
<script>
    // 函数用于创建新的弹库
    function createDanmaku(text) {
        // Create a new danmaku element
        var danmaku = document.createElement("div");
        danmaku.classList.add("danmaku");
        danmaku.innerText = text;

     //设置danmaku位置到容器的右边缘
        danmaku.style.right = "0";

        //设置danmaku顶部位置为0到容器高度之间的随机值
        var container = document.querySelector(".danmaku-container");
        danmaku.style.top = Math.floor(Math.random() * container.offsetHeight) + "px";

        //添加danmaku到容器
        container.appendChild(danmaku);

        //将danmaku动画到容器的左边缘
        var animationDuration = 5000; // 5 秒
        var danmakuWidth = danmaku.offsetWidth;
        var containerWidth = container.offsetWidth;
        var distance = containerWidth + danmakuWidth;
        var duration = (distance / containerWidth) * animationDuration;
        danmaku.style.transition = "transform " + duration + "ms linear";
        danmaku.style.transform = "translateX(-" + distance + "px)";

        // 动画完成后从容器中移除弹幕
        setTimeout(function() {
            danmaku.remove();
        }, duration);
    }

    // 函数生成随机弹库文本

 
    function generateDanmakuText() {
        var texts = ["Hello", "World", "Lorem", "Ipsum", "Dolor", "Sit", "Amet"];
        var index = Math.floor(Math.random() * texts.length);
        return texts[index];
    }

    // 每2秒生成一个新的弹幕
    setInterval(function() {
        var text = generateDanmakuText();
        createDanmaku(text);
    }, 2000);
</script>
</body>
</html>

视频弹幕

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOQBYeH7-1685321359569)(E:\前端\JavaScript\弹幕效果\弹幕效果.assets\image-20230409213636880.png)]

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>弹幕效果</title>
    <style>
        #video-container {
            position: relative;
            width: 640px;
            height: 360px;
            margin: 0 auto;
        }
        #video {
            width: 100%;
            height: 100%;
        }
        #danmu-container {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            overflow: hidden;
        }
        .danmu {
            position: absolute; /* 定位弹幕 */
            font-size: 24px; /* 设置字体大小 */
            white-space: normal; /* 防止换行 */
            color: white; /* 设置字体颜色 */
            text-shadow: 1px 1px 2px black; /* 添加文字阴影 */
            animation: move 10s linear forwards; /* 设置动画 移动   10秒  线性向前  向前 */
           
        }
        /*
        使用@keyframes 规则定义,指定动画名称move和动画的关键帧
        from:关键帧指定动画的的起始状态,即将弹幕元素向右平移其宽度的2500%。
        to:关键帧指定动画的结束状态,即将弹幕元素向左平移其宽度的100%。
        transform属性用于指定平移。
         */
        @keyframes move {
            from {
                transform: translateX(640px);
            }
            to {
                transform: translateX(-200%);
            }
        }

        .box1{
            display: flex; /*排成一行,并根据需要换行。*/
            justify-content: center; /*在主轴上居中对齐。*/
            margin-top: 40px;/*元素之间留出40像素的空间 */
        }
        /*
            弹幕输入框
        */
        .box1 .barrage-input{
            padding: 10px;   /*内边距*/
            font-size: 16px;  /*字体大小*/
            border-radius: 5px;  /* 边框圆角*/
            border: none;  /* 去掉边框*/
            box-shadow: 1px 1px 2px gray;  /* 添加阴影*/
        }
        /*
            弹幕提交按钮
        */
        .box1 .barrage-but{
            padding: 10px;  /* 内边距*/
            font-size: 16px;  /* 字体大小*/
            border-radius: 5px;  /* 边框圆角*/
            border: none;  /* 去掉边框*/
            box-shadow: 1px 1px 2px gray;  /* 添加阴影*/
            background-color: #4CAF50;  /* 背景颜色*/
            color: white;  /* 字体颜色*/

        }
    </style>
</head>
<body>
<div id="video-container">
    <video id="video" src="Docker.mp4" controls></video>
    <div id="danmu-container"></div>
</div>
<div class="box1">
    <input type="text" id="danmu-input" placeholder="请输入弹幕" class="barrage-input">
    <button id="danmu-send" class="barrage-but">发送</button>
</div>
<script>
    // 获取弹幕容器、输入框和发送按钮
    const danmuContainer = document.getElementById('danmu-container');
    const danmuInput = document.getElementById('danmu-input');
    const danmuSend = document.getElementById('danmu-send');

    // 给发送按钮添加点击事件监听器
    danmuSend.addEventListener('click', () => {
        // 创建一个新的div元素
        const danmu = document.createElement('div');
        // 添加danmu类
        danmu.classList.add('danmu');
        // 设置弹幕文本为输入框中的值
        danmu.innerText = danmuInput.value;
        // 将弹幕添加到弹幕容器中
        danmuContainer.appendChild(danmu);
        // 清空输入框
        danmuInput.value = '';

    });


</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Python让小朋友的手绘图跳起来(附源码)

大家好&#xff0c;我是小F&#xff5e; 今天给大家介绍一个非常有趣的项目&#xff0c;基于AI识别&#xff0c;制作儿童手绘图舞蹈图。 只需几分钟&#xff0c;就能自动生成儿童手绘人物或类人角色&#xff08;即具有双臂、两条腿等的角色&#xff09;的动画&#xff0c;而且生…

波奇学C++:模板和STL

什么是模板&#xff1f;为什么我们需要模板&#xff1f; 先假设一个场景&#xff0c;我们要编写一个函数交换a,b两个数的值 void swap(int& a,int& b) {int cmpa;ab;ba; } swap函数可以帮我们交换两个int型的值&#xff0c;那如果要交换的类型是float&#xff0c;do…

基础篇010.1 STM32驱动RC522 RFID模块之一:基础知识

目录 1. RFID概述 1.1 RFID工作原理 1.2 RFID分类 1.3 RFID模块 1.4 RFID卡片 1.5 IC卡和ID卡介绍 1.6 IC卡和ID的区分 2. Mifare卡结构原理 2.1 Mifare卡概述 2.2 Mifare非接触式 IC 卡性能简介&#xff08;M1&#xff09; 2.2.1 Mifare S50与Mifare S70 2.2.2 S5…

操作系统的发展史

█ DOS操作系统 上期提到&#xff0c;20世纪70年代&#xff0c;伴随着计算机技术的成熟&#xff0c;操作系统也进入了一个快速发展阶段。现代操作系统的概念&#xff0c;也在那一时期逐渐形成。 1975年初&#xff0c;MITS电脑公司推出了基于Intel 8080芯片的Altair 8800微型计算…

7 种常见的路由协议

网络路由是网络通信的重要组成部分&#xff0c;通过互联网将信息从源地址移动到目的地的过程。路由发生在 OSI 模型的第 3 层&#xff08;网络层&#xff09;。实际网络中通常会将静态和动态路由结合使用。静态路由适用于小型网络&#xff0c;而动态路由适用于大型网络。 什么…

Office project 2013安装

哈喽&#xff0c;大家好。今天一起学习的是project 2013的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

Anthropic 推出 Claude ,一款与ChatGPT竞争的聊天机器人

最近&#xff0c;谷歌承诺向 Anthropic 投资 3 亿美元&#xff0c;收购这家初创公司 10% 的股份。 Anthropic 是一家由前 OpenAI 员工共同创立的初创公司&#xff0c;近日推出一款与ChatGPT对标的产品。 Anthropic 名为 Claude 的人工智能聊天机器人&#xff0c;可以被指示执行…

【Zero to One系列】window系统安装Linux、docker

1、在window系统安装Linux&#xff08;开启微软的Linux子系统功能-WSL&#xff09; 1.1 什么是WSL&#xff1f; 传送门&#xff1a;适用于 Linux 的 Windows 子系统安装指南 (Windows 10) 链接里有全部的步骤 1.2 开启 WSL 在 控制面板-->程序和功能 页面找到 Windows 功…

【运维知识进阶篇】Ansible自动化运维-PlayBook详解

这篇文章给大家介绍下PlayBook&#xff0c;我们叫它剧本&#xff0c;它是以一种固定的格式&#xff0c;将多个ad-hoc放入yml文件中。在Ansible中&#xff0c;剧本文件是yml结尾的&#xff0c;在SaltStack中剧本文件是sls结尾的&#xff0c;但是两者语法都是使用的yaml语法。 P…

军用电子元器件质量如何界定?

为了保证元器件的质量&#xff0c;我国制定了一系列的元器件标准。在上世纪70年代末期制定了“七专”7905技术协议和80年代初制定了“七专”8406技术协议&#xff0c;已具备了军用器件标准的雏形&#xff0c;但标准是在改革开放之前制定的&#xff0c;有很多局限性&#xff0c;…

Studio One6简体中文版全新版本功能详解

Studio One 6是一款强大的音乐编曲软件,可以帮助您使用灵活的和弦轨道功能实现音乐创作。通过新的智能模板、直观的拖放工作流、可定制的用户界面和强大的集成工具&#xff0c;使创建快速而轻松。 无论你选择 Studio One 哪个版本&#xff0c;你都可以得到无限的音轨、通道和插…

ChatGPT强到离谱,这么十一款ChatGPT浏览器插件你值得拥有

&#x1f517; 运行环境&#xff1a;ChatGPT &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f9…

【ChatGPT功能挖掘】论文绘图救星!

前言 &#x1f497;未来全网粉丝100W、全栈领域优质创作者、掘金、阿里云等社区博客专家、专注于全栈领域和毕业项目实战&#x1f497; 今天分享一个使用ChatGPT来解决绘图没有思路、不知如何下手的问题&#xff01; 注意看&#xff01;全文干货&#xff0c;无废话&#xff01…

路径规划 | 图解RRT*算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 图解RRT*算法原理2 ROS C算法实现3 Python算法实现4 Matlab算法实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#xff1b;局部规划(DWA…

chatgpt赋能python:使用Numpy在Python中进行科学计算

使用Numpy在Python中进行科学计算 对于需要进行科学计算和数据分析的程序员&#xff0c;Python是一个非常有用的编程语言。而Numpy&#xff08;Numerical Python&#xff09;则是Python生态系统中最受欢迎和广泛使用的科学计算库之一。该库提供了高效的数组操作&#xff0c;线…

跟着我学 AI丨知识图谱,搜索的根

搜索是现在大家都很熟悉的功能&#xff0c;同时也是我们搜集信息离不开的重要手段。而搜索之所以能帮助我们获取到对应的信息&#xff0c;其实离不开知识图谱的重要支撑。知识图谱是什么呢&#xff1f;为什么能够支撑起搜索的提升呢&#xff1f;今天我们就来认识一下知识图谱。…

36从零开始学Java之到底什么是方法的重载?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 壹哥在之前给大家讲解构造方法的时候说过&#xff0c;在一个类中&#xff0c;可以定义多个构造方法&a…

老胡的周刊(第092期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 chathub[2] ChatHub 是款全能聊天机器人客户…

Kubernetes最佳实战案例:优化容器化部署与扩展性

▲ 点击上方"DevOps和k8s全栈技术"关注公众号 Kubernetes&#xff08;简称为K8s&#xff09;作为目前最流行的容器编排平台&#xff0c;为企业提供了强大的容器管理和自动化部署能力。在实践中&#xff0c;许多组织已经成功地应用了Kubernetes来提高应用程序的可靠性…

旗舰手机割不动年轻人了,纷纷降价千元贱卖,苹果也未能幸免

618促销即将开启&#xff0c;而手机企业的促销优惠更早&#xff0c;在5月中旬就已开始&#xff0c;苹果率先降价1200元促销&#xff0c;随即国产手机第一大品牌跟进&#xff0c;苹果再反击&#xff0c;如今国产手机开始全面降价&#xff0c;就连最顽强的某国产手机品牌也开始跟…