移动端适配方案

html5

AD:百G视频免费分享

移动端越来越被大众所接收,那么相应的技术就越来越向它靠拢,这是一种不可阻挡的趋势,也是万物发展的规律。移动端有三大难题:兼容、调试和适配。这三大问题就好像三座无法逾越的大山阻挡者我们前进的步伐,此文将记录我在项目中关于移动端适配的一些方式,供大家参考

分析

移动端适配的根本原因

屏幕窗口的大小

设备像素比(devicepixelratio,简称dpr)

很多地方介绍设备像素比的,这里就不做具体探讨,简单总结一下:devicepixelratio(设备像素比,即dpr) = physicalpixel (物理像素) / density-independent pixel(设备独立像素,即dip)。dip或dp,(device independent pixels,设备独立像素)与屏幕密度有关。dip可以用来辅助区分视网膜设备还是非视网膜设备。

在JavaScript中,可以通过window.devicePixelRatio获取到当前设备的dpr,但遗憾的是并不是所有的都支持。

在CSS中,可以分别针对屏幕大小和设备像素比做适配:

针对窗口大小,一般使用媒体查询的only screen、min-width、max-width来适配,也是使用css做适配最常见的一种方式

针对像素比,可以使用-webkit-device-pixel-ratio,-webkit-min-device-pixel-ratio和 -webkit-max-device-pixel-ratio属性,同样他的支持度一样不高(其实是很低),所以几乎没有用武之地。

适配方式

移动端适配主要有两大不同的方向:

响应式布局:它是根据屏幕大小自动的调整布局位置(非单纯的缩放),实现适配

自适应布局:它是根据屏幕大小自动的缩放大小,实现适配。

两种方式应用的场景不同,各有优劣,本人对自适应布局使用的比较多

解决方案

为了解决这个老大难问题,从最初开始百分比到em,然后到现在rem的使用,都一一体现着技术的滚滚向前。目前是用的最多的也就是rem,他们的区别和有点请自行GG。

有了rem这个大杀器,解决问题就变得简单起来,具体请往下看。

纯css实现方式 – 媒体查询

使用原生css来实现媒体查询是很繁琐的,因为每个媒体查询都要去设定规则。推荐使用css的预编译器(sass,less,stylus),比较方便。

/* 定义规则 */

html {

    font-size: 20px;

}

@media only screenand (min-width: 401px) {

    html {

        font-size: 24px!important;

    }

}

@media only screenand (min-width: 428px) {

    html {

        font-size: 28!important;

    }

}

@media only screenand (min-width: 481px) {

    html {

        font-size: 30px!important;

    }

}

@media only screenand (min-width: 569px) {

    html {

        font-size: 35px!important;

    }

}

@media only screenand (min-width: 641px) {

    html {

        font-size: 40px!important;

    }

}

@media only screenand (min-width: 751px) {

    html {

        font-size: 50px!important;

    }

}

@media only screenand (min-width: 1080px) {

    html {

        font-size: 60px!important;

    }

}

//less 方式调用

@unit: 50rem; //基准单位,根据设计稿来确定。假设:设计稿尺寸为750,那么@unit设置为50rem(1rem=50px更方便下面计算)

.warp{with: 100/ @unit} // 设计稿上元素的尺寸为100px=> .warp{with: 2rem}

.warp{with: 10/ @unit} // 设计稿上元素的尺寸为10px=> .warp{with: 0.2rem}

如果这里使用原生css来做,每个尺寸都需要去计算,如果使用预处理器,只需要定义一个变量,计算的事情直接交给它们就行。

这样当页面展示在750的屏幕上时,html的font-size为50px,那么当设置为2rem的元素显示的尺寸就为2*50px=100px。在其他尺寸的设备也会根据媒体查询设置的不同font-size进行自动缩放适配。

当然上面也提到了,在css中也是可以获取到devicePixelRatio的值,那么为了更精确在写媒体查询的时候可以把它也加上去,这里就不展开了。

