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 相关文章推荐
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
Oct 17 Javascript
js实现同一页面多个运动效果的方法
Apr 10 Javascript
JS中this上下文对象使用方式
Oct 09 Javascript
javascript中json基础知识详解
Jan 19 Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 Javascript
webpack+vue2构建vue项目骨架的方法
Jan 09 Javascript
使用vue-aplayer插件时出现的问题的解决
Mar 02 Javascript
JS代码实现电脑配置检测功能
Mar 21 Javascript
vue中的mvvm模式讲解
Jan 31 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
layui关闭层级、简单监听的实例
Sep 06 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
php+mysql事务rollback&amp;commit示例
2010/02/08 PHP
php explode函数实例代码
2012/02/27 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
php session的锁和并发
2016/01/22 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
python按行读取文件并找出其中指定字符串
2019/08/08 Python
详解python中的数据类型和控制流
2019/08/08 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
如何手工释放资源
2013/12/15 面试题
竞职演讲稿范文
2014/01/11 职场文书
保密承诺书范文
2014/03/27 职场文书
担保书格式及范文
2014/04/01 职场文书
品酒会策划方案
2014/05/26 职场文书
乳制品整治工作方案
2014/05/29 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
党支部鉴定意见
2015/06/02 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
重阳节活动主持词
2015/07/04 职场文书
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript