H5项目常见问题及注意事项

Meta基础知识:

  • H5页面窗口自动调解到装备宽度,并制止用户缩放页面

//一、HTML页面构造
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
// width    设置viewport宽度,为一个正整数,或字符串‘device-width’
// height   设置viewport高度,平常设置了宽度,会自动解析出高度,可以不必设置
// initial-scale    默许缩放比例,为一个数字,可以带小数
// minimum-scale    许可用户最小缩放比例,为一个数字,可以带小数
// maximum-scale    许可用户最大缩放比例,为一个数字,可以带小数
// user-scalable    是不是许可手动缩放

//二、JS动态推断
var phoneWidth =  parseInt(window.screen.width);
var phoneScale = phoneWidth/640;
var ua = navigator.userAgent;
if (/Android (\d+\.\d+)/.test(ua)){
    var version = parseFloat(RegExp.$1);
    if(version>2.3){
        document.write('<meta name="viewport" content="width=640, minimum-scale = '+phoneScale+', maximum-scale = '+phoneScale+', target-densitydpi=device-dpi">');
    }else{
        document.write('<meta name="viewport" content="width=640, target-densitydpi=device-dpi">');
    }
} else {
    document.write('<meta name="viewport" content="width=640, user-scalable=no, target-densitydpi=device-dpi">');
}
  • 空白页基础meta标签

<!-- 设置缩放 -->
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui" />
<!-- 可隐蔽地点栏,仅针对IOS的Safari(注:IOS7.0版本今后,safari上已看不到结果) -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- 仅针对IOS的Safari顶端状况条的款式(可选default/black/black-translucent ) -->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<!-- IOS中禁用将数字辨认为电话号码/疏忽Android平台中对邮箱地点的辨认 -->
<meta name="format-detection"content="telephone=no, email=no" />
  • 其他meta标签

<!-- 启用360浏览器的极速形式(webkit) -->
<meta name="renderer" content="webkit">
<!-- 防止IE应用兼容形式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 针对手持装备优化,主假如针对一些老的不辨认viewport的浏览器,比方黑莓 -->
<meta name="HandheldFriendly" content="true">
<!-- 微软的老式浏览器 -->
<meta name="MobileOptimized" content="320">
<!-- uc强迫竖屏 -->
<meta name="screen-orientation" content="portrait">
<!-- QQ强迫竖屏 -->
<meta name="x5-orientation" content="portrait">
<!-- UC强迫全屏 -->
<meta name="full-screen" content="yes">
<!-- QQ强迫全屏 -->
<meta name="x5-fullscreen" content="true">
<!-- UC应用形式 -->
<meta name="browsermode" content="application">
<!-- QQ应用形式 -->
<meta name="x5-page-mode" content="app">
<!-- windows phone 点击无高光 -->
<meta name="msapplication-tap-highlight" content="no">

常见题目:

  • 挪动端怎样定义字体font-family

@ --------------------------------------中笔墨体的英文名称
@ 宋体      SimSun
@ 黑体      SimHei
@ 微信雅黑   Microsoft Yahei
@ 微软正黑体 Microsoft JhengHei
@ 新宋体    NSimSun
@ 新细明体  MingLiU
@ 细明体    MingLiU
@ 标楷体    DFKai-SB
@ 仿宋     FangSong
@ 楷体     KaiTi
@ 仿宋_GB2312  FangSong_GB2312
@ 楷体_GB2312  KaiTi_GB2312  
@
@ 申明:中笔墨体多半应用宋体、雅黑,英文用Helvetica

body { font-family: Microsoft Yahei,SimSun,Helvetica; } 
  • 打电话发短信写邮件怎样完成

// 一、打电话
<a href="tel:0755-10086">打电话给:0755-10086</a>

//  二、发短信,winphone体系无效
<a href="sms:10086">发短信给: 10086</a>

