js实现弹幕(原创)

弹幕是一个很常见的功能,下面是本人封装的一个小小的实现方案,存在不足之处可以提出来或自由改进。

直接上代码:复制可运行

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
        <meta content="yes" name="apple-mobile-web-app-capable">
        <meta content="black" name="apple-mobile-web-app-status-bar-style">
        <meta content="telephone=no" name="format-detection">
        <meta content="email=no" name="format-detection">
        <meta name="full-screen" content="yes">
        <meta name="browsermode" content="application">
        <meta name="full-screen" content="yes">
        <meta name="browsermode" content="application">
        <meta name="x5-orientation" content="portrait">
        <title>js实现弹幕</title>

        <style>

            html,body{
                position: relative;
                width: 100%;
                max-width: 750px;
                margin: auto;
                height: 100%;
                background: #fff;
                overflow: hidden;
                font-family: SimSun,arial;
            }

            .tmBox{
                width: 100%;
                height: 16rem;
                background: #5e907b;
                position: relative;
            }

            .btn{
                display: block;
                margin: auto;
                margin-top: 20px;
                width: 100px;
                height: 40px;
                outline: none;
            }

            .tmItem{
                position: absolute;
                width: auto;
                height: auto;
                padding:4px;
            }

            .tmItem.runTm{
                animation: runTmEfe 4s linear 0s 1 alternate;
                animation-fill-mode: backwards;
            }

            @keyframes runTmEfe{
                from{transform: translateX(18.75rem);}
                to{transform: translateX(-100%);}
            }

        </style>

    </head>
    <body>

        <div class="tmBox">

        </div>

        <button class="btn start">开启弹幕</button>
        <button class="btn stop">停止弹幕</button>
        <button class="btn pause">暂停画面</button>
        <button class="btn resume">恢复弹幕</button>
        <button class="btn send">发射弹幕</button>

        <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.js" ></script>

        <script>

            //根字体设置
            function setHtmlFontSize(){
                var w = document.documentElement.clientWidth;

                if(w > 750){
                    w = 750;
                }

                var fz = w * 20 / 375;
                document.getElementsByTagName(‘html‘)[0].style.fontSize = fz + ‘px‘;
            }

            //实时根据屏宽来适应字体
            setHtmlFontSize();
            window.onresize = function(){
                setHtmlFontSize();
            }

            //获取不重复随机数列
            function getOrder(start, end){
                var len = end - start + 1;
                var myorder = new Array();
                var index = 0;

                while (index < len) {
                  var flag = true;
                  var num = parseInt(Math.floor(Math.random() * len) + start);
                  for (var i = 0; i < myorder.length; i++) {
                    if (myorder[i] == num) {
                      flag = false;
                      break;
                    }
                  }
                  if (flag) {
                    myorder[index] = num;
                    index++;
                  }
                }

                return myorder;
            }

            //弹幕的设置
            var tmEntity={
                //弹幕内容
                tmList:[
                    ‘测试弹幕01‘,
                    ‘测试弹幕02‘,
                    ‘测试弹幕03‘,
                    ‘测试弹幕04‘,
                    ‘测试弹幕05‘,
                    ‘测试弹幕06‘,
                    ‘测试弹幕07‘,
                    ‘测试弹幕08‘,
                    ‘测试弹幕09‘,
                    ‘测试弹幕10‘
                ],
                //弹幕列表上限
                tmMaxLines:10,
                //弹幕行数
                tmRows:10,
                //初始弹幕索引
                initIndex:0,
                //弹幕过度时间 s
                tmTranstionTime:0.4,
                //屏幕宽度
                swidth:document.documentElement.clientWidth,
                //弹幕循环
                isRunTm:true,
                //弹幕父容器class
                tmFatherClass:".tmBox",
                //弹幕class
                tmClass:".tmItem",
                //弹幕高度
                tmHeight:$(".tmBox").height() / 10,
                //屏中最低弹幕数
                screenTmNum:7
            }

            console.log(tmEntity);

            var rowsOrder=getOrder(0,tmEntity.tmRows-1);
            var timeOrder=getOrder(0,tmEntity.tmRows-1);

            //添加弹幕
            function addTm(item,i,max){
                var obj="<div class=‘"+tmEntity.tmClass.replace(‘.‘,‘‘)+" runTm‘ style=‘transform: translateX("+tmEntity.swidth+"px);animation-delay:"+(timeOrder[timeOrder.length-1]*tmEntity.tmTranstionTime)+"s;top:"+(rowsOrder[rowsOrder.length-1] * tmEntity.tmHeight)+"px‘>"+item+"</div>";
                $(tmEntity.tmFatherClass).append(obj);
                //addListenerStart($(tmEntity.tmClass).eq(tmEntity.initIndex));
                addListenerEnd($(tmEntity.tmClass).eq(tmEntity.initIndex));
                tmEntity.initIndex++;

                //校验行
                rowsOrder.pop();
                if(rowsOrder.length==0){
                    rowsOrder=getOrder(0,tmEntity.tmRows-1);
                }

                timeOrder.pop();
                if(timeOrder.length==0){
                    timeOrder=getOrder(0,tmEntity.tmRows-1);
                }
            }

            function addListenerEnd(el){
                el.on("animationend webkitAnimationEnd", function(){
                    el.remove();
                    tmEntity.initIndex--;
                    if(tmEntity.isRunTm && $(tmEntity.tmFatherClass+" "+tmEntity.tmClass).length <= tmEntity.screenTmNum){
                        initTm(tmEntity.tmList);
                    }
                });
            }

            function addListenerStart(el){
                el.on("animationstart webkitAnimationStart", function(){

                });
            }

            function initTm(list){
                for(var i=0;i<list.length;i++){
                    addTm(list[i],i,list.length);
                }
            }

            //开始弹幕
            function startTmRun(){
                initTm(tmEntity.tmList);
                tmEntity.isRunTm = true;
            }

            //停止产生弹幕
            function stopTmRun(){
                tmEntity.isRunTm = false;
            }

            //暂停弹幕
            function pauseTmScreen(){
                $(tmEntity.tmClass).css({"WebkitAnimationPlayState":"paused","AnimationPlayState":"paused"});
            }

            //继续弹幕
            function resumeTmScreen(){
                $(tmEntity.tmClass).css({"WebkitAnimationPlayState":"running","AnimationPlayState":"running"});
            }

            //发射单条弹幕
            function sendTm(str){
                var str=str+(Math.floor(Math.random()*(tmEntity.tmMaxLines-1+1)+1));
                tmEntity.tmList.push(str);

                if(tmEntity.tmList.length > tmEntity.tmMaxLines){
                    tmEntity.tmList.splice(0,tmEntity.tmList.length-tmEntity.tmMaxLines);
                    console.log(tmEntity.tmList);
                    console.log(tmEntity.tmList.length);
                }

            }

            $(".btn.start").click(function(){
                startTmRun();
            })

            $(".btn.pause").click(function(){
                pauseTmScreen();
            })

            $(".btn.resume").click(function(){
                resumeTmScreen();
            })

            $(".btn.stop").click(function(){
                stopTmRun();
            })

            $(".btn.send").click(function(){
                sendTm("最帅的南哥");
            })

        </script>

    </body>
