手机端页面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 相关文章推荐
SyntaxHighlighter代码加色使用方法
Sep 07 Javascript
img标签中onerror用法
Aug 13 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
Mar 05 Javascript
JS实现简单的键盘打字的效果
Apr 24 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
jQuery手动点击实现图片轮播特效
Apr 20 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
JavaScript从0开始构思表情插件
Jul 26 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
Oct 10 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
Jul 22 jQuery
Vue + ts实现轮播插件的示例
Nov 10 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中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
jquery 页面全选框实践代码
2010/04/02 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
Python实现将xml导入至excel
2015/11/20 Python
python 排序算法总结及实例详解
2016/09/28 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
《苏珊的帽子》教学反思
2014/04/07 职场文书
租房协议书范本
2014/04/09 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
年终工作总结范文2014
2014/11/27 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python