QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2474|回复: 0

[HTML/CSS/JS] 利用原生js模拟直播弹幕滚动效果

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-7-14 22:34:35 | 显示全部楼层 |阅读模式
1、基本原理0 T. t& Y; _2 C3 b% U
       首先将直播区域分成十份(为了便于计算分成十份),将输入的内容随机放到分成的十份区域中,插入到十份区域右边的视图之外,然后调用动画,按照随机的速度从右向左移动,当移动到左侧区域视图之外移除此滚动元素。9 K. b: G- K( O  j! \- [6 ?9 y
2、具体代码' c  l; W: |$ l
  1. <div class="move_video_content">
  2.     <div class="video_content">
  3.         <div class="video_div" id="video_view"></div>
  4.         <div class="scroll_content">
  5.             <ul class="scroll_ul" id="scroll_ul_id"></ul>
  6.         </div>
  7.     </div>
  8.     <div class="input_content">
  9.             <input type="text" class="input_text" maxlength="30" placeholder="请输入要发送的弹幕" id="input_text_id">
  10.             <button type="button" class="button_btn" id="send_btn">发送</button>
  11.     </div>
  12. </div>
具体效果如下:
4 S, |1 P, k! k$ Y5 C! Y& v+ q9 G! l* { 1.jpg
* S! o! y. N5 O# P  v! {' ajs代码如下:
$ z& N: L+ s. {3 V$ O
  1. let inputText = document.getElementById("input_text_id");//input输入框
  2. let scrollContent = document.getElementById("scroll_ul_id");//侧边聊天栏
  3. let videoView = document.getElementById("video_view");//视频区域
  4. let videoWidth = videoView.offsetWidth;//直播区域的总宽度
  5. let listHeight = videoView.offsetHeight/10;//每一层直播区域的高度
  6. let listTopNum = [0,1,2,3,4,5,6,7,8,9];//将直播区域的高度分成10层
  7. document.getElementById("send_btn").addEventListener("click",function(){//监听发送按钮
  8.     let value = inputText.value;//获取输入框的值
  9.     if(!value) return;
  10.     appendDom(value);//将输入框的值插入到滚动聊天中
  11.     createVideoBulletChatDom(value);//将输入框的值插入到弹幕中
  12.     inputText.value = '';//清空输入框
  13.     scrollContent.scrollTop = scrollContent.scrollHeight;//自动滚动到底部
  14. })
  15. function appendDom(value){//将输入框的值插入到滚动聊天中
  16.     let li = document.createElement("li");
  17.     li.setAttribute("class","scroll_li");
  18.     li.innerHTML = value;
  19.     scrollContent.appendChild(li);
  20. }
  21. let speedArr = ['normal','fast','faster'];
  22. function createVideoBulletChatDom(value){//将输入框的值插入到弹幕中
  23.     let num = listTopNum[Math.floor((Math.random()*listTopNum.length))];
  24.     let p = document.createElement("p");
  25.     p.setAttribute("class","video_p");
  26.     p.style.top = (num * 60) + "px";
  27.     p.style.left = videoWidth + "px";
  28.     p.innerHTML = value;
  29.     videoView.appendChild(p);
  30.     let speed = speedArr[Math.floor((Math.random()*speedArr.length))];
  31.     Animate(p,speed);//滚动动画
  32. }
  33. let animateType = {
  34.     'normal':5,
  35.     'fast':10,
  36.     'faster':15
  37. }
  38. function Animate(dom,speed){//滚动动画
  39.     let domWidth = dom.offsetWidth;//当前弹幕元素的宽度
  40.     let distance = videoWidth;//直播区域的总宽度
  41.     speed ? speed : 'normal';
  42.     let interval = animateType[speed]
  43.     let timer = setInterval(function(){
  44.             distance -= interval;
  45.             dom.style.left = distance + 'px';
  46.             if(distance <= -domWidth){
  47.                 clearInterval(timer);
  48.                 videoView.removeChild(dom);//清除已经滚动出屏幕的标签
  49.             }
  50.     },50)
  51. }
     根据直播区域分成的十份(listTopNum),获取每一层区域的高度(listHeight),然后改变滚动标签的top实现插入到十份中的不同区域。
; U; [( ^! N! @( F1 R4 V: c       创建一个滚动标签就创建一个滚动动画(函数Animate),默认速度是normal,每次创建动画都会随机传入一个随机速度类型(normal、fast、faster),按照传入的速度类型来改变每次滚动减去的距离大小,实现不同的滚动速度
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-21 22:54

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表