手机端页面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 对象与DOM对象之两者相互间的转换
Apr 27 Javascript
jquery.combobox中文api和例子,修复了上面的小bug
Mar 28 Javascript
Jquery Change与bind事件代码
Sep 29 Javascript
验证控件与Button的OnClientClick事件详细解析
Dec 04 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
Javascript仿京东放大镜的效果
Mar 01 Javascript
weex里Vuex state使用storage持久化详解
Sep 09 Javascript
ES6中Array.find()和findIndex()函数的用法详解
Sep 16 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
Nov 11 Javascript
JavaScript实现跟随鼠标移动的盒子
Jan 28 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 XML备份Mysql数据库
2009/05/27 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
php header函数的常用http头设置
2015/06/25 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
Python简单获取自身外网IP的方法
2016/09/18 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
python numpy存取文件的方式
2020/04/01 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
工程承包协议书范本
2014/09/29 职场文书
公司文体活动总结
2015/05/07 职场文书
学校德育工作总结2015
2015/05/11 职场文书
病假条格式范文
2015/08/17 职场文书
2016教师节感恩话语
2015/12/09 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python