JS原生实现视频弹幕Demo(仿)
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <title>Js原生弹幕</title>
- <link rel="stylesheet" href="">
- <style type="text/css" media="screen">
- * {
- margin: 0px;
- padding: 0px
- }
- html, body {
- height: 100%
- }
- body {
- overflow: hidden;
- background-color: #FFF;
- text-align: center;
- }
- .flex-column {
- display: flex;
- flex-direction: column;
- justify-content: space-between;, align-items: center;
- }
- .flex-row {
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- }
- .wrap {
- overflow: hidden;
- width: 70%;
- height: 600px;
- margin: 100px auto;
- padding: 20px;
- background-color: transparent;
- box-shadow: 0 0 9px #222;
- border-radius: 20px;
- }
- .wrap .box {
- position: relative;
- width: 100%;
- height: 90%;
- background-color: #000000;
- border-radius: 10px
- }
- .wrap .box span {
- position: absolute;
- top: 10px;
- left: 20px;
- display: block;
- padding: 10px;
- color: #336688
- }
- .wrap .send {
- display: flex;
- width: 100%;
- height: 10%;
- background-color: #000000;
- border-radius: 8px
- }
- .wrap .send input {
- width: 40%;
- height: 60%;
- border: 0;
- outline: 0;
- border-radius: 5px 0px 0px 5px;
- box-shadow: 0px 0px 5px #d9d9d9;
- text-indent: 1em
- }
- .wrap .send .send-btn {
- width: 100px;
- height: 60%;
- background-color: #fe943b;
- color: #FFF;
- text-align: center;
- border-radius: 0px 5px 5px 0px;
- line-height: 30px;
- cursor: pointer;
- }
- .wrap .send .send-btn:hover {
- background-color: #4cacdc
- }
- </style>
- </head>
- <body>
- <div class="wrap flex-column">
- <div class="box">
- <video src="danmu.mp4" width="100%" height="100%" controls autoplay></video>
- </div>
- <div class="send flex-row">
- <input type="text" class="con" placeholder="弹幕发送[]~(^v^)~*">
- <div class="send-btn">发送</div>
- </div>
- </div>
- <!-- javascript 前端中能做什么
- 1.响应用户的操作 事件(键盘事件、鼠标事件)
- 2.操作dom元素(增删改查、属性操作、样式等)
- 3.数据交互 表单验证 ajax json jsonp 正则表达式
- 4.造轮子 mvvm mvc nodeJS jquery
- -->
- <!-- 需求分析
- 用户点击发送按钮 把input的内容展示到box里面
- 1.元素 .con .send-btn .box span(创建)
- 2.事件:点击事件 键盘事件
- 3.行为
- 1.点击.send-btn获取.con的内容
- (1)规范发送信息
- (2)禁止空及全空格
- (3)存储value值
- 2.根据内容动态生成span标签
- (1)创建节点document.createElement
- (2)改变节点内容innerHTML
- (3)节点 生成初始化位置等
- (4)标签添加到oBox appendChild
- 3.message运动
- (1)改变元素的left值
- (2)定时器改变 setInterval
- (3)this代表当前弹幕
- (4)弹幕left = 当前left-1
- 4.随机函数
- Math.random 0-1 包括0但不包括1
- (1)top
- (2)color
- (3)fontsize
- (4)textShadow
- (5)timing运动曲线
- linear
- ease-out
- 5.业务完善
- (1)过去的删除掉
- 停止计时器
- 删除自身
- 终止函数
- (2)完善回车输入
- 在oCon上回车 发送弹幕
- -->
- <script src="jquery.min.js" type="text/javascript"></script>
- <script>
- //1.获取元素
- var oBox = document.querySelector('.box'); //获取.box元素
- var oCon = document.querySelector('.con'); //获取input框
- var oBtn = document.querySelector('.send-btn'); //获取发送按钮
- var cW = oBox.offsetWidth; //获取box的宽度
- var cH = oBox.offsetHeight; //获取box的高度
- var message = ''; //弹幕内容初始化
- oBtn.onclick = send; //点击发送
- oCon.onkeydown = function (e) {
- e = e || window.event;
- if (e.keyCode === 13) {
- //回车键
- send();
- }
- };
- function send() {
- //获取oCon的内容
- if (oCon.value.length <= 0 || (/^\s+$/).test(oCon.value)) {
- alert('请输入弹幕');
- return false;
- }
- message = oCon.value;
- console.log(message);
- //生成标签
- createEle(message); //执行节点创建模块
- oCon.value = ''; //收尾工作清空输入框
- }
- function createEle(txt) {
- //动态生成span标签
- var oMessage = document.createElement('span'); //创建标签
- oMessage.innerHTML = txt; //接收参数txt并且生成替换内容
- oMessage.style.left = cW + 'px'; //初始化生成位置x
- oBox.appendChild(oMessage); //把标签塞到oBox里面
- roll.call(oMessage, {
- //call改变函数内部this的指向
- timing: ['linear', 'ease-out'][~~(Math.random() * 2)],
- color: '#' + (~~(Math.random() * (1 << 24))).toString(16),
- top: random(0, cH),
- fontSize: random(16, 32)
- });
- }
- function roll(opt) {
- //弹幕滚动
- //如果对象中不存在timing 初始化
- opt.timing = opt.timing || 'linear';
- opt.color = opt.color || '#fff';
- opt.top = opt.top || 0;
- opt.fontSize = opt.fontSize || 16;
- this._left = parseInt(this.offsetLeft); //获取当前left的值
- this.style.color = opt.color; //初始化颜色
- this.style.top = opt.top + 'px';
- this.style.fontSize = opt.fontSize + 'px';
- this.timer = setInterval(function () {
- if (this._left <= 100) {
- clearInterval(this.timer); //终止定时器
- this.parentNode.removeChild(this);
- return; //终止函数
- }
- switch (opt.timing) {
- case 'linear': //如果匀速
- this._left += -2;
- break;
- case 'ease-out': //
- this._left += (0 - this._left) * .01;
- break;
- }
- this.style.left = this._left + 'px';
- }.bind(this), 1000 / 60);
- }
- function random(start, end) {
- //随机数封装
- return start + ~~(Math.random() * (end - start));
- }
- var aLi = document.querySelectorAll('li'); //10
- function forEach(ele, cb) {
- for (var i = 0, len = aLi.length; i < len; i++) {
- cb && cb(ele[i], i);
- }
- }
- forEach(aLi, function (ele, i) {
- ele.style.left = i * 100 + 'px';
- });
- //产生闭包
- var obj = {
- num: 1,
- add: function () {
- this.num++; //obj.num = 2;
- (function () {
- console.log(this.num);
- })
- }
- };
- obj.add(); //window
- </script>
- </body>
- </html>
JS原生实现视频弹幕Demo(仿)的更多相关文章
- 仿jQuery的siblings效果的js原生代码
仿jQuery的siblings效果的js原生代码 <previousSibling> 属性返回选定节点的上一个同级节点(在相同树层级中的前一个节点). <nextSibling&g ...
- Canvas + WebSocket + Redis 实现一个视频弹幕
原文出自:https://www.pandashen.com 页面布局 首先,我们需要实现页面布局,在根目录创建 index.html 布局中我们需要有一个 video 多媒体标签引入我们的本地视频, ...
- 图片轮播(左右切换)--JS原生和jQuery实现
图片轮播(左右切换)--js原生和jquery实现 左右切换的做法基本步骤跟 上一篇文章 淡入淡出 类似,只不过修改了一些特定的部分 (1)首先是页面的结构部分 对于我这种左右切换式 1.首先是个外 ...
- 图片轮播(淡入淡出)--JS原生和jQuery实现
图片轮播(淡入淡出)--js原生和jquery实现 图片轮播有很多种方式,这里采用其中的 淡入淡出形式 js原生和jQuery都可以实现,jquery因为封装了很多用法,所以用起来就简单许多,转换成j ...
- js原生回到顶部
<!DOCTYPE html><html><head> <meta content="测试demo" name="Keyword ...
- JS原生Date类型方法的一些冷知识
ps:由于Date()是js原生函数,不同浏览器的解析器对其实现方式并不同,所以返回值也会有所区别.本文测试未特别申明浏览器的情况下,均是指win7 x64+chrome 44.0.2403.155 ...
- 使用jQuery.makeArray() 将多种类型转换成JS原生Array
jQuery.makeArray(obj)这个函数从名字上来看非常easy猜出它的用途:应该是用来将传入的对象转换成一个原生array 再看看官网上对它的解释:Convert an array-lik ...
- JS原生上传大文件显示进度条-php上传文件
JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M post_max_size = 10M memory_li ...
- js原生高逼格插件
如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...
随机推荐
- 大数据系列博客之 --- 深入简出 Shell 脚本语言(提升篇)
首先声明,此系列shell系列博客分为四篇发布,分别是: 基础篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cn ...
- 基于zepto的移动端轻量级日期插件
前言 做过移动Web开发的同学都知道,移动端日期选择是很常见的需求.在PC端,我们有很丰富的选择,比较出名的就有Mobiscroll和jQuery UI Datepicker.个人看来,这些插件存在的 ...
- OpenStack容器网络项目Kuryr(libnetwork)
转:https://www.aliyun.com/jiaocheng/518375.html 摘要:容器近几年非常流行,有很多项目都考虑将容器与SDN结合.Kuryr就是其中一个项目.Kuryr项目在 ...
- ECS——CentOS7下使用yum安装MariaDB
CentOS 6 或早期的版本中提供的是 MySQL 的服务器/客户端安装包,但 CentOS 7 已使用了 MariaDB 替代了默认的 MySQL.MariaDB数据库管理系统是MySQL的一个分 ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
- Android日志工具的使用
一.使用Android的日志工具Log 1.Android中的日志工具类是Log,这个类中提供了如下5个方法来供我们打印日志. log.v():用于打印哪些最为繁琐.意义最小的日志信息.对应级别ver ...
- APP支付宝支付接入
1.app支付简介 买家可以在手机,掌上电脑等无线设备的应用程序内,通过支付宝(支付宝app或网页版支付宝)付款购买商品,且资金实行实时到账. 2.申请条件 1.申请前必须拥有经过实名认证的支付宝账户 ...
- PHP 实现 word/excel/ppt 转换为 PDF
前段时间负责公司内部文件平台的设计,其中有一个需求是要能够在线浏览用户上传的 office 文件. 我的思路是先将 office 转换成 PDF,再通过 pdf.js 插件解析 PDF 文件,使其能在 ...
- 【面试 redis】【第十二篇】redis的相关面试问题
redis的相关面试问题 redis教程:http://www.redis.net.cn/tutorial/3501.html ==================================== ...
- 在DevExpress程序中使用内置的图标构建美观的界面元素【转】
https://www.cnblogs.com/wuhuacong/p/6217012.html 在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及 ...