首页 > 其他分享 >解决ios设备软键盘弹出导致页面整体被顶起

解决ios设备软键盘弹出导致页面整体被顶起

时间:2022-10-18 23:47:48浏览次数:38  
标签:flex ios 软键盘 let flexHeight 页面

问题

ios设备:点击input,软键盘弹出,页面整体向上偏移

需求

当软键盘弹起,input改变位置并始终贴着软键盘,整体页面不上移动

解决

页面采用flex布局

<div class="flex">
    <div class="box">
        <div class="head"></div> //标题区
        <div class="body"></div> //内容滚动区
        <div class="foot"></div> //输入区
    </div>
</div>    

 

涉及内置API,返回一个DOMRect对象,包含lefttoprightbottomxywidth 和 height元素。

 

document.getBoundingClientRect()

getBoundingClientRect()是相对浏览器而言的,因此使用与整体页面偏移的情况。

offset()也是可以计算偏移量,但其是相对于父元素,因此在此处不适用

 

setTimeout(() => {
    let flex = document.querySelector('.flex')
    //页面向上偏移量
    let changeHeight = flex.getBoundingClientRect().top
    //flex高度
    let flexHeight =flex.offsetHeight
    //改变flex-div的height
    flex.style.height = parseInt(flexHeight + changeHeight) + 'px'
    }
}, 100)

因为要考虑软键盘弹出是动画需要时间,所以设置定时器来暂缓代码。为了让效果看起来连贯,定时设置为100ms,而下面让页面回滚定时为101ms。

 

遗留问题

当软键盘弹起,页面高度减少,但是在页面和软键盘之间会遗留一片空白区域,不知道是什么原因,只能通过设置页面滚动来返回初始位置

setTimeout(() => {
    window.scroll(0, 0)
}, 101)

 

源码

项目是用vue写,并且设定了在某种条件下才处理软键盘

只有ios才要处理,增加判断打开页面设备是否为ios

setFlexHeight() {
        //判断是否为ios设备,只有ios设备有这样的情况
        const user = navigator.userAgent
        let isIos = !!user.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
        if (isIos) {
          setTimeout(() => {
            if (this.contentList.length >= 3) this.flexHeight = '100%'
            else {
              //页面向上偏移量
              let changeHeight = this.$refs.flex.getBoundingClientRect().top
              //flex高度
              let flexHeight = this.$refs.flex.offsetHeight
              //改变flex-div的height
              this.flexHeight = parseInt(flexHeight + changeHeight) + 'px'
            }
            
          }, 100)
          //因为软键盘弹起页面缩短,导致页面和软键盘之间留白
          //重新让页面回到底部
          if (this.contentList.length < 3) {
            setTimeout(() => {
              window.scroll(0, 0)
            }, 101)
          }
        }
      }

 

标签:flex,ios,软键盘,let,flexHeight,页面
From: https://www.cnblogs.com/karle/p/16804621.html

相关文章

  • mui组件导致ios设备无法让input获取焦点
    问题页面使用了mui组件,其中有个input标签。在IOS,macOS设备上无法通过点击让input框获得焦点,导致无法输入。原因mui.css中有个样式,让页面内容无法被选中,影响了input获取......
  • vue项目添加页面加载loding进度条效果
    Vue项目的优化过程中需要添加NProgress加载loding进度条效果一、进度条效果我们要实现的效果就是,当我们点击每一个菜单,加载相应的页面时,在页面顶部中间会有一个加载的......
  • iOS Block
    http://events.jianshu.io/p/94db362acb97  Block的分类Block有三种类型:全局Block,堆区Block,栈区Block全局Block当Block没有引用到局部变量时或者Block里面使用的......
  • 【SpringMvc】项目启动成功进入index页面,但@RequestMapping注解的路径报 500
    【爱迪的懂】项目正常启动成功进入index页面,但@RequestMapping注解的路径报500【避坑!】----------------------------------------------------------------------------......
  • axios : Promise based HTTP client for the browser and node.js
    axiosPromisebasedHTTPclientforthebrowserandnode.jsFeaturesMake​​XMLHttpRequests​​fromthebrowserMake​​http​​requestsfromnode.jsSupportsthe......
  • electron在远程页面中调用自定义的confirm
    1.自定义confirm,使用elementui的默认弹出框,只用样式。<divtabindex="-1"role="dialog"aria-modal="true"aria-label="提示"class="el-message-box__wrapper"style="z-in......
  • 【Vue】Axios详解
    @[toc]1Axios简介1.1什么是Axios?Axios是一个基于​​promise​​​网络请求库,作用于​​node.js​​和浏览器中。它是​​isomorphic​​​的(即同一套代码可以运......
  • selenium4-定位单个页面元素
    在操作各项页面元素之前,先介绍下如何通过Python代码来找到这些元素。WebDriver提供了18种元素定位方法,共分为两类(定位当个元素、定位组元素),本节先举例详细介绍下selenium4-......
  • Selenium4Web自动化2-页面元素定位
    一前端页面的组成分析详解1常见标签标签语言,常见的标签有:a:超链接img:图片input:输入框、文件上传button:按钮select:下拉框iframe:窗体p:文字。。。。。2标签语......
  • 通过Js来设置页面样式
    介绍我们可以在编辑HTML源码的时候将CSS样式写死到.css文件或者HTML元素的style属性中,但又时候可能会需要动态地来修改某个元素的样式。我这里介绍两种方式:修改HTML元素的s......