结构如下我们需要做的是当评论框获得焦点时,ios需要让键盘置顶评论框。在ios系统中,弹出键盘的时候会挤压页面,评论框自然会在最上面,但是有个问题就是下面的评论框不会粘在底部,露出下面的东西,所以ios12之前的解决方案是在评论框触发焦点的时候页面滚动到底部。代码如下:constbody=document.dcumentElement.scrollTop?document.documentELement:document.body;const{scrollHeight,scrollTop}=body;constinnerHeight=Math.min(window.innerHeight,document.documentElement.clientHeight);body.scrollTop=scrollHeight-innerHeight;如果输入框失去焦点,让页面滚动到上一个位置。代码如下:body.scrollTop=scrollTop;//滚动到上一个位置这个方案在ios12上会有两个问题:
- 如果输入框在页面底部抬起,输入框会被键盘挡住
- 如果在页面中间,行为会变得很奇怪。即使我们使用上面的方法,输入框也不会粘在底部。众所周知,固定定位会在打字时生效,即使我们禁用了touchmove事件,仍然可以滚动
所以针对这些问题,我首先尝试了这个网上普遍的解决方案:scrollIntoView,但是报错,没有这个方法。然后我自己分析了这个问题。各种情况的原因是弹出键盘的时候页面可以滚动,所以出现各种问题,导致页面根本无法滚动。ios11及之前使用以下布局:.parent{position:fixed;左:0;右:0;底部:0;top:0;}并且禁用了touchmove事件,可以让页面无法滚动,但是ios12并没有这个蛋有什么用。还是可以滚动的,所以我们让内容只有一屏,内容多了就被截掉了。下面是输入框焦点的代码:const{scrollHeight,scrollTop}=body;constinnerHeight=Math.min(window.innerHeight,document.documentElement.clientHeight);body.style.height=`${innerHeight}px`;body.style.overflow='hidden';然后是输入框触发模糊事件时的代码:body.style.height=`${scrollHeight}px`;body.style.overflow='自动';body.style.scrollTop=scrollTop;这里我们需要重新设置body的高度,这个高度就是之前获取到的scrollHeight,因为我们需要重新滚动到之前的位置,建议不要将height设置为auto,因为在某些场景下我们可能需要监听滚动事件,会出现其他东西(稳扎稳打,方能打胜仗)。然后重置body的overflow,让页面可以滚动,最后滚动到之前的位置。