移动端适配&常见问题

适配

meta标签

  • <meta name="viewport" content = "width=device-width,initial.scale=1.0,user-scalable = no">

什么是适配?为什么要做适配?

  • 适配:百分百还原设计图(等比)
    • 没有加viewport meta标签时:等比 文字太小了整个用户体验太差
    • 加了viewport meta标签时:不等比 占据的实际尺寸(英寸)一样

三种适配方案

  • 百分百适配,rem适配,viewport适配

rem

  • chorm下的默认font-size = 16px
  • chorm下最小的font-size = 12px
  • IE6下元素最小高度为19px,可以将其父元素的fontSize设置为0,只能解决到2px
  • em参照与自己的font-size
  • rem参照于根标签(html)的font-size与其他标签无关

rem适配

  • 想让一个1rem的元素不管在什么设备上都占据满屏
    • 1rem最终渲染的px值为布局视口所代表的值
    • 根标签的fontsize变为布局视口所代表的值
  • 使用rem适配时,必须要先使用meta标签,把布局视口变成完美视口
  • 元素的width的大小为元素的宽度/布局视口的宽度rem
  • 改变了每个元素在不同设备上所占据的css像素的个数!!!
    • 优点:使用了完美视口
    • 缺点:px到rem的转化比较复杂
(function(){
    var styleNode = document.createElement('style');
    var width = document.documentElement.clientWidth /16;
    styleNode.innerHTML="html{font-size:"+ width +"px !important}"
    document.head.appendChild(styleNode);
})()

设计图的要法

  • 要一张750*1334的图(分辨率)
  • 如果图片大小固定,可以使用viewport适配

viewport适配

  • 改变布局视口的大小(调整initial.scale的比例)
  • meta不能有width=device-width
  • 将每个设备的布局视口变为设计图的尺寸
    • 优点:所量即所得
    • 缺点:没有使用完美视口
    如果设备的width的大小为320
    可以把每一个设备的布局视口变成320
    (function(){
      var width = 320
      var scale = document.documentElement.clientWidth /width
      var metaNode = document.querySelector("meta[name ='viewport']");
      metaNode.setAttribute("content","initial-scale="+ scale +",user-scalable=no");
    })()
    

如何实现一物理像素的适配方案

  • 使用rem适配方案做布局,使用initial-scale的比例缩放
  (function(){
    var dpr = window.devicePixelRatio||1
    var styleNode = document.createElement('style');
    var width = document.documentElement.clientWidth *dpr /16;
    styleNode.innerHTML="html{font-size:"+ width +"px !important}";
    document.head.appendChild(styleNode);

    var scale = 1/dpr;
    var metaNode = document.querySelector("meta[name = 'viewport']");
    metaNode.setAttribute("content","width=device-width,initial-scale=" + scale +",user-scalable=no");
  })()

移动端事件

querySelector的坑

  • document.querySelector静态获取dom节点
  • document.getElementsByClassName动态获取dom节点

触屏事件

  • 触屏事件 建议使用dom2的形式去绑定
    • touchmove 能不能单独触发?在移动端是没有办法单独触发的
  • 鼠标事件
    • mousemove能不能单独触发?在pc端是可以单独触发的

全面禁止移动端默认事件

  • 文字默认选中
  • 橡皮筋效果
  document.addEventListener('touchstart',function(ev){
    ev= ev||event
    //return false dom0的禁止默认行为
    ev.preventDefault();//dom2的禁止默认行为
  })

自定义右键菜单

  • 首先禁止document上的默认行为
  • 右键事件oncontextmenu
  var wrap = document.querySelector('#wrap');
  wrap.style.display ="none"
  document.oncontextmenu = function(ev){
    ev = ev||event;
    var x = ev.clientX;
    var y = ev.clientY;

    wrap.style.left = x+'px';
    wrap.style.top = y+'px';

    wrap.style.display ="block"
    ev.preventDefault();
  }

  document.onclick = function(ev){
    ev = ev||event;
    wrap.style.display ="none"
  }

移动端的坑(事件点透)

  • 目标:一个a标签在div的下面,点击一次a标签时,把div的display变为none,不触发a标签
  • 实际效果:点击a标签后,div消失,a标签触发
  • 原因:PC端的事件可以在移动端执行,PC端事件执行时有300ms的延迟(浏览器需要时间看一下后面到底触发什么事件)
    • 移动端事件:touchstart
    • PC端事件:onclick,onmousedown
    var aNodes = document.querySelectorAll('a');
        document.addEventListener('touchstart',function(ev)){
            ev=ev||event;
            ev.preventDefault();
        }

        for(var i=0;i<aNodes.length;i++){
            aNodes[i].addEventListener('touchstart',function(ev){
                this.ismoved = false;
            })

            aNodes[i].addEventListener('touchmove',function(ev){
                if(!this.ismoved){
                    this.ismoved = true
                }
            })

            aNodes[i].addEventListener('touchend',function(ev){
                if(this.ismoved){
                    return
                }
                window.location.href = this.href;
            })
        }

移动端的其他事件

  • changedTouches:触发当前事件的手指列表(只能有一个?)
  • targetTouches:触发当前事件时,元素身上的手指列表
  • touches:触发当前事件时,屏幕上的手指列表
    testNode.addEventListener('touchend',function(ev){
            ev= ev||event;
            setTimeout(function(){
                testNode.innerHTML = "changed:"+ev.changedTouches.length+"<br>"+"target:"+ev.targetTouches.length
                +"<br>"+"touches:"+ev.touches.length;
            },200)
        })

移动端模板

  • 第一步:viewport meta标签
  • 第二步:移动端事件的默认行为全面禁止掉
  • 第三步:挑选一个适配方案
  document.addEventListener('touchstart',function(ev){
    ev= ev||event;
    ev.preventDefault()
  })

  (function(){
    var styleNode = document.createElement('style');
    var width = document.documentElement.clientWidth /16;
    styleNode.innerHTML = "html{font-size:"+width+"px !important}"
    document.head.appendChild(styleNode);
  })()

移动端常见问题

  • 禁止电话与邮箱

    <meta name="format-detection" content="telephone=no,email=no"/>
  • 链接&按钮背景高亮问题(一般为a,input,button)

    -webkit-tap-highlight-color: rgba(0,0,0,0);
  • 圆角问题(input的圆角在ios下渲染太过分)

    /*处理圆角渲染太过分*/-webkit-appearance: none;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容