纯css实现方式 – 计算属性

当然除了媒体查询,还有一种更潮的方式就是利用css3的一些新属性:计算属性和vw属性来实现自动设置根字体大小的目的

html{font-size:calc(100vw/6.4)} //6.4为psd设计稿尺寸/100

这套方案几乎是目前最简洁的方案了,并且calc和vw在移动端的支持也不错哟。期待ing

js的实现方式

js的实现方式,参考了网易和淘宝的实现方式,对他们进行了整合。并且修复了手机端1px问题。

网易实现方式是通过设备尺寸动态的设置DOM的根元素字体大小,没有考虑devicePixelRatio的因素;

淘宝实现方式也是通过设备尺寸动态的设置DOM的根元素字体大小,并且考虑了devicePixelRatio的因素,但淘宝在设置rem时,显得较复杂(不方便写css把px转化成rem);

1px问题简单点说就是因为devicePixelRatio的存在,css的1px不等于移动端的1px。

(function(doc, win, designSize) { //designSize为设计稿的尺寸(宽)

    vardocEl = document.documentElement,

        devWidth = docEl.clientWidth > 1080 ? 1080 : docEl.clientWidth,

        dpr = devicePixelRatio || 1,

        scale = 1 / dpr,

        width = dpr * devWidth,

        resizeEvt = 'orientationchange'inwindow ? 'orientationchange': 'onresize', //判断横屏和窗口重置

        recalc = function() {

            varclientWidth = docEl.clientWidth;

            if(!clientWidth) return;

            document.querySelector('meta[name="viewport"]')

                    .setAttribute('content','width='+ width +

                                ', initial-scale='+ scale +

                                ', maximum-scale='+ scale +

                                ', minimum-scale='+ scale +

                                ', user-scalable=no');

            docEl.style.fontSize = devWidth / (designSize / 100) * dpr + 'px';

        };

    if(!doc.addEventListener) return;

    win.addEventListener(resizeEvt, recalc, false);

    doc.addEventListener('DOMContentLoaded', recalc, false);

})(document, window, 750);

总结

以上三种方案对比,第一种媒体查询是最死板的,基本就是纯体力活。

利用css的计算属性可以很优雅的解决问题,但是在兼容方面来说,目前还不是很完美

并且利用纯css也没考虑devicePixelRatio(像素问题)这个因素。

最后的javascript解决方案则是考虑到了兼容和devicePixelRatio这些因素,但是这里有一个很大的弊端就是:页面在某些情况(性能慢)会经过两次重回(给HTML根设置font-size和设置meta标签时),在网络或者终端性能不是很好的情况用户体验很不错甚至页面错乱的情况。

本文标题:移动端适配方案

文章作者:2ue

发布时间:2016年11月22日 – 15:11

最后更新:2017年11月15日 – 20:11

原始链接:http://2ue.github.io/2016/11/22/Mobile-terminal-adapter/

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

推荐阅读更多精彩内容

  • 需要移动端适配的根本原因:屏幕窗口的大小,devicepixelratio值等。 简单介绍下devicepixel...
    2ue阅读 1,482评论 0 2
  • 适配:顾名思义,在不同尺寸的手机设备上,页面相对性的达到合理的展示(自适应)或者“保持统一效果的等比缩放” 适配应...
    Imflyer阅读 566评论 0 0
  • h5的移动端适配核心的问题有两个: 1.因为目前手机品牌众多,手机的宽度不统一,所以第一个问题就是如何让不同的手机...
    国服阅读 3,316评论 0 2
  • 方案一: 最新方案:(隆重推荐) 1、下载MateHandler.js,并引入页面2、head里加入 3、设置bo...
    晨光2016阅读 902评论 0 0
  • 很多人都听过这么一个词“薄利多销”,可以这么多说,薄利多销害惨了一大批企业。因为企业的核心竞争力被剥夺了,忽略了产...
    等我回来吗阅读 2,137评论 0 4