基于rem的移动端自适应解决方案
2015-12-25 13:27
519 查看
adaptivejs原理:
利用rem布局,根据公式 html元素字体大小=document根节点(html)宽度*100/设计图宽度 计算html元素的font-size,使1rem等于100px,方便快速开发 开发时,一个div设计图宽度为89px,那么在css中我们可以这样书写:width:0.89rem; 如果是文字,我们也建议使用rem 对于iphone的retina高清显示屏,基本版本(adaptive.js)我们做了缩放处理,以达到最佳显示效果。对于快速开发版本(adaptive-version2.js),viewport的width等于设备宽度,不会缩放
github:
adaptivejs源码:
(function(win,lib){ vardoc=win.document; vardocEl=doc.documentElement; vardevicePixelRatio=win.devicePixelRatio; vardpr=1;//物理像素与逻辑像素的对应关系 varscale=1;//css像素缩放比率 //设置viewport functionsetViewport(){ dpr=1; win.devicePixelRatioValue=dpr; //win.devicePixelRatio=win.devicePixelRatio*win.devicePixelRatio; scale=1/dpr; varmetaEl=doc.createElement('meta'); metaEl.setAttribute('name','viewport'); metaEl.setAttribute('content','initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no'); if(docEl.firstElementChild){ docEl.firstElementChild.appendChild(metaEl); } else{ varwrap=doc.createElement('div'); wrap.appendChild(metaEl); doc.write(wrap.innerHTML); } } setViewport(); varnewBase=100; functionsetRem(){ varvisualView=Math.min(docEl.getBoundingClientRect().width,540);//visualviewport newBase=100*visualView/lib.desinWidth; docEl.style.fontSize=newBase+'px'; } vartid; lib.desinWidth=640; lib.baseFont=18; lib.init=function(){ win.addEventListener('resize',function(){ clearTimeout(tid); tid=setTimeout(setRem,300); },false); /*win.addEventListener('onorientationchange',function(){ clearTimeout(tid); tid=setTimeout(setRem,300); },false);*/ win.addEventListener('pageshow',function(e){ if(e.persisted){ clearTimeout(tid); tid=setTimeout(setRem,300); } },false); if(doc.readyState==='complete'){ doc.body.style.fontSize=lib.baseFont*dpr+'px'; } else{ doc.addEventListener('DOMContentLoaded',function(e){ doc.body.style.fontSize=lib.baseFont*dpr+'px'; },false); } setRem(); docEl.setAttribute('data-dpr',dpr); }; })(window,window['adaptive']||(window['adaptive']={}));
百度理财的H5站我们都采用这种方式开发,比如: 页面:https://8.baidu.com/template/index/current.html
最大优点:
计算html元素的font-size,使1rem等于100px,方便快速开发
adaptivejs利用rem解决移动端页面开发的自适应问题
页面模板初始化的时候不用设置viewport标签,由js生成。
我们在head标签的顶部引入js,按以下方法使用即可
使用方法:
在页面head写入以下代码,实时更新html的fontsize:
<scriptsrc="js/adaptive.js"></script>//有缩放,精确还原设计图
<scriptsrc="js/adaptive-version2.js"></script>//没有缩放,能快速开发的版本
<script>
window['adaptive'].desinWidth=640;//设计图宽度
window['adaptive'].baseFont=18;//没有缩放时的字体大小
window['adaptive'].maxWidth=480;//页面最大宽度默认540
window['adaptive'].init();//调用初始化方法
</script>
然后在css中设置相应样式即可:
.main-info{
height:0.88rem;
padding-bottom:0.24rem;
}
.fund-info{
position:relative;
font-weight:normal;
padding:0.2rem0;
padding-right:1.7rem;
padding-left:0.23rem;
font-size:0.32rem;
line-height:1;
}
注意:如果设计图宽度大于document的宽度,0.01rem将小于1px,故如果设计图是1px,在css中仍然用1px显示。
可用的全局变量:window.devicePixelRatioValue当前页面设置的设备像素比优化宽度问题
新增最大宽度,解决平板或手机横屏时体验不佳的问题window['adaptive'].maxWidth=480;//设置最大宽度,默认540px
需要css配合使用,添加如下代码:
body{
max-width:6.4rem;//设计图宽度为640px时为6.4rem,750时为7.5rem,以此类推
margin:0auto;
}
body*{
max-width:6.4rem;//设计图宽度为640px时为6.4rem,750时为7.5rem,以此类推
}
相关文章推荐
- Swift中的required修饰符
- android AsyncTask介绍
- android 手机拍照选择本地图片
- android 界面中的各种布局
- another app is currently holding the yum lock;waiting for it to exit解决
- IOS版添加phonegap--支付宝2.0快捷支付插件教程
- Unity3D行为树插件Behave学习笔记
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Objective-C 类的扩展
- IOS中用正则表达式判断输入的内容为8-16位且同时包含数字和字母
- Android之string.xml 使用总结
- iOS 的VFL知识详解
- 安卓源码--修改设置语言选择列表
- Android Volley获取本地缓存
- android获取手机配置具体代码
- Android开发实现TextView显示丰富的文本
- iOS设置view的边框、圆角、颜色
- iOS autoLayout总结
- Android适配方案小结(一)
- CocoaPods的安装配置 10.11