前言:
以前编写了一个网页闯关游戏(相似Riddle Game), 除了但愿你们可以体验一下个人游戏外. 也愿意分享编写这个网页游戏过程当中, 学到的一些知识.
本文讲描述, 如何在网页端实现一个仿微信的聊天窗口界面, 以及其中涉及到的一些技术点. 做者前端是初学者, 请大拿们轻拍.javascript
效果展现:
先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^) .
仿微信窗口的设计源于第四关--倾听女神的故事.css
这种聊天对话的布局模式, 比PC端QQ的那种聊天方式更贴近移动端, 我我的感受.html
需求设定:
让咱们先过一遍, 实现该聊天窗口须要支持的一些功能点.
• 聊天消息结构和布局
聊天消息包括: 人物(头像)和消息内容. 朋友消息位居左侧, 本身消息则位于右侧, 方便区分.
• 文本区域的自适应
消息内容能够自适应大小, 老是以最合理的区域大小包裹.
• 滚动支持
因聊天记录太多, 大小超过聊天窗口的预设尺寸.
• 底部自动对齐
有新消息后, 窗口内容自动对齐到可视窗口的底部.
• Enter键捕获
消息的输入支持, 以及捕获响应Enter键.
这几个功能点中, 感受最难的是文本区域自适应处理, 走了很多弯路, ^_^.前端
实现方案:
• 聊天消息结构和布局
基本的html代码结构能够以下所示:java
<div> <img src="" alt="头像"/> <div>消息内容</div> </div>
注: 头像为一个img标签, 文本消息内容则为一个div, 包裹二者的是另外一个大的div, 表明完整的一个消息.
对于布局的左偏移和右偏移, 则借助float:left|right, 来进行控制, 这个仍是基础的.
• 文本区域的自适应
为了让聊天的文本内容显得美观, 最好方式就是自适应的文本区域(有个max-width, 区域最小化).
最初的时候, 我尝试了textarea标签, 由于其属性有row和col, 对应字符个数单位, 能够用于设定行数和列数.
惋惜的是, 我被现实战胜了, 由于textarea对中文字符和英文字符的计算标准不一样, 中文字符按2个算, 英文字符按1个算. 由于用户输入的不肯定, 致使很难用文本串的长度来设定textarea的行列值.
因而回到起点, 只能走计算文本像素点px长度的方式来设定大小(等价于限定max-width).
计算文本的长度, 参考于"JQuery 计算文本的总宽度 Width".浏览器
function GetCurrentStrWidth(text, font) { var currentObj = $('<pre>').hide().appendTo(document.body); $(currentObj).html(text).css('font', font); var width = currentObj.width(); currentObj.remove(); return width; }
注: 巧妙的经过添加/删除<pre>标签, 返回<pre>的真实长度, 既文本长度.
对于小于预设的max-width, 则文本区域div缺省便可. 对于大于预设的max-width值, 则文本区域div设定为width=max-width.微信
var maxWidth = 320; var currentFont = "normal 13px Helvetica, Arial, sans-serif"; msgDiv.style.font = currentFont; var currentWidth = GetCurrentStrWidth(message, currentFont); // *) 设定文本区域的宽度 if (currentWidth <= maxWidth) { msgDiv.style.width = "" + currentWidth + "px"; } else { msgDiv.style.width = "" + maxWidth + "px"; }
固然这边还有一个须要的注意的地方, 就是自动换行.app
word-break: normal|break-all|keep-all; 值 描述 normal 使用浏览器默认的换行规则。 break-all 容许在单词内换行。 keep-all 只能在半角空格或连字符处换行。
为了防止太长的英文单词(很是规词)的影响, 最后选用了word-break: break-all.
• 滚动支持
滚动支持, 相对简单, 只须要聊天对话框在y轴方向设定以下css属性便可:ide
overflow-y : scroll;
• 底部自动对齐
这个也是老生常谈的事了, 每次聊天窗口的内容有更新, 执行以下js代码便可.函数
div.scrollTop = div.scrollHeight;
注: 既scrollTop和scrollHeight属性值保持一致便可.
• Enter键响应捕获
对enter键响应的支持, 添加以下监听事件函数便可.
document.addEventListener("keydown", function (evt) { if (evt.keyCode == 13) { // TODO } });
后记:
本来觉得实现一个聊天窗口的示例很容易, 却在真正的实践过程当中磕磕碰碰, 步履蹒跚. 前端这一块, 真心水很深. 过后回忆起来,以为收获很大, 固然对于文本的自适应, 采用了一个较复杂的办法. 后来想一想是否是加个max-width属性就能轻松搞定了?
公众号&游戏站点:
我的微信公众号: 木目的H5游戏世界
我的游戏做品集站点(尚在建设中...): www.mmxfgame.com, 也可直接ip访问: http://120.26.221.54/.