【vue3】弹幕效果实现

news2025/1/19 3:25:45

本次弹幕基于vue3-danmaku组件实现。

弹幕效果

1.安装插件

npm install vue3-danmaku --save

2.基础使用方法

<template>
  <vue-danmaku v-model:danmus="danmus" loop style="height:100px; width:300px;"></vue-danmaku>
</template>

<script setup>
import vueDanmaku from 'vue3-danmaku'

const danmus = ref(['danmu1', 'danmu2', 'danmu3', '...'])
</script>

3.实际使用

(1)基本框架使用,实现基本弹幕效果

<template>
<div class="baberrage">
		<vue-danmaku class="danmaku" ref="danmaku" v-model:danmus="danmus" :isSuspend="true" :top="20" useSlot loop
			:speeds="speeds" :channels="12">
			<template v-slot:dm="{ danmu }">
				<div class="danmaku-name">
					<span class="bullet-item"  }">
						<img src="@/assets/images/bag.png" alt="">
						{{ danmu.commentContent }}</span>
				</div>
			</template>
		</vue-danmaku>
	</div>

</template>
import vueDanmaku from 'vue3-danmaku'
	import { getComments, addComment } from '../api/comment'
	import { reactive, ref, onMounted } from 'vue'

//弹幕列表
	const danmus = reactive(['danmu1', 'danmu2', 'danmu3', 'danmu4', 'danmu5', 'danmu6', 'danmu7', 'danmu8'])
//获取弹幕列表
	async function getArt() {
		await getComments().then(({ data }) => {
			danmus.splice(0, danmus.length, ...data.data)
		})

	}
	onMounted(() => {
		getArt()

	});

(2)为弹幕添加颜色

添加动态样式,因为随机颜色不好看,自己添加颜色,并随机选取。

<span class="bullet-item" :style="{ color: getRandomColor() }">
const colorList = ref(['rgb(204,255,255)', 'white', 'rgb(204,255,204)', 'white', 'rgb(0,255,255)', 'white', 'rgb(255,204,255)', 'pink'],)
	// 生成随机颜色的函数  
	function getRandomColor() {
		const color = colorList.value[Math.floor(Math.random() * 8)]
		return color
	}

(3)添加发送弹幕功能

<div class="message-form__title" data-v-21971730>留言墙</div>
		<div class="message-form__content" data-v-21971730>
			<input type="text" v-model="form.commentContent" id="bubble_txt" max="25" autocomplete="off"
				placeholder="留下点什么吧,最多25个字~" data-v-21971730>
			<button type="button" id="bubble_btn" @click="sendBullet" data-v-21971730>发射</button><br />
		</div>
</div>
//添加弹幕
	let form = ref({
		commentPeople: '实验室',
		commentContent: ''
	})
	function sendBullet() {
		addComment(form.value).then(() => {
			getArt()
		})
		
	}

(4)弹幕发送成功提示

发送弹幕后如果没有提示就不能了解发送情况,因此增加反馈。

<div class="success-box" v-if="isSuccess">
		<img src="@/assets/images/success.png" alt="">
		<span>发布成功</span>
	</div>
function sendBullet() {
		addComment(form.value).then(() => {
			getArt()
		})
		form.value.commentContent = ''
		isSuccess.value = true; // 提交成功显示弹窗
		setTimeout(() => {
			isSuccess.value = false; // 2秒后自动关闭
		}, 2000);
	}

(5)添加弹幕控制功能

<div class="control">
			<button type="button" id="bubble_btn" @click="pause" data-v-21971730>暂停</button>
			<button type="button" id="bubble_btn" @click="dplay()" data-v-21971730>继续</button>
			<button type="button" id="bubble_btn" @click="addspeeds" data-v-21971730>加速</button>
			<button type="button" id="bubble_btn" @click="jianspeeds" data-v-21971730>减速</button>
			<button type="button" id="bubble_btn" @click="hide" data-v-21971730>隐藏</button>
			<button type="button" id="bubble_btn" @click="show" data-v-21971730>显示</button>
		</div>
