移动端H5常见问题以及解决方案

问题

下面列举了我遇到的一些常规问题,如有遇到其他问题的请在评论区补充,之后我也会实践加以补充,感谢!

以下解决方案,均经过我测试成功,健康安全,请放下食用.由于篇幅问题,某些非核心的解决方案的实现细节暂未谈论,需要的自行研究.

1.iOS滑动不流畅
表现

上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动.整体表现就是滑动不流畅,没有滑动惯性.

产生原因
为什么在iOS的webview中滑动不流畅,它是如何定义的?*

最终我在safari文档里面寻找到了答案(文档链接参考资料项),原来在iOS5.0以及之后的版本,滑动有定义两个值auto和touch,默认值为auto.
-webkit-overflow-scrolling:touch; 当手指从触摸屏上移开,会保持一段时间的滚动.
-webkit-overflow-scrolling:auto; 当手指从触摸屏上移开,滚动会立即停止.

解决方案一

  1. 在滚动容器上增加滚动touch方法,将-webkit-overflow-scrolling值设置为touch
  2. 设置滚动条隐藏:.container :: webkit-scrolling-scrollbar {display:none}
  3. 注意:可能会导致使用postion:fixed、固定定位的元素,随着页面一起滚动

解决方案二

  1. 设置外部overflow为hidden,设置内容元素overflow为auto.内部元素body即产生滚动,超出部分隐藏
  2. body{overflow-y:hidden} .wrapper{overflow-y:auto}

两者结合使用更加

2.iOS上拉边界下拉出现白色空白

表现

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

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

解决方案一
监听事件禁止滑动
移动端触摸事件有三个,分别定义为:

  1. touchstart:手指放在一个dom元素上
  2. touchmove:手指拖拽一个dom元素
  3. touchend:手指从一个dom元素上移开
    显然我们需要控制的是touchmove事件,由此我在w3c文档中找到了这样一段话

Note that rate at which the user agent sends touchmove events is implementation-definend,and may depend on hardware capabilities and other implementation

if the perventDefault method is called on the first touchmove event of an active touch point,it should pervent any default action caused by any touchmove event associatited width same active touch point,such as scrolling.

touchmove事件的熟读是可以实现定义的,取决于硬件性功能和其他实现细节
preventDefalut方法,阻止同一触点上所有默认行为,比如滚动

由此,我们找到解决方案,通过监听touchmove,让需要滑动的地方滑动,不需要滑动的地方禁止滑动

值得注意的是我们要过滤掉具有滚动容器的元素

实现如下:

document.body.addEventListener('touchmove',(e)=>{
if(e._isScroller) return;
//阻止默认事件
e.preventDefault();
},{
passive:false}
)

解决方案二
滚动妥协填充空白,装饰城其他功能
在很多时候,我们可以不去解决这个问题,换一个思路,根据场景,我们可以将下拉作为一个功能性操作.
比如:下拉后刷新页面

3.页面方法或者缩小不确定性行为
表现
双击或者双支张开手指页面元素,页面会放大或缩小
产生原因
HTML本身会产生放大或缩小的行为,比如在PC浏览器上,可以自动控制页面的放大缩小.但是在移动端,我们是不需要这个行为.所以,我们需要禁止该不确定性行为,来提升用户体验
原理以及解决方案
HTML meta元标签中有个viewport属性,用来控制页面缩放,一般用于移动端.
移动端常规写法

<meta name="viewport" conent="width=device-width,inital-scale=1.0">
因此我们可以设置maximum-scale、minimum-scale与user-scalable=no用来避免这个问题

4.click点击事件延迟与穿透

表现

  1. 监听元素click事件,点击元素触发时间延迟约300ms.
  2. 点击蒙层,蒙层消失后,下层元素点击触发

产生原因
1.为什么会产生click延时?

iOS中的safari,为了实现双击缩放操作,在单击300ms之后,如果未进行第二次点击,则执行click单击操作.也就是说来判断用户行为是否双击产生的.但是在app中,无论是否需要双击缩放这种行为,click单击都会生成300ms延迟

2.为什么会产生click点击穿透?

双层元素叠加时,上上层元素上绑定touch事件,下层元素绑定click事件.由于click发生在touch之后,点击上层元素,元素消失,下层元素会触发click事件,由此生成了点击穿透的效果

原理以及解决方案

前面已经介绍了,移动设备不仅支持点击,还支持几个触摸事件.那么我们现在基础思路就是同touch事件代替click事件

将click事件替换成touchstart不仅解决了click事件都延迟问题,还解决了穿透问题.因为穿透问题是在touch和click混用时产生的.

在原生中使用
el.addEventListener("touchstart",()=>{
console.log("ok")
},false)在vue中使用
<button @touchstart="handTouchstart()">点击</button>

那么,是否可以将click事件全部替换成touchstart呢?为什么开源框架还会给出click事件呢

我们想象一种情景,同时需要点击和滑动的场景下.如果将click替换成touchstart会怎么样?

事件触发顺序:touchstart,touchmove,touchend,click.

很容易想象,在我需要touchmove滑动的时候,优先触发了touchstart的点击事件,是不是已经产生了冲突.
所以,在具有滚动的情况下,还是建议使用click处理

解决方案二:使用fastclick库
使用npm/yarn安装后使用
import FastClick from ‘fastclick’
同样,使用fastclick库后,click延迟和穿透的问题都没了

5.软键盘将页面顶起来、收起来未回落问题

表现

  1. Android手机中,点击input框时,键盘弹出,将页面顶起来,定制页面样式错乱.
  2. 移开焦点,键盘收起,键盘区域空白,未回落

产生原因
我们在app布局中会有个空白的底部.安卓一些版本中,输入弹窗出来,会将absolute和fixed定义的元素.导致可视区域变小,布局错乱.

解决方案

  1. 软键盘将页面顶起来的解决方案,主要是通过监听页面高度变化,强制恢复成弹出前的高度
//记录原有的视口高度
const originalHeight = document.body.clientHeight  || document.documentElement.clientHeightwindow.onresize = function(){
var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
if(resizeHeight < originalHeight>){const container = document.getElementById("container");//例如 container.style.height = originalHeight;
}
}
  1. 键盘不能不会落问题 在iOS12+和wechat6.7.4+中,而在微信H5开发中是比较常见的Bug.
  2. 兼容原理:判断版本类型,更改滚动的可视区域

6.页面生成为图片和二维码

表现
在工作中有需要将页面生成图片或者二维码的需求.可能我们第一想到的,交给后端来生成更加简单,但是这样,我们需要将页面代码全部传给后端,网络性能消耗太大.

解决方案

  1. 生成二维码
    使用ORCode生成二维码
import QRcode from 'qrcode';
使用async生成图片
cosnt options = {};
const url = window.location.href;
async url =>
try {
console.log(await QRCode.toDataURL(url,options))} catch(err){
console.log(err);
将await QRCode.toDataURL(url,options)赋值给图片url即可
  1. 生成图片
    主要是使用htmlToCanvas生成canvas画布
import html2canvas from 'html2canvas';
HTMLcanvas(document.body).then(function(canvas){
document.body.appendChild(canvas);
});
但是不单单此处就完了,由于canvas的原因,移动端生成出来的图片比较模糊
我们使用一个新的canvas方法多倍生成,放入一杯容器里面,达到更加清晰的效果,通过超链接下载图片,下载文件简单实现,更完整的实现方法之后更新const scaleSize = 2;
const neewCanvas = document.createElement("canvas")
const target = document.querySelector('div');
const width = parseInt(window.getComputedStyle(target).width);
const height parseInt(window.getComputedStyle(target).height);
newCanvas.width = width* scaleSize;
newCanvas.height= height*scaleSize;
newCanvas.width = width + 'px'
newCanvas.style.height = height+'px'
const context = newCanvas.getContext('2d")
context.scale(scaleSize,scaleSzie);
html2canvas(document.querySelector('.demo),{canvas:newCanvas}).then(function(canvas){
//简单的通过超链接设置下载功能
document.querySelector("btn").setAttribute('href',canvas.toDataUrl()}
}
// 根据需要设置scaleSize大小

** 7.微信公众号分享**

表现
在微信公众号H5开发中,页面内部点击分享按钮调用SDK,方法不生效

解决方法

  1. 加一层蒙层,做分享引导
    因为页面内部点击分享按钮无法直接调用,二分享功能需要点击右上角更多来操作.
    然后用户可能不知道通过右上角

8.H5调试相关方案策略

表现
调试代码一般就是为了查看数据和定位bug,分为两种常见,一种是开发和测试时调试,一种是生成环境上调试.

为什么有生产环境上调试呢,有些时候测试环境没法复现这个bug,测试环境和生产环境不一致,此时就需要紧急生产调试.

在pc端开发时,我们直接调出控制台,使用浏览器提供的工具操作devtools或者查看日志.但是在App内部我们怎么做呢?

原理与解决方案

  1. vconsole控制台插件
使用很简单
import vconsole from vconsole'
new Vconsole()上述方法仅用于开发和测试,生产环境中不允许出现,所以,使用时需要对环境进行判断
import Vconsole from 'vconsole'
if(process.env.NODE_ENV !=='production'){
new Vconsole()
}

移动端H5常见问题以及解决方案相关推荐

  1. H5常见问题及解决方案手册

    点击上方"程序员黑叔",选择"置顶或者星标" 你的关注意义重大! 作者 / 成都之声 阅读本文需要 5分钟 前言 作为一个开发了多个 H5 项目的前端工程师,在 ...

  2. 移动端H5页面生成图片解决方案 1

    现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传! 1. 生成图片可以用canvas,但是由于已经有了html2canvas这个开源库,所以为 ...

  3. 移动端H5页面生成图片解决方案

    现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传! 1. 生成图片可以用canvas,但是由于已经有了html2canvas这个开源库,所以为 ...

  4. 移动端常见问题及解决方案

    移动端常见问题及解决方案 转载来源: 益享天开  >>  手机移动端web前端常见问题整理  一 .meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面<meta n ...

  5. 移动端H5网页开发常见问题汇总

    简介 这篇文章主要是总结下移动端开发常见问题,帮助大家一起避坑.如果已经看过这篇文章了的话也可以看看笔者写的 移动端H5网页开发必备知识 移动端开发必备知识-Hybrid App HTML方面 调用系 ...

  6. 移动端H5实现手动选择地图点的一种解决方案

    一.准备 文中所用地图应用为高得地图v1.4.15版,代码开发环境为Vue.js框架+webpack+node.js. 二.需求 移动端H5实现类似打车软件中在地图界面手动选择目的地功能.效果如图. ...

  7. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)

    在移动端H5开发中(关于安卓端position:fixed和position:absolute:和虚拟键盘冲突的问题,以及解决方案) 参考文章: (1)在移动端H5开发中(关于安卓端position: ...

  8. APP内嵌H5开发常见问题及解决方案

    前言 作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题.现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案.由此来做一个阶段性的总 ...

  9. ionic angular h5 移动端 开发常见问题记录及各位同僚的解决办法

    目录 ios和android唤起软键盘问题 ionic 使用ng-zorro-antd-mobile报错 angular rem移动端适配 移动端唤起电话号拨号键盘 ionic 栅格 grid 取消其 ...

最新文章

  1. python 实现延迟的操作
  2. 详解MariaDB数据库的触发器
  3. 初探系列 — Pharbers用于单点登录的权限架构
  4. LeetCode 452 Minimum Number of Arrows to Burst Balloons(贪心法)
  5. 汇编:OF溢出标志位
  6. 数字图像处理实验(总计23个)汇总
  7. qt android oci数据库,QT mysql SQLite 数据库支持
  8. 百度地图手机和电脑不一致_你可能不知道的电脑手机冷知识
  9. java实现gps定位_GPS定位数据的提取与存储系统的设计
  10. OPENG 获取状态的一些枚举值
  11. c语言标准差公式标准差数组,Excel标准差计算函数Stdev和StdevP的用法与区别,包含4个实例...
  12. c语言 switch错误用法,C语言switch语句的详细用法
  13. ava.io.IOException: Downloaded file /var/lib/jenkins/plugins/credentials.jpi.tmp does not match expe
  14. mysql的连接名和用户名_MySQL登陆认证用户名先后顺序
  15. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
  16. 小米为什么不怕iPhone降价?
  17. 小 tips:删除word表格下面多余的空白页
  18. 【Java实现学生管理系统】
  19. 服务器看门狗芯片电路图,看门狗电路简介(低成本)
  20. 复盘2021,拥抱2022!

热门文章

  1. 解决由VC++6.0移植到VS2019带来的兼容问题
  2. angular中安装ng-alain 插件
  3. SQLite之C#连接SQLite
  4. nc系统搜索服务器失败怎么办,nc: invalid option — ‘e’错误解决办法 linux系统启动weblogic受管服务器报un...
  5. Word文档如何复制文字的格式
  6. php 找祖先,鲸鱼的祖先有4条腿
  7. 华东政法大学教学管理系统_华东政法大学研究生教学管理信息系统入口
  8. 数据结构与算法A实验六图论---7-9 最短路径(并查集Dijkstra)
  9. JavaScript旋转数组
  10. 小学加减法数学题自动生成