本文详细解析如何使用 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 代码实现部分,负责处理交互与动画逻辑。