关于viewport引起的微信二维码识别区域偏移的问题讨论与解决

一、问题概述

在开发一个含有二维码的微信页面时,我遇到了这样一个问题:使用iPhone第一次进入该页面时,二维码可以长按识别,但第二次进入时长按无法识别到二维码。安卓机都能识别。

二、我进行了以下尝试:

  1. 移除控制进入条件的脚本,即部分第一次第二次,长按不能识别二维码。暂时排除脚本原因。
  2. 移除二维码所有样式,发现并不是不能识别到二维码而是识别区域发生了偏移。(图1)
  3. 移除所有元素,页面上只留一张二维码,发现识别区域变大。虽然整张图都被识别了但图片外面的区域也会被识别。(图2)

图1

图2
阶段性结论:二维码能被长按识别,但因为某种原因识别区域发生了偏移。

三、进一步尝试:

在网上简单搜索了偏移问题后,我注意到一条关于<meta>标签的,大意如下:

meta标签定义了默认缩放为一倍就能识别,不定义就不能识别。于是我将原来的

<meta name="viewport" content="target-densitydpi=device-dpi, user-scalable=no">

改成了

<meta name="viewport" content="user-scalable=no,width=device-width,initial-scale=1,maximum-scale=1">

虽然样式飞了但二维码识别正常了。
看来问题就出在这里了。经过尝试,我发现:
target-densitydpi=device-dpi和width=device-width是冲突的。加上后者二维码识别正常了,但样式肯定要重新定义,若不加,样式好使,但二维码识别就不正常了。定义样式是小事,但归根结底,发生偏移的原因到底在哪呢?

四、分析

  • 关于适配屏幕的<meta name="viewport">标签

UI设计人员都知道因为pc和移动设备屏幕密度像素的不同在输出视觉稿的时候要标明空间的倍数大小,所谓的@1x、@2x就是这个原因。然后在页面head里写这样一个<meta>标签:

<meta name="viewport" content="user-scalable=no,width=device-width,initial-scale=1,maximum-scale=1">

即:宽度强制转换成设备宽度,默认缩放比例为1,最大缩放比例1,不允许手动缩放。
比如按照iPhone6出的设计稿,在开发的时候空间尺寸就要除以2,iPhone6 plus出的设计稿,尺寸就除以3。具体原理请看图3
但是如果不想进行单位换算,可以用

<meta name="viewport" content="target-densitydpi=device-dpi, user-scalable=no">

即:分辨率转为设备分辨率……(后边都一样)
强制将搭建好的页面适应移动设备的分辨率。原理就好比是将大尺寸的图片缩小显示并不影响清晰度。
这样给设计和前端开发人员都带来很大的方便。既不用设计出标注,也不用切两套控件出来了。

  • 由此产生的问题和猜测

问题就是元素偏移了。。。但我猜测应该是这样的:可视的页面呗强制“塞”到手机屏幕里,但页面本身仍然是原始大小的(图4)。这样看来,并不是触控区域偏移了而是,可视区域被我们“塞到”了移动设备里。发生偏移的实际上是我们看到的那部分。


图3


图4

五、问题的解决

找到了这个原因,剩下的就是老老实实的,按照实际尺寸修改css了,将所有定义了固定尺寸的元素的宽高,包括字体都除以2,保留所有百分比定义的尺寸。哪里不对改哪里,工作量着实不小。这样搭建出来的页面就是实际大小的,没有经过任何缩放,图片该在哪就是在哪不会有偏移了。

六、不能解释的问题

  1. 为什么该问题只有iPhone存在,或许是因为识别二维码的机制不同,也可能是因为浏览器内核原因,安卓的浏览器比较健壮。
  2. 为什么第一次进入页面的时候没有发生偏移?

此文转载。查看原文地址https://segmentfault.com/a/1190000005871183

时间: 2024-12-22 18:38:25

关于viewport引起的微信二维码识别区域偏移的问题讨论与解决的相关文章

微信小程序二维码识别

