原生JS实现弹幕效果的简单操作指南


Posted in Javascript onNovember 10, 2020

前言

现在很多的直播平台或者视频平台都会用到弹幕加强和观众的互动效果,那么如何用JS实现这样的效果呢,用一个初学者的方法记录下这个方法,欢迎大牛指导。

1、首先需要操作文档必须拿到Dom中的元素,当然有很多方法,这里还是用document.querySelector.

2、这边也是为了键盘和鼠标都可发送封装了一个函数function sendMsg(){

首先需要创建一个容器来接受你编辑的内容,这里用span标签,当然其他标签也可

var oSpan=document.cerateElement(“span”)

将oSpan插入到需要展示的oVideoBox

oVideoBox.appendChild(oSpan)

给oSpan加入class用于编辑插入的样式,当然也可以用js,这里用的CSS样式oSpan.classList.add(“danmu”)

用innerHTML接用户图像及弹幕内容这里用ES6的一个``

oSpan.innerHTML =` < img src ="./source/lei.jpg" /> ${oContent.value}

计算弹幕出现的初始位置,left位移初始位置即oVideoBox的宽度oVideoBox.offsetWidth.也是oSpan的初始定位oSpan.offsetLeft
top位移的初始即oVideoBox内随机的高度,避免超出

var maxTop=oVideoBox…clientHeight-oSpan.offsetHeight;
var top=Math.round(Math.random()*maxTop)
oSpan.style.top = top+ ‘px'

当然JS的动画也离不开计时器。这边也是用setInterval()

var timer=setInterval(()=>{
var left=oSpan.offsetLeft
left-=10
oSpan.style.left= left+ ‘px'

这边判断一下如果超出屏幕就把弹幕和计时器移出

if(left<-oSpan.offsetWidtb){
clearInterval(timer);
oSpan.remove();}},100)

以上就完成了简易版的弹幕函数就封装完成了,后面就可以引用了,

事件从点击开始,弹幕也是创建点击事件oSend.onclick,

oSend.οnclick=function(){引用函数sendMsg()}

后面可以加上一个键盘的enter可以发送,是一个事件委托window.οnkeydοwn=function(e){

var ev = e || event;
var keyCode = ev.keyCode || ev.which;

判断如果按的是键盘enter的keycode码是13和alt组合

if (keyCode === 13 && ev.altKey) {
sendMsg();}}

以下是bod代码,可以练练

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>作业_弹幕</title>
 <style>
 * {
  padding: 0;
  margin: 0;
 }

 body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
 }

 .wrapBox {
  width: 800px;
  height: 550px;
  border: 1px solid #000;
  margin: 50px auto 0;
 }

 .videoBox {
  height: 500px;
  position: relative;
  overflow: hidden;
 }

 .videoBox img {
  width: 100%;
  height: 100%;
 }

 video {
  width: 100%;
  /* height: 500px; */
 }

 .danmuSend {
  display: flex;
  height: 50px;
 }

 #content {
  flex: 1;
 }

 #send {
  width: 100px;
 }

 .danmu {
  color: #f00;
  font-size: 20px;
  position: absolute;
  left: 800px;
  top: 0;
  white-space: nowrap;
 }

 .danmu img {
  width: 60px;
  height: 60px;
  border-radius: 50%;
  vertical-align: middle;
  display: inline-block;
 }
 </style>
</head>

<body>
 <div class="wrapBox">
 <div class="videoBox">
  <img src="../../source/bg.jpg" />
  <!-- <span class="danmu">我是弹幕</span> -->
  <!-- <span class="danmu">我是弹幕</span>
  <span class="danmu">我是弹幕</span>
  <span class="danmu">我是弹幕</span>
  <span class="danmu">我是弹幕</span> -->
 </div>
 <div class="danmuSend">
  <input id="content" type="text">
  <button id="send">发送</button>
 </div>
 </div>
</body>

以下是JS的代码:

<script>


 var oSend = document.querySelector('#send');
 var oContent = document.querySelector('#content');
 var oVideoBox = document.querySelector('.videoBox');




 function sendMsg() {
 var content = oContent.value;

 var oSpan = document.createElement('span');
 oSpan.className = 'danmu';
 oSpan.innerHTML = `<img src="../../source/bg.jpg">${content}`;

 oVideoBox.appendChild(oSpan);

 var maxTop = oVideoBox.clientHeight - oSpan.offsetHeight;

 oSpan.style.top = Math.round(Math.random() * maxTop) + 'px';
 
 var timer = setInterval(() => {
  var left = oSpan.offsetLeft;
  left -= 10;
  oSpan.style.left = left + 'px';
  if (left < -oSpan.offsetWidth) {
  clearInterval(timer);
  oSpan.remove();
  }
 }, 100);
 }

 oSend.onclick = function () {
 sendMsg();
 }

 window.onkeydown = function (e) {
 var ev = e || event;
 var keyCode = ev.keyCode || ev.which;
 if (keyCode === 13 && ev.altKey) {
  sendMsg();
 }
 }

</script>

总结

到此这篇关于原生JS实现弹幕效果的文章就介绍到这了,更多相关原生JS实现弹幕内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery拖动div、移动div、弹出层实现原理及示例
Apr 08 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
Apr 01 Javascript
Javascript实现跑马灯效果的简单实例
May 31 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
Vue生命周期示例详解
Apr 12 Javascript
使用jQuery实现动态添加小广告
Jul 11 jQuery
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
Feb 28 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
Mar 04 Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 Javascript
vue解决跨域问题(推荐)
Nov 10 #Javascript
关于vue 项目中浏览器跨域的配置问题
Nov 10 #Javascript
如何在vue 中引入使用jquery
Nov 10 #jQuery
Vue + ts实现轮播插件的示例
Nov 10 #Javascript
vue router返回到指定的路由的场景分析
Nov 10 #Javascript
如何将Node.js中的回调转换为Promise
Nov 10 #Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 #Javascript
You might like
用session做客户验证时的注意事项
2006/10/09 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
php实现随机生成易于记忆的密码
2015/06/19 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
Numpy之reshape()使用详解
2019/12/26 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
挂牌仪式主持词
2014/03/20 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
设备售后服务承诺书
2014/05/30 职场文书
实习生工作证明范本
2014/09/14 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS