美文网首页HTML5
H5 项目常见问题汇总及解决方案

H5 项目常见问题汇总及解决方案

作者: Dimen_ | 来源:发表于2017-03-23 17:31 被阅读94次

    Meta 基础知识:

    1. H5 页面窗口自动调整到设备宽度,并禁止用户缩放页面。
    一、HTML 页面结构
    // width    设置 viewport 宽度,为一个正整数,或字符串 'device-width'
    // height   设置 viewport 高度,一般设置了宽度,会自动解析出高度,可以不用设置
    // initial-scale    默认缩放比例,为一个数字,可以带小数
    // minimum-scale    允许用户最小缩放比例,为一个数字,可以带小数
    // maximum-scale    允许用户最大缩放比例,为一个数字,可以带小数
    // user-scalable    是否允许手动缩放
    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
    
    二、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">');
    }
    
    1. 空白页基本 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" />
    
    1. 其他 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">
    

    常见问题:

    1. 移动端如何定义字体 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; } 
    
    1. 打电话发短信写邮件怎么实现
    一、打电话
    <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=![](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![](images/1.jpg)">点击我发邮件</a>
    
    1. 移动端 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 ——当手指离开屏幕时触发
    
    1. 移动端 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 的延迟问题。
    
    1. Rentina 显示屏原理及设计方案
      说明:
    • Retina 屏是一种具备超高像素密度的液晶屏,同样大小的屏幕上显示的像素点由 1 个变为多个,如在同样带下的屏幕上,苹果设备的 Retina 显示屏中,像素点 1 个变为 4 个。
    • 在高清显示屏中的位图被放大,图片会变得模糊,因此移动端的视觉稿通常会设计为传统 PC 的 2 倍。 那么,前端的应对方案是:设计稿切出来的图片长宽保证为偶数,并使用 background-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
    }
    
    1. 点击元素产生背景或边框怎么去掉
    // 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">
    
    1. 美化表单元素
    一、使用 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; }
    
    1. 移动端字体单位 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; }  
    
    1. 超实用的 CSS 样式
    // 去掉 webkit 的滚动条 ——display: none;
    // 其他参数
    ::-webkit-scrollba // 滚动条整体部分
    ::-webkit-scrollbar-thumb   // 滚动条内的小方块
    ::-webkit-scrollbar-track   // 滚动条轨道
    ::-webkit-scrollbar-button  // 滚动条轨道两端按钮
    ::-webkit-scrollbar-track-piece  // 滚动条中间部分,内置轨道
    ::-webkit-scrollbar-corner       // 边角,两个滚动条交汇处
    ::-webkit-resizer            // 两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
    // 禁止长按链接与图片弹出菜单
    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 默认触摸事件
    
    1. 取消 input 在 iOS 下,输入的时候英文首字母的默认大写
    <input autocapitalize="off" autocorrect="off" />
    
    1. 手机拍照和上传图片
    // iOS 有拍照、录像、选取本地图片功能,部分 Android 只有选择本地图片功能。Winphone 不支持
    <input type="file" accept="images/*" />
    <input type="file" accept="video/*" />
    
    1. 屏幕旋转的事件和样式
    // 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){   }
    
    1. 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 是不会占据任何空间
    
    1. 重力感应事件
    // 运用 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
    }
    
    1. 微信浏览器用户调整字体大小后页面矬了,怎么阻止用户调整
    // 以下代码可使 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 或百分比布局
    
    1. 定位的坑
    // 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. 播放视频不全屏
    <!--
    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>
    
    1. 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();
    })
    
    1. JS 判断微信浏览器
    function isWeixin(){
        var ua = navigator.userAgent.toLowerCase();
        if(ua.match(/MicroMessenger/i)=='micromessenger'){
            return true;
        }else{
            return false;
        }
    }
    
    1. 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)
    
    1. Android 4.x BUG
    // 1.三星 Galaxy S4 中自带浏览器不支持 border-radius 缩写
    // 2.同时设置 border-radius 和背景色的时候,背景色会溢出到圆角以外部分
    // 3.部分手机(如三星),a 链接支持鼠标:visited 事件,也就是说链接访问后文字变为紫色
    // 4.Android 无法同时播放多音频 Audio
    
    1. 消除 transition 闪屏
    .css {
        -webkit-transform-style: preserve-3d;
        -webkit-backface-visibility: hidden;
        -webkit-perspective: 1000;
    }
    
    1. 开启硬件加速
    //目前,像 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. 渲染优化
    // 1.禁止使用 iframe(阻塞父文档 onload 事件)
    // 2.禁止使用 gif 图片实现 loading 效果(降低 CPU 消耗,提升渲染性能)
    // 使用 CSS3 代码代替 JS 动画;
    // 开启 GPU 加速;
    // 使用 base64 位编码图片(不小图而言,大图不建议使用)
        // 对于一些小图标,可以使用 base64 位编码,以减少网络请求。但不建议大图使用,比较耗费 CPU。小图标优势在于:
        // 1.减少 HTTP 请求;
        // 2.避免文件跨域;
        // 3.修改及时生效;
    

    相关文章

      网友评论

      本文标题:H5 项目常见问题汇总及解决方案

      本文链接:https://www.haomeiwen.com/subject/tzlanttx.html