概述

这是我研究移动端页面时的思考,记录下来供以后开发时参考,相信对其他人也有用。由于我写移动端页面写的还比较少,一些问题都还没遇到,所以我的这篇博文不免有些错误的地方,还请大佬多多指正。

这篇文章是基于网易的移动端屏幕适配方案而来的。

思考

在移动端开发中,对于页面屏幕适配要解决哪些问题?

  1. 对于不同的dpr,图片会有模糊的情况,怎么适配?
  2. 对于不同的屏幕宽度,怎么适配?
  3. 对于不同的内容:容器,文字和图片,怎么适配?

对于移动适配,我个人希望达到的效果是,对于不同的屏幕,在视觉上为了方便阅读,页面只需要简单地放大或缩小即可。但是由于流式布局(根据父容器的百分比来决定宽高)具有很大的局限性,所以我们采用rem布局。

dpr

dpr是什么?简单来说,dpr是实际像素与看到的像素的比值。比如说你看到的是1px,那么在dpr为2的设备上,它实际上是由2个像素点组成的,每个像素点的实际大小是0.5px。

dpr会造成什么问题?比如一个200px*300px的图片,在dpr为1的设备上,显示正常,但是在dpr为2的设备上,由于实际像素变成了400px*600px(虽然实际大小仍然只有200px*300px),那些多余的像素是设备推测出来的,所以会有图片变模糊的问题。

怎么解决?网上的解决方法说的很复杂,真的听不懂。。。但是简单来说,解决方案是使用400px*600px的图片,但是规定它的大小为200px*300px,所以在dpr为1的设备上,图片是被“压缩”过的,但是并不影响视觉效果;而在dpr为2的设备上,因为本身的图片大小是400px*600px,所以那些多余的px就从这里取了,不会通过设备推测,所以视觉效果会更好。

那么对于dpr>2的设备呢?实际上视觉效果影响不大,可以忽略。等到有足够的影响成为一个问题之后,再来解决。

屏幕宽度

机制是:对于不同宽度的屏幕,我们用js取到屏幕的宽度,然后根据这个宽度同比缩放font-size,由于我们的css是用rem写的,所以页面内容也会同比缩放,达到我们想要的效果。下面具体来讲实施方案。

首先给html设置viewport:

<meta name="viewport" content="width=device-width, maximum-scale=1.0, minimum-scale=1.0, initial-scale=1.0, user-scalable=no, viewport-fit=cover">

然后,对于手机端,我们希望以iphone6作为参照,在其它屏幕上同比放大或缩小。

(1)以iphone6作为参照,iphone6的宽度是375px,dpr为2,所以对于上面显示的375px的图,我们需要的图片大小是750px,所以我们拿到的psd设计图的宽度必须是750px。为了方便书写rem,我们希望psd设计图上750px对应的rem是7.5rem。而设计图上面750px在iphone6上面的实际大小是375px,所以我们需要设置iphone6的font-size=375/7.5px=50px。更一般地,由于移动端的font-size的默认值是16px,所以我们更倾向于用一个百分比来设置font-size:font-size=50/16=312.5%。(注意:用px和百分比没有本质上的不同。)

(2)在其它屏幕上进行缩放,为了解决这个问题,我们用js来读取屏幕的宽度,然后利用这个宽度来进行缩放,代码如下:

var initScreen=function(){
$("html").css("font-size", document.documentElement.clientWidth / 375 * 312.5 + "%");
}

最后,我们需要解决横屏问题和用户手动缩放问题,他们本质上都是改变屏幕宽度的问题,所以我们监听resize事件或者onorientationchange事件,当发生的时候,重新调用initScreen方法。代码如下:

$(window).on('onorientationchange' in window ? 'orientationchange' : 'resize', function () {
setTimeout(initScreen, 200);
});

注意:上面的代码并不是原生js,要引入zepto库!也可以用原生js实现,不过要考虑兼容性问题,我就不贴出代码了。

另外,为了增加代码的健壮性,在js加载不成功的时候也能进行适配,建议在css加上媒体查询:

html{ font-size: 312.5%; }
@media screen and (max-width:359px) and (orientation:portrait) {
html { font-size: 266.67%; }
}
@media screen and (min-width:360px) and (max-width:374px) and (orientation:portrait) {
html { font-size: 300%; }
}
@media screen and (min-width:384px) and (max-width:399px) and (orientation:portrait) {
html { font-size: 320%; }
}
@media screen and (min-width:400px) and (max-width:413px) and (orientation:portrait) {
html { font-size: 333.33%; }
}
@media screen and (min-width:414px) and (max-width:431px) and (orientation:portrait){
html { font-size: 345%; }
}
@media screen and (min-width:432px) and (max-width:479px) and (orientation:portrait){
html { font-size:360%; }
}
@media screen and (min-width:480px)and (max-width:639px) and (orientation:portrait){
html{ font-size:400%;}
}
@media screen and (min-width:640px) and (orientation:portrait){
html{ font-size:533.33%;}
}

容器,文字和图片

我查了很多资料,对于其它适配方案,比如流式布局,栅格化布局等,都对容器,文字和图片的尺寸有不同的写法。但是由于我这个方案只是缩放,并没有额外的需求,所以对于容器,文字和图片的大小,都用rem就行了,暂时没有想出不能用rem的情况,等以后遇到问题再来记录。

注意:我这种适配方案中,1rem的实际大小是50px,而不是100px。所以0.12rem的字体,在设计稿上面是12px,但是在手机上的实际大小是6px!