// 三、写邮件
//注:在增加这些功用时,第一个功用以"?"开首,背面的以"&"开首
//1.一般邮件
<a href="mailto:863139978@qq.com">点击我发邮件</a>
//2.收件地点后增加?cc=开首,可增加抄送地点(Android存在兼容题目)
<a href="mailto:863139978@qq.com?cc=zhangqian0406@yeah.net">点击我发邮件</a>
//3.随着抄送地点后,写上&bcc=,可增加密件抄送地点(Android存在兼容题目)
<a href="mailto:863139978@qq.com?cc=zhangqian0406@yeah.net&bcc=384900096@qq.com">点击我发邮件</a>
//4.包括多个收件人、抄送、密件抄送人,用分号(;)离隔多个邮件人的地点
<a href="mailto:863139978@qq.com;384900096@qq.com">点击我发邮件</a>
//5.包括主题,用?subject=
<a href="mailto:863139978@qq.com?subject=邮件主题">点击我发邮件</a>
//6.包括内容,用?body=;如内容包括文本,应用%0A给文本换行 
<a href="mailto:863139978@qq.com?body=邮件主题内容%0A腾讯诚信%0A期待您的到来">点击我发邮件</a>
//7.内容包括链接,含http(s)://等的文本自动转化为链接
<a href="mailto:863139978@qq.com?body=http://www.baidu.com">点击我发邮件</a>
//8.内容包括图片(PC不支撑)
<a href="mailto:863139978@qq.com?body=<img src='images/1.jpg' />">点击我发邮件</a>
//9.完全示例
<a href="mailto:863139978@qq.com;384900096@qq.com?cc=zhangqian0406@yeah.net&bcc=993233461@qq.com&subject=[邮件主题]&body=腾讯诚邀您介入%0A%0Ahttp://www.baidu.com%0A%0A<img src='images/1.jpg' />">点击我发邮件</a>
  • 挪动端touch事宜(辨别webkit和winphone)

/* 当用户手指放在挪动装备在屏幕上滑动会触发的touch事宜 */
// 以下支撑webkit
touchstart——当手指触碰屏幕时刻发作。不论当前有若干只手指
touchmove——当手指在屏幕上滑动时一连触发。一般我们再滑屏页面,会挪用event的preventDefault()可以阻挠默许状况的发作:阻挠页面转动
touchend——当手指脱离屏幕时触发
touchcancel——体系住手跟踪触摸时刻会触发。比方在触摸过程当中倏忽页面alert()一个提示框,此时会触发该事宜,这个事宜比较罕用

//TouchEvent申明:
touches:屏幕上一切手指的信息
targetTouches:手指在目的地区的手指信息
changedTouches:近来一次触发该事宜的手指信息
touchend时,touches与targetTouches信息会被删除,changedTouches保留的末了一次的信息,最好用于盘算手指信息

//参数信息(changedTouches[0])
clientX、clientY在显现区的坐标
target:当前元素

//事宜相应递次
ontouchstart  > ontouchmove  > ontouchend > onclick

// 以下支撑winphone 8
MSPointerDown——当手指触碰屏幕时刻发作。不论当前有若干只手指
MSPointerMove——当手指在屏幕上滑动时一连触发。一般我们再滑屏页面,会挪用css的html{-ms-touch-action: none;}可以阻挠默许状况的发作:阻挠页面转动
MSPointerUp——当手指脱离屏幕时触发
  • 挪动端click屏幕发生200-300ms的延时相应

申明:挪动装备上的web网页是有300ms耽误的,玩玩会形成按钮点击耽误以至是点击失效。

以下是汗青缘由,泉源一个公司内一个同事的分享:
2007年苹果宣布首款iphone上IOS体系搭载的safari为了将适用于PC端上大屏幕的网页能比较好的展现在手机端上,应用了双击缩放(double tap to zoom)的计划,比方你在手机上用浏览器翻开一个PC上的网页,你可能在看到页面内容虽然可以撑满全部屏幕,然则字体、图片都很小视不清,此时可以疾速双击屏幕上的某一部份,你就可以看清该部份放大后的内容,再次双击后能回到原始状况。

双击缩放是指用手指在屏幕上疾速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。

缘由就出在浏览器须要怎样推断疾速点击上,当用户在屏幕上单击某一个元素时刻,比方跳转链接<a href="#"></a>,此处浏览器会先捕捉该次单击,但浏览器不能决议用户是纯真要点击链接照样要双击该部份地区举行缩放操纵,所以,捕捉第一次单击后,浏览器会先Hold一段时候t,假如在t时候区间里用户未举行下一次点击,则浏览器会做单击跳转链接的处置惩罚,假如t时候里用户举行了第二次单击操纵,则浏览器会制止跳转,转而举行对该部份地区页面的缩放操纵。那末这个时候区间t有若干呢?在IOS safari下,也许为300毫秒。这就是耽误的由来。形成的效果用户地道单击页面,页面须要过一段时候才相应,给用户慢体验觉得,关于web开发者来说是,页面js捕捉click事宜的回调函数处置惩罚,须要300ms后才见效,也就间接致使影响其他营业逻辑的处置惩罚。

