移动端使用rem适配及相关问题

移动端适配方案,说多也很多。可以使用百分比布局,但百分比与em都是基于父元素进行计算的,在实际应用中不是很方便。使用rem不仅可以设置字体大小,块大小也可以设置。而且可以良好的适配各种终端,所以这方案很受欢迎。

rem定义及浏览器支持情况

rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。可以先看看rem的浏览器支持情况:

  1. Chrome 31-34 & Chrome-based Android versions (like 4.4) have a font size bug that occurs when the root element has a percentage-based size.
  2. Reportedly does not work on Android 4.3 browser for Samsung Note II or the Samsung Galaxy Tab 2 on Android 4.2.
  3. Borders sized in "rem" disappear when the page is zoomed out in Chrome.
  4. IE 9, 10 and 11 do not support rem units when used in the "line-height" property when used on :before and :after pseudo elements (https://connect.microsoft.com/IE/feedback/details/776744).
  5. Causes content display and scrolling issues on iPhone 4 which typically has Safari 5.1.

可以看到移动端基本支持:

ios:6.1系统以上支持;

android:2.1系统以上都支持;

桌面端IE支持情况不乐观。

用法:

现代浏览器,IE9+,FireFox,Safari,Chrome,Opera,默认字体是16px,设置下根元素的字体大小为16px:

html {
    font-size:16px;
}

,然后,如果希望某段文字的字体大小是12px,需要设置:

p {
    font-size: 0.75rem; //12÷16=0.75(rem)
}

块大小的设置是类似的,所以整个布局的关键就是设置根元素的字体大小了。设置好根元素字体大小值,布局就可以做到自适应了。

块大小的设置,来个例子:

设置根元素字体大小为37.5px,在iphone6里面需要一个宽100px的块,就是这样了:

<!DOCTYPE html>
<html>
    <meta charset="utf-8"></meta>
    <head>
        <title>vertical-align</title>
        <style type="text/css">
            html{
                font-size:37.5px;
            }
            #contentBox{
                width:2.667rem;
                height:2.667rem;
                background:pink;
            }
        </style>
    </head>
    <body>
        <div id="contentBox">
        </div>
    </body>
</html>

如果在iphone5下想得到一个100px的块,需要设置基准值(即根元素字号)为32px。

下面专门谈谈rem的基准值设置。

rem基准值设置

想要rem适配不同尺寸的设备,就需要针对不同设备设置合适的基准值,如上例所示。

问题来了,基准值设置成多少合适?

一般拿到的设计稿是375px(2倍稿)*2的,也就是iphone6的大小。那么对于iphone6来说,基准值可以设置为37.5px。即设备宽度/10。这里做了一个除以10的计算,是因为不希望font-size值太大。这样使用rem时值也不会太大了。

如果是iphone5,基准值就是32px。

问题又来了,如何根据设备尺寸来设置基准值?

有两个方法,通过css media query 和js添加基准值:

css media query:

@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){
      html{font-size: 37.5px;}
}

用media query来实现难覆盖到所有设备:

html {
    font-size : 20px;
}
@media only screen and (min-width: 401px){
    html {
        font-size: 25px !important;
    }
}
@media only screen and (min-width: 428px){
    html {
        font-size: 26.75px !important;
    }
}
@media only screen and (min-width: 481px){
    html {
        font-size: 30px !important;
    }
}
@media only screen and (min-width: 569px){
    html {
        font-size: 35px !important;
    }
}
@media only screen and (min-width: 641px){
    html {
        font-size: 40px !important;
    }
}

而通过js来设置,可以实现覆盖所有设备:

js来设置:

document.getElementsByTagName(‘html‘)[0].style.fontSize = window.innerWidth / 10 + ‘px‘;

关于方案的利弊,其实上面的例子里面可以看出,基准值设置为37.5px时(这个是设计稿的常用值),在计算相应的rem的时候,小数需四舍五入,可能会带来一定的误差,设计的同事像素眼是可以觉察到的。在可以接受的情况下允许这些误差存在。在安卓机子上较多出现这类情况。

其他适配方案

也可以采用固定布局:

1.在viewport meta标签上设置width=320,页面的各个元素也采用px作为单位。通过用JS动态修改标签的initial-scale使得页面等比缩放,从而刚好占满整个屏幕。

<meta name="viewport" content="width=320,user-scalable=no">

2.rem也可以使用自己设置viewport和content的方法来适配,以方便计算和设置值:

例如:

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

其中dpr通过window.devicePixelRatio获取,iphone6的值是2.

对于2倍稿,可以直接设置基准值为2倍,这样就不用设计稿的值除以2了。

iphone6适配的设计稿750px,基准值设置为75px就可以了。

修改了缩放倍数之后,1px边线的问题也同时解决了。

代码:

