小程序刚刚出来,现在网上的demo是多,但是要找到一个自己需要的却不容易。今天跟大家分享自己写的一个弹幕功能。

先来一张效果图:

我的思路是这样的,先用<switch>标签确定是否打开弹幕,若打开弹幕则出现弹幕文本框和发射按钮,还有弹幕遮罩层。

先贴wxml和wxss代码。

wxml代码如下:

  1. <!-- pages/index/index.wxml -->
  2. <swiper indicator-dots="{{indicatorDots}}"
  3. autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
  4. <block wx:for="{{imgUrls}}" wx:key="unique">
  5. <swiper-item>
  6. <image src="{{item}}" class="slide-image"/>
  7. </swiper-item>
  8. </block>
  9. </swiper>
  10.  
  11. <!--弹幕开关-->
  12. <view class="barrage-Switch" style="color:{{barrageTextColor}};">
  13. <switch id="switch_" bindchange="barrageSwitch"/>
  14. <text>弹幕</text>
  15. </view>
  16.  
  17. <!--弹幕输入框-->
  18. <view class="barrage-inputText" style="display:{{barrage_inputText}}">
  19. <view class="barrage-input">
  20. <input bindblur="bind_shoot" value="{{bind_shootValue}}"/>
  21. </view>
  22. <view class="barrage-shoot">
  23. <button class="shoot" size="mini" bindtap="shoot">发射</button>
  24. </view>
  25. </view>
  26.  
  27. <!--弹幕上单文字-->
  28. <view class="barrage-fly" style="display:{{barragefly_display}}">
  29. <block wx:for="{{barrage_style}}" wx:key="unique">
  30. <text class="barrage-textFly" style="color:{{item.barrage_shoottextColor}};left:{{item.barrage_phoneWidth}}px;top:{{item.barrageText_height}}px;">{{item.barrage_shootText}}</text>
  31. </block>
  32. </view>

wxss代码如下:

  1. /* pages/index/index.wxss */
  2. .slide-image{
  3. width: 100%;
  4. }
  5.  
  6. /* 弹幕选择按钮的操作*/
  7. .barrage-Switch{
  8. position: absolute;
  9. bottom: 10px;
  10. right: 10px;
  11. z-index:;
  12. }
  13.  
  14. /* 弹幕输入框的操作*/
  15. .barrage-inputText{
  16. position: absolute;
  17. display: flex;
  18. background-color: #BFBFBF;
  19. width: 100%;
  20. height: 40px;
  21. flex-direction: row;
  22. nav-index:;
  23. justify-content: center;
  24. align-items: center;
  25. bottom: 10%;
  26. }
  27. .barrage-input{
  28. background-color: greenyellow;
  29. width: 60%;
  30. height: 30px;
  31. }
  32. .barrage-shoot{
  33.  
  34. margin-left: 10px;
  35. width: 25%;
  36. height: 30px;
  37. }
  38. .shoot{
  39. width: 100%;
  40. color: black;
  41. }
  42.  
  43. /*弹幕飞飞飞*/
  44. .barrage-fly{
  45. z-index:;
  46. height: 80%;
  47. width: 100%;
  48. position: absolute;
  49. top:;
  50. }
  51. .barrage-textFly{
  52. position: absolute;
  53.  
  54. }

这样基本的样式就都实现了。接下来要对弹幕上的字进行处理。

文字是从右往左移动,文字出现的位置top是随机,left则是取屏幕的宽度。移动的时候是用定时器进行处理。

还有就是字体的颜色是随机出现的。这些功能都是利用js处理的。

