蓝桥杯(Web大学组)2023省赛真题:视频弹幕
思路:
主要是要仔细阅读题目以及理解给出的已有代码,进行函数间的调用、定时器的使用、元素移除、清除定时器等,注意细节。
笔记:
- height不要写成hight
- 设置left时,记得加单位px
- 可以获取left的值进行计算,但要注意spanEle.style.left是带单位的字符串,要用parseInt进行转换:parseInt(spanEle.style.left)
发现一个知识点:
spanEle.style.left = `${getEleStyle(videoEle).width}px`;
spanEle.style.left = `${parseInt(spanEle.style.left)-bulletConfig.speed}px`;
这里可以第二条语句中可以通过spanEle.style.left取值,是因为第一条语句使元素的样式为内联样式,如果没有第一条语句,而 spanEle
的样式不是内联样式(即通过内联style
属性设置的),那么 spanEle.style.left
将返回一个空字符串或 undefined
,取决于浏览器的实现。
在这种情况下,执行 parseInt(spanEle.style.left)
将返回 NaN
(不是一个数字),因为无法将空字符串或 undefined
转换为数字。
这种情况下(通过CSS样式表设置的样式而不是内联样式),可以使用window.getComputedStyle
方法,如下所示:
var element = document.querySelector('.a');
var computedStyle = window.getComputedStyle(element);
var leftValue = computedStyle.getPropertyValue('left');console.log(leftValue); //输出带单位的字符串
答题部分:
1.补全 renderBullet 函数中的代码,控制弹幕的显示颜色和移动。功能说明如下:
每个弹幕内容包裹在 span 标签中,作为子节点插入到 #video 元素节点内。
生成的 span 元素节点相对于 #video 元素绝对定位 ,初始位置的 left 是 #video 元素的宽,top 是 #video 元素的高内的随机数。
注意:需求中所需样式可直接通过已提供的 getEleStyle 方法获取。
弹幕每隔 bulletConfig.time(弹幕配置对象) 时间,向左移动距离为 bulletConfig.speed(弹幕配置对象)。当弹幕最右端完全移出 #video 元素时,移除 span 元素。
function renderBullet(bulletConfig, videoEle, isCreate = false) {const spanEle = document.createElement("SPAN");//创建span标签spanEle.classList.add(`bullet${index}`);if (isCreate) {spanEle.classList.add("create-bullet")//变红}// TODO:控制弹幕的显示颜色和移动,每隔 bulletConfig.time 时间,弹幕移动的距离 bulletConfig.speedspanEle.innerText = bullets[index-1] //弹幕内容//颜色spanEle.style.color=`rgb(${getRandomNum(255)},${getRandomNum(255)},${getRandomNum(255)})` videoEle.appendChild(spanEle)//要添加到#videospanEle.style.left = `${getEleStyle(videoEle).width}px`;//一开始在最右边spanEle.style.top = `${getRandomNum(getEleStyle(videoEle).height, start = 0)}px`let timer = setInterval(() => {// spanEle.style.left = `${parseInt(spanEle.style.left)-bulletConfig.speed}px` // 或spanEle.style.left = `${spanEle.offsetLeft - bulletConfig.speed}px`if(getEleStyle(spanEle).right<=getEleStyle(videoEle).left){videoEle.removeChild(spanEle) //元素出去后移除 clearInterval(timer) //清除定时器}}, bulletConfig.time);
}
2.补全 #sendBulletBtn 元素的绑定事件,点击发送按钮,输入框中的文字出现在弹幕中,样式不同于普通弹幕(样式红色字体红色框已设置,类名为 create-bullet )。
通过调用 renderBullet 方法和正确的传参实现功能。document.querySelector("#sendBulletBtn").addEventListener('click', () => {// TODO:点击发送按钮,输入框中的文字出现在弹幕中//bulletConfig.value是弹幕的内容bulletConfig.value= document.querySelector("#bulletContent").valueif(bulletConfig.value){//判断内容是否非空//弹幕出现在视频中,就调用上面那个函数,不用重新创建那个spanrenderBullet(bulletConfig,videoEle,true)}document.querySelector("#bulletContent").value="" //清空输入框
})
完整代码:
const bullets = ["前方高能","原来如此","这么简单","学到了","学费了","666666","111111","workerman","学习了","别走,奋斗到天明"];/*** @description 根据 bulletConfig 配置在 videoEle 元素最右边生成弹幕,并移动到最左边,弹幕最后消失* @param {Object} bulletConfig 弹幕配置* @param {Element} videoEle 视频元素* @param {boolean} isCreate 是否为新增发送的弹幕,为 true 表示为新增的弹幕*
*/// 1.补全 renderBullet 函数中的代码,控制弹幕的显示颜色和移动。功能说明如下:
// 每个弹幕内容包裹在 span 标签中,作为子节点插入到 #video 元素节点内。
// 生成的 span 元素节点相对于 #video 元素绝对定位 ,初始位置的 left 是 #video 元素的宽,top 是 #video 元素的高内的随机数。
// 注意:需求中所需样式可直接通过已提供的 getEleStyle 方法获取。
// 弹幕每隔 bulletConfig.time(弹幕配置对象) 时间,向左移动距离为 bulletConfig.speed(弹幕配置对象)。
// 当弹幕最右端完全移出 #video 元素时,移除 span 元素。
function renderBullet(bulletConfig, videoEle, isCreate = false) {const spanEle = document.createElement("SPAN");//创建span标签spanEle.classList.add(`bullet${index}`);if (isCreate) {spanEle.classList.add("create-bullet")//变红}// TODO:控制弹幕的显示颜色和移动,每隔 bulletConfig.time 时间,弹幕移动的距离 bulletConfig.speedspanEle.innerText = bullets[index-1] //弹幕内容//颜色spanEle.style.color=`rgb(${getRandomNum(255)},${getRandomNum(255)},${getRandomNum(255)})` videoEle.appendChild(spanEle)//要添加到#videospanEle.style.left = `${getEleStyle(videoEle).width}px`;//一开始在最右边spanEle.style.top = `${getRandomNum(getEleStyle(videoEle).height, start = 0)}px`let timer = setInterval(() => {// spanEle.style.left = `${parseInt(spanEle.style.left)-bulletConfig.speed}px` // 或spanEle.style.left = `${spanEle.offsetLeft - bulletConfig.speed}px`if(getEleStyle(spanEle).right<=getEleStyle(videoEle).left){videoEle.removeChild(spanEle) //元素出去后移除 clearInterval(timer) //清除定时器}}, bulletConfig.time);
}// 2.补全 #sendBulletBtn 元素的绑定事件,点击发送按钮,输入框中的文字出现在弹幕中,样式不同于普通弹幕(样式红色字体红色框已设置,类名为 create-bullet )。通过调用 renderBullet 方法和正确的传参实现功能。
document.querySelector("#sendBulletBtn").addEventListener('click', () => {// TODO:点击发送按钮,输入框中的文字出现在弹幕中//bulletConfig.value是弹幕的内容bulletConfig.value= document.querySelector("#bulletContent").valueif(bulletConfig.value){//判断内容是否非空//弹幕出现在视频中,就调用上面那个函数,不用重新创建那个spanrenderBullet(bulletConfig,videoEle,true)}document.querySelector("#bulletContent").value="" //清空输入框
})function getEleStyle(ele) {// 获得元素的width,height,left,right,top,bottomreturn ele.getBoundingClientRect();
}function getRandomNum(end, start = 0) {// 获得随机数,范围是 从start到 endreturn Math.floor(start + Math.random() * (end - start + 1));
}// 设置 index 是为了弹幕数组循环滚动
let index = 0;
const videoEle = document.querySelector("#video");
// 弹幕配置
const bulletConfig = {isHide: false, // 是否隐藏speed: 5, // 弹幕的移动距离time: 50, // 弹幕每隔多少ms移动一次value:"" // 弹幕的内容
}
let isPlay = false;
let timer; // 保存定时器
document.querySelector("#vd").addEventListener('play', () => {// 监听视频播放事件,当视频播放时,每隔 1000s 加载一条弹幕isPlay = true;bulletConfig.value = bullets[index++];renderBullet(bulletConfig, videoEle);timer = setInterval(() => {bulletConfig.value = bullets[index++];renderBullet(bulletConfig, videoEle);if (index >= bullets.length) {index = 0;}}, 1000);
})document.querySelector("#vd").addEventListener("pause", () => {isPlay = false;clearInterval(timer);
})document.querySelector("#switchButton").addEventListener("change", (e) => {if (e.target.checked) {bulletConfig.isHide = false;} else {bulletConfig.isHide = true;}
})
相关文章:
蓝桥杯(Web大学组)2023省赛真题:视频弹幕
思路: 主要是要仔细阅读题目以及理解给出的已有代码,进行函数间的调用、定时器的使用、元素移除、清除定时器等,注意细节。 笔记: height不要写成hight设置left时,记得加单位px可以获取left的值进行计算,但要注意sp…...