<!DOCTYPE html>
<html>
    <meta charset="utf-8"></meta>
    <meta name="viewport" content="" id="viewMeta">
    <head>
        <title>vertical-align</title>
        <style type="text/css">
            html{
                font-size:75px;
            }
            #contentBox{
                width:2.667rem;
                height:2.667rem;
                background:pink;
                border:1px solid #000;
            }
        </style>
    </head>
    <body>
        <div id="contentBox">
        </div>
    </body>
    <script type="text/javascript">
    var meta = document.getElementById(‘viewMeta‘);
    var dpr = window.devicePixelRatio;
    meta.setAttribute(‘content‘, ‘initial-scale=‘ + 1/dpr + ‘, maximum-scale=‘ + 1/dpr + ‘, minimum-scale=‘ + 1/dpr + ‘, user-scalable=no‘);
    </script>
</html>

图图:

参考:

http://www.alloyteam.com/2016/03/mobile-web-adaptation-tool-rem/?utm_source=tuicool&utm_medium=referral#prettyPhoto

时间: 2025-01-23 05:53:31

移动端使用rem适配及相关问题的相关文章

前端移动端的rem适配计算原理

rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位.它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算. 计算原理: 1 屏幕宽为 clientWidth(px). 设计稿宽度为 750 (px), 假设 n = clientWidth(px)/750(px)

基于rem的移动端响应式适配方案(详解) 移动端H5页面的设计稿尺寸大小规范

基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.com/v/53039.html 原文地址:https://www.cnblogs.com/bydzhangxiaowei/p/9536126.html

移动端最强适配(rem适配之px2rem)&amp;&amp; 移动端结合Vuex实现简单loading加载效果

一.rem之px2rem适配 前言:相信许多小伙伴上手移动端时面对各式各样的适配方案,挑选出一个自己觉得简便.实用.高效的适配方案是件很纠结的事情. 深有体会... 经过多个移动端项目从最初的 viewport --> 百分比 --> rem --> rem的升级版px2rem可谓是一把鼻涕一把泪啊 ,在px2rem之前总觉得之前的不够完美或者麻烦: 进入正题: 首先 px2rem 也是基于 rem  适配的,但是他的好用之处在于灵活.简便.高效不用我们自己去换算.px2rem-load

移动端适配(3)---rem适配

rem适配 <meta name="viewport"  content="width=device-width,user-scalable=no"/> <script> (function(){ var html=document.documentElement; var hWidth=html.getBoundingClientRect().width; html.style.fontSize=hWidth/16+"px&quo

移动端屏幕的适配

因为对H5较感兴趣,所以没事的时候会看一些文章博客. 废话不多说,先引入问题, 关于移动端屏幕的适配你有没有什么想说的 ?首先 我之前一直使用的就是这种Rem 缩放的方法去做的,content= "width= device-width",initial-scale=1.0,可以实现针对不同屏幕实现缩放效果,并且不出现滚动条, 而在内容部分使用 Rem进行对等比缩放,我们知道Rem 是一个相对长度 单位,它的大小会根据HTML根元素设置的font-size的大小进行换算, 根元素(ht

移动端多屏适配方案

原文:http://www.cocoachina.com/webapp/20150715/12585.html?utm_source=tuicool 背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范往往会遵循以下两点: 1)首先,选取一款手机的屏幕宽高作为基准(以前是iPhone4的320×480,现在更多的是iphone6的375×667).

移动端界面的适配

阅读目录 适配的要求 适配的方法,3个步骤 适配中背景图片的处理 适配的原理解析 摘要:在进行移动端界面的书写的时候,如果把宽度高度或者字体大小全部写死的话,那么在所有手机上看到的大小都一样,存在的问题就是同样大小的字体,或者一个盒子模型, 在大屏幕手机上看起来会有点偏小.比如iphone6PLUS.如果是做成适配的话,就很好的解决了这个问题,大屏幕显示的内容大一点,小屏幕显示的小一点. 所以今天做一个移动端页面适配的小小总结 回到顶部 适配的要求 1.在不同分辨率的手机上,页面看起来是自适应的

再聊移动端页面的适配

再聊移动端页面的适配 https://www.w3cplus.com/css/vw-for-layout.html  原文网址 Flexible承载的使命 Flexible到今天也有几年的历史了,解救了很多同学针对于H5页面布局的适配问题.而这套方案也相对而言是一个较为成熟的方案.简单的回忆一下,当初为了能让页面更好的适配各种不同的终端,通过Hack手段来根据设备的dpr值相应改变<meta>标签中viewport的值: <!-- dpr = 1--> <meta name=

移动端高清适配方案(解决图片模糊问题、1px细线问题)

本文介绍了移动端适配的3种方法,以及移动端图片模糊问题和1px细线问题的解决方法.当然了,在这之前先整理了与这些方法相关的知识:物理像素.设备独立像素.设备像素比和viewport. >>>>物理像素.设备独立像素和设备像素比 在CSS中我们一般使用px作为单位,需要注意的是,CSS样式里面的px和物理像素并不是相等的.CSS中的像素只是一个抽象的单位,在不同的设备或不同的环境中,CSS中的1px所代表的物理像素是不同的.在PC端,CSS的1px一般对应着电脑屏幕的1个物理像素,但