zoukankan      html  css  js  c++  java
  • h5 ios输入框与键盘 兼容性优化

    起因

    h5的输入框引起键盘导致体验不好,目前就算微信、知乎、百度等产品也没有很好的技术方案实现,尤其底部固定位置的输入框各种方案都用的前提下体验也并没有很好,这个问题也是老大难问题了。目前在准备一套与native协议 来解决这个问题,目前项目中的解决方案还是有值得借鉴的地方的,分享一下

    业务场景

    固定在h5页面底部的输入框

    无论是使用

    <input />

    还是

        <div contenteditable="true">
        </div>

    在聚焦事件触发调起原生键盘时,在ios部分机型(iphone 4s iphone 5等)上会使得键盘弹起后遮挡住输入框,使得用户体验不好。

    目前的解决方案是写一个定时任务,在判定是ios打开页面时,执行以下函数

    let timer = setInterval(()=>{
        // container 知道整个容器的dom节点
         container.scrollIntoView({ 
            block: 'start',
            behavior: 'auto'
         })
    },300); //300毫秒是经过多次试验得到的数值,用户体验为佳

    关于scrollIntoView

    scrollIntoView这个API,官方的解释是
    The Element.scrollIntoView() method scrolls the element on which it's called into the visible area of the browser window.
    语法

    element.scrollIntoView(); // 等同于element.scrollIntoView(true) 
    element.scrollIntoView(alignToTop); // Boolean型参数 
    element.scrollIntoView(scrollIntoViewOptions); // Object型参数

    参数

    参数 说明 类型 可选值 默认值
    alignToTop -- boolean --- false
    scrollIntoViewOptions -- object -- --
    {
        behavior: "auto"  | "instant" | "smooth",
        block:    "start" | "end",
    }

    在can i use中查到的scrollIntoView的兼容性(主流浏览器中不考虑ie)

    • Firefox 36 以上兼容
    • chrome 61 以上兼容
    • safiri 5.1开始 不兼容behavior中的smooth

    后续问题

    当然,这个解决方案智能解决部分机型的问题,要真正解决这个问题还是要依靠native端。

    在ios 和 安卓机型的问题

    因为设置了这个定时任务,就会有一个后续的问题出现,也是在落地项目中有遇到过的,在此说明一下。


    在上拉或下拉到头时,会出现背景白色的现象,因为有了这个定时器,它就会不断将视图拉回,导致页面抖动。
    如果在app层做了webview禁止拖动的话就不会有这个问题,当然不能完全依赖app,在程序中我们也需要做此方面的兼容优化。

        <div class="container"
             @touchStart="touchStart($event)"
             @touchEnd="touchEnd($event)">
        
        </div>
     touchStart(e) {
        this.clearTimer();
     },
     touchEnd(e) {
        this.repairIosInput();
     },
     clearTimer() {
         if(this.timer) {
             clearInterval(this.timer);
             this.timer = null;
         }else{
             return;
         }
     },
     repairIosInput() {
         if(this.timer) {
             return;
         }
         this.timer = setInterval(()=>{
              container.scrollIntoView({ 
                block: 'start',
                behavior: 'auto'
             })
         },300);
     }

    在开始拉动页面时清空定时器,停止拉动时开启定时器,这样就可以解决造成的抖动的问题了。

    总结

    做为一个老大难的问题,还会用更多的解决方案,请与我联系,一起讨论,早日脱坑!

    本文转载于:猿2048→https://www.mk2048.com/blog/blog.php?id=h010hi2ik2j

  • 相关阅读:
    “automation服务器不能创建对象”的问题的解决方案大全
    转载区分C#中的Abstract函数和Virtual函数
    DOS批处理
    数据库设计范式
    java 内存查看工具
    Java内存溢出详解
    Struts2 循环编辑指定次数
    Selenium 使用
    spring security 获取当前用户信息
    由MyEclipse内存不足谈谈JVM内存
  • 原文地址:https://www.cnblogs.com/10manongit/p/12738430.html
Copyright © 2011-2022 走看看