ios11,弹出层内的input框光标错位 键盘弹出时,输入信息,光标一直乱跳

本文介绍了解决iOS11系统下弹出层内输入框光标错位问题的方法。通过调整弹出层定位并阻止页面底部touchmove事件,有效解决了用户体验问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

  之前开发了一个微信项目,维护期中苹果手机突然出现光标错位现象,经过排查,发现是最新的ios11系统的锅。

  具体情况:弹出层使用position: fixed;弹出层内附带input/textarea输入框,ios11系统的苹果机用户在点击输入框,出现键盘后,弹出层被顶上去,而光标还停留在原处,即出现错位情况。

  解决思路:

  1. 解决光标错位:弹出层设置为position: absolute;body添加position: fixed;
  2. 弹出层重新定位:获取滚动条高度,设置为弹出层Top值;
    function getScrollTop(): string {
    const scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
    return scrollTop + 'px';
    }

  解决过程中碰到的问题:body设置为position: fixed后,一旦弹出层Top属性被赋值,页面会默认回到最顶端,用户体验感极差。

  在此基础上决定不设置body的定位,改为overflow: hidden; 等用户执行完操作,关闭弹出层时,再还原overflow: initial; 缺点是弹出层底部的内容无法再进行滚动,但是对用户体验无太大影响。在pc上测试无误后发布test环境,真机测试简直爆炸,底部内容仍旧可以自由滑动,连带着固定在上层页面的弹出层一起不受拘束的自由愉快滑动。

  由此发现的坑2:移动端设置body的overflow: hidden不生效,即使附加height: 100%;

  顺着思路下去,决定采取阻止页面的touchmove事件来实现固定底部页面的想法       

public fixBg() {    //阻止页面底部touchmove事件
document.addEventListener("touchmove",function(e){
e.preventDefault();
e.stopPropagation();
},false);
}

public flexibleBg() {    //恢复touchmove事件
document.addEventListener('touchmove', function (e) {
e.returnValue = true;
}, false);
}

from:https://www.cnblogs.com/teLumy/p/8257591.html

解释fixed的好链接

http://efe.baidu.com/blog/mobile-fixed-layout/?utm_source=tuicool&utm_medium=referral


在一个页面中点击一个按钮会出现一个弹出框,这个弹出框给了fixed定位,并且宽高都等于100%,在这个弹出框中有包含input输入框的div,这个div未做定位设置。页面操作中看不出来什么问题,真机操作的时候会发现,安卓上没有问题,但是在ios上就出现问题了,尤其是ios11系统上,问题表现非常明显。在输入框输入内容的时候,手机下方会弹出一个键盘,然后输入框中光标就跟丢了魂似的乱窜,本以为会是个别手机屏幕问题,拿出几个ios测试机,一番简单测试后发现,是普遍存在的问题,尤其在ios11上比较明显。看着那乱窜的光标,瞬间懵十三了。 
一番简单查阅,了解到这是在ios上存在的一个坑,前人已经给出了几种解决方案,查看几篇相关技术博客,看了一遍,那写的是毛玩意,顿时心有不畅,然后尝试着按照自己理解的思路去解决,结果成了,光标的魂终于回来了。在此分享下我的解决思路: 
如果弹出框是fixed定位,并且弹出框中输入框,那么就很可能会出现这种问题。很简单的解决办法,你把fixed定位去掉,改变你的样式表现方式。我这里是把弹出框改成absolute定位,弹出框的父元素改成relative定位解决的。

转载于:https://www.cnblogs.com/AiMuzi/p/8336714.html

<think>好的,我现在需要解决用户在uni-app的<uni-popup>组件中使用textarea,软键盘弹起导致弹窗被遮挡的问题。首先,我得回想一下用户提供的引用内容,看看有哪些已有的解决方法。 根据引用[3],在pages.json中设置softinputMode为adjustResize可以让页面高度调整,避免输入框被覆盖。这可能适用于普通页面,但弹窗组件可能结构同,需要确认是否同样有效。用户的问题是关于<uni-popup>的,可能需要针对弹窗进行调整。 引用[1]提到必须同使用cursor-spacing和uni-input类,并且引入uni.css。这可能与输入框的样式和间距有关,确保软键盘弹出有足够的空间。需要检查用户的代码是否应用了这些类,或者是否有遗漏的样式文件。 引用[2]指出在H5中软键盘收起后页面未恢复,导致按钮错位。这可能涉及到页面布局的调整,可能需要监听键盘事件,手动调整弹窗位置或页面滚动。 接下来,我需要将这些信息整合成解决方案。首先,设置softinputMode为adjustResize,确保页面高度自适应。然后,检查textarea的样式,应用cursor-spacing和uni-input类,并引入uni.css。此外,可能需要动态调整弹窗的位置,比如在键盘弹起改变弹窗的定位方式或添加滚动。 另外,引用[3]提到设置外页面高度为100vh,这有助于布局正确。可能需要确保弹窗的容器高度也是100vh,或者使用flex布局让内容区域自适应。 最后,可能需要测试同平台的表现,比如iOS和Android,以及H5环境,因为同平台处理软键盘的方式可能有差异。如果问题依然存在,可能需要结合监听键盘事件,动态调整布局或使用垫高元素的方法。</think>在 uni-app 的 `<uni-popup>` 组件中处理 textarea 弹起软键盘导致弹窗被遮挡的问题,可通过以下组合方案解决: ### 一、基础配置方案 1. **设置软键盘模式** 在 `pages.json` 中为使用弹窗的页面配置: ```json { "path": "pages/your-page", "style": { "app-plus": { "softinputMode": "adjustResize" // 安卓/iOS 通用方案[^3] } } } ``` 2. **容器高度设定** 弹窗容器需设置最小高度为 `100vh`,防止键盘顶起压缩空间: ```css .popup-container { min-height: 100vh; display: flex; flex-direction: column; } ``` ### 二、输入框专项优化 3. **强制光标间距** 给 `<textarea>` 添加 `cursor-spacing` 属性(单位 px),预留键盘空间: ```html <textarea class="uni-input" cursor-spacing="100" :adjust-position="false" ></textarea> ``` 需同引入 `uni.css` 样式文件[^1] 4. **禁用自动位移** 设置 `:adjust-position="false"` 关闭原生位移逻辑,避免与弹窗布局冲突 ### 三、动态布局补偿(进阶) 5. **键盘事件监听** ```javascript export default { methods: { onKeyboardHeightChange(e) { this.keyboardHeight = e.height this.$nextTick(() => { this.scrollToInput() }) } } } ``` 6. **滚动补偿算法** ```javascript scrollToInput() { const query = uni.createSelectorQuery().in(this) query.select('#target-textarea').boundingClientRect(rect => { const visibleHeight = uni.getSystemInfoSync().windowHeight if (rect.bottom > visibleHeight - this.keyboardHeight) { uni.pageScrollTo({ scrollTop: rect.top - (visibleHeight - this.keyboardHeight - 40), duration: 300 }) } }).exec() } ``` ### 四、平台差异化处理 ```javascript // 安卓需额外处理 resize 延迟 if (uni.getSystemInfoSync().platform === 'android') { setTimeout(this.scrollToInput, 300) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值