其它

还有另外一个很重要的度量单位,vh和vw,以前由于兼容性太差而不太适用,现在逐渐步入时代舞台,比如网易新闻的css里面就有下面这样一段代码。(目前vh和vw的适配方案还不成熟,等成熟了我再来记录。)

@media screen and (max-width: 320px) {
html {
font-size:42.667px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 321px) and (max-width:360px) {
html {
font-size:48px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 361px) and (max-width:375px) {
html {
font-size:50px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 376px) and (max-width:393px) {
html {
font-size:52.4px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 394px) and (max-width:412px) {
html {
font-size:54.93px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 413px) and (max-width:414px) {
html {
font-size:55.2px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 415px) and (max-width:480px) {
html {
font-size:64px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 481px) and (max-width:540px) {
html {
font-size:72px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 541px) and (max-width:640px) {
html {
font-size:85.33px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 641px) and (max-width:720px) {
html {
font-size:96px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 721px) and (max-width:768px) {
html {
font-size:102.4px;
font-size: 13.33333vw
}
}
@media screen and (min-width: 769px) {
html {
font-size:102.4px;
font-size: 13.33333vw
}
}

移动端font-size适配方案的更多相关文章

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

    基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.c ...

  2. 基于REM的移动端响应式适配方案

    视口 在前一段时间,我曾经写过一篇关于viewport的文章.最近由于在接触移动端开发,对viewport有了新的理解.于是,打算重新写一篇文章,介绍移动端视口的相关概念. 关于这篇文章说到的所有知识 ...

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

    本文介绍了移动端适配的3种方法,以及移动端图片模糊问题和1px细线问题的解决方法.当然了,在这之前先整理了与这些方法相关的知识:物理像素.设备独立像素.设备像素比和viewport. >> ...

  4. 移动端Web页面适配方案

    概念理解 viewport视口 visual viewport 可见视口,设备屏幕的宽度  windw.innerWidth/Height layout viewport 布局视口,DOM宽度 doc ...

  5. 基于Vue/React项目的移动端适配方案

    本文的目标是通过下文介绍的适配方案,使用vue或react开发移动端及H5的时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局,提升开发效率. 下文给出了本人分别使用create-re ...

  6. 移动端高清、多屏适配方案——rem

    背景: 开发移动端H5页面 一套设计图 不同尺寸的手机 不同分辨率的手机 方案:使用rem作为单位解决一套设计图适应不同分辨率,不同尺寸的手机. 概念: REM(font size of the ro ...

  7. rem移动端适配方案

    一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素 ...

  8. web移动端适配方案

    web移动端常用解决方案: 一.通过js+rem,这里有一个解决方案(http://imochen.github.io/hotcss/) 1.1.rem兼容性(https://caniuse.com) ...

  9. html5移动端主流适配方案

    1.流式布局(百分比布局)    案例:京东移动端 优点:简单方便,只需要固定高度,宽度自适应: 缺点:大屏幕手机实际显示的不协调. 2.响应式布局 优点:可以节约成本,不用再做专门的web app网 ...

  10. Web 端屏幕适配方案

    基础知识 像素相关 1.像素 :像素是屏幕显示最小的单位. 2.设备像素 :设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. ...

随机推荐

  1. Android Studio 老提示adb问题

    Android Studio 老提示adb问题,restart后任然无解,最后发现某手机助手软件占用端口... 解决步骤: C:\Users\xxx>netstat -ano | findstr ...

  2. Python学习杂记

    Python中关键字yield有什么作用? 首先得理解generators,而理解generators前还要理解iterables: 你可以用在for...in...语句中的都是可迭代的:比如list ...

  3. express框架搭建服务端

    1.管理员权限全局安装express npm i -g express-generator@4 2.创建express项目 express -e projectName 3.进入项目并安装 cd pr ...

  4. 连接oracle数据库报错:TNS-12516 TNS:listener could not find available handler with matching protocol stack解决方法

    导致此问题的可能原因为:数据库的当前会话说不满足造成的. 解决方法如下: (1)连接数据库: [localhost@oracle]$:sqlplus  /nolog sql>conn  / as ...

  5. centos 下备份oracle数据

    一.在xshell下root用户登录服务器 1.新建oracle数据库备份目录 mkdir -p /casnw/backup/oradata6910bak 2.设置目录权限为oinstall用户组的o ...

  6. c++关键字extern的作用

    1.用extern修饰变量 使用在别的在源文件定义的非静态外部变量时,需要使用extern进行说明 2.用extern修饰函数 使用在别的在源文件定义的函数时,需要使用extern进行说明 3.用ex ...

  7. MFC 消息框

    窗口类能够使用messagebox int ret = MessageBox(_T("内容"), _T("标题"), MB_OKCANCLE|  //MB_OB ...

  8. PKG_CONFIG_PATH变量 与 ld.so.conf 文件

    一.编译和连接 一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I 参数指定其路径.由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安 ...

  9. UVa 11021 Tribles (概率DP + 组合数学)

    题意:有 k 只小鸟,每只都只能活一天,但是每只都可以生出一些新的小鸟,生出 i 个小鸟的概率是 Pi,问你 m 天所有的小鸟都死亡的概率是多少. 析:先考虑只有一只小鸟,dp[i] 表示 i 天全部 ...

  10. PHP continue break 区别 用法

    <?php //continue 跳过当前循环,进行下一个 //break 终止当前循环 $db=new PDO("mysql:host=localhost;dbname=root&q ...