zoukankan      html  css  js  c++  java
  • 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,
                    //屏幕宽度
                    sdocument.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>

    效果如图:

    点击开启弹幕按钮:

  • 相关阅读:
    11 Apr 18 类与对象 对象的使用 一切皆对象
    10 Apr 18 项目构架 hashlib模块 subprocess模块 configparser模块 面向对象的编程 类与对象
    9 Apr 18 shelve模块 xml模块 re模块
    8 Apr 18 包的使用 常用模块
    定义一个Student类,包含名字一个数据成员,定义无参构造函数、有参构造函数、拷贝构造函数、析构函数及对于名字的封装函数,在main函数中实例化Student对象,并访问相关函数,观察运行结果。
    皮马印第安人糖尿病数据集免费下载分享
    机器学习之模型训练(二)皮马印第安人糖尿病数据集
    anaconda的虚拟环境sklearn中如何安装pandas
    人工智能之模型评估之参数选择
    人工智能之模型评估之数据分离
  • 原文地址:https://www.cnblogs.com/nanyang520/p/11290751.html
Copyright © 2011-2022 走看看