真假难辨 - Sora(OpenAI)/世界模拟器的技术报告
目录 引言技术报告汉译版英文原版 引言 Sora是OpenAI在2024年2月15日发布的世界模拟器,功能是通过文本可以生成一分钟的高保真视频。由于较高的视频质量,引起了巨大关注。下面是三个示例,在示例之后给出了其技术报告: tokyo-wal…...

Linux第52步_移植ST公司的linux内核第4步_关闭内核模块验证和log信息时间戳_编译_并通过tftp下载测试
1、采用程序配置关闭“内核模块验证” 默认配置文件“stm32mp1_atk_defconfig”路径为“arch/arm/configs”; 使用VSCode打开默认配置文件“stm32mp1_atk_defconfg”,然后将下面的4条语句屏蔽掉,如下: CONFIG_MODULE_SIGy CONFIG_MODULE_…...

ctfshow-web21~28-WP
爆破(21-28) web21 题目给了一个zip文件,打开后解压是爆破的字典,我们抓包一下网址看看 发现账号和密码都被base64了,我们发送到intruder模块,给爆破的位置加上$符圈住 去base64解码一下看看格式...

鸿蒙开发系列教程(二十四)--List 列表操作(3)
列表编辑 1、新增列表项 定义列表项数据结构和初始化列表数据,构建列表整体布局和列表项。 提供新增列表项入口,即给新增按钮添加点击事件。 响应用户确定新增事件,更新列表数据。 2、删除列表项 列表的删除功能一般进入编辑模式后才可…...
线性代数笔记2--矩阵消元
0. 简介 矩阵消元 1. 消元过程 实例方程组 { x 2 y z 2 3 x 8 y z 12 4 y z 2 \begin{cases} x2yz2\\ 3x8yz12\\ 4yz2 \end{cases} ⎩ ⎨ ⎧x2yz23x8yz124yz2 矩阵化 A [ 1 2 1 3 8 1 0 4 1 ] X [ x y z ] A \begin{bmatrix} 1 & 2 & 1 \\ 3 & …...

透光力之珠——光耦固态继电器的独特特点解析
光耦固态继电器作为现代电子控制领域中的重要组件,以其独特的特点在工业、通信、医疗等多个领域得到广泛应用。本文将深入剖析光耦固态继电器的特点,揭示其在电子控制中的卓越性能。 光耦固态继电器的光电隔离技术 光耦固态继电器以其光电隔离技术而脱颖…...
C#系列-EntityFrameworkCore.Transactions.Abstractions应用场景+实例(38)
EntityFrameworkCore.Transactions.Abstractions应用场景 EntityFrameworkCore.Transactions.Abstractions 并不是一个官方的或广泛认可的 NuGet 包名称。在 Entity Framework Core (EF Core) 中,事务管理通常是通过 DbContext 的内置方法来实现的,如 Sa…...

PMDG 737
在Simbrief中生成计划后下载两个文件 放到C:\Users\32497\AppData\Local\Packages\Microsoft.FlightSimulator_8wekyb3d8bbwe\LocalState\packages\pmdg-aircraft-737(微软商店版本) 加油 先在飞行计划中查看计划燃油数量 MCDU中, AIRPLANE SEVICE 第二页, REQUEST FUEL TR…...
深入探索Midjourney:领航人工智能的新征程
深入探索Midjourney:领航人工智能的新征程 引言 在这个数据驱动、以技术创新为核心的时代,Midjourney以其独特的特性在人工智能领域中崭露头角。作为一款前沿的人工智能工具,它不仅重新定义了人机交互的方式,而且为各行各业提供…...

ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)
ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏) 1.1 漏洞和风险分析 ChatGPT还可以帮助开发人员预测代码的潜在风险,识别其中的安全漏洞,而不必先运行它,这可以让开发人员及早发现错误࿰…...