const speeds = ref(200);

	const danmaku = ref(null);
	//继续播放弹幕
	const dplay = () => {
	  danmaku.value.play();
	};
	//暂停播放弹幕
	const pause = () => {
		danmaku.value.pause();
	};
	//显示弹幕
	const show = () => {
		danmaku.value.show();
	};
	//隐藏弹幕
	const hide = () => {
		danmaku.value.hide();
	};
	
	//弹幕加速
	const addspeeds = () => {
		console.log(speeds.value);
		speeds.value += 20;
	};
	//弹幕减速
	const jianspeeds = () => {
		console.log(speeds.value);
		speeds.value -= 20;
	};

(6)全部代码

<template>
	<div class="message-form" data-v-21971730>
		<div class="message-form__title" data-v-21971730>留言墙</div>
		<div class="message-form__content" data-v-21971730>
			<input type="text" v-model="form.commentContent" id="bubble_txt" max="25" autocomplete="off"
				placeholder="留下点什么吧,最多25个字~" data-v-21971730>
			<button type="button" id="bubble_btn" @click="sendBullet" data-v-21971730>发射</button><br />
		</div>
		<div class="control">
			<button type="button" id="bubble_btn" @click="pause" data-v-21971730>暂停</button>
			<button type="button" id="bubble_btn" @click="dplay()" data-v-21971730>继续</button>
			<button type="button" id="bubble_btn" @click="addspeeds" data-v-21971730>加速</button>
			<button type="button" id="bubble_btn" @click="jianspeeds" data-v-21971730>减速</button>
			<button type="button" id="bubble_btn" @click="hide" data-v-21971730>隐藏</button>
			<button type="button" id="bubble_btn" @click="show" data-v-21971730>显示</button>
		</div>
		
	</div>
	<div class="baberrage">
		<vue-danmaku class="danmaku" ref="danmaku" v-model:danmus="danmus" :isSuspend="true" :top="20" useSlot loop
			:speeds="speeds" :channels="12">
			<template v-slot:dm="{ danmu }">
				<div class="danmaku-name">
					<span class="bullet-item" :style="{ color: getRandomColor() }">
						<img src="@/assets/images/bag.png" alt="">
						{{ danmu.commentContent }}</span>
				</div>
			</template>
		</vue-danmaku>
	</div>
	<div class="success-box" v-if="isSuccess">
		<img src="@/assets/images/success.png" alt="">
		<span>发布成功</span>
	</div>
</template>
<script lang="ts" setup>
	import vueDanmaku from 'vue3-danmaku'
	import { getComments, addComment } from '../api/comment'
	import { reactive, ref, onMounted } from 'vue'
	const colorList = ref(['rgb(204,255,255)', 'white', 'rgb(204,255,204)', 'white', 'rgb(0,255,255)', 'white', 'rgb(255,204,255)', 'pink'],)
	// 生成随机颜色的函数  
	function getRandomColor() {
		const color = colorList.value[Math.floor(Math.random() * 8)]
		return color
	}
	//弹幕列表
	const danmus = reactive(['danmu1', 'danmu2', 'danmu3', 'danmu4', 'danmu5', 'danmu6', 'danmu7', 'danmu8'])
	//控制发送弹幕成功提示是否显示
	let isSuccess = ref(false)
	//添加弹幕
	let form = ref({
		commentPeople: '实验室',
		commentContent: ''
	})
	function sendBullet() {
		addComment(form.value).then(() => {
			getArt()
		})
		form.value.commentContent = ''
		isSuccess.value = true; // 提交成功显示弹窗
		setTimeout(() => {
			isSuccess.value = false; // 2秒后自动关闭
		}, 2000);
	}
	//获取弹幕列表
	async function getArt() {
		await getComments().then(({ data }) => {
			danmus.splice(0, danmus.length, ...data.data)
		})

	}
	onMounted(() => {
		getArt()

	});

	const speeds = ref(200);

	const danmaku = ref(null);
	//继续播放弹幕
	const dplay = () => {
	  danmaku.value.play();
	};
	//暂停播放弹幕
	const pause = () => {
		danmaku.value.pause();
	};
	//显示弹幕
	const show = () => {
		danmaku.value.show();
	};
	//隐藏弹幕
	const hide = () => {
		danmaku.value.hide();
	};
	
	//弹幕加速
	const addspeeds = () => {
		console.log(speeds.value);
		speeds.value += 20;
	};
	//弹幕减速
	const jianspeeds = () => {
		console.log(speeds.value);
		speeds.value -= 20;
	};