js的代码如下:

  1. var barrage_style_arr = [];
  2. var barrage_style_obj ={};
  3. var phoneWidth = 0;
  4. var timers = [];
  5. var timer ;
  6. Page({
  7. data: {
  8. imgUrls: [
  9. 'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg',
  10. 'http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg',
  11. 'http://img06.tooopen.com/images/20160818/tooopen_sy_175833047715.jpg'
  12. ],
  13. indicatorDots: true,
  14. autoplay: true,
  15. interval: 3000,
  16. duration: 500,
  17. barrageTextColor:"#D3D3D3",
  18. barrage_inputText:"none",
  19. barrage_shoottextColor:"black",
  20. bind_shootValue:"",
  21. barrage_style:[],
  22. barragefly_display:"none",
  23. },
  24.  
  25. // 生命周期函数--监听页面加载
  26. onLoad:function(options){
  27. var that = this;
  28. //获取屏幕的宽度
  29. wx.getSystemInfo({
  30. success: function(res) {
  31. that.setData({
  32. barrage_phoneWidth:res.windowWidth-100,
  33. })
  34. }
  35. })
  36. phoneWidth = that.data.barrage_phoneWidth;
  37. console.log(phoneWidth);
  38. },
  39.  
  40. //是否打开弹幕...
  41. barrageSwitch: function(e){
  42. console.log(e);
  43. //先判断没有打开
  44. if(!e.detail.value){
  45. //清空弹幕
  46. barrage_style_arr = [];
  47. //设置data的值
  48. this.setData({
  49. barrageTextColor:"#D3D3D3",
  50. barrage_inputText:"none",
  51. barragefly_display:"none",
  52. barrage_style:barrage_style_arr,
  53. });
  54. //清除定时器
  55. clearInterval(timer);
  56. }else{
  57. this.setData({
  58. barrageTextColor:"#04BE02",
  59. barrage_inputText:"flex",
  60. barragefly_display:"block",
  61. });
  62. //打开定时器
  63. timer= setInterval(this.barrageText_move,800)
  64. }
  65. },
  66.  
  67. //发射按钮
  68. shoot: function(e){
  69.  
  70. //字体颜色随机
  71. var textColor = "rgb("+parseInt(Math.random()*256)+","+parseInt(Math.random()*256)+","+parseInt(Math.random()*256)+")";
  72. // //设置弹幕字体的水平位置样式
  73. // var textWidth = -(this.data.bind_shootValue.length*0);
  74. //设置弹幕字体的垂直位置样式
  75. var barrageText_height = (Math.random())*266;
  76. barrage_style_obj = {
  77. // textWidth:textWidth,
  78. barrageText_height:barrageText_height,
  79. barrage_shootText:this.data.bind_shootValue,
  80. barrage_shoottextColor : textColor,
  81. barrage_phoneWidth:phoneWidth
  82. };
  83. barrage_style_arr.push(barrage_style_obj);
  84. this.setData({
  85. barrage_style:barrage_style_arr, //发送弹幕
  86. bind_shootValue:"" //清空输入框
  87. })
  88.  
  89. //定时器 让弹幕动起来
  90. // this.timer= setInterval(this.barrageText_move,800);
  91.  
  92. },
  93.  
  94. //定时器 让弹幕动起来
  95. barrageText_move: function(){
  96. var timerNum = barrage_style_arr.length;
  97. var textMove ;
  98. for(var i=0;i<timerNum;i++){
  99. textMove = barrage_style_arr[i].barrage_phoneWidth;
  100. console.log("barrage_style_arr["+i+"].barrage_phoneWidth----------:"+barrage_style_arr[i].barrage_phoneWidth);
  101. textMove = textMove -20;
  102. barrage_style_arr[i].barrage_phoneWidth = textMove;
  103. //走完的移除掉
  104. if(textMove<=-100){
  105. // clearTimeout(this.timer);
  106. barrage_style_arr.splice(0,1);
  107. i--;
  108. //全部弹幕运行完
  109. if(barrage_style_arr.length==0){
  110. this.setData({
  111. barrage_style:barrage_style_arr,
  112. })
  113. // clearInterval(this.timer);
  114. return;
  115. }
  116. }
  117. console.log("第"+i+"个定时器:",textMove);
  118. this.setData({
  119. barrage_style:barrage_style_arr,
  120. })
  121. }
  122.  
  123. },
  124.  
  125. //绑定发射输入框,将值传递给data里的bind_shootValue,发射的时候调用
  126. bind_shoot:function(e){
  127. this.setData({
  128. bind_shootValue:e.detail.value
  129. })
  130. },
  131.  
  132. })

因为刚刚接触小程序,所以对一些语句的使用都不是很了解。所以遇到了一些问题:

1、在js中获取wxml的控件的信息。

  js:

  1. barrageSwitch: function(e){
  2. console.log(e);
  3. }

  wxml:

  1. <switch id="switch_" bindchange="barrageSwitch"/>

结果:返回了一个objec.在控制台返回的类型好像都是json格式的数据。

  1. Object {type: "change", timeStamp: 2766, target: Object, currentTarget: Object, detail: Object}

2、在实现弹幕的时候,点击发射按钮,如何获取到输入框的信息。

在这,我是输入框失去焦点的时候,将数据复制给js中的data类,再点击发射的时候取data类中的值。

3、其中最大的问题是如何让文字跑起来,因为小程序不支持jQuery,让我这个js白痴有点无能为力。

在这说说自己让文字移动的思路:

首先,在打开弹幕的时候定义一个定时器,关闭的弹幕的时候把定时器给关掉。因为我是用数组来存储文字移动的样式,其他确定下来。我只要改变left的大小就可以让文字移动。所以我用for循环,当定时器运行的时候改变弹幕文字样式 left:xxx px;的大小。

