手机端页面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 学习笔记(七)字符串的连接
Dec 31 Javascript
基于jQuery的简单的列表导航菜单
Mar 02 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
May 14 Javascript
用js读、写、删除Cookie代码续篇
Dec 03 Javascript
JavaScript 学习笔记之操作符(续)
Jan 14 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
May 04 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
Nov 23 Javascript
微信小程序 实例应用(记账)详解
Sep 28 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
实现div内部滚动条滚动到底部和顶部的代码
Nov 15 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
js消除图片小游戏代码
Dec 11 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 组件化编程技巧
2009/06/06 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
js的逻辑运算符 ||
2010/05/31 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
nodejs开发——express路由与中间件
2017/03/24 NodeJs
原生JS实现N级菜单的代码
2017/05/21 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
python机器学习实现决策树
2019/11/11 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
惠普新加坡官方商店:HP Singapore
2020/04/17 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
公务员个人自我评价分享
2013/11/06 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
2014财务年终工作总结
2014/12/08 职场文书
大学生求职意向书
2015/05/11 职场文书
高三语文教学反思
2016/02/16 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
Python集合set()使用的方法详解
2022/03/18 Python
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers