font-size: calc(100vw/3.75);
vw是 Viewport宽度, 1vw 等于viewport宽度的1%;vh是 Viewport高度, 1vh 等于viewport高的的1%; 假设设计图是根据iphone6来设计的,iphone6的宽度为375px,100vw(等于viewport宽度的100%)是屏幕的宽度, 100vw/3.75=100px;所以在这里1rem=100px。
然而,虽然几乎所有手机浏览器都支持css3,但对于calc计算和vw单位却并非都支持,所以需要考虑兼容性时,我们应该考虑用js代码来定义根字号rem,最简单的实现脚本代码是:
$("html").css("font-size",(window.innerWidth)/3.75 + 'px');
这句js代码基于jQuery,而且不会同步窗口大小变化,手机横竖屏变化时需改进。以下益吾库将分享一段有同步变化功能的原生js代码:
(function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'onorientationchange' in window ? 'onorientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; if(clientWidth>=750){ docEl.style.fontSize = '100px'; }else{ docEl.style.fontSize = 100 * (clientWidth / 750) + 'px'; } }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
再看一段可以自定义设计宽度和最大宽度参数的:
(function(designWidth, maxWidth) { var doc = document, win = window, docEl = doc.documentElement, remStyle = document.createElement("style"), tid; function refreshRem() { var width = docEl.getBoundingClientRect().width; //也可修改为屏幕高度 maxWidth = maxWidth || 540; width>maxWidth && (width=maxWidth); var rem = width * 100 / designWidth; remStyle.innerHTML = 'html{font-size:' + rem + 'px;}'; } if (docEl.firstElementChild) { docEl.firstElementChild.appendChild(remStyle); } else { var wrap = doc.createElement("div"); wrap.appendChild(remStyle); doc.write(wrap.innerHTML); wrap = null; } refreshRem(); win.addEventListener("resize", function() { clearTimeout(tid); tid = setTimeout(refreshRem, 300); }, false); win.addEventListener("pageshow", function(e) { if (e.persisted) { clearTimeout(tid); tid = setTimeout(refreshRem, 300); } }, false); if (doc.readyState === "complete") { doc.body.style.fontSize = "16px"; } else { doc.addEventListener("DOMContentLoaded", function(e) { doc.body.style.fontSize = "16px"; }, false); } })(750, 750);
需要注意的是,这种定义根字号的js代码应尽可能放在网页代码最前面,否则计算延迟时可能造成网页样式闪变明显。小技巧:border边框线宽度和background-size背景图尺寸不建议使用rem单位,可分别使用px和百分数。