接下来我会坚持写博客,每次学习一个新的技术都是参观别人的博客。在这里可以分享自己的一些成果,如果自己的内容可以在网上找到,就不会去花时间写了。

1、微信小程序----弹幕的实现(无后台)的更多相关文章

  1. 微信小程序腾讯云php后台解决方案

    微信小程序腾讯云php后台解决方案 微信小程序前段需要添加必要的文件以配合后端 (1)wafer2-client-sdk sdk提供了几种接口包括登陆,获取用户openid,图片上传等 (2)conf ...

  2. 微信小程序支付源码,后台服务端代码

    作者:尹华南,来自原文地址 微信小程序支付绕坑指南 步骤 A:小程序向服务端发送商品详情.金额.openid B:服务端向微信统一下单 C:服务器收到返回信息二次签名发回给小程序 D:小程序发起支付 ...

  3. 微信小程序开发(request请求后台获取不到data)

    1微信的request的post请求后台获取不到data(当初这个问题纠结了好久好久),原因是post传递的data是json格式而不是key,value的格式,所以获取不到相应的data就是post ...

  4. 微信小程序支付接口之Django后台

    本文链接:https://blog.csdn.net/qq_41860162/article/details/89098694Python3-django-微信小程序支付接口调用工具类生成一系列微信官 ...

  5. 微信小程序图片上传java后台(前后端代码)

    小程序代码 upload:function(e){ var that = this; wx.showActionSheet({ itemList: ['从相册选择','拍照'], itemColor: ...

  6. 微信小程序传code 拿token 后台报40029 状态吗,是为什么?

    看看是不是code用了两次,还有种可能,检查一下后台的appid

  7. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  8. 微信小程序计算器Bug版=-=(笔记)

    微信小程序计算器BUG版本 无APPID的测试号登录,先在app.json中更改路径,以及修改头部信息. 首先一个输入框字段用{{screenData}} 功能可以退格,清屏,正负号,正常操作加减乘除 ...

  9. 新手指南:顶象验证码如何接入微信小程序?

    自2017年小程序发布以来,经过4年的快速发展,小程序已然成为企业互联网布局不可或缺的一环.无论是互联网企业还是拥抱互联网的传统企业,无论是服务导向型企业还是产品导向型企业,小程序都为用户提供了一种轻 ...

随机推荐

  1. 动态添加Redis密码认证

    如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题. 本文描述一种可行的方案,适用于客户端使用了jedis连接池 ...

  2. MySql俩种分页区别(注意)

    注意俩个分页的区别哦~ SELECT * FROM city LIMIT 2 OFFSET 1; 从第二条记录开始 取二条记录 如下: SELECT * FROM city LIMIT 3,2; 从第 ...

  3. JDBC的批处理操作三种方式

    SQL批处理是JDBC性能优化的重要武器,批处理的用法有三种. package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import ...

  4. 写代码中遇到的问题(php接收不到传过来的json数据,php使用utf8的用法)

    今天写代码用python处理完数据,传给php服务器后,发现接收不到数据,因为是跨域,所以加了消息头:header('Access-Control-Allow-Origin:*');但是并没有什么卵用 ...

  5. python 算法 -- 冒泡排序

    python 排序算法 -- 冒泡排序 原理 从数组的底部开始, 两两比较大小, 小的在下,大的在上, 依次类推直到顶部. 当整个数组比较完毕, 则最上面的一定是最大值(此即冒泡的由来); 当第一轮比 ...

  6. thinkphp中find()和select()的区别

    1.find()是查找符合条件的第一条数据,返回的是一个一维数组: select()是查找符合条件的所有的数据,返回的是一个二维数组: 2.以下案例 $tech=M('techlevel','HR_C ...

  7. ASP.NET MVC5(五):身份验证、授权

    使用Authorize特性进行身份验证 通常情况下,应用程序都是要求用户登录系统之后才能访问某些特定的部分.在ASP.NET MVC中,可以通过使用Authorize特性来实现,甚至可以对整个应用程序 ...

  8. Linux终端类型

    unix是一个多用户多任务的操作系统.早期电脑昂贵,所以当时使用便宜的设备连接到电脑上(当时还没有键盘和显示器,使用纸带和卡片来输入输出)来使用操作系统,这个便宜的设备就是终端,也可以认为终端是一种控 ...

  9. 一个"Median Maintenance"问题

    题目要求: Download the text file here. The goal of this problem is to implement the "Median Mainten ...

  10. JavaScript中的栈及通过栈操作的实例

    <script> /*栈操作*/ function Stack() { this.dataStore = []; this.top = 0; this.push = push; this. ...