在日常工作中,如下图的聊天场景是不是很熟悉,没错就是我们再熟悉不过的 QQ 和微信,一个正常的聊天界面大致上是长这个样子的:

这种聊天窗口的消息流有两个明显的特点:

  • 最新的消息和滚动条初始位置需要在列表的最底部
  • 下拉加载历史消息要在当前消息列表顶部进行衔接

一般来说要实现这样的功能,对于前端开发来说都不是难事,只要两步就可以了:

  1. 在第一屏消息渲染完之后设置容器的 scrollTop 为一个极大值,这样就把最新消息和滚动条初始位置定位到了最底部;
  2. 当滚动到顶部时渲染第二屏数据,接着设置容器的 scrollTop 为衔接的位置(也就是第二屏的总高度),这样就实现了前后两屏消息的衔接。

这样的 demo 只需要随手撸二三十行代码就实现了:

一开始渲染消息 1~20,滚到顶部后渲染第二屏消息 ABCDEFGHIJK,看上去前后两屏消息的衔接很平滑很流畅。目前开源社区中也有很多现成的用 React 和 Vue 开发的聊天组件或者示例,他们基本也是用上面提到的思路或者借助 iScroll 实现的。

用上面这种思路跑在 Web 中是没有任何问题的,但是在小程序中的表现却大失所望,看一下用同样的方式应用到小程序后的实际效果:

从第一段视频(左)可以看到从列表进入到聊天页面后设置滚动条位置到底部发生了明显的跳动,先看到停留在顶部然后瞬间再去到底部;

第二段视频(右)滚动到顶部加载后,下一屏消息与当前消息的衔接出现了一个明显的跳动,也是先看到在顶部然后才去到预期的位置。

为什么这个思路在 Web 端体验这么好,到了小程序上体验就如此糟糕呢?原因其实很简单,这是由于小程序底层通信逻辑和视图更新机制造成的:

由于小程序跨线程通信和异步更新的特点,内容的渲染和滚动位置的设置无法保证完成的先后顺序,所以必然会先看到上一个位置一闪而过的画面。

既然是底层的问题,那么这种聊天场景在小程序中难道就玩不了了吗?当然也有尝试过用 opacity 过渡和滚动动画去缓解这种跳动,但都无法从根本上解决这两个体验问题。

当各种常规方案尝试都不尽满意的时候,那就换个思路:从本质上来说,聊天窗口的消息流实际上是一个 “反自然” 的列表,因为在计算机的 “自然界” 和人们习以为常的使用方式上,列表的初始位置都是在最顶部,想要浏览列表更多的内容需要向下滚动,而聊天场景的特点是完全反常规的!

再回到这两个体验问题:为什么需要手动设置最新消息和滚动条到最底部,为什么不让它一开始就在底部?为什么需要要在列表顶部追加数据,为什么不让它在底部追加数据?所以有没有可能颠倒常规,做一个 “反向渲染” 的滚动列表呢?答案是肯定的!

首先像常规的列表一样去渲染,不需要做任何处理,第一条最新消息和滚动条的初始位置是自然地在最上面:

然后把整个列表区域的包裹容器用 CSS 旋转 180°,这样第一条最新消息和滚动条初始位置就在最下面下了:

不过此时整个列表是倒置渲染的,最后再把每一条消息组件用同样的方式旋转 180° 使它们显示回正常的视角,这样就实现了一个 “反向渲染” 的列表:

虽然是 “反向渲染”,但视觉上和正常的一模一样。此时顶部就变成了底部,向上追加数据变成了向下追加数据。最后看一下聊天列表使用 “反向渲染” 之后的体验效果:

可以看到,下拉加载消息与当前消息的衔接非常平滑没有任何的跳动,实际上这个时候历史消息是在底部渲染的,只不过反向渲染让它看上去是在顶部渲染的;此外,页面一进来最新消息和滚动条位置无需任何处理自然地停留在最底部,接近原生体验。

这种 “反向渲染” 的思路用最少的代码就解决了消息场景在小程序上这种几乎无解的问题,并且达到了最优的体验,而实际上核心代码只有两行 CSS:

transform: rotate(180deg);direction: rtl;

整个过程无需任何手动设置滚动位置和计算第二屏总高度(实际上都不用关心它们),同样这种思路用在 Web 上也是 OK 的。当然用了反向渲染也有一些牺牲,比如 iOS 双击顶部栏回到顶部这个特点就不能用了,但总体来说获得体验上的优化是更多的。

此外,聊天场景中的消息流通常也有这样的布局:

如果视觉上需要将自己和别人的消息方向分别位列两边对齐,那么利用这种 “反向渲染” 的思路,实现起来也非常容易,只需要对消息组件应用不同的 CSS 样式即可:

