JavaScript 实现弹幕滚动效果完整教程

作者:纸飞机时间:2026-10-24 06:36:10浏览:639

本文详细解析如何使用 JavaScript 和 CSS 实现网页弹幕滚动效果。内容涵盖界面布局、随机颜色生成、弹幕数据管理以及基于定时器与 jQuery 的动画控制逻辑,提供完整的静态页面、样式及脚本代码示例,帮助开发者快速掌握弹幕功能的实现细节。

JS 弹幕滚动特效实现代码与逻辑解析

本文分享了一个使用 JavaScript 实现弹幕滚动效果的具体代码示例,供读者参考学习。

功能需求与界面元素设计

1.首先需要明确弹幕墙的功能需求:包含一面显示墙、一个输入框、一个发射按钮,以及一个兼具开启和关闭弹幕功能的切换按钮; 2.弹幕生成后需要在墙面上执行从右向左的水平移动动画,当弹幕完全移出墙面左侧边界时,该条弹幕元素应当被移除; 3.基本实现逻辑为:用户在输入框中输入文字并点击发送按钮后,程序在墙面上动态创建一个新的div元素以包裹该条弹幕内容,并为其添加相应的CSS移动动画类名。

弹幕移动逻辑与 DOM 操作

其次,弹幕在显示后需要执行从右向左的滚动动画。当某条弹幕完全移出屏幕左侧边界时,该条目的 DOM 节点应当被移除。初步思路是:当用户在输入框中键入内容并点击发送按钮时,程序会在容器内动态创建一个新的 div 元素来承载该条弹幕,并为其添加相应的移动动画样式类。

随机颜色生成与间隔控制

此外,每条弹幕的颜色应当是随机生成的,且同一时刻屏幕上存在的多条弹幕之间需保持垂直方向的间隔,避免重叠遮挡。


"#"+(Math.random()*0x1000000<<0).toString(16)

关于随机颜色的获取,代码中使用了特定的数学计算方式生成十六进制颜色值。

静态页面结构实现


<!--墙-->
<h1>弹幕墙</h1>
<div id="container">

</div>
<!--弹幕发送关闭-->
<div class="s_c">
  <input id="message" type="text" placeholder="说点什么">
  <div class="btn">
    <button id="sent">发射弹幕</button>
    <button id="clear">关闭弹幕</button>
  </div>
</div>

在编写逻辑前,首先构建静态页面结构。

CSS 样式布局定义


#container{
  /*width:700px;*/
  height:500px;
  margin:50px 100px;
  border:solid 2px #7a2a1d;
}
h1{
  text-align:center;
}
.s_c{
  width:500px;
  margin:0 auto;
}
#message{
  width:400px;
  height:30px;
  margin:0 auto;
  position:relative;
  left:50px;
}
.btn{
  padding-top:20px;
  height:30px;
  margin-left:150px;
}
#sent,#clear{
  width:100px;
}

接下来定义 CSS 样式,用于控制容器、输入框及按钮的布局与外观。

JavaScript 交互与动画逻辑


var arr = [];//用于保存弹幕数据的数组;
var start = true;//用于判断是否需要开启弹幕
  $(document).ready(function(){
    var showscreen = $("#container");//弹幕墙的div
    var showHeight = showscreen.height();//弹幕墙div的高度
    var showWidth = showscreen.width();//弹幕墙div的宽度
    //点击发射按钮事件
    $("#sent").click(function(){
      var text = $("#message").val();//获取用户输入的待发送弹幕
      $("#message").val("");//清空弹幕发送区
      arr.push(text);//将数据存入实现定义好的用于保存弹幕数据的数组
      var send_div=$("<div>"+text+"</div>");
      showscreen.append(send_div);
      // var send_text=$("<div>+text+</div>");//新建div弹幕条
      // var send_div = document.createElement("div");
      // var inner = document.createTextNode(text);
      // send_div.appendChild(inner);
      // document.getElementById("container").appendChild(send_div)//把弹幕挂在墙上
      move_text(send_div);
    })
    //按回车发送
     $("input").keydown(function(event){
       if(event.keyCode == 13){
         $("#sent").trigger("click");//trigger触发被选元素的指定事件类型,触发#send事件的click类型
       }
     })

     if(start==false){
       start = true;
       $("#clear").html("关闭弹幕");
       run();
     }
     //关闭/开启弹幕按钮点击事件
    $("#clear").click(function(){
      if(start == true){
        start = false;
        $("#clear").html("开启弹幕");
        showscreen.empty();
      }else if(start == false){
        start = true;
        $("#clear").html("关闭弹幕");
        run()
      }
    });
     var topMin = showscreen.offset().top;
     var topMax = topMin+showHeight;
     var top = topMin;
     var move_text = function(obj){
       obj.css({
         display:"inline",
         position:"absolute"
       })
       var begin = showscreen.width() - obj.width(); //一开始的起点
       top+=50;

       if(top > topMax-50){
         top = topMin;
       }
       //console.log("showscreenWidth"+showscreen.width());
       //console.log("objWidth",obj.width());

       obj.css({
         left:begin,
         top:top,
         color:getRandomColor()
       });

       var time = 20000 + 10000*Math.random();
       obj.animate({
         left:"-"+begin+"px"
       },time,function(){
         obj.remove();
       });
     };
    var getRandomColor = function(){
      return '#'+('00000'+(Math.random()*0xffffff <<0).toString(16)).substr(-6);
    }

    var run = function(){
      if(start == true){
        if(arr.length > 0){
          var n = Math.floor(Math.random()* arr.length + 1)-1;
          var textObj = $("<div>"+arr[n]+"</div>");
          showscreen.append(textObj);
          //console.log("loop:"+textObj.html());
          move_text(textObj);
        }
      }
      setTimeout(run,3000);
    }

    jQuery.fx.interval = 50;
    run();
})

最后是核心的 JavaScript 代码实现部分,负责处理交互与动画逻辑。

作者最新文章