HTML5技术

妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析 - 菜鸟先飞1992(2)

字号+ 作者:H5之家 来源:H5之家 2017-03-28 11:01 我要评论( )

如果设计稿基于iphone6,横向分辨率为750,body的width为750 / 100 = 7.5rem如果设计稿基于iphone4/5,横向分辨率为640,body的width为640 / 100 = 6.4rem (3)在dom ready以后,通过以下代码设置html的font-size:

如果设计稿基于iphone6,横向分辨率为750,body的width为750 / 100 = 7.5rem 如果设计稿基于iphone4/5,横向分辨率为640,body的width为640 / 100 = 6.4rem

  • (3)在dom ready以后,通过以下代码设置html的font-size:

    document.documentElement.style.fontSize = document.documentElement.clientWidth / 6.4 + 'px';

  • 6.4只是举个例子,如果是750的设计稿,应该除以7.5。
  • (4)font-size可能需要额外的媒介查询,并且font-size不能使用rem,如网易的设置:

    @media screen and (max-width:321px){ .m-navlist{font-size:15px} } @media screen and (min-width:321px) and (max-width:400px){ .m-navlist{font-size:16px} } @media screen and (min-width:400px){ .m-navlist{font-size:18px} }

  • 最后还有2个情况要说明:

    第一,如果采用网易这种做法,视口要如下设置:

    <meta content="initial-scale=1,maximum-scale=1, minimum-scale=1">

    第二,当deviceWidth大于设计稿的横向分辨率时,html的font-size始终等于横向分辨率/body元素宽:

    640*680

    641*680

    之所以这么干,是因为当deviceWidth大于640时,则物理分辨率大于1280(这就看设备的devicePixelRatio这个值了),应该去访问pc网站了。事实就是这样,你从手机访问网易,看到的是触屏版的页面,如果从pad访问,看到的就是电脑版的页面。如果你也想这么干,只要把总结中第三步的代码稍微改一下就行了:

    //code from var deviceWidth = document.documentElement.clientWidth; if(deviceWidth > 640) deviceWidth = 640; document.documentElement.style.fontSize = deviceWidth / 6.4 + 'px';

    3. 淘宝的做法

    看看淘宝在不同分辨率下,呈现的效果:

    image

    image

    image

    淘宝的效果跟网易的效果其实是类似的,随着分辨率的变化,页面元素的尺寸和间距都相应变化,这是因为淘宝的尺寸也是使用了rem的原因。在介绍它的做法之前,先来了解一点关于viewport的知识,通常我们采用如下代码设置viewport:

    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

    这样整个网页在设备内显示时的页面宽度就会等于设备逻辑像素大小,也就是device-width。这个device-width的计算公式为:

    设备的物理分辨率/(devicePixelRatio * scale),在scale为1的情况下,device-width = 设备的物理分辨率/devicePixelRatio 。

    devicePixelRatio称为设备像素比,每款设备的devicePixelRatio都是已知,并且不变的,目前高清屏,普遍都是2,不过还有更高的,比如2.5, 3 等,我魅族note的手机的devicePixelRatio就是3。淘宝触屏版布局的前提就是viewport的scale根据devicePixelRatio动态设置:

    image

    在devicePixelRatio为2的时候,scale为0.5

    image

    在devicePixelRatio为3的时候,scale为0.3333

    这么做目的当然是为了保证页面的大小与设计稿保持一致了,比如设计稿如果是750的横向分辨率,那么实际页面的device-width,以iphone6来说,也等于750,这样的话设计稿上标注的尺寸只要除以某一个值就能够转换为rem了。通过js设置viewport的方法如下:

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 微信小程序体验(2):驴妈妈景区门票即买即游 - 腾讯攻城师lee

      微信小程序体验(2):驴妈妈景区门票即买即游 - 腾讯攻城师lee

      2017-01-08 08:02

    • 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话) - 杨中科

      不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话) - 杨

      2015-12-25 14:27

    • 将BootstrapJS和AngularJS结合使用以及为什么不用jQuery - 数通畅联

      将BootstrapJS和AngularJS结合使用以及为什么不用jQuery - 数通畅联

      2015-12-22 09:51

    • 不用Unity库,自己实现.NET轻量级依赖注入 - Lizon

      不用Unity库,自己实现.NET轻量级依赖注入 - Lizon

      2015-12-02 17:41

    网友点评
    /