//处理计划:
fastclick可以处理在手机上点击事宜的300ms耽误
zepto的touch模块,tap事宜也是为了处理在click的耽误题目
  • Rentina显现屏道理及设想计划

申明:retina屏是一种具有超高像素密度的液晶屏,一样大小的屏幕上显现的像素点由1个变成多个,如在一样带下的屏幕上,苹果装备的retina显现屏中,像素点1个变成4个。
在高清显现屏中的位图被放大,图片会变得隐约,因而挪动端的视觉稿一般会设想为传统PC的2倍。
那末,前端的应对计划是:设想稿切出来的图片长宽保证为偶数,并应用backgroud-size把图片削减为本来的1/2

//比方图片宽高为:200px*200px,那末写法以下
.css{width:100px;height:100px;background-size:100px 100px;}
//别的元素的取值为本来的1/2,比方视觉稿40px的字体,应用款式的写法为20px
.css{font-size:20px}

//image-set设想Rentina背景图
image-set,webkit私有属性,也是CSS4的属性,为处理Rentina屏幕下的图象而生。
.css {
    background: url(images/bg.jpg) no-repeat center;
    background: -webkit-image-set(
    url(images/bg.jpg) 1x,     //支撑image-set一般屏
    url(images/bg-2x.jpg) 2x); //支撑image-set的Rentinan
}
  • chrome表单自动添补去掉input黄色背景处理计划

input:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px white inset;
border: 1px solid #CCC!important;
}
  • 点击元素发生背景或边框怎样去掉

//ios用户点击一个链接,会涌现一个半透明灰色遮罩, 假如想要禁用,可设置-webkit-tap-highlight-color的alpha值为0去除灰色半透明遮罩;
//android用户点击一个链接,会涌现一个边框或许半透明灰色遮罩, 差别生产商定义出来额结果不一样,可设置-webkit-tap-highlight-color的alpha值为0去除部份机械自带的结果;
//winphone体系,点击标签发生的灰色半透明背景,能经由过程设置<meta name="msapplication-tap-highlight" content="no">去掉;
//特别申明:有些机型去除不了,如小米2。关于按钮类另有个要领,不应用a或许input标签,直接用div标签
a,button,input,textarea { 
    -webkit-tap-highlight-color: rgba(0,0,0,0); 
    -webkit-user-modify:read-write-plaintext-only; //-webkit-user-modify有个副作用,就是输入法不再可以输入多个字符
}   
// 也可以 
 * { -webkit-tap-highlight-color: rgba(0,0,0,0); }
//winphone下
<meta name="msapplication-tap-highlight" content="no">
  • 美化表单元素

//一、应用appearance转变webkit浏览器的默许表面
input,select { -webkit-appearance:none; appearance: none; }

//二、winphone下,应用伪元素转变表单元素默许表面
//1.禁用select默许箭头,::-ms-expand修正表单控件下拉箭头,设置隐蔽并应用背景图片来润饰
select::-ms-expand { display:none; }

//2.禁用radio和checkbox默许款式,::-ms-check修正表单复选框或单选框默许图标,设置隐蔽并应用背景图片来润饰
input[type=radio]::-ms-check,
input[type=checkbox]::-ms-check { display:none; }

//3.禁用pc端表单输入框默许消灭按钮,::-ms-clear修正消灭按钮,设置隐蔽并应用背景图片来润饰
input[type=text]::-ms-clear,
input[type=tel]::-ms-clear,
input[type=number]::-ms-clear { display:none; }
  • 挪动端字体单元font-size挑选px照样rem

// 如需适配多种挪动装备,发起应用rem。以下为参考值:
html { font-size: 62.5%; }   //10*16 = 62.5%
//设置12px字体   这里注意在rem前要加上对应的px值,处理不支撑rem的浏览器的兼容题目,做到文雅降级
body { font-size:12px; font-size:1.2rem; }     
  • 超有用的CSS款式

