JavaScript css3实现简单视频弹幕功能(JavaScript css3实现简单视频弹幕功能)
类别:编程学习 浏览量:2058
时间:2021-10-07 00:33:29 JavaScript css3实现简单视频弹幕功能
JavaScript css3实现简单视频弹幕功能本文尝试写了一个demo模拟了最简单的视频弹幕功能。
思路:
设置一个<li>和所播放的video的大小一致,把这个li标签蒙在video上面用于放置弹幕。在video的右边放一个<ul>列表用于显示弹幕列表。
屏幕上面的弹幕,把内容放在<span>标签里面,一般一行字都是从左边飞到右边, 为了简单起见,这个移动就用了CSS3 的transition 属性。position设置为absolute,
那么就用的transition过度left属性,实现弹幕的移动。当然要注意设置其父元素的样式 overflow:hidden; 这样当字体飞出去的时候,就会隐藏飞出去的部分。
当点击发送的时候,获取input中的内容、当前日期、视频播放的进度video.currentTime,把这个内容作为一个对象存入一个数组中。把放置弹幕的span标签加入到li蒙版里,设置它的left,transition就会从当前left过度到下一个left,所以实现了移动。过渡完之后这个span标签就没用了,用removeChild把它中父元素中移除。同时把生成的<li>标签加入到ul中。
代码:
<!--Created by CC on 2017/10/11--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <style type="text/css"> .mainBody{ margin: 10px auto; text-align: center; font-family: arial; position:relative; } .send{ width:700px; margin:0px auto; text-align:left; } .my-msg{ width:85%; height:35px; } .my-btn{ background-color: #ccd0d7; border-radius: 8px; width: 50px; height: 35px; margin-left:30px; border:1px solid #00a1d6; } .my-list{ display:inline-block; vertical-align: top; border:1px solid #ccd0d7; width:200px; height:450px; overflow: auto; } .my-tm{ position:absolute; top:0px; height:366px; width: 710px; overflow:hidden; } .rtol{ position:absolute; display: inline-block; height:28px; overflow: hidden; font-size:24px; color:#fff; left:720px; -moz-transition:left 4s linear; -webkit-transition:left 4s linear; -o-transition:left 4s linear; } ul{ text-align: left; list-style-type:none; margin-top:0px; padding-left: 8px; } li span { text-align: left; color: #99a2aa; } </style> <body> <li> <li class="mainBody"> <li style="display:inline-block"> <video src="/big_buck_bunny.mp4" height="400" controls></video> <li class="send"> <input type="text" class="my-msg" id="msgcc" placeholder="发送弹幕~"> <input type="button" class="my-btn" id="sendcc" value="发送"> </li> </li><li class="my-list"> <span style="color: #00a1d6">~弹幕~</span> <hr style="border-top:2px solid #185598"/> <ul id="msg"> </ul> </li> <li class="my-tm" id="tmbox"> </li> </li> </li> <script> var tm=document.getElementById('tmbox'); var btn=document.getElementById('sendcc'); var video=document.getElementsByTagName('video')[0]; var list=document.getElementById('msg'); var msg=document.getElementById('msgcc'); var infor=[]; window.οnlοad=function() { //设置位置 tm.style.left=(document.body.offsetWidth-911)/2+'px'; } window.οnresize=function(){ tm.style.left=(document.body.offsetWidth-911)/2+'px'; } //获取当前日期 function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate = month + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes(); return currentdate; } //按下发送键 btn.οnclick=function(){ var value=msg.value; if(value&&value!='') { var itemInfor={}; itemInfor.value=value; itemInfor.showTime=video.currentTime; //时间 itemInfor.sendTime=getNowFormatDate(); //发送时间 //弹幕列表 var li=document.createElement('li'); li.className='my-li'; li.innerHTML="<span> > "+value+"</span>"; list.appendChild(li); //当前弹幕 var text=document.createElement('span'); text.className='rtol'; text.style.top=Math.floor( Math.random()*12 )*30+'px'; text.innerHTML=value; tm.appendChild(text); //左边位置 setTimeout(function(){ text.style.left=-value.length*25+'px'; },200); //之后把不显示的span删除 setTimeout(function(){ tm.removeChild(text) //防止已有弹幕和当前发送的显示冲突,在这里加入到数组中 infor.push(itemInfor); },5000 ) } } //显示已有弹幕 setInterval(function(){ if(video.paused==false) { infor.forEach(function(item){ var currentTime=video.currentTime; if(item.showTime<video.currentTime&&item.showTime>=(video.currentTime-0.5)) { var text=document.createElement('span'); text.className='rtol'; text.style.top=Math.floor( Math.random()*12 )*30+'px'; text.innerHTML=item.value; tm.appendChild(text); //左边位置 setTimeout(function(){ text.style.left=-(item.value.length*25)+'px'; },200); //之后把不显示的span删除 setTimeout(function(){ tm.removeChild(text); },5000 ) } }); } },500) </script> </body> </html>
效果:
虽然这样写很简单,但是有个很大的问题就是transition过渡left属性不能暂停,所以自然这个transition动画就只能等它执行完。或者说每个<span>标签的移动都用interval定时器来完成移动。不过这样写就要复杂一些。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
您可能感兴趣
- ExtJs中怎么上传文件
- html markdown 超链接对比(html+js 实现markdown编辑器效果)
- js获取子表单所有数据(JavaScript实现异步提交表单数据)
- js绘制平滑路径(如何利用Javascript生成平滑曲线详解)
- phpstudy 目录浏览宽度(JspStudy如何设置PHP根目录可编辑)
- js简单小游戏代码(用JS实现飞机大战小游戏)
- extjs中apply和applyIf的用法
- jsp实现短信验证码(手动实现js短信验证码输入框)
- vscode react jsx语法 开发环境(React-vscode使用jsx语法的问题及解决方法)
- js浮点数运算精度问题(JS超出精度数字问题的解决方法)
- nodejs 内部模块代码(详解Node.js如何处理ES6模块)
- js怎么防抖(JS防抖节流函数的实现与使用场景)
- jspromise原理(JavaScript使用promise处理多重复请求)
- nodejs启动web服务器(使用NODE.JS创建一个WEBSERVER服务器的步骤)
- vue购物车怎么实现(Vue.js框架实现购物车功能)
- js实现继承的五种(JavaScript继承的三种方法实例)
- 素人恋爱综艺火药味十足 男生为赢得芳心集体扯头花,真是出好戏(素人恋爱综艺火药味十足)
- 《囧妈》为何受抵制 春节七部影片撤档背后的责任与博弈(囧妈为何受抵制)
- 提醒 2019年起河南驾考要开设科目五 官方回应来了(2019年起河南驾考要开设科目五)
- 省 市书法家协会 送万福进万家 活动走进禹州美丽乡村(省市书法家协会)
- 点赞 禹州苌庄正式撤乡建镇 未来发展不可估量(禹州苌庄正式撤乡建镇)
- 它荣获 中国生态魅力镇 称号 就在咱们禹州,一起来看看(中国生态魅力镇)
热门推荐
- 用docker搭建在线开发平台(docker部署蜗牛影院系统详细流程分析)
- sqlserver非唯一索引汇总性能(详解SQL Server的聚焦过滤索引)
- C#中is、as的区别
- nginx配置两个前端web服务(你真的了解如何将Nginx配置为Web服务器吗)
- navicat for mysql连接测试失败(Navicat连接虚拟机mysql常见错误问题及解决方法)
- django请求流程(Django学习笔记之为Model添加Action)
- laravel后台登录教程(Laravel 默认邮箱登录改成用户名登录的实现方法)
- 如何降低SQL语句复杂度
- php创建多个文件(PHP实现单文件、多个单文件、多文件上传函数的封装示例)
- python字符串的拼接与分割(Python字符串通过'+'和join函数拼接新字符串的性能测试比较)