最近有点怀疑人生,毕竟一个人写前端,有时候会怀疑自己理解的一些东西包括用法有没有符合标准。趁着这阵子闲下来,翻了翻别人的rem适配博客,发现有点绕口,怪自己是个强迫症,啥都要自己去试试结果并从中理解,趁着这段时间有点闲就整理了一下自己的移动端rem适配方案:

  1.思路很简单,首先我们得明白一样东西,就是viewport,简单的说就是我们打开谷歌浏览器模拟手机不同型号时看到的不同像素比例大小,i5为320x568,i6为375x667,其它的就不一一列举了,现在假设我们ui给出的设计图大小是750x1334的基准,也就是i6的viewport的两倍大小。那么我就会通过js来自定义根元素的字体像素大小:如下:

    var w = document.documentElement.clientWidth,
       fz = w * 20 / 375;
    document.getElementsByTagName('html')[0].style.fontSize = fz + 'px';

  解释一下=>clientWidth也就是我们经常所说的viewport视口宽度大小,除以375是因为设计稿是基于750x1334的基准做出来的,也就是i6设备device-width的两倍宽度大小(375px),这个宽度大小可以根据设计图实际大小自定义,假设设计图的宽度大小是640px,那么就要将375px换成640/2=320px大小;

      =>而20的意义是用来自定义你要设置的viewport的device-width为375px下的根字体大小,可随意更改,因此设定了上面一段代码后你会看到谷歌浏览器模拟下的设备为i6(375pxX667px)的html元素上多了style="font-size:20px"这个样式,也就是我们自己定义的根字体的像素大小,当然不能少了window.onresize事件让视口被改变时自动算出并跟新html根字体大小,所以完整的代码是这样的:     

    Window.onload=window.onresize=function () {
            var w = document.documentElement.clientWidth,
            fz = w * 20 / 375;
            document.getElementsByTagName('html')[0].style.fontSize = fz + 'px';
            },
  那么此时1rem就相当于20px=>(html根目录字体大小),于是我们可以通过设计图中某一块元素的标记大小来调整它对应的rem值,比如设计图上(基于750x1334的基准)某一个logo的宽度为100px,那么写成rem样式就是100/2*(1/20)=2.5rem,为什么要除以2呢,不要忘了设计图宽度750px是i6设备viewport的两倍宽度大小(375px)。当然,可以通过sass的@mixin()自定义方法设定一个缺省变量将转化公式100/2*(1/20)写在该方法中,sass会自动帮你完成转换,写其它元素样式时就可以@include该方法啦,关于sass的使用可以看这篇文章=>http://www.ruanyifeng.com/blog/2012/06/sass.html
  这样子基本上就实现了rem适配,原理就是在你转换成不同型号手机时1rem的相对大小==html根字体大小,而html根字体大小是会随时变动的,1rem相对大小也就会跟着变动.

谈谈我的移动端rem适配方案的更多相关文章

  1. H5 端 rem 适配方案与 viewport 适配

    H5 端 rem 适配方案与 viewport 适配 rem rem 是 CSS3 新增的一个相对单位(root em,根 em) 只根据当前页面 HTML 页面的 font-size 设置,如果根目 ...

  2. vue中使用第三方UI库的移动端rem适配方案

    需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...

  3. 最佳移动端h5自适应rem适配方案

    一.利用lib-flexible.postcss-plugin-px2rem插件 进行移动端rem适配. 1.第一 引入lib-flexible . 安装lib-flexible: npm i lib ...

  4. 移动端font-size适配方案(续)

    概述 之前写过一篇移动端font-size适配方案,但是在实践过程中,还是发现当时的思维太局限了,视野太窄了,所以现在补充更新一下,记录下来,供以后开发时参考,相信对其他人也有用. 我上一篇博文主要有 ...

  5. 移动端font-size适配方案

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

  6. 07. 如何实现移动端rem适配

    如何实现移动端rem适配 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  7. em与rem之间的区别以及移动设备中的rem适配方案

    em与rem之间的区别: 共同点: 它们都是像素单位 它们都是相对单位 不同点: em大小是基于父元素的字体大小 rem大小是基于根元素(html)的字体的大小 实例: <!DOCTYPE ht ...

  8. 移动端rem适配&iOS兼容

    移动端rem适配js // 默认375,750设计稿请将375替换为750 (function (doc, win) { // 移动端适配 var docEl = doc.documentElemen ...

  9. 移动端rem适配屏幕

    九月已成历史,十月如期而至...可能是九月工作比较清闲,周记就没怎么写,十月决不能这么堕落,立贴为证,至少保证5篇博客!!!如果没学到什么新知识,就对以往的那些工作中常用到的知识点做个总结...话不多 ...

随机推荐

  1. Python日期时间Date/Time

    Python程序可以处理多种方式的日期和时间.日期格式之间的转换是一种常见计算机的杂活. Python的时间和日历模块,能帮助处理日期和时间. Tick是什么? 为时间间隔,以秒为单位的浮点数.从“新 ...

  2. Linux软件安装管理

    1.软件包管理简介 1.软件包分类 源码包 脚本安装包 二进制包(RPM包.系统默认包) 2.源码包 源码包的优点是: 开源,如果有足够的能力,可以修改源代码 可以自由选择所需要的功能 软件设计编译安 ...

  3. GooglePlay - 排行榜及支付接入

    前言 Google Play应用商店在国外Android市场中地位基本与AppStore在IOS中的地位一致,为此考虑国外的应用时,Android首要考虑的是接入GooglePlay的排行榜等支持. ...

  4. d01

    基础 <head>   <meta http-equiv="Content-Type" content="text/html; charset=utf- ...

  5. 吐槽CSDN--想钱想疯了--推荐文章里面广告博文去不掉

    CSDN广告手段高,广告博文删不掉! 如图所示,我自己的博客文章下面有个相关文章推荐,这是csdn新出的信息流式内容呈现方式,也没什么太大问题.只是,你在里面放广告"羊毛衫,弹力裤" ...

  6. 从零开始搭建框架SSM+Redis+Mysql(二)之MAVEN项目搭建

    从零开始搭建框架SSM+Redis+Mysql(二)之MAVEN项目搭建 废话不说,直接撸步骤!!! 1.创建主项目:ncc-parent 选择maven创建项目,注意在创建项目中,packing选择 ...

  7. svn解除控制

    转自 :http://guoyong123.blog.163.com/blog/static/162543782010428102928353/ 一直在研究svn,今天让我们组将文件加入到服务器上,但 ...

  8. Hadoop(十四)MapReduce原理分析

    前言 上一篇我们分析了一个MapReduce在执行中的一些细节问题,这一篇分享的是MapReduce并行处理的基本过程和原理. Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于had ...

  9. PHP垃圾回收机制

    一.引用计数基本知识 每个php变量存在一个叫"zval"的变量容器中,当一个变量被赋常量值时,就会生成一个zval变量容器.一个zval变量容器,除了包含变量的类型和值,还包括两 ...

  10. 解决phpstorm ftp自动保存文件问题

    初次使用phpstorm, 1.配置ftp时,远程文件要用/ftp用户名/文件夹名: 2.由于版本管理的原因(猜测),直接从本地原有文件修改时各种办法都无法上传,结果从服务器上下载一份再修改,解决这个 ...