//去掉webkit的转动条——display: none;
//其他参数
::-webkit-scrollba //转动条团体部份
::-webkit-scrollbar-thumb   //转动条内的小方块
::-webkit-scrollbar-track   //转动条轨道
::-webkit-scrollbar-button  //转动条轨道两头按钮
::-webkit-scrollbar-track-piece  //转动条中心部份,内置轨道
::-webkit-scrollbar-corner       //边角,两个转动条交汇处
::-webkit-resizer            //两个转动条的交汇处上用于经由过程拖动调解元素大小的小控件
//去除Firefox按钮和锚标签上的虚线表面
a:focus, a:active,
button::-moz-focus-inner,
input[type="reset"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner,
select::-moz-focus-inner,
input[type="file"] > input[type="button"]::-moz-focus-inner {
    border: 0;
    outline : 0;
}
// 制止长按链接与图片弹出菜单
a,img { -webkit-touch-callout: none }    

// 制止ios和android用户选中笔墨
html,body {-webkit-user-select:none; user-select: none; }

// 转变输入框placeholder的色彩值
::-webkit-input-placeholder { /* WebKit browsers */
color: #999; }
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
color: #999; }
::-moz-placeholder { /* Mozilla Firefox 19+ */
color: #999; }
:-ms-input-placeholder { /* Internet Explorer 10+ */
color: #999; }
input:focus::-webkit-input-placeholder{ color:#999; }

// android上去掉语音输入按钮
input::-webkit-input-speech-button {display: none}

// 阻挠windows Phone的默许触摸事宜
/*申明:winphone下默许触摸事宜事宜应用e.preventDefault是无效的,可经由过程款式来禁用,如:*/
html { -ms-touch-action:none; } //制止winphone默许触摸事宜
  • 作废input在ios下,输入的时刻英文首字母的默许大写

<input autocapitalize="off" autocorrect="off" />
  • 手机照相和上传图片

//IOS有照相、录相、拔取当地图片功用,部份Android只要挑选当地图片功用。Winphone不支撑
<input type="file" accept="images/*" />
<input type="file" accept="video/*" />
  • 屏幕扭转的事宜和款式

//JS处置惩罚
function orientInit(){
    var orientChk = document.documentElement.clientWidth > document.documentElement.clientHeight?'landscape':'portrait';
    if(orientChk =='lapdscape'){
        //这里是横屏下须要实行的事宜
    }else{
        //这里是竖屏下须要实行的事宜
    }
}

orientInit();
window.addEventListener('onorientationchange' in window?'orientationchange':'resize', function(){
    setTimeout(orientInit, 100);
},false)    

//CSS处置惩罚
//竖屏时款式
@media all and (orientation:portrait){   }
//横屏时款式
@media all and (orientation:landscape){   }
  • audio元素和video元素在ios和andriod中没法自动播放

//音频,写法一
<audio src="music/bg.mp3" autoplay loop controls>你的浏览器还不支撑哦</audio>

//音频,写法二
<audio controls="controls"> 
    <source src="music/bg.ogg" type="audio/ogg"></source>
    <source src="music/bg.mp3" type="audio/mpeg"></source>
    优先播放音乐bg.ogg,不支撑在播放bg.mp3
</audio>

//JS绑定自动播放(操纵window时,播放音乐)
$(window).one('touchstart', function(){
    music.play();
})

//微信下兼容处置惩罚
document.addEventListener("WeixinJSBridgeReady", function () {
    music.play();
}, false);

//小结
//1.audio元素的autoplay属性在IOS及Android上没法应用,在PC端一般
//2.audio元素没有设置controls时,在IOS及Android会占有空间大小,而在PC端Chrome是不会占有任何空间
  • 重力感到事宜

// 应用HTML5的deviceMotion,挪用重力感到事宜
if(window.DeviceMotionEvent){
    document.addEventListener('devicemotion', deviceMotionHandler, false)
}   

var speed = 30;
var x = y = z = lastX = lastY = lastZ = 0;
function deviceMotionHandler(eventData){
    var acceleration = event.accelerationIncludingGravity;
    x = acceleration.x;
    y = acceleration.y; 
    z = acceleration.z;
    if(Math.abs(x-lastX)>speed || Math.abs(y-lastY)>speed || Math.abs(z-lastZ)>speed ){
        //这里是动摇后要实行的要领 
        yaoAfter();
    }
    lastX = x;
    lastY = y;
    lastZ = z;
}

function yaoAfter(){
    //do something
}

//申明:说见案例摇一摇结果中yao.js
  • 微信浏览器用户调解字体大小后页面矬了,怎样阻挠用户调解

//以下代码可以使Android机页面不再受用户字体缩放强迫转变大小,然则会有1S摆布延时,时期可以斟酌loading来处置惩罚
if (typeof(WeixinJSBridge) == "undefined") {
    document.addEventListener("WeixinJSBridgeReady", function (e) {
        setTimeout(function(){
            WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize':0}, function(res){
                alert(JSON.stringify(res));
            })
        }, 0)
    });
}else{  
    setTimeout(function(){
        WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize':0}, function(res){
            alert(JSON.stringify(res));
        })
    }, 0)   
}

//IOS下可应用 -webkit-text-size-adjust制止用户调解字体大小
body { -webkit-text-size-adjust:100%!important; }

//最好的处理计划:最好应用rem或百分比规划
  • 定位的坑

//fixed定位
//1.ios下fixed元素轻易定位失足,软键盘弹出时,影响fixed元素定位
//2.android下fixed表现要比iOS更好,软键盘弹出时,不会影响fixed元素定位
//3.ios4下不支撑position:fixed
//处理计划:应用[Iscroll](http://cubiq.org/iscroll-5),如:
<div id="wrapper">
        <ul>
               <li></li>
               .....
        </ul>
</div>
<script src="iscroll.js"></script>
<script>
    var myscroll;
    function loaded(){
        myscroll=new iScroll("wrapper");
    }
    window.addEventListener("DOMContentLoaded",loaded,false);
</script>


//position定位
//Android下弹出软键盘弹出时,影响absolute元素定位
//处理计划:
var ua = navigator.userAgent.indexOf('Android');
if(ua>-1){
    $('.ipt').on('focus', function(){
        $('.css').css({'visibility':'hidden'})
    }).on('blur', function(){
        $('.css').css({'visibility':'visible'})
    })
}
  • 播放视频不全屏

<!--
1.ios7+支撑自动播放
2.支撑Airplay的装备(如:音箱、Apple TV)播放
x-webkit-airplay="true" 
3.播放视频不全屏
webkit-playsinline="true" 
-->
<video x-webkit-airplay="true" webkit-playsinline="true" preload="auto" autoplay src="http://"></video>
  • JS推断装备

function deviceType(){
    var ua = navigator.userAgent;
    var agent = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];    
    for(var i=0; i<len,len = agent.length; i++){
        if(ua.indexOf(agent[i])>0){         
            break;
        }
    }
}
deviceType();
window.addEventListener('resize', function(){
    deviceType();
})
  • JS推断微信浏览器

