滚动弹幕案例

滚动弹幕案例

一、需求

1.页面上漂浮字体大小不一、颜色不一,从左向右滚动的弹幕;
2.底部中间有一个发送功能,可以发送新的弹幕;
3.底部的发送部分可以向下收起和弹出。

二、html

<div class="container"><div class="content"><p>哈哈哈哈哈</p><p>哈哈哈哈哈哈哈哈</p><p>哈哈哈哈哈</p><p>哈哈哈哈哈哈哈</p><p>哈哈哈哈哈哈哈哈哈哈哈哈哈</p><p>哈哈哈哈哈哈哈哈哈哈</p><p>哈哈哈</p></div><div class="input-box"><input type="text"><button>发射</button></div><button class="show">收起</button>
</div>

三、css

<style>.container{margin:0 auto;width: 500px;height: 400px;border:1px solid black;position:relative;}.content {width: 500px;height: 365px;position:relative;overflow: hidden;}.input-box {width: 500px;height: 30px;position:absolute;bottom:0;}.input-box input {width: 400px;height: 25px;float:left;} .input-box button{width: 90px;height: 30px;float:right;cursor:pointer;}@keyframes moveDanmu {from{left:-100%}to{left:100%}}p{white-space: nowrap;position:absolute;animation: moveDanmu 8s linear infinite;left:-100%;}.show {width: 50px;height: 30px;position:absolute;left:500px;bottom:0px;}
</style>

四、javascript

<script>const container =document.querySelector('.container')const content =document.querySelector('.content')const danmus = document.querySelectorAll('.content p')const text = document.querySelector('.input-box input')const button = document.querySelector('.input-box button')const inputBox = document.querySelector('.input-box')const show = document.querySelector('.show')//创建随机颜色function getRandomRGBColor(){const r = Math.floor(Math.random()*255)const g = Math.floor(Math.random()*255)const b = Math.floor(Math.random()*255)return `rgb(${r},${g},${b})`}//创建top值function getRandomTop(){return (Math.floor(Math.random()*content.offsetHeight)- 44 +'px')}console.log(content.offsetHeight);//创建随机大小function getRandomFontSize(){return (Math.floor(Math.random()*30)+14+'px')}//发送弹幕button.addEventListener('click',function(){if(text.value!==''){const danmu = document.createElement('p')danmu.textContent = text.valuedanmu.style.color = getRandomRGBColor()danmu.style.top= getRandomTop()danmu.style.fontSize = getRandomFontSize()content.appendChild(danmu)text.value = ''// 弹幕滚动结束后移除danmu.addEventListener('animationend', () => {danmuContainer.removeChild(danmu);});}})//已有弹幕danmus.forEach((hadDanmu)=>{const randomDelay=Math.floor(Math.random()*10000)hadDanmu.style.color = getRandomRGBColor()hadDanmu.style.top= getRandomTop()hadDanmu.style.fontSize = getRandomFontSize()hadDanmu.style.animationDelay = randomDelay+'ms'})//展开收起let isInputHidden = falseshow.addEventListener('click',function(){if(isInputHidden){inputBox.style.display='block'show.textContent='收起'}else{inputBox.style.display='none'show.textContent='展开'}isInputHidden=!isInputHidden})
</script>

五、样式截图

请添加图片描述

六、实现原理

  1. 使用Math.random随机生成方法,构建随机颜色、随机大小、随机绝对定位高度
  2. 对于已有的弹幕,针对每一个弹幕随机生成颜色大小位置,并且设置css动画(animation)使其从左到右运动,对每个弹幕设置不同的延迟时间出现,形成弹幕效果。
  3. 对于即将发送的弹幕,需新建p元素,且同样随机生成颜色大小位置,弹幕内容为input的value值,最后将其添加至已有弹幕p元素后。
  4. 发送条的展开收起,引入布尔变量isInputHidden并设置初始值为false,按钮内容初始设置为收起,发送条display初始值为block,当点击收起按钮,按钮收起–>展开,发送条block–>none,isInputHidden值取反,相反同理。

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

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

相关文章

【wiki知识库】08.添加用户登录功能--后端SpringBoot部分

目录 一、今日目标? 二、SpringBoot后端实现 2.1 新增UserLoginParam 2.2 修改UserController 2.3 UserServiceImpl代码 2.4 创建用户上下文工具类 2.5?通过token校验用户&#xff08;重要&#xff09; 2.6 创建WebMvcConfig 2.7 用户权限校验拦截器 一、今日目标 上…

AI大模型的技术突破与传媒行业变革

性能与成本&#xff1a;AI大模型的“双轮驱动” 过去几年&#xff0c;AI大模型的发展经历了从实验室到产业化的关键转折。2025年初&#xff0c;以DeepSeek R1为代表的模型在数学推理、代码生成等任务中表现超越国际头部产品&#xff0c;而训练成本仅为传统模型的几十分之一。这…

C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析

博主将从C标准库中的 std::string 出发&#xff0c;详细探讨字符串的处理方法&#xff0c;涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string 的使用展开&#xff0c;结合代码示例进行说明。 一、std::string 的基本操作 1.1 创建与初始化 std::string 提供了…

3.【线性代数】——矩阵乘法和逆矩阵

三 矩阵乘法和逆矩阵 1. 矩阵乘法1.1 常规方法1.2 列向量组合1.3 行向量组合1.4 单行和单列的乘积和1.5 块乘法 2. 逆矩阵2.1 逆矩阵的定义2.2 奇异矩阵2.3 Gauss-Jordan 求逆矩阵2.3.1 求逆矩阵 ⟺ \Longleftrightarrow ⟺解方程组2.3.2 Gauss-Jordan求逆矩阵 1. 矩阵乘法 1.…

