解决H5在native中键盘弹起影响页面交互

news/2024/12/29 12:51:38/

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

问题描述

native中拉起键盘再收回,滚动列表实际距离发生变化,被键盘一起弹上去了(我这里大约是400px的样子)

这是初始页面:

在这里插入图片描述

当我聚焦页面中某个Input后,再失去焦点,页面变成了这样:

在这里插入图片描述

可以看到页面被弹上去了,再次重复步骤页面会继续弹上去,排查了一下发现是在IOS中的问题。

解决方案

我这里想到的一个比较好的方案是监听弹起键盘收起键盘两个事件,在弹起时记录被破坏的页面scrollY,收起时恢复。

记录弹起时的页面scrollY挺简单的,直接这样:

window.addEventListener('focusin', () => {console.log('弹起前高度:', window.scrollY);
}, false)

这样思路就很简单了,代码实现一下:

const focusScrollHeight = useRef<number>(0);useEffect(() => {window.addEventListener('focusin', focusIn, false);window.addEventListener('focusout', focusOut, false);return () => {window.removeEventListener('focusin', focusIn, false);window.removeEventListener('focusout', focusOut, false);};}, []);const focusIn = () => {focusScrollHeight.current = window.scrollY;};const focusOut = (e) => {window.scrollTo(0, focusScrollHeight.current);};

把这段代码放在出现问题的页面里,发现页面会不稳定的回弹到顶部,排查下来应该是antd的组件触发了收起键盘的事件,所以考虑用类名定位的方案来搞定,同时我们直接封装成一个hook,在出现问题的页面中直接使用,就像这样:

useResetScrollY.ts

/*** @description: 声明式hook,在页面声明即可自动归位手机端键盘弹起撑开的高度* @param {string} listenerClassList 监听的类名* @return {*}*/
const useResetScrollY = (listenerClassList: string[]) => {const focusScrollHeight = useRef<number>(0);useEffect(() => {window.addEventListener('focusin', focusIn, false);window.addEventListener('focusout', focusOut, false);return () => {window.removeEventListener('focusin', focusIn, false);window.removeEventListener('focusout', focusOut, false);};}, []);const focusIn = () => {focusScrollHeight.current = window.scrollY;};const focusOut = (e) => {const classNameList: string[] = Array.from(e?.target?.classList);if (classNameList?.some((item: string) => listenerClassList?.includes(item))) {window.scrollTo(0, focusScrollHeight.current);}};
};export { useResetScrollY };

这里入参我们给出在页面中需要被监听的组件类名,一般来说都是InputTextarea这类表单组件,然后在这个页面我使用的是antdInput组件,所以使用是这样的:

const Page = () => {// ...if(isIos) {useResetScrollY(['adm-input-element']);}// ...
}

这样子在hook内部触发事件时只需要判断事件对象的classList与入参classList是否存在公共项的情况,就会触发键盘副作用归位的行为。

写在后面

这是笔者在业务中遇到的一个问题,简单总结记录,如果对于这种情况有更好的方案也欢迎留言讨论~

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~


http://www.ppmy.cn/news/415867.html

相关文章

OSChina 周二乱弹 ——有时醒来发现身边是不同的姑娘

2019独角兽企业重金招聘Python工程师标准>>> 马晓倩osc : 时间过得太快了. 假期总给你这样的感觉&#xff0c; 用欢快的心情迎接工作吧。 手机版的想听音乐&#xff0c;请戳&#xff08;这里&#xff09; codeIsMyGirl : 防不胜防。 人和人之间的信任呢&#xff01;…

JAVA学习总结十四

第四章 使用DML修改数据库 本章主要集中于对数据库的增删改的内容继续进行讲解&#xff0c;所以以示例展示的方式即可。 – 创建一个新的数据库 CREATE DATABASE homework; – 学生表&#xff1a;t_student – 编号s_id 整形 主键 自增 – 姓名&#xff1a;s_name 字符串…

使用ListView实现聊天界面

使用listview实现聊天界面如下: 实现聊天界面的的方法可以在定义baseAdapter的时候重写getItemViewType()方法返回第positon个Item是何种类型,重写getVIewTypeCount()方法来返回不同的布局总数,在获取布局的时候,判断一下该获取哪一种布局就可以了。也可以定义两个布局来实…

不可不知的全面产品分析

不可不知的全面产品分析 经过各大应用市场&#xff0c;搜索引擎&#xff0c;社会化媒体&#xff08;用搜狗搜索微信朋友圈相关文章&#xff0c;微博搜索相关话题&#xff09;&#xff0c;行业媒体&#xff08;36kr、虎嗅、钛媒体、知乎、人人都是产品经理、艾瑞咨询、易观智库&…

nlp总结

中科院nlpir和海量分词&#xff08;http://www.hylanda.com/&#xff09;是收费的。 hanlp:推荐基于CRF的模型的实现~~要看语料&#xff0c;很多常用词会被分错&#xff0c;所以需要词库支撑。目前最友好的开源工具包应该是HanLP&#xff0c;基于词典&#xff0c;对各种实体词汇…

简单循环

names[yangyuying,zilingxi,ziye,muziyi] for name in names:print(name)>>> yangyuying zilingxi ziye muziyii0 while i<3:i1print(i)>>> 1 2 3for i in range(5):print(i)>>> 0 1 2 3 4actor[[黄景瑜,刘昊然,吴亦凡],[朴海镇,宋钟基,朴灿烈]]…

产品经理基本功:消息推送设计

拉新、促活最有效的方式&#xff0c;在目前除了有效的活动运营外&#xff0c;消息反馈机制也是必不可少的。以消息推送为例&#xff0c;借助第三方的推送工具&#xff0c;可以有效的提升产品的打卡率与用户活跃度。 但第三方工具只能在产品外部帮助提醒用户&#xff0c;系统内的…

字典操作

info{xihuan01:张艺兴,xihuan02:李易峰,xihuan03:吴亦凡,xihuan04:黄景瑜,xihuan05:朴灿烈,xihuan06: 张云龙 } print(info) print(info[xihuan03]) info[xihuan03]like吴亦凡 print(info) print(info.get(xihuan05))#提取元素 print(info.get(xihuan07))#若元素不存在&#xf…