安卓和ios的输入框弹出键盘时,导致fixed或absolute定位的按钮顶上去的问题

8631次阅读 659人点赞 作者: WuBin 发布时间: 2023-12-20 15:05:28
扫码到手机查看

遇到的问题

在移动端中input唤起键盘的时候,会导致底部被fixed或者absoluted的button被顶上去,解决的第一思路就是要监听到键盘弹起的事件,对此解决方案要分为ios和android两种情况。问题如图所示:

就是如上图一个很简单的textarea,下面的关闭是absolute的。部分代码如下:

HTML

<div class="textarea-wrapper">
    <textarea placeholder="请填写您要展示的文字内容"
              v-model="textContent"
    ></textarea>
    
    <div class="submit">...</div>
</div>
<div class="close">
    <button type="button" @click="close">
        关 闭
    </button>
</div>

CSS

.close {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 0 0 30px;
    text-align: center;

    button {
        color: #fff;
        background-color: ...;
        width: 50%;
        line-height: 40px;
    }
}

解决方法

主要的原理是分别考虑focus事件和onresize 事件,在focus为true时,再去考虑onresize 导致的窗口高度是否发生变化。

这是因为对于android,输入框的弹起必然导致onresize 事件的发生,窗口高度是一定会变化的,但焦点并不一定和此完全相关,例如,输入框获取焦点后,收回键盘,焦点并不会随之撤出;

但ios上焦点和键盘弹出是绝对相关的关系,相反的,ios中键盘的弹起并不会触发onresize事件。同时,ios上键盘弹起也不会影响absolute定位。

因此,我们不仅要对textarea的focus和blur做触发方法,同时也要监听屏幕高度变化,判断是否调起了键盘。

对HTML的修改:

<textarea 
            placeholder="请填写您要展示的文字内容"
            @focus="toggleTextareaFocus(true)"
            @blur="toggleTextareaFocus(false)"
            v-model="textContent"
></textarea>
 <div class="close" :class="{'focus-text': focusText}">
                    <button type="button" @click="close">
                        关 闭
                    </button>
</div>

CSS

.close {
    position: absolute;
    ...

    &.focus-text{
        opacity: 0;
    }

    button {
        ...
    }
}

JS

const SCREEN_HEIGHT = Math.floor(window.innerHeight);
const IS_IOS = (() => {
    let reg = /iphone|ipod|ipad|Macintosh/i;
    return reg.test(navigator.userAgent.toLowerCase());
})();

mounted() {
    // 当唤起键盘时 屏幕尺寸会发生改变 这里只针对安卓 苹果虚拟键盘调起的时候不触发屏幕变化事件
    window.onresize = () => {
        if (IS_IOS) {
            return;
        }
        const resizeHeight = document.body.clientHeight;
        // 当安卓端键盘调上来后document.body.clientHeight和window.innerHeight值一致
        if (resizeHeight < SCREEN_HEIGHT) {
            // 如果变化后的高度比之前小 代表虚拟键盘展开了 那么代表需要隐藏按钮
            this.focusText = true;
        } else {
            // 如果变化后的高度>=之前 代表虚拟键盘关闭了 但是此时失焦与否不确定
            this.focusText = false;
        }
    }
},
methods: {
    toggleTextareaFocus(focus) {
        if (IS_IOS) {
            return;
        }
        this.focusText = focus;
    },
}

这里需要添加失焦、聚焦时候都要有事件,并且要排除掉IOS,否则聚焦时候在IOS上会隐藏掉按钮。

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:输入框,定位,布局混乱
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9315次阅读 600人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4060次阅读 302人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14265次阅读 931人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    13177次阅读 461人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11801次阅读 943人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15926次阅读 1269人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14993次阅读 1221人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29343次阅读 2304人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25342次阅读 1952人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录