html里字号rem,JS实现移动端适配字体根字号rem

做为前端开发者我们应该了解,手机等移动端与PC端最大的不同,就是屏幕大小会分很多种,手机屏幕分辨率的不同对一个像素点的定义也会不同,而且有时还得考虑横屏和竖屏情况。对于网页字体而言,字号大小单纯用px、pt、em等单位显然已不够完美,好在css3新推出了rem根字号单位,让我们可以根据屏幕大小来自动调节字号大小。最简单的实现样式代码是: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和百分数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值