移动端适配

最先开始做移动端适配的时候,是这样写的:

先在html头部添加meta标签:viewport

viewport 是用户网页的可视区域。翻译为中文可以叫做"视口"。
手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,通常这个虚拟的"窗口"(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局),用户可以通过平移和缩放来看网页的不同部分。

为了更好的理解移动端适配,可以看下像素和视口。下面这篇文章对像素和适口解释的挺详细的:http://web.jobbole.com/90075/

viewport标签极其属性:

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
然后再用rem适配

rem是(font size of the root element),官方解释


1.png

意思就是根据网页的根元素来设置字体大小,和em(font size of the element)的区别是,em是根据其父元素的字体大小来设置,而rem是根据网页的跟元素(html)来设置字体大小的

只要引入这一段代码就可以实现rem适配。

// rem  样式适配
(function(doc, win) {
    var _root = doc.documentElement,
        resizeEvent = 'orientationchange' in window ? 'orientationchange' : 'resize',
        resizeCallback = function() {
            var clientWidth = _root.clientWidth,
                fontSize = 10;
            if (!clientWidth) return;
            if (clientWidth < 640 && clientWidth != 384) {
                fontSize = parseInt(10 * (clientWidth / 320));
            } else if (clientWidth == 384) {
                fontSize = 11;
            } else {
                fontSize = parseInt(10 * (640 / 320));
            }
            _root.style.fontSize = fontSize + 'px';
            doc.getElementsByTagName("body")[0].style.display = "block";
        };

    if (!doc.addEventListener) return;
    win.addEventListener(resizeEvent, resizeCallback, false);
    doc.addEventListener('DOMContentLoaded', resizeCallback, false);
})(document, window);

这么写是为了方便计算,写css时,200px 直接写成 2rem。
当然使用rem还有其他的写法,最根本的就是动态设置html的font-size。

动态设置html的font-size还有一种方法: 利用css的media query来设置

@media screen and (min-width: 320px) and (max-width : 360px) {
    html {
        font-size: 12px;
    }
}
@media screen and (min-width: 360px) {
    html {
        font-size: 14px;
    }
}
@media screen and (min-width: 400px) {
    html {
        font-size: 16px;
    }
}

@media screen and (min-width: 440px) {
    html {
        font-size: 18px;
    }
}

@media screen and (min-width: 480px) {
    html {
        font-size: 20px;
    }
}

@media screen and (min-width: 640px) {
    html {
        font-size: 22px;
    }
}
rem适配进阶

淘宝适配使用lib-flexible来适配各种大小的屏幕

具体是实现的原理图例:
宽度为10rem
Nexus 6p 布局宽度 为 10rem * 41.2px=412px
iphone5 布局宽度 为 10rem * 64px=640px=320 * dpr=320 * 2
iphone6 plus 布局宽度 为10rem * 124.2px=1242px=414 * dpr=414 * 3

内容
Nexus6p.png
dpr1.png
iphone7.png
dpr2.png
iphone7p.png
dpr3.png

1 设计给的稿子双倍的原因是iphone6这种屏幕属于高清屏,也即是设备像素比(device pixel ratio)dpr比较大,所以显示的像素较为清晰。

2 一般手机的dpr是1,iphone4,iphone5这种高清屏是2,iphone6s plus这种高清屏是3,可以通过js的window.devicePixelRatio获取到当前设备的dpr,所以iphone6给的视觉稿大小是(*2)750×1334了。

3 拿到了dpr之后,我们就可以在viewport meta头里,取消让浏览器自动缩放页面,而自己去设置viewport的content例如(这里之所以要设置viewport是因为我们要实现border1px的效果,加入我给border设置了1px,在scale的影响下,高清屏中就会显示成0.5px的效果)

meta.setAttribute('content', 'initial-scale=' + 1/dpr + ', maximum-scale=' + 1/dpr + ', minimum-scale=' + 1/dpr + ', user-scalable=no');

4 设置完之后配合rem,修改

@function px2rem($px){
$rem : 75px;
@return ($px/$rem) + rem;
}

双倍75,这样就可以完全按照视觉稿上的尺寸来了。不用在/2了,这样做的好处是:
1 解决了图片高清问题。
2 解决了border 1px问题(我们设置的1px,在iphone上,由于viewport的scale是0.5,所以就自然缩放成0.5px)

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

推荐阅读更多精彩内容

  • 作为一个前端开发人员,我们的任务是将UI设计师的图稿运用计算机语言呈现在用户面前。而现在的设备大小尺寸不一,近年来...
    小红依阅读 305评论 0 1
  • 移动端适配 (手淘) 在html页面中引入以下flexible.js flexible实际上就是能过JS来动态改写...
    yangxiaoming阅读 581评论 0 0
  • 原文地址 http://blog.poetries.top/2017/11/05/mobile-layout 关注...
    程序员poetry阅读 1,281评论 0 18
  • 现在的移动设备种类繁多,导致需要针对不同的尺寸进行适配。可以使用媒体查询的方式,但是媒体查询的方式因为有跨度,与d...
    ITtian阅读 1,360评论 0 2
  • 文 光头小和尚 上一章节 美女养成记(18) 林黛艺决定减肥。 林黛艺这次是下了决心决定减肥,原因是有一次她...
    桃_夭阅读 282评论 0 2