</script>
<style scoped>
	@import url("@/assets/styles/bullet.css");

	.baberrage {
		padding-top: 300px;
		width: 100%;
		height: 70vh;
		overflow: hidden;
		background: url(@/assets/images/bac1.png);
		background-size: 100%;
	}

	.danmaku {
		width: 100%;
		height: 100%;
	}
    
	.control{
		margin-top: 20px;
	}
	.control>button{
		margin-right: 12px;
	}
	.control>button:hover{
		background-color: #e73c7e;
		border: 1px solid #fff;
		color: #fff;
		cursor: pointer;
		animation: rightToleft 9s linear both;
	}
	.bullet-item {
		white-space: nowrap;
		background-color: rgba(0, 0, 0, 0.5);
		border-radius: 30px;
		height: 30px;
		font-size: 16px;
		color: #FFFFFF;
		line-height: 30px;
		padding-right: 20px;
		display: flex;
	}

	img {
		width: 30px;
		height: 30px;
		border-radius: 50%;
		margin-right: 10px;
	}

	.success-box {
		width: 120px;
		height: 40px;
		border-radius: 8px;
		background: #F0F9EB;
		display: flex;
		justify-content: center;
		flex-direction: row;
		align-items: center;
		gap: 8px;
		position: absolute;
		top: 10%;
		left: 50%;
		margin-left: -65px;
		margin-top: -65px;
		color: #67C23A;
		text-align: center;
		font-size: 14px;
		font-weight: 600;
	}

	.success-box>img {
		display: inline-block;
		width: 20px;
		height: 20px;
	}
</style>

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

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

相关文章

发布自己的python包

文章目录 概要模块和包发布自己的package创建目录结构发布 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; openAI 的 GPT 大模型的发展历程。 模块和包 在Python中&#xff0c;程序的划分可以分为三个层次&#xff1a;脚本、模块和包 script&#xff1a;独…

【人工智能】探索最强AI工具:实际应用与影响

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI工具已经深入到人们日常生活和工作的方方面面。这些工具不仅提高了生产力&#xff0c;还改变了我们解决问题和处理信息的方式。在中文互联网和国际市场中&#xff0c;众多AI工具已成为人们工作、学习、创作…

软考结构化开发 -- (耦合,内聚,设计原则,系统文档,数据字典)

文章目录 一、耦合二、内聚三、设计原则四、系统文档五、数据字典 一、耦合 模块化&#xff1a;将一个待开发的软件分解成若干个小的简单部分–模块模块独立 无直接耦合&#xff1a;指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&#xff0c;…

spring boot itext7 修改生成文档的作者、制作者、标题,并且读取相关的信息。

1、官方的example文件&#xff1a;iText GitHub itext-java-7.2.5\kernel\src\test\java\com\itextpdf\kernel\pdf\PdfStampingTest.java 2、修改代码&#xff1a; Testpublic void stamping1() throws IOException {String filename1 destinationFolder "stamping1_…

特惠电影票API接口的优势功能以及对接因素?

特惠电影票对接接口通常是指允许第三方开发者或平台通过编程方式接入电影票预订服务的API。这些接口可以提供查询电影场次、座位信息、票价、订票、支付等功能。以下是一些关键点和考虑因素&#xff0c;以及一些提供特惠电影票API接口的平台&#xff1a; 关键功能 电影场次信息…

RK3568 4G模块移远 EM05-CE

首先确保4G模块的天线是否正确安装,这一步会影响到后面测试成功与失败,购买模块时可以咨询厂家 然后就可以进行测试,首先需要关闭所有网络设备,以我的开发板为例子,确保等会使用的是4G模块的功能 ifconfig eth0 down ifconfig eth1 down ifconfig eth2 down 然后查看ifc…

java-day7

练习一&#xff1a;飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来…

【Spring相关技术】spring进阶-自定义请求报文转对象HttpMessageConverter

文章目录 类继承体系核心类与接口说明底层调用链完整示例步骤 1: 创建自定义的HttpMessageConverter步骤 2: 配置Spring MVC使用自定义转换器步骤 3: 使用自定义转换器 相关文献 类继承体系 默认转换器即springmvc默认的转换器&#xff0c; 用的比较多的是以下两种&#xff0c;…

生信技能61 - 获取比对后BAM文件的多项基础统计指标

