移动端特性

手机端的web页(H5)

跨平台(手机端、PC端)

基于webview

-webkit- 常用属性

http://ued.ctrip.com/webkitcss/   整理的webkit属性集合

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

1、-webkit-appearance: none;     // 用于移IOS下移除原生样式

2、text-size-adjust: 100%;       // webkit内核浏览器可以让终端字体小于12px

    iPhone 和 Android 的浏览器纵向和橫向时自动调整字体大小的功能。通过 text-size-adjust 设为 none 或者 100% 关闭字体大小自动调整功能.
    html {
        font-family: "Helvetica Neue", Helvetica, STHeiTi, Arial, sans-serif;
        -ms-text-size-adjust: 100%;
        -webkit-text-size-adjust: 100%; 
    }

3、overflow-scrolling  硬件加速, 在body中设置

    body {
        /*height: 100%;*/
        overflow-x: hidden;
        -webkit-overflow-scrolling: touch; 
    }

4、tap-highlight-color  用户点击iOS的Safari浏览器中的链接或JavaScript的可点击的元素时,覆盖显示的高亮颜色

    a {
        -webkit-tap-highlight-color: transparent;
    }

5、touch-callout  当触摸并长按住的时候,禁止或显示系统默认菜单

    a {
        -webkit-touch-callout: none
    }

    window.ontouchstart = function(e) {
        if (e.target.tagName === 'img')
                    e.preventDefault();
    }

6、pointer-events:none;

viewport 视图

<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 - 是否允许手动缩放

不同屏幕的适配方案

通过响应式技术,在不同设备上使用同一套代码来展示

1、设置@media      2、rem       3、vw/vh

一、@media 媒体查询 

    @media screen and(min-width: 500px){    // 大于500px执行下面代码
            ...
    }

二、rem

    rem会根据根元素<html>的fontSize的大小来变化,需要运用js来计算根据屏幕宽度或来计算html的赋值

    1、普通CSS写法

        html { font-size: 16px; }
        div { width: 2rem; }

    2、Sass的工程: 

        前端构建中,完全可以利用scss来解决这个问题,例如我们可以写一个scss的function px2rem即: 
        @function px2rem($px){
            $rem : 37.5px;
            @return ($px/$rem) + rem;
        }

        调用
        height: px2rem(90px);
        width: px2rem(90px);

三、vw、vh

    上面两种不是特别完美,媒体查询不能做到等比例响应,rem需要js与css耦合在一起,而且vw/vh就不需要

    计算vm方法: 16 / 750 * 100 = 2.13vw;        // 16是px转rem的值,750

        html {
            font-size: 2.13vw;
        }

    vw: 视窗的宽度,视窗的宽度是100vw

    vh: 视窗的高度,视窗的高度是100vh

    vmin: 选取vw和vh中最小的那个

    vmax: 选取vw和vh中最大的那个

https://zhuanlan.zhihu.com/p/23968868
https://juejin.im/entry/59b00e46f265da2491513bcc

移动端概念

一、物理像素: 物理像素是屏幕的实际尺寸

二、设备独立像素: 设备像素与CSS像素之间的关系

三、设备像素比 dpr: 设备像素比 = 物理像素 / 设备独立像素;

    js获取设备像素比: window.devicePixelRatio        // devicePixelRatio = 物理像素 / 实际像素;

    iphoneX是3倍屏,其它都是2倍屏

    retina屏是超高像素密度屏,同样大小的屏幕上显示的像素点由1个变为多个,同样苹果设备的retina屏中,像素点1个变为4个

    1、根据不同的设备像素比来加载不同的图片

        // 例如图片宽高为: 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
        }

        // javscript的解决方案
        $(document).ready(function(){
            if (window.devicePixelRatio > 1) {
                var lowresImages = $('img');

                images.each(function(i) {
                    var lowres = $(this).attr('src');
                    var highres = lowres.replace(".", "@2x.");
                    $(this).attr('src', highres);
                });
            }
        });

    https://www.jianshu.com/p/c88e9489b583

四、设置不同像素比的响应样式

    /* 2倍屏 */
    @media only screen and (-webkit-min-device-pixel-ratio: 2.0){
        .bor-querymidea::after{
            -webkit-transform: scaleY(0.5);
            transform: scaleY(0.5);
        }
    }

    /* 3倍屏 */
    @media only screen and (-webkit-min-device-pixel-ratio: 3.0){
        .bor-querymidea::after{
            -webkit-transform: scaleY(0.33);
            transform: scaleY(0.33);
        }
    }