深入了解 Oracle 正则表达式

目录 深入了解 Oracle 正则表达式一、正则表达式基础概念二、Oracle 正则表达式语法&#xff08;一&#xff09;字符类&#xff08;二&#xff09;重复限定符&#xff08;三&#xff09;边界匹配符&#xff08;四&#xff09;分组和捕获 三、Oracle 正则表达式函数&#xff08;…

用python写一个聊天室程序

下面是一个简单的基于Socket的Python聊天室程序示例&#xff0c;包括服务器端和客户端&#xff1a; 服务器端代码&#xff1a; import socket import threadingdef handle_client(client, address):print(f"New connection from {address}")while True:msg client…

在nodejs中使用RabbitMQ(六)sharding消息分片

RabbitMQ 的分片插件&#xff08;rabbitmq_sharding&#xff09;允许将消息分布到多个队列中&#xff0c;这在消息量很大或处理速度要求高的情况下非常有用。分片功能通过将消息拆分到多个队列中来平衡负载&#xff0c;从而提升消息处理的吞吐量和可靠性。它能够在多个队列之间…

1.7 AI智能体实战指南:从单任务自动化到企业级智能体集群架构

AI智能体实战指南:从单任务自动化到企业级智能体集群架构 一、智能体技术演进:从脚本工具到认知革命的跨越 1.1 三代智能体能力对比 能力维度第一代(规则驱动)第二代(机器学习)第三代(LLM驱动)任务理解固定模式匹配统计模式识别语义推理与逻辑链分解环境适应需人工重写…

Github 2025-02-14 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2025-02-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C#项目1Guava: 谷歌Java核心库 创建周期:3725 天开发语言:Java协议类型:Apache License 2.0Star数量:49867 个Fork数量:10822 次…

C++17中的clamp函数

一、std::clamp() 其实在前面简单介绍过这个函数&#xff0c;但当时只是一个集中的说明&#xff0c;为了更好的理解std::clamp的应用&#xff0c;本篇再详细进行阐述一次。std::clamp在C17中其定义的方式为&#xff1a; template< class T > constexpr const T& cl…

WEB安全--SQL注入--常见的注入手段

一、联表查询&#xff1a; 1.1原理&#xff1a; 当payload参数被后端查询语句接收到时&#xff0c;其中的非法语句通过union关联显示出其他的数据 1.2示例&#xff1a; #payload: -1 and union select 1,2,database()--#query: $sqlselect * from users where id-1 and union …

QT笔记——QPlainTextEdit

文章目录 1、概要2、文本设计2.1、设置文本2.1、字体样式&#xff08;大小、下划线、加粗、斜体&#xff09; 1、概要 QPlainTextEdit 是 Qt 框架中用于处理纯文本编辑的控件&#xff0c;具有轻量级和高效的特点&#xff0c;以下是它常见的应用场景&#xff1a; 文本编辑器&am…

【D2】神经网络初步学习

总结&#xff1a;学习了 PyTorch 中的基本概念和常用功能&#xff0c;张量&#xff08;Tensor&#xff09;的操作、自动微分&#xff08;Autograd&#xff09;、正向传播、反向传播。通过了解认识LeNet 模型&#xff0c;定义神经网络类&#xff0c;熟悉卷积神经网络的基本结构和…

DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件

1 DeepSeek处理自有业务的案例&#xff1a;让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景 AI能力再强&#xff0c;如果不能在企业的自有业务上产生助益&#xff0c;那基本也是一无是处。将企业的自有业务上传到线上训练&#xff0c;那是脑子进水的做法&#xff…

DeepSeek教unity------MessagePack-05

动态反序列化 当调用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 时&#xff0c;二进制数据中存在的任何值都将被转换为基本值&#xff0c;即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…

C++入门之《拷贝构造函数》详解

拷贝构造函数是构造函数的一个重载 拷贝构造函数是特殊的构造函数&#xff0c;用于基于已存在对象创建新对象。比如定义一个 Person 类&#xff1a; class Person { private:std::string name;int age; public:Person(const std::string& n, int a) : name(n), age(a…

Ollama命令使用指南

Ollama 命令使用指南 Ollama 命令使用指南1. Ollama 命令概览2. Ollama 命令详解2.1 启动 Ollama2.2 创建模型2.3 查看模型信息2.4 运行模型2.5 停止运行的模型2.6 从注册表拉取模型2.7 推送模型到注册表2.8 列出本地模型2.9 查看正在运行的模型2.10 复制模型2.11 删除模型 3. …

为什么配置Redis时候要序列化配置呢

序列化和反序列化&#xff1f;&#xff1a; 序列化&#xff1a;将对象转换为二进制数据&#xff0c;以便存储到Redis中。 反序列化&#xff1a;将Redis中的二进制数据转换回对象&#xff0c;以便在应用程序中使用。 1. 默认序列化器的问题 如果不配置序列化器&#xff0c;Re…

【问】强学如何支持 迁移学习呢?

案例&#xff1a;从CartPole-v1迁移到MountainCar-v0 在源环境&#xff08;CartPole-v1&#xff09;中训练模型 首先&#xff0c;我们使用DQN算法在CartPole-v1环境中训练一个强化学习模型。以下是代码示例&#xff1a; import gym import torch import torch.nn as nn impor…

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中&#xff0c;学习…