效果图

wxml

<view class="index-view">
	<image class='background-img' src="/images/background-img.png" mode="widthFix"></image>
	<view hidden="{{!showInput}}" class='msg-input' style="bottom: {{msgInputBottom}}px;">
		<input type="text" confirm-type="send" bindfocus="foucusInput" focus="{{showInput}}"
					bindconfirm="sendMsg" bindblur="blurInput" adjust-position="{{false}}" value="{{inputVal}}"/>
		<button size="mini" bindtap="sendMsg">发送</button>
	</view>
	<image hidden="{{showInput}}" class='click-img' src="/images/msg-click-btn.png" bindtap="clickSendMsg"></image>
</view>

<view class="barrage-view">
	<view wx:for="{{barrageLineCount}}" wx:for-item="count" 
			wx:for-index="lineIndex" data-index="{{lineIndex}}" 
			wx:key="*this" class="barrage-line">
		<view class='barrage-msg' wx:for="{{barrageMsgs[lineIndex].msgInfos}}" 
				wx:key="msg">
			<image class='barrage-avatar' src='{{item.avatarUrl}}'></image>
			<text class='barrage-text'>{{item.msg}}</text>
		</view>
	</view>
</view>

js

const app = getApp();
Page({
	/**
	 * 页面的初始数据
	 */
	data: {
			msgInputBottom: 0,
			inputVal: "",
			showInput: false,
			barrageLineCount: 10,
			// 拉取最新弹幕的毫秒值
			barragePullMillis: 0,
			// 最新的弹幕
			barrageNewMsgs: [],
			// 已显示的弹幕,无新弹幕时则循环
			barrageSendedMsgs: [],
			// 弹幕显示数据
			barrageMsgs: []
	},
	foucusInput: function(e) {
		this.setData({ msgInputBottom: e.detail.height })
	},
	blurInput: function(e) {
		this.setData({ inputVal: e.detail.value, msgInputBottom: 0, showInput: false })
	},
	clickSendMsg: function(e) {
		this.setData({ showInput: true })
	},
	sendMsg: function(e) {
			const msg = this.data.inputVal;
			if (msg == "") return;
			
			const userInfo = app.getUserInfo();
			wx.request({
				url: app.globalData.baseUrl   '/barrageMsg/',
				data: { memberId: userInfo.id, msg: msg},
				method: 'PUT'
			})
			this.setData({ inputVal: "" });
	},
	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad(options) {
	},
	/**
	 * 生命周期函数--监听页面初次渲染完成
	 */
	onReady() {
		// 初始化barrageLineCount个弹幕行
		let barrageMsgs = this.data.barrageMsgs;
		const barrageLineCount = this.data.barrageLineCount;
		const nowTimeMillis = new Date().getTime();
		for(var i = 0; i < barrageLineCount; i  )
			barrageMsgs.push({'showTimeMillis': new String(nowTimeMillis - 
				Math.round(Math.random() * barrageLineCount) * 1000), msgInfos: []});
		this.setData({ barrageMsgs: barrageMsgs });
		// 每隔2s拉取最新的弹幕
		setInterval((that) => {
			wx.request({
				url: app.globalData.baseUrl   '/barrageMsg/',
				data: { timeMillis: that.data.barragePullMillis },
				method: 'GET',
				success: res => {
					const data = res.data.data;
					if (data == null) return;
					that.setData({ barrageNewMsgs: data.barrageMsgList, 
						barragePullMillis: data.lastPullMillis });
				}
			});
		}, 2000, this);
		// 动态显示弹幕
		setInterval((that) => {
			var arrSort = [];
			const barrageLineCount = this.data.barrageLineCount;
			for(var i = 0; i < barrageLineCount; i  ) arrSort.push(i);
			arrSort.sort(() => (0.5 - Math.random()));
			var nowTimeMillis = new Date().getTime();
			var barrageNewMsgs = that.data.barrageNewMsgs;
			if (barrageNewMsgs != null && barrageNewMsgs.length > 0) {
				// 有最新弹幕
				var barrageMsgs = that.data.barrageMsgs;
				for(var j = 0; j < arrSort.length; j  ) {
					var barrageMsg = barrageMsgs[arrSort[j]];
					// 获取最后发起的弹幕超过5s则跟在后面
					if (nowTimeMillis - barrageMsg.showTimeMillis > 5000) {
						// 显示
						barrageMsg.showTimeMillis = nowTimeMillis;
						const barrageNewMsg = barrageNewMsgs[0];
						barrageNewMsg.showTimeMillis = nowTimeMillis;
						barrageMsg.msgInfos.push(barrageNewMsg);
						barrageMsgs[arrSort[j]] = barrageMsg;
						// 在最新弹幕中删除此条弹幕
						barrageNewMsgs.splice(0, 1);
						that.setData({ barrageNewMsgs: barrageNewMsgs, 
							barrageMsgs: barrageMsgs });
						break;
					}
				}
			}
			// 回收每个超过10s的弹幕放到barrageSendedMsgs中
			var barrageMsgs = that.data.barrageMsgs;
			for(var i = 0; i < barrageMsgs.length; i  ) {
				var barrageMsg = barrageMsgs[i];
				var msgInfos = barrageMsg.msgInfos;
				if (msgInfos == null || msgInfos.length == 0 ||
					nowTimeMillis -	msgInfos[0].showTimeMillis <= 10000) continue;
				var barrageSendedMsgs = that.data.barrageSendedMsgs;
				for (var j = 0; j < msgInfos.length; j  ) {
					var msgInfo = msgInfos[j];
					if (nowTimeMillis - msgInfo.showTimeMillis <= 10000) break;
					msgInfos.splice(j, 1); j--;
					barrageSendedMsgs.push(msgInfo);
				}
				barrageMsg.msgInfos = msgInfos;
				barrageMsgs[i] = barrageMsg;
				that.setData({ barrageMsgs: barrageMsgs, 
					barrageSendedMsgs: barrageSendedMsgs });
			}
			// 新的弹幕未发完,老弹幕不循环
			if (barrageNewMsgs != null && barrageNewMsgs.length > 0) return;
			// 从barrageSendedMsgs取开头1条进行播放后删除,由上文代码再次放入实现循环
			var barrageSendedMsgs = that.data.barrageSendedMsgs;
			if (barrageSendedMsgs.length == 0) return;
			var barrageSendedMsg = barrageSendedMsgs[0];
			for(var j = 0; j < arrSort.length; j  ) {
				var barrageMsg = barrageMsgs[arrSort[j]];
				// 获取最后发起的弹幕超过5s则跟在后面
				if (nowTimeMillis - barrageMsg.showTimeMillis > 5000) {
					// 显示
					barrageMsg.showTimeMillis = nowTimeMillis;
					barrageSendedMsg.showTimeMillis = nowTimeMillis;
					barrageMsg.msgInfos.push(barrageSendedMsg);
					barrageMsgs[arrSort[j]] = barrageMsg;
					// 在已发弹幕中删除此条弹幕
					barrageSendedMsgs.splice(0, 1);
					that.setData({ barrageSendedMsgs: barrageSendedMsgs, 
						barrageMsgs: barrageMsgs });
					break;
				}
			}
		}, 500, this);
	},
	/**
	 * 生命周期函数--监听页面显示
	 */
	onShow() {
	},
	/**
	 * 生命周期函数--监听页面隐藏
	 */
	onHide() {
	},
	/**
	 * 生命周期函数--监听页面卸载
	 */
	onUnload() {
	},
	/**
	 * 页面相关事件处理函数--监听用户下拉动作
	 */
	onPullDownRefresh() {
	},
	/**
	 * 页面上拉触底事件的处理函数
	 */
	onReachBottom() {
	},
	/**
	 * 用户点击右上角分享
	 */
	onShareAppMessage() {
	}
})