获取比对后BAM文件的多项基础统计指标 1. 运行实例 采用pysam库解析bam文件,将bam文件路径作为输入参数,统计输出比对的参考基因组大小、ATCGN各碱基数量/比率、GC含量、UR reads数量、平均测序深度、总reads数量等统计指标。 python bam_statistics.py -b sample.sorted.…

【Nestjs】从入门到精通(依赖注入)

NestJS 是一个基于 Node.js 的渐进式框架&#xff0c;构建在 Express 或 Fastify 之上&#xff0c;主要用于构建高效、可扩展的服务器端应用程序。它使用 TypeScript 并借鉴了 Angular 的设计理念&#xff0c;采用了依赖注入&#xff08;IoC, Inversion of Control&#xff09;…

动态网站及爬虫技术应用(题目)

/*T26:HTTP响应消息的状态代码为500时表示&#xff08; &#xff09;: HTTP响应消息的状态代码为500时表示服务器内部错误&#xff08;Internal Server Error&#xff09;。这通常意味着服务器在处理请求时遇到了意外的情况&#xff0c;导致无法完成该请求。这种错误可能是由于…

操作系统Lesson - 5 进程简介及进程编程模型

文章目录 什么是进程同一程序如何并发&#xff1f; Linux进程常用命令proc目录 PCB进程控制块PCB包含的信息两个进程间的关系 进程编程exec() 替换函数子进程的运行过程 什么是进程 进程 程序运行的过程&#xff0c;系统进行资源管理和调度的独立单位。 程序由两部分组成&am…

基础入门-Web应用架构搭建漏洞HTTP数据包

网站搭建 这里给一个网站搭建的视频链接&#xff0c;之前又搞过搭建服务器&#xff0c;这里就不再重做了 https://www.bilibili.com/video/BV16A4y1X7vg/?spm_id_from333.337.search-card.all.click&vd_sourcec2c3c616b3ad1faf44a9f6f30a4dbb03 值得注意的是&#xff0c;…

网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

基于tcp的套接字 文章目录 基于tcp的套接字一、套接字的工作流程二、基于tcp的套接字通信三、基于udp的套接字通信四、粘包现象 一、套接字的工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是一个…

学习底座架构-武汉

1 学习底座架构概述 大脑学习中心-边缘系统 一、当下教育现状 二、什么是学习底座 三、学习底座价值 七、学习底座解决问题的流程 案例&#xff1a;以4R注意力为例 一 注意力问题解决流程 二 注意力问题的危害 三 衡量注意力水平高低的标准 四 注意力问题4大根源 & 2大诱因…

FPGA驱动HDMI 初级篇

简介 本章节主要讲述如何通过FPGA驱动HDMI显示。 本章节框图如下: bd框图中使用了两个IP核,分别是Video Timing controller核AXI4-Stream to video out两个模块,下面先对两个模块做介绍。 Video Timing controller 配置如下: 这里由于没有使用ZYNQ PS端,…

BKD树介绍、区别与联系

简介 BKD树&#xff08;全称 bushy kd-trees&#xff09;是一种用于高维数据搜索的数据结构。它结合了K-D树和B树的特点&#xff0c;旨在提高多维空间数据的索引和查询效率。 基本概念 BKD树是一种二叉树结构&#xff0c;类似于K-D树&#xff0c;但其设计更加注重空间利用率…

10.11Python数学基础-多维随机变量及其分布

多维随机变量及其分布 1.二维随机变量及其分布 假设E是随机试验&#xff0c;Ω是样本空间&#xff0c;X、Y是Ω的两个变量&#xff1b;(X,Y)就叫做二维随机变量或二维随机向量。X、Y来自同一个样本空间。 联合分布函数 F ( x , y ) P ( X ≤ x , Y ≤ y ) F(x,y)P(X≤x,Y≤…

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中&#xff0c;定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合&#xff0c;以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起&#xff0c;实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…

【进阶】面向对象之接口

文章目录 为什么要有接口如何定义和使用一个接口练习 接口里面的成员特点接口和类之间的关系 为什么要有接口 接口:就是一种规则 如何定义和使用一个接口 接口用关键字interface来定义 public interface 接口名{}接口不能实例化接口和类之间是实现关系&#xff0c;通过imple…