消息流的每一条消息都是一个单独的组件,此时不需要为了区分不同的视角而去新写一个组件,也不需要改变现有组件的结构布局。

❤️ 最后

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

将chart放入panel中出现滚动条_聊天场景在web前端开发中的体验与优化相关推荐

  1. 表单html遇到的问题及处理,Web前端开发中常见问题及解决方案

    Web前端开发中常见问题及解决方案 时间:2017-04-24     来源:web前端开发小赢家 作为一名web前端开发工程师,我们在工作时免不了会遇到各种各样的问题.因为web前端开发相对于Jav ...

  2. web前端开发中需要掌握的技术:

    web前端开发中需要掌握的技术: 1.学习HTML,这是最简单,最基本的是要掌握div,formtable.Ulli.P.跨度.字体这些标签,这些都是最常用的,尤其是DIV和表格,DIV,表也可以用于 ...

  3. Web前端开发中的表单练习

    在web前端开发中,练习table的使用是非常重要的,通过表单的练习可以很好的帮助我们掌握表单的使用方式. 效果如图所示: 代码如下: css采用了外部样式 HTML部分: <!DOCTYPE ...

  4. 列举在Web前端开发中经常会设置的特殊样式!

    在实际开发中,移动Web页面的设计风格更接近App(手机应用),而不是传统的网页.为了有更好的用户体验,我们可以给移动Web页面设置一些特殊样式.下面为列举在移动Web开发中经常会设置的特殊样式,具体 ...

  5. Web前端开发中最基本的找错误的方法, 你得了解一下

    本文将与您分享在制作网页首页时,寻找错误.错误及解决方案,非常详细,在此向您推荐,希望对您有所帮助. WEB开发主要是两个交互(B/S数据) 浏览器: 1包含html.css.js等客户端代码运行错误 ...

  6. web前端开发中的各种居中

    一,水平居中 方法① :行内元素 (父元素)text-align,(子元素)inline-block .parent{text-align: center;} .child{display: inli ...

  7. 前端中什么是中台开发环境_Web前端开发中需要学习什么?会使用到哪些开发工具?...

    今天我们来谈谈Web和前端开发过程中需要学习什么?前端开发需要使用什么开发工具?也简单介绍前端开发前景和薪水.下面和千锋广州小编一起来看看吧! ​前端工程师的主要职责: 前端工程师在不同的公司有不同的 ...

  8. 关于Web前端div中<p>等块状标签位置问题

    项目场景: 项目场景:web前端开发时div盒子中p等块状标签位置错误的问题 问题描述: 在web前端网页样式的制作时,常常会出现在div盒子中用p等块状便签,文本的位置会出盒子的边界,而且与padd ...

  9. 前端开发中的MCRV模式

    针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为基础,结合Web前端开发中内容-结构-表现-行为相分离的开发标准, ...

最新文章

  1. HTTPS Web配置举例
  2. C++学习笔记6:多文件编程
  3. 【LeetCode】【HOT】101. 对称二叉树(BFS+队列/递归)
  4. 放弃第三方?苹果正自研iPhone调制解调器芯片
  5. 计算机网络毕业论文 20页,计算机网络技术专业毕业论文(23页)-原创力文档
  6. [项目管理] ISO900X 标准体系
  7. Java面试复习体系总结(2021版,持续更新)
  8. linux下nohup后台运行RSSHub等nodejs项目,开启与关闭
  9. 电子科大杨宁TCPIP协议原理(总结)
  10. android 电话录音功能,Android实现电话录音功能
  11. [概念]像素,分辨率
  12. RealSense D435深度相机开发(一)---- 基础介绍
  13. 物联网在车联网中的应用
  14. 事务的基本特性是什么
  15. 对随机变量值域的思考
  16. 大数据课程培训大纲详解,大数据培训学习内容
  17. 26.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(2)
  18. 4大方法,因果关系分析的总结,都在这了
  19. 一、中英文对切基本公式
  20. 映客直播技术实战:直播平台的数据库架构演变

热门文章

  1. Java 正则表达式 工具类 中文 英文 email 手机号 身份证 数字 日期
  2. jeesite导出Excel Minimum column number is 0
  3. superset0.34源码级别汉化
  4. Calender日历类
  5. java手机飞行模式_用了这么多年手机才知道,飞行模式还藏着这6个功能!太好用了...
  6. mysql 字符串类型 小数_在Mysql中,小数数据类型是指由字符串来表示的数字。(  )...
  7. 消息长度_填坑笔记:RocketMQ消息订阅失败问题?
  8. 计算机英语 传输介质,计算机英语实用教程unit7
  9. c语言 计算坐标,求助,有关坐标计算的
  10. xamarin android 标签,安卓端Tabbedpage调整在底部位置和标签及取消Android API28 以下的点击特效—-xamarin.forms学习笔记(一)...