Meta

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" />


2、其他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">

预加载技术

一、dns-prefetch 预加载

    <link rel="dns-prefetch" href="http://g.alicdn.com">

    dns-prefetch, DNS解析往往导致了网站加载速度慢。现代浏览器针对这个问题开发了处理方式,它将域名缓存后,当用户点击其它页面地址后自动的获取


二、prefetch 连接网页预先加载

    当能确定网页在未来一定会使用到某个资源时,开发者可以让浏览器提前请求并且缓存好以供后续使用。prefetch支持预拉取图片、脚本或者任何可以被浏览器缓存的资源。

    <link rel="prefetch" href="image.png">

三、preconnect 

    和DNS prefetch类似,preconnect不光会解析DNS,还会建立TCP握手连接和TLS协议(如果需要)

    <link rel="preconnect" href="http://css-tricks.com">


http://www.alloyteam.com/2015/10/prefetching-preloading-prebrowsing/

打电话发短信写邮件怎么实现

一、打电话

    <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>

CSS样式

一、美化表单元素

    // 使用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; }


二、其它实用的css

    1、去掉webkit的滚动条——display: none;
            // 其他参数
            ::-webkit-scrollba //滚动条整体部分
            ::-webkit-scrollbar-thumb   //滚动条内的小方块
            ::-webkit-scrollbar-track   //滚动条轨道
            ::-webkit-scrollbar-button  //滚动条轨道两端按钮
            ::-webkit-scrollbar-track-piece  //滚动条中间部分,内置轨道
            ::-webkit-scrollbar-corner       //边角,两个滚动条交汇处
            ::-webkit-resizer            //两个滚动条的交汇处上用于通过拖动调整元素大小的小控件

    2、禁止长按链接与图片弹出菜单
            a,img { -webkit-touch-callout: none }    

    3、禁止文字复制
            html,body {-webkit-user-select:none; user-select: none; }

    4、改变输入框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; }

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

    6、阻止windows Phone的默认触摸事件
            /*说明: winphone下默认触摸事件事件使用e.preventDefault是无效的,可通过样式来禁用,如: */
            html { -ms-touch-action:none; } //禁止winphone默认触摸事件

            取消input在ios下,输入的时候英文首字母的默认大写
            <input autocapitalize="off" autocorrect="off" />

    7、手机拍照和上传图片
            // IOS有拍照、录像、选取本地图片功能,部分Android只有选择本地图片功能。Winphone不支持
            <input type="file" accept="images/*" />
            <input type="file" accept="video/*" />

播放视频不全屏

<!--
        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>

bug修改

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消耗,提升渲染性能)

    3、使用CSS3代码代替JS动画

    4、开启GPU加速

    5、使用base64位编码图片(不小图而言,大图不建议使用),以减少网络请求。比较耗费CPU。小图标优势在于: 减少HTTP请求、避免文件跨域、修改及时生效

—————————– 移动端的JS ——————————–

移动端touch事件(区分webkit和winphone)

一、当用户手指放在移动设备在屏幕上滑动会触发的touch事件

    1、以下支持webkit

        touchstart: 当手指触碰屏幕时候发生。不管当前有多少只手指
        touchmove: 当手指在屏幕上滑动时连续触发。通常我们再滑屏页面,会调用event的preventDefault()可以阻止默认情况的发生: 阻止页面滚动
        touchend: 当手指离开屏幕时触发
        touchcancel: 系统停止跟踪触摸时候会触发。例如在触摸过程中突然页面alert()一个提示框,此时会触发该事件,这个事件比较少用

    2、TouchEvent对象 : 

        touches: 屏幕上所有手指的信息
        targetTouches: 手指在目标区域的手指信息
        changedTouches: 最近一次触发该事件的手指信息
        touchend时,touches与targetTouches信息会被删除,changedTouches保存的最后一次的信息,最好用于计算手指信息

        event.changedTouches[0].clientX  获取移动端事件

    3、参数信息(changedTouches[0])

        clientX、clientY在显示区的坐标
        target: 当前元素

    4、事件响应顺序

        ontouchstart  > ontouchmove  > ontouchend > onclick

    5、以下支持winphone 8

        MSPointerDown: 当手指触碰屏幕时候发生。不管当前有多少只手指
        MSPointerMove: 当手指在屏幕上滑动时连续触发。通常我们再滑屏页面,会调用css的html{-ms-touch-action: none;}可以阻止默认情况的发生: 阻止页面滚动
        MSPointerUp: 当手指离开屏幕时触发