function isWeixin(){
    var ua = navigator.userAgent.toLowerCase();
    if(ua.match(/MicroMessenger/i)=='micromessenger'){
        return true;
    }else{
        return false;
    }
}
  • android 2.3 bug

//1.@-webkit-keyframes 须要以0%最先100%完毕,0%的百分号不能去掉
//2.after和before伪类没法应用动画animation
//3.border-radius不支撑%单元,如要兼容,可以给radius设置一下较大的值
//4.translate百分比的写法和scale在一起会致使失效,比方:
-webkit-transform: translate(-50%,-50%) scale(-0.5, 1)
  • android 4.x bug

//1.三星 Galaxy S4中自带浏览器不支撑border-radius缩写
//2.同时设置border-radius和背景色的时刻,背景色会溢出到圆角之外部份
//3.部份手机(如三星),a链接支撑鼠标:visited事宜,也就是说链接接见后笔墨变成紫色
//4.android没法同时播放多音频audio
  • 消弭transition闪屏

.css {
    -webkit-transform-style: preserve-3d;
    -webkit-backface-visibility: hidden;
    -webkit-perspective: 1000;
}
  • 开启硬件加快

//现在,像Chrome/Filefox/Safari/IE9+以及最新版本Opera都支撑硬件加快,当检测到某个DOM元素应用了某些CSS划定规矩时就会自动开启,从而处理页面闪白,保证动画流通。
.css {
    -webkit-transform: translate3d(0,0,0);
    -moz-transform: translate3d(0,0,0);
    -ms-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}
  • 衬着优化

//1.制止应用iframe(壅塞父文档onload事宜)
//2.制止应用gif图片完成loading结果(下降CPU斲丧,提拔衬着机能)
//应用CSS3代码替代JS动画;
//开启GPU加快;
//应用base64位编码图片(对小图而言,大图不发起应用)
    // 关于一些小图标,可以应用base64位编码,以削减收集要求。但不发起大图应用,比较消耗CPU。小图标上风在于:
    //1.削减HTTP要求;
    //2.防止文件跨域;
    //3.修正实时见效;

经常使用的挪动端框架

  • zepto.js

官网
中文网
浏览器检测
tap事宜

    原文作者:potato1314
    原文地址: https://segmentfault.com/a/1190000005649894
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