</html>

效果如图:

点击开启弹幕按钮:

原文地址:https://www.cnblogs.com/nanyang520/p/11290751.html

时间: 2024-11-13 07:20:25

js实现弹幕(原创)的相关文章

js实现弹幕效果

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>js实现弹幕效果</title> <style> #play { width: 600px; height: 500px; background-color: #000; } /*方便js获取高度*/ #danmu{ width:600px

JS代码站原创DEDECMS教程插件系列

dedecms插件系列 DEDECMS防盗链插件,DEDECMS隐藏真实下载地址插件 dedecms使用ajax实现搜索下拉提示功能 dedecms使tag标签生成静态插件 DEDECMS发布或修改文章同步更新到腾讯微博插件 DEDECMS发布或修改文章同步更新到腾讯微博插件 DEDECMS留言薄后台功能增强(带回复功能) dedecms文章按日期归档插件-伪静态版本 DEDECMS5.7SP1中文验证码插件 [原创]DEDECMS后台查询文章在百度是否收录插件 给DEDECMS留言本增加新留言

js红皮书总结(原创)--markdown格式

2017-09-21 第一章 js简介

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=""&

js利用节点,封装函数进行简单弹幕制作

js简单弹幕制作(注:简单弹幕从右向左执行,除了数字字母之外,汉字执行会出现出框是排列向下成一排清空状态(如下图),不必担心,简单弹幕的问题 后续有说明和解决方案). 思路: 1.在输入框内输入值显示在显示区域里 2.发送完毕,输入框内清空 3.弹幕从右向左,且多行(可控) 4.性能优化处理(显示完毕清空弹幕,计时器) 效果图: 代码: <!DOCTYPE html><html> <head> <meta charset="UTF-8">

情人节送ta一朵独一无二的玫瑰

[情人节福利]JS实现玫瑰花 原创来自于博客http://www.romancortes.com/blog/1k-rose/ 中文版翻译于http://www.csdn.net/article/2012-02-09/311621 有增改 本文详细出自http://www.shiyanlou.com/courses/197  转载请注明出处. 前言 先放压缩过的html代码,把下段代码复制到你的新建的html文件用浏览器打开就能看到一个玫瑰.我们管它叫生产版好了,三步就能完成. 在文档的最后附上一

送ta一朵独一无二的玫瑰花

[情人节福利]JS实现玫瑰花 原创来自于博客 http://www.romancortes.com/blog/1k-rose/ 中文版翻译于http://www.csdn.net/article/2012-02-09/311621 有增改 本文详细来自实验楼,如需转载请注明出处. 前言 不得不看的提示 先放压缩过的html代码,把下段代码复制到你的新建的html文件用浏览器打开就能看到一个玫瑰.我们管它叫生产版好了,三步就能完成. 在文档的最后附上一个简单的开发版本,供大家自行定制 :-) 情人

高性能之html

下面是alloyteam的总结,还是那句老话站在巨人的肩膀上看的远. 避免使用Iframe Iframe也叫内联frame,可以把一个HTML文档嵌入到另一个文档中.使用iframe的好处是被嵌入的文档可以完全独立于其父文档,凭借此特点我们通常可以使浏览器模拟多线程,需要注意的是使用iframe并不会增加同域名下的并行下载数,浏览器对同域名的连接总是共享浏览器级别的连接池,即使是跨窗口或跨标签页,这在所有主流浏览器都是如此.也因为这样这让iframe带来的好处大打折扣. 在页面加载过程中ifra

前端常用插件、工具类库汇总(下)

前言 对本文感兴趣可以先加个收藏,也可以转发分享给身边的小伙伴,以后遇到类似的场景就来看看具体的插件及其用法. 上一篇<前端常用插件.工具类库汇总(上)>内容摘要: " 动画库 滚动库 轮播图 滚屏 弹出框 消息通知 下拉框 级联选择器 颜色选择器 时间日期处理 表单验证 分页插件 " >>前端常用插件.工具类库汇总(上) 本篇延续上一篇的内容继续给大家带来一系列关于前端插件.工具类的内容. 富文本编辑器 wangEditor http://www.wanged