二、移动端的web页面click事件会产生200-300ms的延时响应

    移动设备上的web网页是有300ms延迟的,往往会造成按钮点击延迟甚至是点击失效。

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

            比如在点击一个<a href="#"></a>时,浏览器先捕获是单击还是双击缩放,所以捕获一次单击后,浏览器会hold一段时间来看是否有下一次点击,这个时间间隔就是300ms,这就是延时的由来,所以使用click来触发事件需要延时300ms后才生效

    解决方案: 
            fastclick可以解决在手机上点击事件的300ms延迟
            zepto的touch模块,tap事件也是为了解决在click的延迟问题

屏幕旋转的事件orientationchange

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(event){
    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
}

设备判断

一、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){   
                return agent[i];     
                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;
        }
    }

前端动画的几种方式

一、动画方式

    1、css3的transition 和 animattion

    2、定时器, 最原始的“window.setTimout()”或者“window.setInterval()” 不断更新元素的状态位置等来实现动画

    3、requestAnimationFrame方法

    4、canvas上作图来实现动画,也可以借助jQuery动画相关的API方便地实现

    5、SVG、WebGL

二、requestAnimationFrame  注意 Android不支持此方法

    requestAnimationFrame是浏览器用于定时循环操作的一个接口,类似于setTimeout,主要用途是按帧对网页进行重绘。

    设置这个API的目的是为了让各种网页动画效果(DOM动画、Canvas动画、SVG动画、WebGL动画)能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果。

    1、对requestAnimationFrame方法处理兼容:

        window.requestAnimFrame = (function(){
        return  window.requestAnimationFrame ||
                        window.webkitRequestAnimationFrame ||
                        window.mozRequestAnimationFrame ||
                        window.oRequestAnimationFrame ||
                        window.msRequestAnimationFrame ||
                        function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element){
                                window.setTimeout(callback, 1000 / 60);
                        };
        })();

    2、Example

        <div id="demo" style="position:absolute; width:100px; height:100px; background:#ccc; left:0; top:0;"></div>
        <script>
                var demo = document.getElementById('demo');
                function render(){
                        demo.style.left = parseInt(demo.style.left) + 1 + 'px'; //每一帧向右移动1px
                }
                var requestID = requestAnimationFrame(function(){
                        render();
                        //当超过300px后才停止
                        if(parseInt(demo.style.left) <= 300) {
                                requestAnimationFrame(arguments.callee);        // arguments.callee调用函数本身,或者给函数一个名,参数传个名
                        }
                });

                // cancelAnimationFrame(requestID);      // 停止动画重绘
        </script>

三、常用动画库

    Ani.js -- 基于CSS动画的生命处理库
    Dynamics.js -- 创建具有物理运动效果动画的js库
    Animate.css -- 齐全的CSS3动画库
    Three.js -- 让用户通过javascript入手进入搭建webgl项目的类库

    http://www.tuicool.com/articles/uUfYry
    http://www.jianshu.com/p/280e0ef90b96

其它API

一、querySelector()、querySelectorAll()

    获取元素 document.querySelector('#app');

二、window.devicePixelRatio 获取设备像素比,也叫做dpr

    这个属性是系统自动算出来的值返回给window.devicePixelRatio,公式就是

    // 比如ipone6 750px物理像素 / 375px设备像素,所以dpr为2,有这个属性不用我们就不用去算
    window.devicePixelRatio = 物理像素 / 设备独立像素;

三、getBoundingClientRect  js判断可视区域

    var htmlWidth = document.documentElement.getBoundingClientRect().width;     // html文档的宽度
    var top = document.documentElement.getBoundingClientRect().top;      // 元素顶端到可见区域顶端的距离
    var se = document.documentElement.clientHeight; // 浏览器可见区域高度。

四、document.documentElement、document.body

    document.body 获取body文档
    document.documentElement 获取HTML整个文档,从<!DOCTYPE html>开始

五、document.documentElement.getBoundingClientRect().width   获取html文档宽度

    获取文档可视区宽度

    问题
            document.body.clientWidth;   // 这里取的是body的宽度,如果body的宽度被改变
            window.innerWidth;      // 这里获取的是整个宽口的宽度,包括滚动条

    解决方法: document.documentElement.getBoundingClientRect().width

fetch 新一代ajax

