谈谈「朋友在看」功能的交互优化与技术实现

75 阅读3分钟

2024-03-13 创建于墨问

  1. 列表切换

发现页新增了一个「朋友在看」列表,为了方便左右滑动,使用了 swiper 来完成。

而点击顶部 tab 文字,则需要立即切换,不要滑动效果。

webview 模式将 swiper 的动画时间设置为 0,skyline 模式则将 scroll-with-animation 设置为 false,就能实现这个效果了。

  1. 下拉刷新

小程序 PC 版无法通过「下拉」的方式去刷新列表,单独放一个按钮又显得不自然,于是增加了点击 tab 去刷新的交互。

只要点击带小红线的 tab 就可以刷新,点击另一个灰色 tab 则是切换 tab。

需要刷新时,去设置 scroll-view 的 refresher-triggered 为 true 即可。

  1. 瀑布流

旧的版本,瀑布流固定是 2 列。预览图只有 240px 宽度,在电脑或大屏幕设备上,图片被拉宽后变得模糊,卡片也显得头重脚轻。间距只能 1:2:1,两边 10px,中间 20px。

优化后,瀑布流则是最少 2 列 ~ 最大任意数量,宽度则是不超过 240px。能够保证图片清晰,视野中也能看到更多卡片。间距自由,目前设为了 5px。

旧版本在 PC 端自行写算法进行布局。如果设置 4 列,在调整窗口宽度时,特别卡顿几乎不可用。

优化后,使用了小程序原生组件 grid-view 的 masonry 模式。原生组件可以自定对卡片进行宽度计算和布局,性能提高了很多。开发者只需要计算好图片的显示高度即可。

为什么不跳过图片计算,直接使用 image 的 widthFix 模式。原因是图片加载完成前,是不占用高度的,加载过程中,图片会从 0 增高,视觉效果会看到抖动,也会增加布局的计算,带来性能损耗。

具体如何计算呢?

设瀑布流展示 X 列,边距为 5,图片显示宽度 width,屏幕宽度为 windowWidth

则得到公式:

5 + width * X + 5 * (X - 1) + 5 = windowWidth

利用公式,先使用最大列宽 240px,计算出列数:

X = (windowWidth - 5) / (maxCrossAxisExtent + 5)

计算结果向上取整数,得到整数列数,注意最少 2 列:

X = Math.ceil(X)

X = Math.max(X, 2)

代入 X 的值,再次利用公式,就可以求出 width

通过服务端返回的图片真实宽高,进行换算,就可以得出图片的显示高度了。注意为了防止图片超过一屏幕,也需要限制下高度:

imageHeight * width / imageWidth

imageHeight = Math.min(imageHeight, windowHeight - navBarHeight - 220)

瀑布流兼容情况:

grid-view 需要小程序基础库 3.0.0,这个版本以下,则不使用瀑布流,使用卡片列表做好兜底即可。要兜底的用户比例,可以在小程序后台-设置-基本设置-版本设置-基础库最低可用版本里去查看对应版本的「受影响用户UV占比」。