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 相关文章推荐
才发现的超链接js导致网页中GIF动画停止的解决方法
Nov 02 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
Feb 06 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
Sep 26 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
Nov 06 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
PHP PDO操作总结
Nov 17 Javascript
jQuery页面刷新(局部、全部)问题分析
Jan 09 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
JavaScript中push(),join() 函数 实例详解
Sep 06 Javascript
原生JS实现简单的无缝自动轮播效果
Sep 26 Javascript
详解react-refetch的使用小例子
Feb 15 Javascript
layui实现tab的添加拒绝重复的方法
Sep 04 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程序的方法小结
2012/02/23 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
php缓存技术详细总结
2013/08/07 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
利用js对象弹出一个层
2008/03/26 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
Python os模块学习笔记
2015/06/21 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
python取余运算符知识点详解
2019/06/27 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
社区文明创建工作总结2015
2015/04/21 职场文书
初中毕业感言300字
2015/07/31 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技