手机端页面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 相关文章推荐
关于javascript 回调函数中变量作用域的讨论
Sep 11 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
Nov 11 Javascript
遍历jquery对象的代码分享
Nov 02 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
Mar 19 Javascript
JavaScript打印iframe内容示例代码
Aug 20 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
详解jquery easyui之datagrid使用参考
Dec 05 Javascript
javascript设计模式之单体模式学习笔记
Feb 15 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
详解Vue的watch中的immediate与watch是什么意思
Dec 30 Javascript
vue 计算属性和侦听器的使用小结
Jan 25 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实现rc4加密算法代码
2012/04/25 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
如何在Django项目中引入静态文件
2019/07/26 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
python中如何使用虚拟环境
2020/10/14 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
给酒店员工的表扬信
2014/01/11 职场文书
对祖国的寄语大全
2014/04/11 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
员工教育培训协议书
2014/09/27 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery