webapp新体验Rem实现移动端网页适配详解资源
本来想写一篇,webapp使用Rem的问题,查了一下相关rem的介绍之后,发现很多平台已经解释的很清楚了,图文并茂,于是我便想将其解释资源整理一些,方便以后自己查阅。
腾讯ISUX:web app变革之rem(解释的最精辟了)
大漠博客:CSS3的REM设置字体大小
小黑成长录:关于webapp中的文字单位的一些捣腾
前端观察站:px em rem在WEB前端开发中的区别
这里面需要注意的一点就是,ren是根据根元素的字体大小来确定的:
我们可能经常设置html{font-size:20px}或者font-size:16px,这些其实都没有错,但是可能我们有更好的设置方法:
html{font-size:62.5%;} /* font-size 62.5% = 10px =1rem */
body{font-size:%;} /* font-size 100% = 10px = 1rem */
.rem-{font-size:.2rem;}
.rem-{font-size:.4rem;}
.rem-{font-size:.6rem;}
通过设置html的font-size:62.5%,我们就可以很方便的计算出px所对应的rem值,简单粗暴。
常用的调节rem的视口尺寸:
html {
font-size : 20px;
}
@media only screen and (min-width: 401px){
html {
font-size: 25px !important;
}
}
@media only screen and (min-width: 428px){
html {
font-size: .75px !important;
}
}
@media only screen and (min-width: 481px){
html {
font-size: 30px !important;
}
}
@media only screen and (min-width: 569px){
html {
font-size: 35px !important;
}
}
@media only screen and (min-width: 641px){
html {
font-size: 40px !important;
}
}
最后分享一段淘宝手机屏幕尺寸判断改变字体大小的js(淘宝首页好像现在没有用rem了还是采用定宽px):