一、fetch的请求设置与响应

    fetch('/some/url', {
        method: 'get'
    })
    .then(function(response) {
        // 成功
    })
    .catch(function(err) {
        // 出错了;等价于 then 的第二个参数,但这样更好用更直观 :(
    });


二、设置Header头

    fetch('https://www.baidu.com/search/error.html', {
        method: 'POST',
        headers: new Headers({
                'Content-Type': 'application/x-www-form-urlencoded'     // 指定提交方式为表单提交
        }),
        body: new URLSearchParams([["foo", 1],["bar", 2]]).toString()
    })
    .then((res)=>{
        return res.text()
    })
    .then((res)=>{
        console.log(res)
    })

fetch没有拦截请求和响应数据的功能,在单页面路由跳转时会需要提前去查看用户的一些登录信息,这时候需要使用Axios插件

问题收集

一、keydown侦听输入个数时,中文输入法输入个数的问题 

        let username = document.querySelector('#username');

        // 如果输入中文,输入法比如输 "物品" 五笔需要输入 "trkk",这样size为4,这样对中文判断长度会有问题
        $('#username').on('keydown', function(){
                let size = $(this).val().length;
                console.log(size);    
        })

        // 解决方法,侦听compositionend事件,返回的size正常
        $('#username').on('compositionend', function(){
                let size = $(this).val().length;
                console.log(size);  
        })

        http://www.alloyteam.com/2017/03/moves-the-input-box-fill-series-a/
        http://www.alloyteam.com/2016/12/alloytouch-full-screen-scroll-plugin-released-30-seconds-to-get-smooth-page-h5/


二、Retina屏1px边框处理

    高清屏,1px实际是2x2个像素来渲染,有的还是3x3,所以border: 1px 移动端会渲染为2px或3px

    <div class="bor-box">
            <div class="bor-querymidea">通过伪类创建边框,在通过媒体查询来适配</div>
    </div>

    解决方法

    1、通过-webkit-min-device-pixel-ratio 来确定两倍屏来修改边框大小

            .bor-querymidea{
                border: 1px #ccc solid;
            }

            /* 2倍屏 */
            @media only screen and (-webkit-min-device-pixel-ratio: 2.0){
                .bor-querymidea{
                    /* border: 0.5 #ccc solid;   retina屏是不识别0.5px,会解释为0 */
                    -webkit-transform: scaleY(0.5);
                    transform: scaleY(0.5);
                }
            }

            /* 3倍屏 */
            @media only screen and (-webkit-min-device-pixel-ratio: 3.0){
                .bor-querymidea{
                    -webkit-transform: scaleY(0.33);
                    transform: scaleY(0.33);
                }
            }

        2、js判断如果devicePixelRation的值

            devicePixelRation = 2; 输出viewport: <meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

            devicePixelRatio = 3; 输出 <meta name="viewport" content="initial-scale=0.333, maximum-scale=0.333, minimum-scale=0.333, user-scalable=no">

        https://www.jianshu.com/p/7e63f5a32636          // 7咱方法


三、设置viewport 缩放比例

    (function(doc, win) {
        var scale = 1.0;
        if (win.devicePixelRatio === 2) {
            scale *= 0.5;
        }
        if (win.devicePixelRatio === 3) {
            scale *= 0.333333;
        }
        var text = '<meta name="viewport" content="initial-scale=' + scale + ', maximum-scale=' + scale +', minimum-scale=' + scale + ', width=device-width, user-scalable=no" />';
        doc.write(text);       
    })(document, window);

    https://www.cnblogs.com/stella1024/p/7199832.html

收集工具

1、browsersync 多端浏览器同步测试工具  http://www.browsersync.cn/

2、lib-flexible 处理根据屏幕的尺寸将Html中的font-size的值自动转换  https://github.com/amfe/lib-flexible

3、sublime的px转rem的插件   https://github.com/flashlizi/cssrem

| http://www.uigreat.com/page/guifan // 移动端屏幕尺寸集合
| http://cubic-bezier.com/#.55,.01,.38,.99 // 调节css3动画效果并导出代码
| https://segmentfault.com/a/1190000007075834 // Retina屏
| http://mp.weixin.qq.com/s?__biz=MzAwNjI5MTYyMw==&mid=404009356&idx=1&sn=e3218b95b78a5f043e7b0e3df49703d3&scene=4#wechat_redirect
| http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html
| http://www.alloyteam.com/2016/03/mobile-web-adaptation-tool-rem/#prettyPhoto rem
| https://github.com/amfe/article/issues/17 // 淘宝H5终端适配