整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

html5聊天实例|h5+jquery仿微信界面聊天|朋友圈模板

目介绍

采用html5+css3+Zepto+swiper+wcPop+flex等技术开发的聊天实例。实现发送消息/表情,图片/视频预览,添加好友/群聊,语音模块,地图定位模块,整体功能界面效果类似微信聊天。

使用技术

  • 整体布局:HTML5 + css3(flex) + fontSize.js
  • zepto版本:Zepto v1.0
  • 轮播组件:Swiper 3.4.1
  • 字体图标:阿里iconfont字体图标库
  • 下拉刷新:mescroll v1.4.0
  • 效果演示

    <script src="https://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>

    了解Flex布局

    Flex | Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。

    https://www.runoob.com/w3cnote/flex-grammar.html

    2009年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。Flex 布局将成为未来布局的首选方案。

    采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。

    如上图:容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)

    想要了解Flex布局更多的用法,可以去网上查阅相关资料,这里不作详细概述了。

    下拉刷新插件mescroll

    mescroll | 精致的下拉刷新和上拉加载 js框架.支持vue,完美运行于移动端和主流PC浏览器。

    http://www.mescroll.com/
    https://github.com/mescroll/mescroll

    注意:如果你是uni-app开发者,下面是mescroll的uniapp版本

    http://www.mescroll.com/uni.html

    运行效果图

    弹窗组件wcPop

    wcpop是一个手机端弹窗插件,提供了多种类型的弹窗功能,有ios、android弹窗效果

    // 基本使用
    wcPop({ 
      //传入参数
    })

    如上图 弹窗菜单,使用下面代码即可实现

    $("#J_chatList").on("contextmenu", ".item", function (e) {
    	e.preventDefault();
    	
    	//获取长按坐标点
    	var _points = [e.pageX, e.pageY];
    	
    	wcPop({
    		skin: 'contextmenu',
    		follow: _points,
    		opacity: 0,
    		btns: [
    			{
    				text: '发送给朋友',
    				style: 'color:#212121;',
    				onTap() {...}
    			}, 
    			{text: '复制'}, 
    			{text: '收藏'},
    			{text: '撤回'},
    			{text: '删除'},
    		]
    	});
    });

    聊天功能模块

    • 滚动聊天消息至最底部
    function wchat_ToBottom() {
    	$(".mescroll").animate({ scrollTop: $("#J__chatMsgList").height() }, 0);
    }
    • 获取光标位置 | 在光标处插入表情

    // 定义最后光标位置
    var _lastRange = null, _sel = window.getSelection && window.getSelection();
    var _rng = {
    	getRange: function () {
    		if (_sel && _sel.rangeCount > 0) {
    			return _sel.getRangeAt(0);
    		}
    	},
    	addRange: function () {
    		if (_lastRange) {
    			_sel.removeAllRanges();
    			_sel.addRange(_lastRange);
    		}
    	}
    }
    
    // 聊天插入表情
    $("#J__swiperEmotion").on("click", ".face_item", function () {
    	var that = $(this), range;
    	
    	var img = that[0].cloneNode(true);
    	if (!_editor.childNodes.length) {
    		_editor.focus();
    	}
    	_editor.blur(); //输入表情时禁止输入法
    
    	setTimeout(function () {
    		if (document.selection && document.selection.createRange) {
    			document.selection.createRange().pasteHTML(img);
    		} else if (window.getSelection && window.getSelection().getRangeAt) {
    			range = _rng.getRange();
    			range.insertNode(img);
    			range.collapse(false);
    			
    			//记录当前光标位置 (否则光标会跑到表情前面)
    			_lastRange = range;
    			_rng.addRange();
    		}
    	}, 10);
    });
    • 判断编辑框信息是否为空
    function isEmpty() {
    	var html = $editor.html();
    	html = html.replace(/<br[\s\/]{0,2}>/ig, "\r\n");
    	html = html.replace(/<[^img].*?>/ig, "");
    	html = html.replace(/ /ig, "");
    	return html.replace(/\r\n|\n|\r/, "").replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, "") == "";
    }

    ❤️ 最后

    如果你觉得这篇文章对你有帮助,麻烦点个「关注/转发」,让更多的人也能看到你的分享!

    从Recorder H5 GitHub开源库优化后,对边录边转码成小语音片段文件实时上传服务器这种操作支持非常良好,因此以前不太好支持的H5语音通话已经有了更好的突破空间。因此花了两晚时间打造了一个H5语音通话聊天的demo。

    欢迎在线把玩:https://xiangyuecn.github.io/Recorder/

    一、把玩方法

    1. 准备局域网内两台设备(Peer A、Peer B)用最新版本浏览器(demo未适配低版本)分别打开demo页面(也可以是同一浏览器打开两个标签)
    2. 勾选页面中的H5版语音通话聊天,在Peer A中点击新建连接
    3. 把Peer A的本机信手动复制传输给Peer B,粘贴到远程信息中,并点击确定连接
    4. 把Peer B自动生成的本机信息手动复制传输给Peer A,粘贴到远程信息中,并点击确定连接
    5. 双方P2P连接已建立,使用页面上方的录音功能,随时开启录音,音频数据会实时发送给对方

    局域网H5版对讲机

    二、技术特性

    (1)数据传输

    github demo中考虑到减少对服务器的依赖,因此采用了WebRTC P2P传输功能,无需任何服务器支持即可实现局域网内的两个设备之间互相连接,连接代码也算简单。有服务器支持可能就要逆天了,不过代码也会更复杂。

    如果正式使用,可能不太会考虑使用WebRTC,用WebSocket通过服务器进行转发可能是最佳的选择。

    WebRTC局域网P2P连接要点(实际代码其实差不多,只不过多做了点兼容):

    /******Peer A(本机)******/
    var peerA=new RTCPeerConnection(null,null)
    //开启会话,等待远程连接
    peerA.createOffer().then(function(offer){
     peerA.setLocalDescription(offer);
     peerAOffer=offer;
    });
    var peerAICEList=[......] //通过peerA.onicecandidate监听获得所有的ICE连接信息候选项,如果有多个网络适配器,就会有多个候选
    //创建连接通道对象,A端通过这个来进行数据发送
    var peerAChannel=peerA.createDataChannel("RTC Test");
    /******Peer B(远程)******/
    var peerB=new RTCPeerConnection(null,null)
    //连接到Peer A
    peerB.setRemoteDescription(peerAOffer);
    //开启应答会话,等待Peer A确认连接
    peerB.createAnswer().then(function(answer){
     peerB.setLocalDescription(answer);
     peerBAnswer=answer;
    });
    //把Peer A的连接点都添加进去
    peerB.addIceCandidate(......peerAICEList)
    var peerBICEList=[......] //通过peerB.onicecandidate监听获得所有的ICE连接信息候选项,如果有多个网络适配器,就会有多个候选
    var peerBChannel=... //通过peerB.ondatachannel得到连接通道对象,B端通过这个来进行数据发送
    /*******最终完成连接********/
    //连接到Peer B
    peerA.setRemoteDescription(peerBAnswer);
    //把Peer B的连接点都添加进去
    peerA.addIceCandidate(......peerBICEList)
    /*
    peerA peerB分别等待peerA/BChannel.onopen回调即完成P2P连接
    ,然后通过监听peerA/BChannel.onmessage获得对方发送的信息
    ,通过peerA/BChannel.send(data) 发送数据。
    */
    

    (2)音频采集和编码

    由于是在我的Recorder库中新加的demo,因此音频采集和编码都是现成的,Recorder库有好的兼容性和稳定性,因此节省了最大头的工作量。

    编码最佳使用MP3格式,因为此格式已优化了实时编码性能,可做到边录边转码,16kbps 16khz的情况下可做到2kb每秒的文件大小,音质还可以,实时传输时为3kb每秒,15分钟大概3M的流量。

    用wav格式也可以,不过此格式编码出来的数据量太大,16位 16khz接近50kb每秒的实时传输数据,15分钟要37M多流量。其他格式由于暂未对实时编码进行优化,使用中会导致明显卡顿。

    降噪、静音检测等高级功能是没有的,毕竟是非专业人员 要求高点可以,但不要超出范围太多啦。

    (3)音频实时接收和播放

    接收到一个音频片段后,本应该是立即播放的,但由于编码、网络传输导致的延迟,可能上个片段还未播放完(甚至未开始播放),因此需要缓冲处理。

    因为存在缓冲,就需要进行实时同步处理,如果缓冲内积压了过多的音频片段,会导致语音播放滞后太多,因此需要适当进行对数据进行丢弃,实测发现网络正常、设备性能靠谱的情况下基本没有丢弃的数据。

    然后就是播放了,本应是播完一个就播下一个,测试发现这是不靠谱的。因为结束一个片段后再开始播放下一个发出声音,这个过程会中断比较长时间,明显感觉得出来中间存在短暂停顿。因此必须在片段未播完时准备好下一个片段的播放,并且提前开始播放,达到抹掉中间的停顿。

    我写了两个播放方式:

    1. 实时解码播放
    2. 双Audio轮换播放

    最开始用一个Audio停顿感太明显,因此用两个Audio轮换抹掉中间的停顿,但发现不同格式Auido播放差异巨大,播放wav非常流畅,但播放mp3还是存在停顿(后面用解码的发现是得到的PCM时长变长了,导致事件触发会出现误差,为什么会变长?怪异)。

    因此后面写了一个解码然后再播放,mp3这次终于能正常连续播放了,wav格式和双Audio的播放差异不大。实时解码里面也用到了双Audio中的技巧,其实也是用到了两个BufferSource进行类似的轮换操作,以抹掉两个片段间的停顿。

    不过最终播放效果还是不够好,音质变差了点,并且多了点噪音。如果有现成的播放代码拿过来用就就好了。

    三、应用场景

    1. 数据传输改成WebSocket,做个仿微信语音通话H5版还是可以的(受限于Recorder浏览器支持)
    2. 局域网H5版对讲机(前端玩具)
    3. ......没有想到

    完。

    TML5 是当前 Web 开发中广泛使用的标准,具有许多强大的特性和功能,未来仍然具有巨大的发展潜力。以下是 HTML5 的一些未来展望:

    1. 增强用户体验:HTML5 提供了许多新的 API 和功能,如 Canvas、WebGL、Web Audio 等,可以实现更丰富、更交互式的用户体验,未来可以进一步提升 Web 应用程序的用户体验。
    2. 移动端应用开发:随着移动互联网的普及,HTML5 可以作为开发跨平台移动应用的技术之一。未来,HTML5 在移动端应用开发领域可能会有更多创新和突破,实现更好的性能和用户体验。
    3. 增强多媒体支持:HTML5 对音频和视频的支持更加完善,未来可以进一步提升多媒体内容在 Web 上的表现和传播效果,为在线媒体、游戏等领域带来更多可能性。
    4. 进一步标准化和优化:HTML5 标准仍在不断完善和发展,未来可能会有更多的标准化工作,以解决现有标准的不足和问题,提升 Web 应用的质量和性能。
    5. 增强安全性:HTML5 引入了一些安全机制,如跨域资源共享(CORS)、内容安全策略(CSP)等,未来可能会进一步加强 Web 应用的安全性,保护用户数据和隐私。
    6. Web 组件化和模块化:未来 HTML5 可能会更多地支持 Web 组件化和模块化开发,提供更灵活、可复用的组件和模块,加快 Web 应用开发的速度和效率。
    7. 增强对设备的支持:随着物联网和智能设备的快速发展,未来 HTML5 可能会加强对各种设备的支持,包括智能家居设备、可穿戴设备等,使其更好地融入 Web 生态系统。
    8. 进一步推动 Web 标准化:HTML5 的发展也将继续推动 Web 标准化的进程,促进不同浏览器和平台间的兼容性和统一性,为开发者和用户提供更一致的 Web 体验。
    9. 增强对可访问性的支持:未来,HTML5 可能会更多地关注对残障人士的支持,包括视力障碍和听力障碍等,使 Web 内容更易于访问和理解。
    10. 融合人工智能和机器学习:随着人工智能和机器学习技术的发展,HTML5 可能会更多地与这些技术结合,为开发者提供更丰富的工具和功能,从而创造出更具智能化的 Web 应用。
    11. 增强对区块链和加密货币的支持:随着区块链技术的发展,未来 HTML5 可能会更多地支持与区块链和加密货币相关的功能和API,为开发者提供构建去中心化应用的能力。
    12. 增强对实时通信和协作的支持:HTML5 可能会在 WebRTC 和实时通信领域有更进一步的发展,为实时视频会议、协作工具等场景提供更好的支持。
    13. 推动跨平台开发:HTML5 在跨平台开发方面有很大潜力,未来可能会进一步推动跨平台开发工具和框架的发展,使开发者能够更方便地开发同时支持多个平台的应用。
    14. 环境保护和可持续发展:HTML5 的发展也可能与环境保护和可持续发展相关,例如通过优化 Web 应用程序的能效,减少能源消耗,促进数字化转型与绿色发展相结合。
    15. 拓展虚拟现实和增强现实:HTML5 可能会在虚拟现实(VR)和增强现实(AR)应用方面有更多的发展,为开发者提供更好的工具和支持,使这些技术更广泛地应用于 Web 开发中。
    16. 增强对人类与机器的交互支持:未来 HTML5 可能会更多地关注人类与机器之间的交互,包括语音识别、自然语言处理等技术的集成,为开发智能对话型界面和智能助手提供更好的支持。
    17. 推动可持续发展目标:HTML5 的应用也可能会与可持续发展目标相关联,例如促进可持续城市发展、提高教育水平、改善医疗保健等方面,为实现联合国可持续发展目标做出贡献。
    18. 加强网络安全和隐私保护:HTML5 可能会在网络安全和隐私保护方面有更多创新,加强网站和应用程序的安全性,保护用户的个人信息和数据不受侵犯。
    19. 支持新兴技术的融合:未来 HTML5 可能会更多地融合新兴技术,如边缘计算、人工智能、大数据分析等,为开发者提供更丰富的工具和功能,推动 Web 技术与其他领域的融合创新。
    20. 促进数字化转型和创新:HTML5 的发展将继续促进数字化转型和创新,在各个行业和领域推动数字化技术的应用和创新,为社会经济发展带来更多机遇和可能性。
    21. 增强对移动互联网的支持:HTML5 未来可能会进一步加强对移动设备和移动应用的支持,优化移动端用户体验,推动移动互联网的发展。
    22. 推动社交化网络和内容共享:HTML5 可能会更多地融入社交网络和内容共享领域,为开发者提供更多工具和功能,促进社交化网络应用和内容共享平台的创新。
    23. 可穿戴设备和物联网的整合:未来 HTML5 可能会更好地整合可穿戴设备和物联网技术,为开发智能穿戴应用和物联网解决方案提供更好的支持。
    24. 跨境电子商务和金融科技:HTML5 的发展也可能会在跨境电子商务和金融科技领域有更大作用,为跨境电商平台和金融科技应用提供更丰富的功能和工具。
    25. 持续改善用户体验:未来 HTML5 可能会持续改善用户体验,包括更快的加载速度、更流畅的动画效果、更直观的交互方式等,使用户能够享受更优质的 Web 使用体验。
    26. 推动边缘计算和云服务的融合:HTML5 可能会进一步促进边缘计算和云服务的融合,为开发者提供更多跨平台、跨设备的开发工具和服务,支持边缘智能和云端协作。
    27. 支持可访问性和无障碍性:未来 HTML5 可能会更加关注可访问性和无障碍性,为残障人士提供更友好的网络环境,确保所有用户都能够方便地访问和使用 Web 内容。
    28. 推动教育和在线学习:HTML5 的发展也可能会在教育和在线学习领域发挥更大作用,为开发教育应用和在线学习平台提供更强大的功能和工具,推动教育信息化的发展。
    29. 支持数字身份和区块链身份验证:未来 HTML5 可能会加强对数字身份和区块链身份验证技术的支持,为用户提供更安全、去中心化的身份验证方式,保护个人隐私和数据安全。
    30. 促进文化交流和多元化表达:HTML5 的发展也可能会促进文化交流和多元化表达,为不同文化背景的内容创作者提供更丰富的表现方式,推动文化多样性和交流。
    31. 提升游戏开发和虚拟现实体验:HTML5 可能会在游戏开发和虚拟现实领域有更大突破,为开发者提供更强大的游戏开发工具和技术,同时支持更逼真、沉浸式的虚拟现实体验。
    32. 加强数据可视化和分析能力:未来 HTML5 可能会加强对数据可视化和分析能力的支持,为开发者提供更多图表、图形和交互式界面的展示方式,帮助用户更好地理解和分析数据。
    33. 推进智能家居和智能城市发展:HTML5 的发展也可能会推进智能家居和智能城市的发展,为开发智能家居应用和智能城市解决方案提供更好的支持,提升生活质量和城市运行效率。
    34. 增强网络媒体和流媒体能力:未来 HTML5 可能会加强对网络媒体和流媒体的支持,提供更丰富的音视频处理能力,为开发者提供更好的媒体播放和流媒体传输的功能和性能。
    35. 支持跨平台和跨设备的开发:HTML5 的未来发展可能会更加注重跨平台和跨设备的开发,为开发者提供统一的开发框架和工具,使应用能够在不同的操作系统和设备上无缝运行。