js实现rem自动匹配计算font-size的示例


Posted in Javascript onNovember 18, 2017

实际开发过程中,我们经常会被各种宽度,高度计算搞晕。尤其是使用了rem的计算方式,自适应布局难倒一大片程序员。为了解决这类问题,我觉得可以利用js监听屏幕宽度变化来实现更改HTML 根元素font-size的值。

下面是相关JavaScript的实现代码:

(function (doc, win) {
  var docEl = doc.documentElement,
    resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
    recalc = function () {
      var clientWidth = docEl.clientWidth;
      if (!clientWidth) return;
      if(clientWidth>=640){
        docEl.style.fontSize = '100px';
      }else{
        docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';
      }
    };
  if (!doc.addEventListener) return;
  win.addEventListener(resizeEvt, recalc, false);
  doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

此代码选640px为基准值,为什么选640呢,

640px的页面宽度是一个安全的最大宽度,保证了移动端页面两边不会留白。注意这里的px是css逻辑像素,与设备的物理像素是有区别的。如iPhone 5使用的是Retina视网膜屏幕,使用2px x 2px的 device pixel 代表 1px x 1px 的 css pixel,所以设备像素数为640 x 1136px,而它的CSS逻辑像素数为320 x 568px。
所以当要切移动端的页面的时候,需要把效果图宽度等比例缩放到640px。

比如当页面中某一div的宽度为60,高度为65的时候,就可以直接这样写样式:

{
  width:0.6rem;
  height:0.65rem
}

浏览器的兼容性

rem是CSS3新引进来的一个度量单位,大家心里肯定会觉得心灰意冷呀,担心浏览器的支持情况。其实大家不用害怕,你可能会惊讶,支持的浏览器还是蛮多的,比如:Mozilla Firefox 3.6+、Apple Safari 5+、Google Chrome、IE9+和Opera11+。只是可怜的IE6-8无法,你们就把他们当透明了吧,我向来都是如此。

不过使用单位设置字体,可不能完全不考虑IE了,如果你想使用这个REM,但也想兼容IE下的效果,可你可考虑“px”和“rem”一起使用,用"px"来实现IE6-8下的效果,然后使用“Rem”来实现代浏览器的效果。就让IE6-8不能随文字的改变而改变吧,谁让这个Ie6-8这么老呢?大家不仿试试,还蛮有意思,说不定这个就是主流的度量单位了。

完整实例代码:

<!DOCTYPE html>
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
   <meta content="telephone=no" name="format-detection" />
   <meta name="format-detection" content="email=no" />
   <meta http-equiv="Cache-Control" content="no-cache"/>
 <title>响应式布局</title>
 <style>
  html{font-size: 20px;width: 100%;height: 100%;}
  body{margin: 0;padding: 0;}
  header,footer{width: 100%;background: #17A578;color: #fff;font-size:1rem;text-align: center;line-height: 2rem;}
  .footer{position: fixed;bottom: 0;}
  .box{}
  .public{width: 5rem;height: 5rem;font-size: 1.2rem;display: inline-block;text-align: center;color: #fff;line-height: 5rem;margin-top: 1rem;}
  .left{background: #f00;}
  .center{background: #048F74;}
  .right{background: #000;}
 </style>
 </head>
 <body>
 <header>页面头部</header>
 <div class="box">
  <div class="public left">左</div>
  <div class="public center">中</div>
  <div class="public right">右</div>
  <div class="public left">左</div>
  <div class="public center">中</div>
  <div class="public right">右</div>
 </div>
 <footer class="footer">页面底部</footer>
  <script>
    //orientationchange方向改变事件
    (function (doc, win) {
     var docEl = doc.documentElement,//根元素html
     //判断窗口有没有orientationchange这个方法,有就赋值给一个变量,没有就返回resize方法。
      resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
      recalc = function () {
       var clientWidth = docEl.clientWidth;
       if (!clientWidth) return;
       //把document的fontSize大小设置成跟窗口成一定比例的大小,从而实现响应式效果。
       docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
      };
      //alert(docEl)
     if (!doc.addEventListener) return;
     win.addEventListener(resizeEvt, recalc, false);//addEventListener事件方法接受三个参数:第一个是事件名称比如点击事件onclick,第二个是要执行的函数,第三个是布尔值
     doc.addEventListener('DOMContentLoaded', recalc, false)//绑定浏览器缩放与加载时间
    })(document, window);
    //alert(document.documentElement.clientWidth/320)

  </script>
 </body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
通过上下左右键和回车键切换光标实现代码
Mar 08 Javascript
js读写(删除)Cookie实例详解
Apr 17 Javascript
关于js内存泄露的一个好例子
Dec 09 Javascript
jQuery 取值、赋值的基本方法整理
Mar 31 Javascript
jquery实现类似淘宝星星评分功能实例
Sep 12 Javascript
Javascript堆排序算法详解
Dec 03 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
手机端转盘抽奖代码分享
Sep 10 Javascript
IONIC自定义subheader的最佳解决方案
Sep 22 Javascript
微信小程序之数据双向绑定与数据操作
May 12 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
如何编写一个完整的Angular4 FormText 组件
Nov 18 #Javascript
Angular中支持SCSS的方法
Nov 18 #Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 #Javascript
jQuery实现checkbox的简单操作
Nov 18 #jQuery
浅谈Emergence.js 检测元素可见性的 js 插件
Nov 18 #Javascript
基于jquery实现五星好评
Nov 18 #jQuery
基于JavaScript实现五子棋游戏
Aug 26 #Javascript
You might like
PHP函数microtime()用法与说明
2013/12/04 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
python插入数据到列表的方法
2015/04/30 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
构建高效的python requests长连接池详解
2020/05/02 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
2014年国培研修感言
2014/03/09 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
统计工作个人总结
2015/03/03 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
2016年社区服务活动总结
2016/04/06 职场文书