在实际开发上先的h5页面产品中,总会遇到各种坑,好多坑都是安卓和iPhone端兼容的问题(用电脑谷歌浏览器输入  chrome://inspect/#devices可以用手机USB调试,打开)

eg:

  1. 软键盘弹出时会影响到的页面布局
  2. 如果在iframe中用到透明罩,想用fixed却失效?
  3. angular中如果用$scope控制布尔值来添加/删除类时,获取这个节点的坑
  4. 在获取用户头像等信息在canvas画图时加载的顺序

暂时遇到的问题,比较磨人一点(之后遇到会慢慢补充)

  1. 对于h5页面产品,输入框弹出软键盘,页面布局可能会压缩(安卓手机存在,苹果无这bug),我用的单位是vh,所以会出现这个令人头疼的bug,知道了这个原因,先对万恶的安卓系统吐槽一遍,然后将高度的单位全部用vw替换,因为宽度不会变啊,调试一遍,跑一下页面,问题解决.

  2.很多公司都喜欢开发的页面使用iframe,所以也引发了很多的问题,就比如说你想用吸顶条或者一个透明遮罩层的时候,习惯了想用position:fixed的我,用了fixed失效,狠狠的对公司使用这个iframe吐槽一遍,但是也只能老老实实的想其他办法去解决,想过利用js去控制高度等等处理办法,最傻的是用绝对定位,高度100%,然后安卓和苹果总有一个会出现问题,真是内心吐槽一万遍,这两个系统就是爱搞特殊化,而且是手指向上拖动手机屏幕时,遮罩层也跟着跑,扎心!!!

这个时候,灵光乍现的我想到了一个绝佳的办法,那就是js控制获取手机屏幕高度,用哪个方法呢?毕竟有好多,诸位别慌,且跟着往下看:

  1. 网页可见区域高:document.body.clientHeight
  2. 网页可见区域宽:document.body.clientWidth
  3. 网页可见区域宽:document.body.offsetWidth (包括边线的宽)
  4. 网页可见区域高:document.body.offsetHeight (包括边线的宽)
  5. 网页正文全文宽:document.body.scrollWidth
  6. 网页正文全文高:document.body.scrollHeight
  7. 网页被卷去的高:document.body.scrollTop
  8. 网页被卷去的左:document.body.scrollLeft
  9. 网页正文部分上:window.screenTop
  10. 网页正文部分左:window.screenLeft
  11. 屏幕分辨率的高:window.screen.height
  12. 屏幕分辨率的宽:window.screen.width
  13. 屏幕可用工作区高度:window.screen.availHeight
  14. 屏幕可用工作区宽度:window.screen.availWidth

  看到这么多,你也许会想问我,这么多,都可以吗?那我偷偷的告诉你,你可不要告诉别人哦,用前面的12种方法获取到的你总会发现不是安卓闹小脾气就是ios要逗你玩,这个时候,你要掌握游戏的规则,不要被它所主导你的思维,我也就不墨迹了,这时候,你应该选用   13/14   屏幕的可用工作区宽高,这个算是都兼容

HTML:
<!-- you are jackpot -->
<div class="{{ isJackpot ? 'yJackpot' : 'nJackpot' }}" style="">
<div class="closeJackpot" ng-click="isJackpot = !isJackpot;">&times;</div>
</div>
CSS:

.yJackpot{
transition: all linear 0.5s;
-webkit-transition: all linear 0.5s;
width: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 99;
background: url(../images/prize.png) center no-repeat;
background-size: 100% 100%;
}
.nJackpot{
position: absolute;
top: 0;
left: 0;
transition: all linear 0.5s;
-webkit-transition: all linear 0.5s;
background: url(../images/prize.png) center no-repeat;
background-size: 100% 100%;
z-index: 99;
width: 0;
height: 0;
}
(Angular1)js:

$scope.isJackpot = true;      //
setTimeout(function(){
  console.log(window.screen.availHeight)
  document.querySelector(".yJackpot").style.height = window.screen.availHeight + "px";
  document.querySelector(".yJackpot").addEventListener('touchmove',function(e){
    e.preventDefault();
  },false)
},100)

  上述js中你可能注意到我加了一个延时器,你们可能有点疑惑,好吧,这个问题就要和我的问题3挂钩了,怎么说呢,这就是dom加载和js加载先后的问题了,这也算开发中遇到的一个小坑,我很巧妙地加了一个延时,也许有更好的解决办法,只是我暂时还没发现,你们可以评论对我指教(龙在这里不胜感激,因为这是开发接触ng1,还没系统的学过ng1)

  而之后的事件监听则是为了实现禁止用户拖动,哈哈,这个方法一瞬间出现在我脑海,瞬间敲出来测试,完美实现.只能说,有些东西还是得熟悉,才能在开发中活学活用

  4.接下来要说的就是,获取用户头像之后,在画布上画图出现的问题了,这个比较恶心人,不对,是比较绕,容我小小的吐槽一次~

angular
.module('name')
.factory('myService', myService) function myService($http, $q,$httpParamSerializerJQLike) {
return {
getUserNicknameMyID: getUserNicknameMyID,
getWXShare: getWXShare,
socialLogin: socialLogin
};
  //获取用户信息
function getUserNicknameMyID(myId) {
var params = {};
params.myId= myId;
return $http.get(ENDPOINT + 'getUserNickname', {
params: params
})
.then(getUserNicknameComplete)
.catch(getUserNicknameFailed); function getUserNicknameComplete(response) {
return response.data;
} function getUserNicknameFailed(response) {
return $q.reject(response.data);
}
}
  //微信分享
function getWXShare() {
var params = {};
params.url = location.href;
params.appid = 'appid'; return $http.get('此处为链接', { params: params })
.then(getWXShareComplete)
.catch(getWXShareFailed); function getWXShareComplete(response) {
return response.data;
} function getWXShareFailed(response) {
return $q.reject(response.data);
} }
  
function socialLogin(code) {
var params = {};
params.code = code;
params.base = "base";
params.platform = 0;
return $http({
method: 'POST',
url: ENDPOINT + 'socialLogin',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: $httpParamSerializerJQLike(params)
}).then(postSocialLoginComplete)
.
catch(postSocialLoginFailed); function postSocialLoginComplete(response) {
return response.data;
} function postSocialLoginFailed(response) {
return $q.reject(response.data);
}
}
}

  以上我在factory中封装的请求方式,但是它是异步请求,所以你不知道你的用户信息在什么阶段获取到这个头像,然后去绘制,我就很傻了,先把所有的绘制完成再去绘制这个头像,问题就出来了,头像要么不绘制,要么就是给你绘制,随意的很,怎么办,只能收拾他,把之前所有的绘制方法各自封装成一个函数,然后一层一层的往下调用,上一步完成才往下走,将头像方法仍在了第一步,再次测试,发现完美解决,心里感觉舒服多了~

当然还有遇到的问题,估计大家使用过h5产品绘图的可能都知道,canvas并不能直接保存在手机,那怎么办呢,调用插件Canvas2Image.js,然后将其封装成一个函数,每次绘制之后都将其调用绘制在指定的img上面,并将img覆盖在canvas上面,实现以假乱真的效果....具体代码如下:

function createImg(canvas) { //在id为img元素内生成图片
var img = document.getElementById("img");
if(!img.hasChildNodes()) {
img.appendChild(Canvas2Image.convertToImage(canvas, 750, 1180, "png"));
} else {
img.removeChild(img.childNodes[0]);
img.appendChild(Canvas2Image.convertToImage(canvas, 750, 1180, "png"));
}
}

  好了,写了这么多,也有点困了,看看时间,已经是深夜23:46  记录于2018/03/08

  明天会更好~~

h5开发中,利用微信或者QQ登陆以后获取用户头像在canvas画布显示问题的更多相关文章

  1. 微信测试号开发之九 微信网页授权:页面获取用户openid

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78981369 一:配置接口 注意:这里填写的是域名(是一个字符串),而不是URL,因此 ...

  2. [小程序]微信小程序登陆并获取用户信息

    1.小程序js端调用框架登陆API,获取到一个临时code,拿着这个code去调用自己的服务端接口 2.在自己的服务器端,使用app_id app_secrect code可以获取到用户的openid ...

  3. H5开发中的问题总结

    最近公司做了一个出行日记的项目,里面的页面十多页,天天加班,做到吐血.总体来说,写页面的时候虽然是十多个页面,其实难度还是在每个页面的特效上.公司是易到用车,出行日记的页面在APP里有生成入口,有兴趣 ...

  4. H5开发中的故障

    本篇博文会不断的收录我在做H5页面时遇到的问题以及解决方案,当然有的问题,我也没有遇到好的解决方案,所以如果你有解决的办法,请务必不吝赐教! H5开发中的故障       微信APP返回按钮不刷新页面 ...

  5. 如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret。

    如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret. 申请流程如下: 步骤1:登陆腾讯开放平台.链接地址: http://open.qq.com/ . 步骤2:填 ...

  6. vue开发中利用正则限制input框的输入(手机号、非0开头的正整数等)

    我们在前端开发中经常会碰到类似手机号输入获取验证码的情况,通常情况下手机号的输入需要只能输入11位的整数数字.并且需要过滤掉一些明显不符合手机号格式的输入,那么我们就需要用户在输入的时候就控制可以输入 ...

  7. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  8. php 实现微信模拟登陆、获取用户列表及群发消息功能示例

    本文实例讲述了php实现微信模拟登陆.获取用户列表及群发消息功能.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  9. Android之QQ授权登录获取用户信息

    有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...

随机推荐

  1. gitHub新项目的上传

    github作为一个开源托管平台,除了有机会学习各位大神的开源项目,还能托管自己写的一些小Demo,作为github新进菜鸟,今天就整理下上传Demo所需的命令和操作步骤,防止我这谜一样的记忆力. 1 ...

  2. es6函数模块-------初步学习

    初步学习: 函数参数允许尾逗号 function clownsEverywhere( param1, param2, //param2后面有逗号 ) { } 函数参数可以赋初值 利用解构赋值默认值结合 ...

  3. Gym - 100548H The Problem to Make You Happy 2014-2015 ACM-ICPC, Asia Xian Regional Contest (BFS+博弈)

    题意:Bob和Alice在一张有向无环图上移动,给定二者的起点,Bob先手.Bob的失败条件是不能移动或者与Alice相遇.两个人都采取最优策略,求Bob是否会赢 分析:银牌题.先确定所有的失败状态, ...

  4. VS插件神器 ReShaper入门

    @简介: 1,Resharper提供以下6个核心功能,分别是: (1). 代码分析(Code Analysis):智能提示代码中存在的问题和修复建议. (2). 编码助手(Coding Assista ...

  5. laravel 环境配置

    一.composer 安装 1.确定为最新版本的PHP 2.进入Composer官网下载页面,在页面最下方Manual Download区域选择需要的版本下载. 3.将下载的composer.phar ...

  6. mac/linux查询网络端口占用

    参考:http://www.cnblogs.com/kaiye/archive/2013/05/25/3099393.html netstat命令 netstat -an|grep 8080 lsof ...

  7. AVAudioSession(1):iOS Audio Session 概览

    本文转自:AVAudioSession(1):iOS Audio Session 概览 | www.samirchen.com 本文内容主要来源于 Audio Session Programming ...

  8. Java读者写者问题

    实验存档. 允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写. 读者.java: package operating.entity.readerwriter; import ...

  9. C++中string的成员函数

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...

  10. CSS Outline(轮廓)

    CSS Outline(轮廓) 一.CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. CSS outline 属性规定元素轮廓 ...