原生js弹幕实现范例

  1. <!doctype html>  
  2. <html lang="en">  
  3.  <head>  
  4.   <meta charset="UTF-8">  
  5.   <meta name="Generator" content="EditPlus®">  
  6.   <meta name="Author" content="natural_live">  
  7.   <meta name="Keywords" content="barrage">  
  8.   <meta name="Description" content="">  
  9.   <title>弹幕</title>  
  10.   <style>  
  11.     *{margin:0;padding:0;}  
  12.   
  13.     #barrage{  
  14.         margin:auto;  
  15.         margin-top:50px;  
  16.         position:relative;  
  17.         width:800px;  
  18.         height:400px;  
  19.         background:#fff;  
  20.         border:2px solid #ffcc00;  
  21.     }  
  22.   
  23.     #barrage div{  
  24.         width:100%;  
  25.         height:20px;  
  26.         line-height:20px;  
  27.         position:absolute;  
  28.     }  
  29.   
  30.     #btn{  
  31.         margin:auto;  
  32.         margin-top:30px;  
  33.         height:50px;  
  34.         width:300px;  
  35.     }  
  36.     #text{  
  37.         font-size:20px;  
  38.         height:30px;  
  39.         border-radius:4px;  
  40.         border:1px solid #c8cccf;  
  41.         color:#6a6f77;  
  42.     }  
  43.     #submit{  
  44.         padding:7px;  
  45.         font-size:14px;  
  46.         height:30px;  
  47.         border-radius:4px;  
  48.         border:1px solid #c8cccf;  
  49.     }  
  50.   </style>  
  51.  </head>  
  52.  <body>  
  53.     <div id="barrage"></div>  
  54.     <div id="btn">  
  55.         <input type="text" id="text"></input>  
  56.         <input type="button" id="submit" value="发送"></input>  
  57.     </div>  
  58.     <script>  
  59.         var timer=null;  
  60.         var current=[];//存储当前输入框的内容  
  61.         var newarr=[];//存储每个弹幕距左边框的距离  
  62.         var flag=0;//标志量  
  63.         var num=new Array();//数组,用来存储划分每个块的序号  
  64.         //var t=12;  
  65.         var words = ["富强","民主","文明","和谐","自由","平等","公正","法治","爱国","敬业","诚信","友善"];  
  66.         function $(id){  
  67.             return document.getElementById(id);  
  68.         }  
  69.         for(var i=0;i<$("barrage").offsetHeight/20 - 1;i++){  
  70.             num.splice(i,0,i);//将整个显示框划分成多个块,并对每个块进行标号  
  71.             //console.log(num)  
  72.         }  
  73.         //console.log(num)  
  74.         //console.log(num.length)  
  75.   
  76.         window.onload = function(){//加载页面发生的事件  
  77.   
  78.             clearInterval(timer);//清除定时器  
  79.             for(var i = 0;i<10;i++){  
  80.                 setTimeout(function(){  
  81.                     var word=words[random(0,words.length-1)];//随机产生一个弹幕的内容  
  82.                     create(word);//创建一个弹幕  
  83.                 },100*random(10,100))//给弹幕随机加一个延迟  
  84.                   
  85.             }  
  86.             timer=setInterval(move,20);//开启定时器  
  87.         }  
  88.   
  89.         function create(w){//创建一个弹幕  
  90.                 var node=document.createElement("div");//创建一个div元素,用来存储弹幕的信息  
  91.                 //console.log(words.length)  
  92.                 node.innerHTML=w;  
  93.                 //console.log($("barrage").offsetHeight)  
  94.                 var trandom(0,num.length-1);  
  95.                 //console.log(num)  
  96.                 node.style.top=num[t]*20+"px";//从划分的块中随机选中一块。  
  97.                 Delete(num[t]);//删除已被选中的块  
  98.                 //console.log(t)  
  99.                 //console.log(node.style.top);  
  100.                 node.style.left="800px";  
  101.                 node.style.color="#"+randomColor();//随机颜色  
  102.                 $("barrage").appendChild(node);//插入子节点  
  103.                 flag++;//创建了一个新弹幕时,更新为0  
  104.                   
  105.                 //console.log(node.offsetLeft)  
  106.         }  
  107.   
  108.         function move(){  
  109.             var arr=$("barrage").getElementsByTagName("div");//获取所有的弹幕  
  110.             for(var i=0;i<arr.length;i++){  
  111.                 newarr.push(arr[i].offsetLeft);//将每个弹幕距左边边框的距离分别存储在newarr数组中  
  112.                 arr[i].style.left=newarr[i]+"px";//更新距离  
  113.                 newarr[i] = newarr[i] - 2;//每次减少2px  
  114.                 if(newarr[i]<0){  
  115.                     //console.log(arr[i].innerHTML)  
  116.                     if(currentTest(arr[i].innerHTML) && flag != 0){//当是从输入框发送的弹幕时而且是第一次时,将内容添加到预备的词库中,并删除这个div元素。这么做是为了将弹幕数量维持在一定数量,防止在输入框发送大量弹幕,导致出现错误。  
  117.                         //console.log(current)  
  118.                         words.push(arr[i].innerHTML);  
  119.                         $("barrage").removeChild(arr[i]);  
  120.                         newarr.splice(i,1);//在newarr中删除这个div  
  121.                         flag--;  
  122.                     }else{//当弹幕到达最左边时,弹幕内容再次随机,同时,将这个块加入到预选块中,并在预选块中随机再选一个,颜色也再次随机,这样就保持块的数量不变。  
  123.                         newarr[i]=800;  
  124.                         //console.log(parseInt(arr[i].style.top))  
  125.                         //console.log(arr[i].style.top/20)  
  126.                         arr[i].innerHTML=words[random(0,words.length-1)];  
  127.                         num.splice(num.length,0,parseInt(arr[i].style.top)/20);  
  128.                           
  129.                           
  130.                         var trandom(0,num.length);  
  131.                         arr[i].style.top=num[t]*20+"px";  
  132.                         Delete(num[t]);  
  133.                         //console.log(num)  
  134.                         //console.log(node.style.top);  
  135.                         arr[i].style.left="800px";  
  136.                         arr[i].style.color="#"+randomColor();  
  137.                     }  
  138.                 }  
  139.             }  
  140.         }  
  141.   
  142.         $("submit").onclick=function(){//输入款发送弹幕  
  143.             create($("text").value);  
  144.             current[current.length]=$("text").value;  
  145.             //console.log(current)  
  146.             $("text").value="";  
  147.         }  
  148.         //console.log(num)  
  149.         function Delete(m){//从预选块中删除已被选择的块  
  150.             for(var i = 0;i < num.length;i++){  
  151.                 if(num[i] == m){  
  152.                     //console.log(m)  
  153.                     num.splice(i,1);  
  154.                 }  
  155.             }  
  156.         }  
  157.   
  158.         function currentTest(m){  
  159.             var fl=false;  
  160.             for(var i = 0;i < current.length;i++){  
  161.                 if(current[i] == m){  
  162.                     //console.log(m)  
  163.                     current.splice(i,1);  
  164.                     fl=true;  
  165.                 }  
  166.             }  
  167.             return fl;  
  168.         }  
  169.   
  170.         function randomColor(){//随机颜色  
  171.             var color=Math.ceil(Math.random()*16777215).toString(16);  
  172.   
  173.             while(color.length < 6){  
  174.                 color = "0" + color;  
  175.             }  
  176.             return color;  
  177.         }  
  178.   
  179.         function random(m,n){//随机在m、n之间的整数  
  180.             return Math.round(Math.random()*(n - m)) + m;  
  181.         }  
  182.     </script>  
  183.  </body>  
  184. </html>  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值