gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点


Posted in Javascript onFebruary 21, 2016

前言:

之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识.

本文讲描述, 如何在网页端实现一个仿微信的聊天窗口界面, 以及其中涉及到的一些技术点. 作者前端是初学者, 请大拿们轻拍.

效果展示:

gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

这种聊天对话的布局模式, 比PC端QQ的那种聊天方式更贴近移动端, 我个人感觉.

需求设定:

让我们先过一遍, 实现该聊天窗口需要支持的一些功能点.

• 聊天消息结构和布局

聊天消息包括: 人物(头像)和消息内容. 朋友消息位居左侧, 自己消息则位于右侧, 方便区分.

• 文本区域的自适应

消息内容可以自适应大小, 总是以最合理的区域大小包裹.

gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

 • 滚动支持

因聊天记录太多, 大小超过聊天窗口的预设尺寸.

• 底部自动对齐

有新消息后, 窗口内容自动对齐到可视窗口的底部.

• Enter键捕获

消息的输入支持, 以及捕获响应Enter键.

这几个功能点中, 感觉最难的是文本区域自适应处理, 走了不少弯路, ^_^.

实现方案:

• 聊天消息结构和布局

基本的html代码结构可以如下所示:

<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";
}

当然这边还有一个需要的注意的地方, 就是自动换行.

word-break: normal|break-all|keep-all;


值 描述

normal 使用浏览器默认的换行规则。
break-all 允许在单词内换行。
keep-all 只能在半角空格或连字符处换行。
为了防止太长的英文单词(非常规词)的影响, 最后选用了word-break: break-all.

• 滚动支持

滚动支持, 相对简单, 只需要聊天对话框在y轴方向设定如下css属性即可:

overflow-y : scroll;


• 底部自动对齐

这个也是老生常谈的事了, 每次聊天窗口的内容有更新, 执行如下js代码即可.

div.scrollTop = div.scrollHeight;

注: 既scrollTop和scrollHeight属性值保持一致即可.

• Enter键响应捕获

对enter键响应的支持, 添加如下监听事件函数即可.

document.addEventListener("keydown", function (evt) {

if (evt.keyCode == 13) {


// TODO

}
});

后记:

原本以为实现一个聊天窗口的示例很容易, 却在真正的实践过程中磕磕碰碰, 步履蹒跚. 前端这一块, 真心水很深. 事后回忆起来,觉得收获很大, 当然对于文本的自适应, 采用了一个较复杂的办法. 后来想想是不是加个max-width属性就能轻松搞定了?

好了,关于本文给大家介绍的gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点就给大家介绍这么多,希望对大家走gameboy网页闯关游戏有所帮助!

Javascript 相关文章推荐
JavaScript获取GridView选择的行内容
Apr 14 Javascript
JavaScript编程开发中的五个实用小技巧
Jul 22 Javascript
检测jQuery.js是否已加载的判断代码
May 20 Javascript
jQuery Migrate 1.1.0 Released 注意事项
Jun 14 Javascript
5款JavaScript代码压缩工具推荐
Jul 07 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
jquery+css实现的红色线条横向二级菜单效果
Aug 22 Javascript
Bootstrap开关(switch)控件学习笔记分享
May 30 Javascript
jQuery中ScrollTo用法示例
Sep 04 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
微信小程序商品详情页规格属性选择示例代码
Oct 30 Javascript
详解微信小程序审核不通过的解决方法
Jan 17 Javascript
全面详细的jQuery常见开发技巧手册
Feb 21 #Javascript
完善的jquery处理机制
Feb 21 #Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 #Javascript
jQuery实现div拖拽效果实例分析
Feb 20 #Javascript
jQuery实现简单隔行变色的方法
Feb 20 #Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 #Javascript
jQuery获得字体颜色16位码的方法
Feb 20 #Javascript
You might like
Windows下的PHP安装pear教程
2014/10/24 PHP
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
jQuery功能函数详解
2015/02/01 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
简单理解Python中基于生成器的状态机
2015/04/13 Python
Python 装饰器使用详解
2017/07/29 Python
Python读取word文本操作详解
2018/01/22 Python
python实现图书借阅系统
2019/02/20 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python二进制文件的转译详解
2019/07/03 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
环境科学毕业生自荐信
2013/11/21 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
党员演讲稿
2014/09/04 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python