!function(x) {
//x 为window
function w() {
//document.documentElement.getBoundingClientRect().width;
var a = r.getBoundingClientRect().width;
//先计算 a / v>540然后 && (a =540*v)
a / v > && (a = * v), x.rem = a / , r.style.fontSize = x.rem + "px"
}
//s = window.document ,r = document.documentElement,q = document.querySelector('meta[name = "viewport"]'),p = document.querySelector("meta[name = 'flexible']")
var v, u, t, s = x.document, r = s.documentElement, q = s.querySelector('meta[name="viewport"]'), p = s.querySelector('meta[name="flexible"]');
if (q) {
console.warn("将根据已有的meta标签来设置缩放比例");
var o = q.getAttribute("content").match(/initial\-scale=(["']?)([\d\.]+)\1?/);
o && (u = parseFloat(o[]), v = parseInt( / u))
} else {
if (p) {
var o = p.getAttribute("content").match(/initial\-dpr=(["']?)([\d\.]+)\1?/);
//v是meta[name = "viewport"] dpi值大小
o && (v = parseFloat(o[]), u = parseFloat(( / v).toFixed()))
}
}
if (!v && !u) {
var n = (x.navigator.appVersion.match(/android/gi), x.navigator.appVersion.match(/iphone/gi)), v = x.devicePixelRatio;
v = n ? v >= ? : v >= ? : : , u = / v
}
if (r.setAttribute("data-dpr", v), !q) {
if (q = s.createElement("meta"), q.setAttribute("name", "viewport"), q.setAttribute("content", "initial-scale=" + u + ", maximum-scale=" + u + ", minimum-scale=" + u + ", user-scalable=no"), r.firstElementChild) {
r.firstElementChild.appendChild(q)
} else {
var m = s.createElement("div");
m.appendChild(q), s.write(m.innerHTML)
}
}
x.dpr = v, x.addEventListener("resize", function() {
clearTimeout(t), t = setTimeout(w, )
}, !), x.addEventListener("pageshow", function(b) {
b.persisted && (clearTimeout(t), t = setTimeout(w, ))
}, !), "complete" === s.readyState ? s.body.style.fontSize = * v + "px" : s.addEventListener("DOMContentLoaded", function() {
s.body.style.fontSize = * v + "px"
}, !), w()
}(window);
(function () {
var b = document.documentElement,
a = function () {
var a = b.getBoundingClientRect().width;
//b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px" 这里设置的为根元素节点大小为20px,必须与样式里面的根节点样式大小一致,貌似不能通过document.documentElement.style.fontSize获取根节点元素字体大小只能手写,根元素大小*视口比例
b.style.fontSize = . * ( <= a ? : a) + "px"
}, c = null;
window.addEventListener("resize", function () {
clearTimeout(c);
c = setTimeout(a, )
});
a()
})();
根元素大小设置为多少,子元素的rem单位跟着一起变化扩大。我们这样设置:
html {font-size: 62.5%;/*10 ÷ 16 × 100% = 62.5%*/}
body {font-size: .4rem;/*1.4 × 10px = 14px */}
h1 { font-size: .4rem;/*2.4 × 10px = 24px*/}
达到的目的只是方便我们去计算,等同于现在html 的fontsize:10px; 但是元素h1大小为20px 那么我们就可以把h1设置为2rem
最后我还想谈一下,关于h5布局活动页面的问题:
先来两张图做对比吧:

chrome控制台 iphone4s
看到这两张图,可能我们不禁要问,问什么320*480下正常,到了微信上面为什么不正常了,主要是因为微信底部有个顶部条导致的高度为65px(320下),为了解决这个问题,我们可能就要通过视口@media query去媒介调整,但每次未免也太麻烦了。
为了解决这个问题,我们分析一下,通常设计师给我的设计稿可能有两种大小一种640*960 ,640*1136,如果说设计师在设计稿下大部分都填充了,那肯定会出现拥挤。其实我们应该这样做将布局分层三部分,顶部,中部,底部,让三者内容挨近保证能在带有微信底部条的960px下面不溢出,那么这样,我们就会少出现这些情况了。
但是我们即使基于如上我说的设计稿要求去做也会遇到问题,那就是我们做出来的在320*480下是展现正常的,但是在微信下顶部bar+电量高度为64px,则实际变成了320*416的尺寸,所以通常来说要进行缩放,我们可以单独基于iphone4s来做一个处理:
/* 兼容iphone4/4s */
@media (device-height:480px) and (-webkit-min-device-pixel-ratio:){
.page1inner{padding-top: 5rem;}
.page2inner{padding-top: %;}
.img-zhong{margin-bottom: }
.page3inner{padding-top: %;}
.img-jj{margin-bottom: %}
.img-shu{width: %; margin-bottom: %}
.page5inner{padding-top: ;}
.page6inner{ padding-top: 1rem;}
.img-hua{width: %; margin-bottom: }
.page8inner{padding-top: .5rem}
.page8-title{ margin-bottom: 1rem;}
.page7-text{top: %}
}
用zoom加强,对元素进行缩放
<script type="text/javascript">
!function(){
var cw=document.documentElement.clientWidth||document.body.clientWidth,zoom=cw/;
var ch= document.documentElement.clientHeight || document.body.clientHeight;
zoom = Math.min(cw/,ch/);
document.write('\
<style id="htmlzoom">\
html{font-size:'+(zoom*20)+'px;}\
.svn_wrp{zoom:'+(zoom/2)+';}\
</style>\
');
}();
</script>
另外两种通过缩放解决多屏下,元素尺寸缩放问题:
通过zoom解决的缩放问题:
<script>
(function () {
var b = document.documentElement,
a = function () {
var a = b.getBoundingClientRect().width;
//b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px" 这里设置的为根元素节点大小为20px,必须与样式里面的根节点样式大小一致,貌似不能通过document.documentElement.style.fontSize获取根节点元素字体大小只能手写,根元素大小*视口比例
// b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px"
b.style.cssText="-webkit-transform: translate3d(0px, 0px, 0px);zoom:"+( <= a ? : a)/;
}, c = null;
window.addEventListener("resize", function () {
clearTimeout(c);
c = setTimeout(a, )
});
a()
})();
</script>
基于transform中scale进行缩放
<script>
(function () {
var b = document.documentElement,
a = function () {
var a = b.getBoundingClientRect().width;
//b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px" 这里设置的为根元素节点大小为20px,必须与样式里面的根节点样式大小一致,貌似不能通过document.documentElement.style.fontSize获取根节点元素字体大小只能手写,根元素大小*视口比例
// b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px"
var p = ( <= a ? : a)/;
b.style.webkitTransform = "scale(" + p + ")";
}, c = null;
window.addEventListener("resize", function () {
clearTimeout(c);
c = setTimeout(a, )
});
a()
})();
</script>
这里这两种缩放一定要注意一个问题,就是html,body,容器都是width:100%,height:100%
//判断浏览器支持那个,然后加前缀
prefix=function(){
var style=document.body.style,vendor=["t","webkitT","mozT","oT","msT"],i=vendor.length;
while(i--)
{
if(typeof style[vendor[i]+"ransition"]!="undefined")
return vendor[i];
}
return vendor[];
}();
友盟:http://www.umindex.com/devices/android_os
webapp新体验Rem实现移动端网页适配详解资源的更多相关文章
- 网页性能管理详解:浅谈chrome-Timeline及window.requestAnimationFrame()方法
你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个开发 ...
- 新浪sae url rewrite(伪静态、重定向)详解
新浪sae url rewrite(伪静态.重定向)详解 http://www.veryhuo.com phpclubs 2011-11-14 投递稿件 sae全程Sina App Engine,真是 ...
- web端网页适配移动端注意事项,以及遇到的问题
1.一定要加上 <!-- name=“viewport” 指视口 width=device-width 宽度等于视口宽 initial-scale=1.0 像素比例 maximum-scale= ...
- 利用rem解决移动端响应适配问题
最近看了<从网易与淘宝的font-size思考前端设计稿与工作流>和github上的<使用Flexible实现手淘H5页面的终端适配> 以前一直用百分比的我,对移动前端的H5页 ...
- web端,app端,小程序端测试差异详解
前置解释:1.单纯从功能测试的层面上来讲的话,APP 测试.web 测试和H5测试在流程和功能测试上是没有区别的2.Web项目或pc项目都是在电脑上进行测试的.常见的PC项目架构有BS架构和CS架构的 ...
- Web网页性能管理详解
你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的 CPU 和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个 ...
- C++ STL 双端队列deque详解
一.解释 Deque(双端队列)是一种具有队列和栈的性质的数据结构.双端队列的元素可以从两端弹出,其限定插入和删除操作在表的两端进行. 二.常用操作: 1.头文件 #include <deque ...
- zabbix系列(一)centos7搭建zabbix3.0.4服务端及配置详解
1.安装常用的工具软件 yum install -y vim wget centos7关闭防火墙 systemctl stop firewalld.service systemctl disable ...
- Java8初体验(2):Stream语法详解
原文出处: 一冰_天锦 上篇文章Java8初体验(1):lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的 ...
随机推荐
- Linux 中使用 KVM
from:http://www.php-oa.com/2010/02/22/ubutnu-kvm-vmware.html 听讲XEN很快就要从LINUX内核中去掉,redhat和Ubuntu也大力的在 ...
- 【ps】gif动态图白边问题
(从死了一次又一次终于挂掉的百度空间中抢救出来的,发表日期 2014-08-13) 在制作gif动态图的时候发现有白边问题 网上说可以设成索引,但是这样一整连动画帧都一块丢掉了. 最终解决办法: 将要 ...
- MyEclipse使用总结——使用MyEclipse打包带源码的jar包
平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不到jar包里面的类的源码了,所以也就无法调试,要想调试,那么就只能通过关联源代码的形式,这样或多或少也有一些不方便,今 ...
- Redis 安装与简单示例 <第一篇>
一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...
- FluorineFx 播放FLV 时堆棧溢出解决 FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法
http://25swf.blogbus.com/tag/FluorineFx/ http://www.doc88.com/p-7002019966618.html 基于Red5的视频监控系统的研究 ...
- iOS开发——实战篇Swift篇&UItableView结合网络请求,多线程,数据解析,MVC实战
UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高 ...
- iOS开发——数据持久化Swift篇&(二)沙盒文件
沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...
- poj 3249 Test for Job (DAG最长路 记忆化搜索解决)
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 8990 Accepted: 2004 Desc ...
- BinaryWriter和BinaryReader用法
C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级 ...
- Web安全XSS
Web安全XSS 简单的反射型XSS钓鱼演示 </form> <script> function hack(){ XSSImage=new Image; XSSImage.sr ...