移动端适配总结

前景提要
以下内容根据部分文章参考 自己实践得出的猜想和总结 有错误请指正
一·概念介绍
css单位:px ,rem,em(没用过),pt,vw,%
viewport说明:参考这个
物理像素:理解成分别率
设备独立像素(css像素或者说dip):由一个或多个物理像素组成的虚拟点也是开发中设置的点 比如width:1px设置的就是这个
ppi:每英寸含有的物理像素 (300以上人肉眼看不到点)
dpr:物理像素/设备独立像素 每个移动设备都有自己的dpr (打开chrome切换到移动模式也能看到对应的dpr,window.devicePixelRatio能直接获取该值)
metaviewprot:设置布局viewport<meta name="viewprot" content="width=360">
二:理论
正常一个pc端一个页面移植到手机端可以看到页面内容很小比如一个

1.png

这里我没有设置相应的viewport可以看到内容很小 还有个现象layoutviewPort宽是980而不是真机的1080分辨率(有些手机默认有可能是800 也有别的 大部分是980),即html的宽度980

添加一个metaviewport
ps:真机设备分辨率1080*1920 dip是360
分别是

  1. <meta name="viewport" content="width=160,user-scalable=0">


    4.png

2.<meta name="viewport" content="width=360,user-scalable=0">


3.png

3.<meta name="viewport" content="width=1080,user-scalable=0">


2.png

4.<meta name="viewport" content="width=device-width,user-scalable=0">
width=device-width把layoutviewport定义跟视觉窗口一样大(即设备的可视窗口这里是360pt)不上图了...

这个实例对比可以看到没设置viewport的时候viewport的默认值是980 可以看到document.documentElement.clientWidth=980(layoutviewport 也有人叫他视口 的宽度 很多手机默认都是980)
设置了相应的width后对应的html改变了, device-width就是设备独立像素(dip360)
而且width越小看到内容越大就好像被放大了一样。

这里我是这么去想象的:
有那边一张白纸是layoutviewport(=布局窗口=html的宽度) ,你可以在白纸上画画 ,手机框(就想象成一个空壳的框)(=视觉窗口 你通过这个窗口去看那个白纸上的内容)
假设就是有一个980宽的白纸 然后你手上有个360宽的壳,一开始你透过壳可以看到整个白纸(但是字很小像图2.png)把纸改成360大小,这样你必须拿着手上的壳离这个白纸越来越近直到2个完全重合(想象下这样白纸上面的看到的东西是不是越来越大)这个时候相当于设了width=device-width或者width=360,甚至你可以改的更小 然后再靠近直到你框的宽度又跟他重合,字也是越来越大(注意这里html的with跟viewport width是一致)。

<meta name="viewport" content="width=device-width,initial-scale=0.5,user-scalable=0">


5.png

<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">


6.png

<meta name="viewport" content="width=device-width,initial-scale=2,user-scalable=0">


7.png

其实这里很好理解 要initial-scale=0.5就是缩小2倍 ,还是那个画画的白纸(layoutviewportviewport)想象下你要缩小2倍自然要把白纸在原来合适的位置(白纸=360的时候,注意这里跟你设的width=device-width没关系),然后一边远离一边放大720视觉上,这样缩小后白纸的大小跟你设置width=720就是一样的,
有一点要注意 这里initial-scale计算出的白纸大小和width=xx白纸大小会取这里的大值。
比如

<meta name="viewport"  content="width=400,initial-scale=1,user-scalable=0"> 

设备独立像素(dip)=360 initial-scale=1算出的layoutviewport=360 但是width=400所以最后layoutviewport就是400

有了以上的结论再来看看minimum-scale ,maximum-scale
这么说吧initial-scale minimum-scale 以这里大的为准
initial-scale maximum-scale以这里小的值为准,
其实这个很好理解,就是最小要放大多少倍和最多放大多少倍的概念。
再来理解下
<meta name="viewport" content="width=640,initial-scale=0.5,minimum-scale=0.5,maximum-scale=2,,user-scalable=0">
scale=0.5不比0.5小也没比2大 所以合理(假设这里的device-width=320)
那我们以320再缩小2倍的视角去看(即layoutviewport=640的角度去看)width设了640 所以我们看到的应该是一个以白纸=640角度去看并且html的width=640的一个layout白纸。
那我们自己设置的css像素到底是什么呢。
请以上面的html with为准
以iphone5为准(1136x640)dpr=2 设备独立像素是dip=320
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no">
这里设置这个后layoutviewport=320 即html width=320
那一个css像素就是2*2 4倍的物理像素。
三:实战
3.1<meta name="viewport" content="width=device-width,initial-scale=1">
布局用百分比 flex 定宽来决定(适合一些只有简单的列表信息和详情信息的) 这样的方案简单 不过在一些大高清屏上会有大的差异化
3.2 固定宽 并用px布局

  setViewport(640)
function setViewport(uiWidth) {
    if(/Android (\d+\.\d+)/.test(navigator.userAgent)){
        scal=window.screen.width/uiWidth;
        document.write('<meta name="viewport" content="width='+uiWidth+',initial-scale='+scal+', user-scalable=no">');

    }else{
        document.write('<meta name="viewport" content="width=640,user-scalable=no">');
    }
    
}

字体大小和布局大小完全按照设计稿来,还是大屏的看上去差异化比较大
可以试试nexus 10的
3.3使用rem

!function(n, e) {
    var t = n.documentElement,
        i = "orientationchange" in window ? "orientationchange" : "resize",
        d = function() {
         document.querySelector("html").setAttribute("data-dpr",window.devicePixelRatio)    ;
            var n = t.clientWidth;//dip
            var uiWidth=640;
            var scal=n/uiWidth;
            if (n) {
                var e = n;
                if(n>640 || n==640){
                    t.style.fontSize = '100px';
                    }else{
                    t.style.fontSize = 100 * (n / 640) + 'px';
                    }
                var htmlWidth=document.documentElement.offsetWidth;
                var allrem=1;
                document.getElementById("remw").innerHTML="width="+allrem+"rem (html font-size "+t.style.fontSize+"  htmlWidth "+htmlWidth+"   )";
                document.getElementById("remw").style.width=allrem+"rem";
            }
        };
    n.addEventListener && (e.addEventListener(i, d, !1), n.addEventListener("DOMContentLoaded", d, !1))
}(document, window); 

这里1rem等100px 6.4rem等于整个宽

然后布局按设计稿来(问题是设计稿中每个px你都要自己转 应该有插件的吧 没找过知道的支个声 )
3.4使用flex 请看下面文章
手淘适配
3.5使用vw
vw没有实践过 具体看下
大漠老师的文章
postcss-px2viewport
postcss-px-to-viewport
postcss-viewport-units
viewport-units-buggyfill

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

推荐阅读更多精彩内容