
这种聊天对话的布局模式, 比PC端QQ的那种聊天方式更贴近移动端, 我个人感觉.
需求设定:
让我们先过一遍, 实现该聊天窗口需要支持的一些功能点.
• 聊天消息结构和布局
聊天消息包括: 人物(头像)和消息内容. 朋友消息位居左侧, 自己消息则位于右侧, 方便区分.
• 文本区域的自适应
消息内容可以自适应大小, 总是以最合理的区域大小包裹.

• 滚动支持
因聊天记录太多, 大小超过聊天窗口的预设尺寸.
• 底部自动对齐
有新消息后, 窗口内容自动对齐到可视窗口的底部.
• Enter键捕获
消息的输入支持, 以及捕获响应Enter键.
这几个功能点中, 感觉最难的是文本区域自适应处理, 走了不少弯路, ^_^.
实现方案:
• 聊天消息结构和布局
基本的html代码结构可以如下所示:
<div><img src="" alt="头像"/> <div>消息内容</div></div>注: 头像为一个img标签, 文本消息内容则为一个div, 包裹两者的是另一个大的div, 代表完整的一个消息.
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>的真实长度, 既文本长度.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 }});后记: