原生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下:nth-child(an+b)的使用注意
May 28 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
Dec 06 Javascript
JS多物体 任意值 链式 缓冲运动
Aug 10 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
JS如何设置iOS中微信浏览器的title
Nov 22 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
Nov 22 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
JavaScript继承的三种方法实例
May 12 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
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
浅谈五大Python Web框架
2017/03/20 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Python流程控制 if else实现解析
2019/09/02 Python
python 动态调用函数实例解析
2019/10/21 Python
scrapy头部修改的方法详解
2020/12/06 Python
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
仓库保管员岗位职责
2013/12/20 职场文书
还款承诺书范文
2014/05/20 职场文书
刑事代理授权委托书
2014/09/17 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
军训结束新闻稿
2015/07/17 职场文书
讲座新闻稿
2015/07/18 职场文书
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python