摘要:希望新版兼容和安卓两端的情况下,无限制的刷新加载数据。图片大小限制,本次由于部分列表图片过大,在安卓上导致黑屏的问题出现。
一、背景
近期项目改版,对原有的h5页面进行了重新设计,数据呈现变成了瀑布流。希望新版兼容ios和安卓两端的情况下,无限制的刷新加载数据。大致效果如下:
整个页面分4部分:
顶部导航
步数状态卡片
用户信息卡片
滚动列表
期望效果:列表滚动到用户信息卡片消失后,展示另一个吸顶的导航栏。
效果如下:
分析可以发现,首先我们要做的就是适配iPhone X,其次我们需要监听列表的滚动高度,在pc和安卓上监听滚动事件是没有问题的,但是ios上滚动过程中不会触发scroll事件,而是滚动结束后会触发onscrollend事件,这就不能满足实时监听高度的要求。经过简单调研,决定站在巨人的肩膀上,通过iscroll、better-scroll等js库实现。这两个库都是解决各种滚动兼容的js库,很多常见的轮播、picker组件都是基于这些库封装的。顺便说一句,还有个库也不错(simulation-scroll-y)
1.适配iPhone X
PhoneX的适配,在iOS 11中采用了viewport-fit的meta标签作为适配方案;viewport-fit的默认值是auto。react app的渲染内容都在id为root的 div里面。我们给这个div加上iphoneX的safe-area-inset属性即可。更多相关内容,这篇文章写的挺详细
#root{ height:100vh; padding-top: constant(safe-area-inset-top); padding-left: constant(safe-area-inset-left); padding-right: constant(safe-area-inset-right); padding-bottom: constant(safe-area-inset-bottom); padding-top: env(safe-area-inset-top); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); padding-bottom: env(safe-area-inset-bottom); }
2.页面
页面结构不多说,比较基础。
div.container-> div#wrapper->div.list->div.list-item
值得注意的是,wrapper需要设置绝对定位。同时,通过transform: translateZ(0);开启硬件加速,浏览器在渲染时会通过GPU进行渲染。有效缓解安卓端滚动卡顿的问题,类似的css还有不少,css硬件加速不要滥用,否则会导致不该使用gpu的layer使用gpu,占用内存过高,导致页面卡顿,甚至黑屏,一般情况下,给不同的硬件加速元素添加一个不同的z-index属性可以解决。-webkit-overflow-scrolling: touch使ios滚动顺滑。
// 初始化BScroll伪代码,生产慎用:
import BScroll from "better-scroll"; this.myScroll = new BScroll("#wrapper", { mouseWheel : true, // 无需scrollbar scrollbar : false, // propType属性设置为3在惯性动画期间也触发onscroll事件 probeType : 3, // 允许滚动列表内可点击、touch click : true, tap : true, // 上拉加载,正值自动触发加载 pullUpLoad : { threshold: 50 } });
一开始,我将better-scroll初始化代码放在container组件的componentDidMount函数中,但由于初始数据也在这个函数获取,导致当返回较慢的时候初始化的#wrapper没有内容,此时需要手动点击加载更多才展现数据,不符合预期。所以考虑将初始化代码放到list组件渲染完成之后的componentDidUpdate函数中。list组件渲染完成后,就可以初始化我们的滚动类,这里使用的better-scroll,iscroll使用类似。具体参考上面链接。
#wrapper { position:absolute; top:0; left:0; width:100vw; overflow:auto; height: 100vh; transform: translateZ(0); z-index: 33; -webkit-overflow-scrolling: touch }
具体的,可以将初始化代码放在list组建的container组件的handleScrollRefresh函数。这个函数作为props传到list组件,在list组件的componentDidUpdate钩子里面执行:
container组件:
handleScrollRefresh () { if (this.myScroll) { this.myScroll.refresh(); console.log("refreshed "); } else { console.log("initialized"); this.myScroll = new BScroll("#wrapper", { ...//初始化参数 }); this.myScroll.on("scroll",this.handleScroll, 10); this.myScroll.on("pullingUp", this.loadMore); } }
list 组件:
componentDidUpdate () { if (this.props.onRefresh) { this.props.onRefresh(); } }
网上很多滚动卡顿的情况,大都是加载数据后没有执行refresh导致的。同时,加载数据成功后我们需要调用scroll的finishPullUp方法。下次上拉才能继续加载数据。这样,每当加载新的数据后,list组件就会执行componentDidUpdate,此时就调用了scroll的finishPullUp、refresh函数,使用起来无比顺滑。
三、优化
和大多数滚动处理一样,better-scroll的scroll事件也会频繁触发,这对性能还是有一定影响的,毕竟我们不需要过于频繁的执行回调函数。
throttle (func, delay) { let lastTime = null; return function () { let context = this; let args = arguments; let now = new Date().getTime(); if (!lastTime || (now - lastTime) > delay) { lastTime = now; func.apply(context, args); } }; };
不想写直接使用lodash也可以:
//不精准的每秒十次 this.myScroll.on("scroll", this.throttle(this.handleScroll, 100));
函数绑定,不传参的情况下在constructor中绑定this。而不是在render中使用this.xxx.bind(this)。
list 图片大小限制,本次由于部分列表item图片过大,在安卓上导致黑屏的问题出现。排查了很久才发现这个问题。通过在图片url拼接参数限制大小解决了这个问题。
最后感觉写得好乱,做事情和写文章果然是两回事。。。
有兴趣可以访问:https://3hours.taobao.com/new...
一起来做公益吧!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/108858.html
摘要:比如安卓平台在中不能触屏手动滚动。主要的功能界面模块大部分主要是展示的,网易云的页面和功能实在是太多了,由于时间关系,并没有把所有的功能都做完整,后续会陆续加上其他的功能。各部分模块首页展示音乐播放,包括动画,歌词同步等。 React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台。 GitHub 完整源码地址https://github.com/yezihaohao...
摘要:最近在使用技术栈重构一个单页应用,其中有个页面是实现城市选择功能,主要是根据城市的首字母来快速跳转到相应位置,比较类似原生中的电话联系人查找功能,页面如图主要问题在上下滑动右侧定位的元素时,页面会跟着一起滑动当然这个现象在开发过程中应该会经 最近在使用 React 技术栈重构一个单页应用,其中有个页面是实现城市选择功能,主要是根据城市的首字母来快速跳转到相应位置,比较类似原生 APP ...
摘要:主要有两种方式和。的私有标签,顶端状态条的样式。禁止数字自动识别为电话号码,这个比较有用,因为一串数字在上会显示成蓝色,样式加成别的颜色也是不生效的。页面禁止复制选中文本 react 移动端 兼容性问题和一些小细节 使用 ES6 的浏览器兼容性问题 react 对低版本的安卓webview 兼容性 iOS下 fixed与软键盘的问题 onClick 阻止冒泡 meta对于移动端的一些...
摘要:主要有两种方式和。的私有标签,顶端状态条的样式。禁止数字自动识别为电话号码,这个比较有用,因为一串数字在上会显示成蓝色,样式加成别的颜色也是不生效的。页面禁止复制选中文本 react 移动端 兼容性问题和一些小细节 使用 ES6 的浏览器兼容性问题 react 对低版本的安卓webview 兼容性 iOS下 fixed与软键盘的问题 onClick 阻止冒泡 meta对于移动端的一些...
阅读 3405·2021-09-26 09:46
阅读 2742·2021-09-13 10:23
阅读 3465·2021-09-07 10:24
阅读 2374·2019-08-29 13:20
阅读 2898·2019-08-28 17:57
阅读 3053·2019-08-26 13:27
阅读 1161·2019-08-26 12:09
阅读 484·2019-08-26 10:27