用一周的时间上线了一个基于微信端的H5,把微信内置浏览器的坑几乎都踩了一遍,稍做总结,希望我所遇到的问题,各位同学都不在遇到
视频
禁止视频全屏
<video controls x5-playsinline="" playsinline="" webkit-playsinline="" >
<source src="url" type="audio/mp4">
您的浏览器不支持 video 标签
</video>
图片
不得不说,图片一直都是H5中流量占用的大头,大于500kb的图片在无线端的加载几乎慢成了翔,优化H5的第一步就是,优化图片的显示,目前我用了了两种方式来优化图片
在线压缩
对jgp和png的格式的图片全部压缩一遍,压缩率几乎可以达到百分之五十,对速度的提升非常明显,建议H5上线之前必须进行一次
第三方cdn
cdn的作用就不说了,谁用谁知道,将压缩后的图片存在cdn的空间上面,用户体验又可以提升一大步,如果公司有自己的cdn服务器那是最好的,如果没有的话就去借助七牛或者又拍云之类的服务,个人开发者几乎可以免费使用
关于加载进度
可以毫不夸张的说,所有你看到的H5加载进度,都是假的。javascript根本没有办法精确的计算到页面的加载进度,最多计算出一个大概的值,但我们也并不需要对么精确的值,我们只需要一个最小化的时间期限,只要在这个时间期限之内,可以保证百分之九十以上的概率加载ok就可以了,so,定一个时间,然后随机增加加载进度显示的数字
var load=document.getElementById('loading');
var index=0;
var timer=setInterval(function(){
if(index>5){
clearInterval(timer);
//some code
}else{
load.innerHTML=parseInt(load.innerHTML)+Math.floor(Math.random()*10+10)+'%';
index++;
}
}, 1000)
})()
我是这么做的,定了五秒的时间,每秒随机一个10-20之间的整数,加在加载进度上,五秒之后,停止计时器,开始执行最终的业务逻辑
关于背景音乐自动播放
默认情况下,我们添加一段audio自动循环播放的代码是这样的
<audio id='bkMusic' loop="loop" autoplay='autoplay' src="./wav/bk.mp3" ></audio>
但是在微信端你这么搞,是行不通的。微信内置浏览器不支持autoplay,必须用一个事件促发才能播放。那么onload会是最佳的促发方式
window.onload=function(){
···some code
$('#bkMusic')[0].play();
}
这里有一个坑,就是如果你在onload里面还有其他的业务逻辑,那么必须先执行其他的业务,最后在执行音频的play(),如果先执行play(), 你的音频会播放,但是其他的逻辑没反应了,至于为什么会这样,有待我继续深入研究
关于动画animation
微信内置浏览器使用的是qq浏览器的X5内核,动画属性并不能完美的兼容,必须添加-webkit-前缀,当然,我们可以使用自动化工具一次性生成所有前缀,那样就更不存在任何问题了,下面贴一段我利用opacity属性做的呼吸灯的动画,很简单的动画,就是不停的改变opacity的值。从透明到不透明再到透明
#light img{
animation: mylight 4s linear infinite;
-moz-animation: mylight 4s linear infinite;
-webkit-animation: mylight 4s linear infinite;
-o-animation: mylight 4s linear infinite;
}
@keyframes mylight
{
0% {opacity: 0;}
50% {opacity: 1;}
100% {opacity: 0;}
}
@-webkit-keyframes mylight
{
0% {opacity: 0;}
50% {opacity: 1;}
100% {opacity: 0;}
}
关于动画GPU加速
关于垂直滚动条
常见问题解决
禁止移动端双击会放大屏幕
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
禁止ios端识别手机号码自动添加下划线
<meta name="format-detection" content="telephone=no" />
今天补完,先干活