【AIGC】Stable Diffusion 的提示词入门
一、正向提示词和反向提示词 Stable Diffusion 中的提示词通常用于指导用户对生成的图像进行控制。这些提示词可以分为正向提示词(Positive Prompts)和反向提示词(Negative Prompts)两类,它们分别影响图像生成过程中的…...

力扣---通配符匹配
题目描述: 给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 ? 和 * 匹配规则的通配符匹配: ? 可以匹配任何单个字符。 * 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是ÿ…...
Rust 原生类型
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、标量类型(scalar type)二、 复合类型(compound type)总结 前言 Rust 学习系列 ,rust中的原生类…...

09、全文检索 -- Solr -- SpringBoot 整合 Spring Data Solr (生成DAO组件 和 实现自定义查询方法)
目录 SpringBoot 整合 Spring Data SolrSpring Data Solr的功能(生成DAO组件):Spring Data Solr大致包括如下几方面功能:Query查询(属于半自动)代码演示:1、演示通过dao组件来保存文档1、实体类…...

C# CAD SelectionFilter下TypedValue数组
SelectionFilter是用于过滤AutoCAD实体的类,在AutoCAD中,可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时,需要传入一个TypedValue数组,它用于定义选择规则。 在TypedValue数组中,每个元素表示一个选…...