目前市场上二维码识别的软件或者网站越来越多,可是真正方便,无广告的却少之很少. 于是,自己突发奇想做了一个微信二维码识别的小程序. 包含功能: 1.识别二维码 ①普通二维码 ②条形码 ③只是复制解析出来的数据 2.生成二维码 ①只是从粘贴板生成二维码 软件截图: 体验二维码: 以下为主要代码 index.js // pages/main/index.js var QR = require("../../utils/qrcode.js"); Page({ data: { canvasHi

微信二维码登录原理

在电脑上使用微信时,你可能已经发现微信不提供传统的账号密码登陆,取而代之的是通过扫描二维码进行登陆.今天就要研究下次登陆方式微信时如何实现的? 1.每次用户打开PC端登陆请求,系统返回一个唯一的uid,并将uid的信息绘制成二维码返回给用户.这里的uid一定是唯一的,否则就会造成你登陆了其他用户的账号或者其他用户登陆你的账号. 2.当用户使用登陆后的微信扫描该二维码的时候,会将这个uid和手机上的微信账号及密码产生的token进行绑定,并上传到服务器. 3.WEB通过JS不断的向后端发起请求,查

你的微信二维码是唯一的吗?【微信二维码的秘密】

最近听说有一老板被一科技公司业务员忽悠,说"您赶快来注册您唯一的二维码吧!否则,会被别人抢注的!" 很多人以为自己的微信二维码.网站的二维码是唯一的,果真如此吗?事实上,不是! 你的二维码可以是多种多样的,这里以我所掌管的"掌上龙岗"微信号为例进行说明. "掌上龙岗"的微信号是szlgwx,二维码则可以至少用以下几种: (L)(M)(Q)(H) 打开你的手机,使用手机微信"扫一扫"功能,扫描上面几种和下面的二维码,均可直接添加

用微信二维码登录自己的网站

地址:http://www.cnblogs.com/loogn/p/3727953.html用微信二维码登录自己的网站 一.当用户选择用微信二维码登录时,我们要在用户页面里生成一个guid做为客户端的唯一标识,然后带着这个guid请求二维码图片地址,得到地址后,显示给用户.请求到后台的时候要将此二维码的Key和客户端的guid关联到一起.注意这个key的生成方式,要保证多人同时用二维码登录而不冲突,比如用10000自增,隔断时间又重置到10000. 二.得到二维码后,马上发出长链接请求登录标识(

微信公众平台开发(121) 微信二维码海报

关键字:微信公众平台 二维码 海报作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/weixin-poster.html 本文介绍微信公众平台下二维码海报的开发过程. 一.微信二维码海报介绍 微信二维码海报是指在海报中嵌入和微信用户关联的参数二维码的海报,用户分享推广之后,新用户可以被统计为被推广人员数,从而达到增加粉丝的传播效果.其使用场景如下:   二.开发流程 在微信二维码海报生成中,需要用到以下信息 1. 自定义菜单中设置一个菜单项,点击后返回二维

微信二维码防伪

微信二维码防伪应用介绍 如今各大企业都在考虑如何做到产品线上线下发展,微信是现如今O2O发展最为前沿的科技产物,防伪公司现如今在二维码.微信防伪方面不断的取得了新的创新,如何真正帮助企业更好的实现线上宣传,线下销售,也是防伪公司如今考虑最为重要的原因之一,本篇通过凯迅惠商防伪公司如何利用微信防伪.二维码防伪给企业产品做到既能防伪.又能给企业宣传和营销起到重要作用. 微信防伪价值 微信防伪是现如今市场中新推出的防伪产物之一,根据如今企业发展,微信用户群的不断增加,微信防伪也在防伪行业展开,微信防伪

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据开发03

大家好,这次是第三个课时的视频,欢迎大家继续学习. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地址:http://www

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据系统02

hello,上一次我们上传了第一个课时的视频,现在当然是上传第二个视频咯. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地

用户扫码微信二维码生成订单(三)

官方API:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 首先要修改/lib/HttpService.cs 把Get和Post中的的设置代理服务器代码进行隐藏: 修改前: WebProxy proxy = new WebProxy();proxy.Address = new Uri(WxPayConfig.PROXY_URL);request.Proxy = proxy; 修改后: //WebProxy proxy =