• h5移动端常见的问题及解决方案


    01、ios端兼容input高度

    问题描述

      input输入框光标,光标的高度和父盒子的高度一样,而android手机没问题

      android  

        

      ios

        

    产生原因

      通常我们习惯用height属性设置行间的高度和line-height属性设置行间的距离(行高),当点击输入的时候,光标的高度就自动和父盒子的高度一样了。(谷歌浏览器的设计原则,还有一种可能就是当没有内容的时候光标的高度等于input的line-height的值,当有内容时,光标从input的顶端到文字的底部

    解决

    padding  去替换  line-height

    复制代码
    .content {
    box-sizing: border-box; height: 88px; .content-input { display: block;//块元素 box-sizing: border-box;//怪异盒模型 100%; font-size: 28px; //line-height: 88px; padding: 30px 0; } }
    复制代码

    02、ios上下滑动页面卡顿,页面缺失

    问题描述

      在ios端,上下滑动页面时,如果页面高度超出了一屏,就会出现明显的卡顿,页面有部分内容显示不全的情况,例如下图,右图是正常页面,边是ios上下滑动后,卡顿导致如左图下面部分丢失。

    产生原因

       微信浏览器的内核,Android上面是使用自带的WebKit内核,iOS里面由于苹果的原因,使用了自带的Safari内核,Safari对于overflow-scrolling用了原生控件来实现。对于有-webkit-overflow-scrolling的网页,会创建一个UIScrollView,提供子layer给渲染模块使用。

      原来在iOS5.0以及之后的版本,滑动有定义两个值auto和touch,默认值为auto.
        -webkit-overflow-scrolling:touch; 当手指从触摸屏上移开,会保持一段时间的滚动.
        -webkit-overflow-scrolling:auto; 当手指从触摸屏上移开,滚动会立即停止.

    解决

     方案一

    在需要滑动的位置加上如下css代码:
    overflow:scroll;
    -webkit-overflow-scrolling:touch;

    存在问题

    1、在滑动界面之中使用的position:fixed 无法固定下来,会随着界面进行一起滚动

      解决方法:将使用的position:fixed(头部导航)写在滑动部位外部,在使用绝对定位进行布局,以此解决问题

    2、vue中使用v-if导致的界面初始化之后无法滑动

      解决方法:将v-if改成v-show进行展示,解决界面进入之后第一次不能滑动的问题

    扩展

      -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效果.auto: 使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止。touch: 使用具有回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。同时也会创建一个新的堆栈上下文

    03、input输入框在iOS中获取到焦点之后界面上移无法回落问题

    问题描述

      输入内容,软键盘弹出,页面内容整体上移,但是键盘收起,页面内容不下滑

    产生原因

      固定定位的元素 在元素内 input 框聚焦的时候 弹出的软键盘占位 失去焦点的时候软键盘消失 但是还是占位的 导致input框不能再次输入 。

    解决

    复制代码
     <input
          class="content-input"
          placeholder="请输入姓名"
          v-model="peopleList.name"
          @blur.prevent="changeBlur()"
        />
    复制代码
    复制代码
    changeBlur(){
      let u = navigator.userAgent, app = navigator.appVersion;
      let isIOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);
      if(isIOS){
        setTimeout(() => {
          const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0
          window.scrollTo(0, Math.max(scrollHeight - 1, 0))
        }, 200)
      }
    }
    复制代码

    扩展

    • prevent:     阻止默认事件
    • blur:        失去焦点
    • position:fixed  的元素在ios里,收起键盘的时候会被顶上去,特别是第三方键盘

    04、界面点反应慢、延时问题解决方案

    产生原因

      iOS嵌套界面之后,界面点击效果会自动产生一个300毫秒的延时

    解决
    1、下载fastclick
      npm i -S fastclick
    2、引入
       FastClick.attach(document.body);

    存在问题

      引入fastclick之后,会有一个副作用:input输入框需要连续点击两次或者长按才能获取焦点

    |解决

      再引入fastClick的js中加入如下代码即可解决input输入框点击不能获取焦点的问题

    复制代码
    FastClick.prototype.focus = function(targetElement) {
      var length;
    
      if (deviceIsIOS&& targetElement.setSelectionRange && 
        targetElement.type.indexOf('date') !== 0 &&     targetElement.type !== 'time' &&
        targetElement.type !== 'month') {     length = targetElement.value.length;     targetElement.focus();     targetElement.setSelectionRange(length, length);   } else {     targetElement.focus(); } };
    复制代码

    05、new Date()转换时间在iOS中不生效问题

    产生原因

      前端界面使用new Date('2021-3-14 23:59:59').getTime(),iOS不解析。

    解决

      换用其他格式:new Date('2021-3-14T23:59:59').getTime()

    06、关于部分拷贝方法在iOS中不生效问题

    解决

      前端有时候需要用到拷贝部分内容到剪切板中,但是在使用时发现,部分网上提供的拷贝方法在Android中正常使用,但是在iOS中无法进行拷贝,经过试验发现一种通用的拷贝方法,如下:

    复制代码
    /**
    
    * 将内容拷贝到剪切板中
    
    */
    
    function copyContent(message) {
    
       // text: 要复制的内容, callback: 回调
    
      var input = document.createElement("input");
    
      input.value = message;
    
      document.body.appendChild(input);
    
      input.select();
    
      input.setSelectionRange(0, input.value.length);
    
      document.execCommand('Copy');
    
      document.body.removeChild(input);
    
    }
    复制代码

    07、android弹出的键盘遮挡输入框

    解决

      给input和textarea标签添加focus事件

      先判断是不是安卓手机下的操作,当然,可以不用判断机型,Document 对象属性和方法,setTimeout延时0.5秒,因为调用安卓键盘有一点迟钝,导致如果不延时处理的话,滚动就失效了

    复制代码
    changefocus(){
      let u = navigator.userAgent, app = navigator.appVersion;
      let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
      if(isAndroid){
        setTimeout(function() {
          document.activeElement.scrollIntoViewIfNeeded();
          document.activeElement.scrollIntoView();
        }, 500);       
      }
    },

    复制代码
    // 解决键盘弹出后挡表单的问题
        window.addEventListener('resize', function() {
          if(
            document.activeElement.tagName === 'INPUT' ||
            document.activeElement.tagName === 'TEXTAREA'
          ) {
            window.setTimeout(function() {
              if('scrollIntoView' in document.activeElement) {
                document.activeElement.scrollIntoView();
              } else {
                document.activeElement.scrollIntoViewIfNeeded();
              }
            }, 0);
          }
        });

     08、iOS上拉边界下拉出现白色空白

    问题描述

      手指按住 屏幕下拉,屏幕顶部会多出一块白色区域.手指按住屏幕上拉,底部多出一块白色区域。

    产生原因

      在iOS中,手指按住屏幕上下拖动,会触发touchmove事件.这个事件触发的对象时整个webview容器.容器自然会被拖动,剩下的部分会成空白

    解决

    复制代码
    <template>
      <div id="app" @touchmove="handleTouch">
        <div id="nav">
          <router-link to="/">Home</router-link> |
          <router-link to="/about">About</router-link>
        </div>
        <router-view/>
      </div>
    </template>
    <script>
    export default {
        created () {
            document.body.addEventListener('touchmove', (e) => {
              if (e._isScroller) return;
              e.preventDefault()
            }, {
              passive: false
            })
      },
      methods: {
        handleTouch (e) {
          e._isScroller = true
        }
      }
    }
    </script>
    <style>
    html,body {
      height: 100%;
      overflow: hidden;
    }
    app {
      height: 100%;
      overflow-y: auto;
      overflow-x: hidden;
    }
    <style>
    复制代码

    input 标签在 iOS 上唤起软键盘,键盘收回后页面不回落(部分情况页面看上去已经回落,实际结构并未回落)

    input 焦点失焦后,ios 软键盘收起,但没有触发 window resize,导致实际页面 dom 仍然被键盘顶上去--错位。解决办法:全局监听 input 失焦事件,当触发事件后,将 body 的 scrollTop 设置为 0。

    document.addEventListener('focusout', () => {
      document.body.scrollTop = 0;
    });


    唤起键盘后 position: fixed;bottom: 0px; 元素被键盘顶起

    解决办法:全局监听 window 的 resize 事件,当触发事件后,获取 id 名为 fixed-bottom 的元素(可提前约定好如何区分定位在窗口底部的元素),将其设置成 display: none。键盘收回时,则设置成 display: block;。

    const clientHeight = document.documentElement.clientHeight;
    window.addEventListener('resize', () => {
      const bodyHeight = document.documentElement.clientHeight;
      const ele = document.getElementById('fixed-bottom');
      if (!ele) return;
      if (clientHeight > bodyHeight) {
        (ele as HTMLElement).style.display = 'none';
      } else {
        (ele as HTMLElement).style.display = 'block';
      }
    });
  • 相关阅读:
    Windows安装Docker Toolbox 和docker-machine 常用操作
    VirtualBox6.1下载及安装 创建虚拟机
    Linux CentOS7 Docker-machine的安装
    CentOS Docker 安装
    gcc、g++
    找不到所需要的ndbm.h头文件
    最长公共字串(LCS)最长连续公共字串(LCCS)
    C# 爬虫批量下载文件
    '"VCVARS32.BAT"' 不是内部或外部命令,也不是可运行的程序
    jsoncpp 生成 json 字符串
  • 原文地址:https://www.cnblogs.com/chenzxl/p/14523972.html
Copyright © 2020-2023  润新知