python 爬虫篇(3)---->Beautiful Soup 网页解析库的使用(包含实例代码)
Beautiful Soup 网页解析库的使用 文章目录 Beautiful Soup 网页解析库的使用前言一、安装Beautiful Soup 和 lxml二、Beautiful Soup基本使用方法标签选择器1 .string --获取文本内容2 .name --获取标签本身名称3 .attrs[] --通过属性拿属性的值标准选择器find_all( name , at…...
第十二周学习报告
比赛 参加了一场 div 2 ,B 题,C 题没写出来,B 是一个排序去重+双指针,C题是要观察出一个数学结论(因为数据范围太大,我暴力做直接超时了) 排 6253 ,表现分是 998 &…...

Redis面试题整理(持续更新)
1. 缓存穿透? 缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致DB挂掉,这种情况大概率是遭到了攻击。 解决方案: …...

一周学会Django5 Python Web开发-Django5 Hello World编写
锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频,包括:2024版 Django5 Python we…...

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用
作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…...
2. 库的操作
2.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存储编码 [DEFAULT] COLLATE collation_name # 校验集: 比较/选择/读…...

sql入门语句-案例
Sql入门 数据库、数据表、数据的关系介绍 数据库 用于存储和管理数据的仓库 一个库中可以包含多个数据表 数据表 数据库最重要的组成部分之一 它由纵向的列和横向的行组成(类似excel表格) 可以指定列名、数据类型、约束等 一个表中可以存储多条数据 数据 想要永久化存储…...

go语言map扩容
map是什么? 在Go语言中,map是一种内置的无序key/value键值对的集合,可以根据key在O(1)的时间复杂度内取到value,有点类似于数组或者切片结构,可以把数组看作是一种特殊的map,数组的key为数组的下标&…...
第1章:Neo4j简介与图数据库基础
1.1 图数据库概述 在当今数据爆炸的时代,数据不仅仅是以量取胜,更重要的是数据之间的关联关系。传统的关系型数据库在处理高度关联数据时往往力不从心,而图数据库则应运而生,成为处理复杂关联数据的理想选择。 传统关系型数据库…...
图像处理、图像分析和图像理解的定义、联系与区别
1. 定义 图像处理(Image Processing) 图像处理是低层操作,主要针对像素级的图像数据进行加工,目的是改善图像质量或为后续分析做准备。 典型任务:去噪、增强(如对比度调整)、锐化、边缘检测、图…...

前端杂货铺——TodoList
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

FastAPI安全异常处理:从401到422的奇妙冒险
title: FastAPI安全异常处理:从401到422的奇妙冒险 date: 2025/06/05 21:06:31 updated: 2025/06/05 21:06:31 author: cmdragon excerpt: FastAPI安全异常处理核心原理与实践包括认证失败的标准HTTP响应规范、令牌异常的特殊场景处理以及完整示例代码。HTTP状态码选择原则…...
【PCIe总线】 -- PCI、PCIe相关实现
PCI、PCIe相关概念和知识点 【PCIe总线】-- PCI、PCIe基础知识点整理 【PCIe】非常适合初学的pcie博客(PCIe知识整理) PCIe具体实现 【PCIe】如何获取PCIe的BAR空间大小?...
rec_pphgnetv2完整代码学习(二)
六、TheseusLayer PaddleOCRv5 中的 TheseusLayer 深度解析 TheseusLayer 是 PaddleOCRv5 中 rec_pphgnetv2 模型的核心网络抽象层,提供了强大的网络结构调整和特征提取能力。以下是对其代码的详细解读: 1. 整体设计思想 核心概念: 网络…...