手机端页面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 相关文章推荐
js精度溢出解决方案
Dec 02 Javascript
js数组的基本操作(很全自己整理的)
Oct 16 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
Feb 16 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
Jun 02 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
记一次用vue做的活动页的方法步骤
Apr 11 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
微信小程序实现日期格式化和倒计时
Nov 01 Javascript
vue实现倒计时获取验证码效果
Apr 17 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使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
python 连接sqlite及简单操作
2017/06/30 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
python集合常见运算案例解析
2019/10/17 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
使用django自带的user做外键的方法
2020/11/30 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
数据库连接池的工作原理
2012/09/26 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
安全生产责任书范本
2014/04/15 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
导游词之江南周庄
2019/12/06 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
《废话连篇——致新手》——chinapizza
2022/04/05 无线电