手机端页面rem宽度自适应脚本


Posted in Javascript onMay 20, 2015

什么是rem

在我看来,rem就是1rem单位就等于html节点fontsize的像素值。所以改变html节点的fontsize是最为关键的一步。根据手机宽度改变相对大小就可以实现自适应了,就不用什么媒体查询那些的。

我们的设计图往往宽度是640或者其他尺寸的,不过我建议是用这个尺寸,以640为基准,以小到大,实现自适应,下面实现的比例为1rem=40px(640宽度)。

为什么这样搞?

这样一套代码就搞定手机端尺寸自适应,不需要媒体查询,而且利用Sass和Less能够给我们节约更多的时间,以及更好的体验。

扩展
因为是要计算rem的值,所以我们前端在看到设计图量尺寸的时候会去计算下这个东西,需要花费一些时间,所以我提供了Sass(不知道的自己去百度)和Less(不知道的自己去百度)相对变量的代码,

Sass相对变量地址:Sass相对变量

Less相对变量地址:Less相对变量

打开页面,1-400的相对变量都在上面,只需要全选复制,然后放入你的项目中,直接拿来用就是了,当然我写的css雪碧图生成工具也会用到里面的变量,大家不妨一试。

手机自适应代码

下面的代码是拷贝自淘宝的手机app,当然,我把有的变量还原了,有的注释了。

viewport标签

<meta name="viewport"content="initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5,user-scalable=no,minimal-ui"/>

js代码

!function(win) {
 function resize() {
  var domWidth = domEle.getBoundingClientRect().width;
  if(domWidth / v > 540){
   domWidth = 540 * v;
  }
  win.rem = domWidth / 16;
  domEle.style.fontSize = win.rem + "px";
 }
 var v, initial_scale, timeCode, dom = win.document, domEle = dom.documentElement, viewport = dom.querySelector('meta[name="viewport"]'), flexible = dom.querySelector('meta[name="flexible"]');
 if (viewport) {
  //viewport:<meta name="viewport"content="initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5,user-scalable=no,minimal-ui"/>
  var o = viewport.getAttribute("content").match(/initial\-scale=(["']?)([\d\.]+)\1?/);
  if(o){
   initial_scale = parseFloat(o[2]);
   v = parseInt(1 / initial_scale);
  }
 } else {
  if (flexible) {
   var o = flexible.getAttribute("content").match(/initial\-dpr=(["']?)([\d\.]+)\1?/);
   if(o){
    v = parseFloat(o[2]);
    initial_scale = parseFloat((1 / v).toFixed(2))
   }
  }
 }
 if (!v && !initial_scale) {
  var n = (win.navigator.appVersion.match(/android/gi), win.navigator.appVersion.match(/iphone/gi));
  v = win.devicePixelRatio;
  v = n ? v >= 3 ? 3 : v >= 2 ? 2 : 1 : 1, initial_scale = 1 / v
 }
 //没有viewport标签的情况下
 if (domEle.setAttribute("data-dpr", v), !viewport) {
  if (viewport = dom.createElement("meta"), viewport.setAttribute("name", "viewport"), viewport.setAttribute("content", "initial-scale=" + initial_scale + ", maximum-scale=" + initial_scale + ", minimum-scale=" + initial_scale + ", user-scalable=no"), domEle.firstElementChild) {
   domEle.firstElementChild.appendChild(viewport)
  } else {
   var m = dom.createElement("div");
   m.appendChild(viewport), dom.write(m.innerHTML)
  }
 }
 win.dpr = v;
 win.addEventListener("resize", function() {
  clearTimeout(timeCode), timeCode = setTimeout(resize, 300)
 }, false);
 win.addEventListener("pageshow", function(b) {
  b.persisted && (clearTimeout(timeCode), timeCode = setTimeout(resize, 300))
 }, false);
 /* 个人觉得没必要完成后就把body的字体设置为12
 "complete" === dom.readyState ? dom.body.style.fontSize = 12 * v + "px" : dom.addEventListener("DOMContentLoaded", function() {
  //dom.body.style.fontSize = 12 * v + "px"
 }, false);
 */
 resize();
}(window);

执行完代码后你的页面就会跟随手机的宽度而自适应了,根本就不用什么媒体查询那些,很简洁,很使用,站在巨人的肩膀上吧这就叫做!

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
jQuery+slidereveal实现的面板滑动侧边展出效果
Mar 14 Javascript
js限制文本框只能输入整数或者带小数点的数字
Apr 27 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
Sep 18 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
Oct 29 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
jquery事件绑定解绑机制源码解析
Sep 19 Javascript
简单谈谈require模块化jquery和angular的问题
Jun 23 jQuery
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
layui.tree组件的使用以及搜索节点功能的实现
Sep 26 Javascript
JavaScript实现烟花绽放动画效果
Aug 04 Javascript
openlayers 3实现车辆轨迹回放
Sep 24 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 Javascript
jquery实现弹出层效果实例
May 19 #Javascript
jQuery结合ajax实现动态加载文本内容
May 19 #Javascript
jQuery实现在列表的首行添加数据
May 19 #Javascript
jQuery中 prop() attr()使用详解
May 19 #Javascript
javascript实现获取服务器时间
May 19 #Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
May 19 #Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
May 19 #Javascript
You might like
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
JavaScript引用类型Array实例分析
2018/07/24 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
Selenium定位元素操作示例
2018/08/10 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
深入理解Python异常处理的哲学
2019/02/01 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
宾馆总经理岗位职责
2014/02/14 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
承诺书范本
2015/01/21 职场文书
教师个人年终总结
2015/02/11 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android