css

.index-view {
	display: flex;
	width: 100%;
	align-content: center;
	justify-content: center;
}
.background-img { width: 100%; }
.msg-input { position: absolute; width: 100%; bottom: 0px; 
	background-color: rgba(241, 213, 135, 0.911); }
.msg-input input{ margin: 20rpx 1% 10rpx 1%; width: 75%; height: 60rpx;
	border: none; padding: 5rpx 10px 5rpx 10px; border-radius: 8px; 
	background-color: #ffffff; display: inline-block; }
.msg-input button { width: 15%; display: inline-block; font-size: 30rpx; color: rgba(241, 213, 135, 0.911);
	margin: 20rpx 0px 13rpx 0px; border-radius: 5px; background-color: rgb(247, 40, 40);}
.click-img { position: absolute; width: 40%; height: 20%; bottom: 18%; }

.barrage-view { position: absolute; top: 10rpx; margin-top: 30rpx; }
.barrage-line { height: 80rpx; }
.barrage-msg { position: fixed; left: 100%; width: 80%; animation: barrage-msg 10s linear 0s 1; }
.barrage-text { height: 45rpx; }
.barrage-avatar { width: 45rpx; height: 45rpx; border-radius: 20rpx; margin-right: 10rpx; }
@keyframes barrage-msg {
  from {
    left: 100%;
    transform: translateX(0);
  }
  to {
    left: 0;
    transform: translateX(-100%);
  }
}

到此这篇关于微信小程序弹幕纯编码实现的文章就介绍到这了,更多相关微信小程序弹幕内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

纯编码实现微信小程序弹幕效果(非视频底)的更多相关文章

  1. 微信小程序“圣诞帽”的实现思路详解

    这两天朋友圈被圣诞帽刷屏,下面通过本文给大家分享微信小程序“圣诞帽”的实现思路详解,需要的朋友参考下吧

  2. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. 小程序实现图片裁剪上传

    这篇文章主要为大家详细介绍了小程序实现图片裁剪上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. php实现小程序支付完整版

    这篇文章主要为大家详细介绍了php实现小程序支付完整版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. 微信小程序的宿主环境实现代码

    这篇文章主要介绍了微信小程序的宿主环境,包括scroll-view 组件的基本使用,text 组件的基本使用及rich-text 组件的基本使用,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

  6. 微信小程序使用ucharts在小程序中加入横屏展示功能的全过程

    这篇文章主要给大家介绍了关于微信小程序使用ucharts在小程序中加入横屏展示功能的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友可以参考下

  7. 微信小程序实现页面导航的方法详解

    这篇文章主要为大家详细介绍一下微信小程序实现页面导航的几种方法以及帮助大家掌握如何使用页面之间的导航跳转,感兴趣的可以了解一下

  8. 微信小程序开发WXML模板语法基础教程

    这篇文章主要介绍了微信小程序模板语法,WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构,需要的朋友们下面随着小编来一起学习学习吧

  9. 简单实现jQuery弹幕效果

    这篇文章主要为大家详细介绍了简单实现jQuery弹幕效果的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. 微信小程序访问mysql数据库流程详解

    日常我们在开发小程序的时候,总是希望把数据提交回数据库进行存储,那在小程序中该如何访问数据库呢?本篇我们就介绍一下具体的思路

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部