手机端页面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 相关文章推荐
网页里控制图片大小的相关代码
Jun 25 Javascript
Autocomplete Textbox Example javascript实现自动完成成功
Aug 17 Javascript
javascript 静态对象和构造函数的使用和公私问题
Mar 02 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
May 12 Javascript
Bootstrap3制作图片轮播效果
May 12 Javascript
BootStrap的Datepicker控件使用心得分享
May 25 Javascript
原生js验证简洁注册登录页面
Dec 17 Javascript
Vue2 轮播图slide组件实例代码
May 31 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 Javascript
微信小程序开发的基本流程步骤
Jan 31 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
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 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
Vue性能优化的方法
2020/07/30 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
Python入门篇之文件
2014/10/20 Python
python版学生管理系统
2018/01/10 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python实现ip代理池功能示例
2019/07/05 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
生物技术专业毕业生求职信范文
2013/12/14 职场文书
应届专科生个人的自我评价
2014/01/05 职场文书
回门宴答谢词
2014/01/13 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python