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>
时间: 2024-07-28 12:36:37

JS原生实现视频弹幕Demo(仿)的相关文章

仿jQuery的siblings效果的js原生代码

仿jQuery的siblings效果的js原生代码 <previousSibling> 属性返回选定节点的上一个同级节点(在相同树层级中的前一个节点). <nextSibling> 属性返回被选节点的下一个同级节点(在相同树层级中的下一个节点). 如果不存在这样的节点,则该属性返回 null.//元素节点的节点类型是 1  obj.previousSibling.nodeType ==1; reverse() 方法用于颠倒数组中元素的顺序. push() 方法可向数组的末尾添加一个

java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid??数据库连接池??阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势D 集成安全权限框架shiro??Shiro 是一个用 Java 语言

Canvas + WebSocket + Redis 实现一个视频弹幕

原文出自:https://www.pandashen.com 页面布局 首先,我们需要实现页面布局,在根目录创建 index.html 布局中我们需要有一个 video 多媒体标签引入我们的本地视频,添加输入弹幕的输入框.确认发送的按钮.颜色选择器.字体大小滑动条,创建一个 style.css 来调整页面布局的样式,这里我们顺便创建一个 index.js 文件用于后续实现我们的核心逻辑,先引入到页面当中. HTML 布局代码如下: <!-- 文件:index.html --> <!DOC

图片轮播(左右切换)--js原生和jquery实现

图片轮播(左右切换)--js原生和jquery实现 左右切换的做法基本步骤跟 上一篇文章  淡入淡出 类似,只不过修改了一些特定的部分 (1)首先是页面的结构部分 对于我这种左右切换式 1.首先是个外围部分(其实也就是最外边的整体wrapper) 2.接着就是你设置图片轮播的地方(也就是一个banner吧) 3.然后是一个图片组(可以用新的div 也可以直接使用 ul-->li形式) 4.然后是图片两端的左箭头和右箭头5.然后是一个透明背景层,放在图片底部 6.然后是一个图片描述info层,放在

使用jQuery.makeArray() 将多种类型转换成JS原生Array

jQuery.makeArray(obj)这个函数从名字上来看很容易猜出它的用途:应该是用来将传入的对象转换成一个原生array 再看看官网上对它的解释:Convert an array-like object into a true JavaScript array.(将一个类似数组对象转换为JS原生的数组) 那么怎么样的object才可以称为"array-like object"呢?这个问题不急着回答,相信看完文章你会明白的,先看看下面的实验 将HTMLCollection转换成原

Js原生Ajax和Jquery的Ajax

一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死 2.Ajax的运行原理 页面发起请求,会将请求发送给浏览器内核中的Ajax引擎,Ajax引擎会提交请求到服务器端,在这段时间里,客户端可以任意进行任意操作,直到服务器端将数据返回给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面1 功能. 二

认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法

(一)认识JQuery  JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法    JQuery的主旨:以更少的代码,实现更多的功能 (二)JQuery的优势 1)可以像CSS一样访问和操作DOM 2)修改CSS控制页面外观 3)简化JS代码操作 4)事件代理更加容易 5)动画效果使用方便 6) Ajax技术更加完美 7)大量的基于Jquery的插件 8)可以自定义扩展功能插件 (三)JQuery的语法 格式:$(selector).actio

JS原生Ajax请求

摘录一个JS原生Ajax请求行为,原文地址:http://caibaojian.com/ajax-jsonp.html ajax({ url: "./TestXHR.aspx", //请求地址 type: "POST", //请求方式 data: { name: "super", age: 20 }, //请求参数 dataType: "json", success: function (response, xml) { //

js原生offsetParent解析

offsetParent是个只读属性,返回最近显示指定位置的容器元素的引用.如果元素没有指定位置,最近的元素或者根元素(标准模式下是html,怪异模式下是body)就是offsetParent.当元素的style.display='none'时,offsetParent返回null.由于offsetTop和offsetLeft是相对于页边距,因此offsetParent是非常有用的. 浏览器兼容性 在以WebKit为核心的浏览器上,如果元素是隐藏的(该元素或者上级元素style.display=