概述

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

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

思考

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

  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. Tkinter添加图片

    Tkinter添加图片的方式,与Java相似都是利用label标签来完成的: 一.默认的是gif的格式,注意将png后缀名修改为gif还是无法使用,文件格式依然错误. photo = PhotoIma ...

  2. Hadoop3集群搭建之——hive安装

    Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hbase安装及简单操作 现在到 ...

  3. crt转cer ,6.0以上的android系统证书请求配置

    1.在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句  openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der 这样你就可以得到cer ...

  4. mmm和mmma的区别

    m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Andr ...

  5. referraluserid推广ID号跟踪JS处理A标签

    网站推广ID号跟踪 xxx.html?referraluserid=123 referraluserid.js JS源文件 referraluserid的参数会自动绑定页面A标签 有时是Post 表单 ...

  6. Cron连接正常工作5次后异常原因分析

    目录 目录 1 问题描述 1 分析定位 1 解决方法 2 附1:Cron工作流 3 附2:SIGPIPE发生的位置 3 如果一个shell命令的"$?"值为141,则它是收到了SI ...

  7. Lua 常用遍历

    b = {} , do b[i] = i end -- method one for i, v in pairs(b) do print (i, v) end -- method two for i, ...

  8. Android 如何通过浏览器打开App

    首先给出参考资料http://my.oschina.net/liucundong/blog/354029?p=3#rpl_291191828 通过浏览器直接打开Android应用程序 Android ...

  9. sed,grep,进阶+source+export+环境变量

    三剑客之sed 概括流程:从文件或管道中,可迭代读取. 命令格式: sed(软件) 选项 sed命令 输入文件 增 两个sed命令: a: 追加文本到指定行后 i: 插入到指定行前 sed -i '1 ...

  10. day03_雷神_文件操作

    day03 上周回顾_问题总结: 地址值: li = [] name = ['name','price','count'] dic = {} #如果这里定义空列表,后边的dic[name[i]] = ...