当前位置: 首页 > news >正文

rem使用配置

rem的使用会转化为一个如何让根元素的font-size动态变化问题?

/*dpi*/
/* for 1080+ px width screen */
/* for 1080 px width screen */
/* for 800 px width screen */
/* for 800 px width screen */
@media only screen and (min-width: 751px) { html, body { font-size: 31.25px; } }
/* for 800 px width screen */
@media only screen and (max-width: 750px) { html, body { font-size: 31.25px; } }
/* for 720 px width screen */
@media only screen and (max-width: 720px) { html, body { font-size: 30px; } }
/* for 640 px width screen */
@media only screen and (max-width: 640px) { html, body { font-size: 27px; } }
/* for 540 px width screen */
@media only screen and (max-width: 540px) { html, body { font-size: 22.5px; } }
/* for 480 px width screen */
@media only screen and (max-width: 480px) { html, body { font-size: 20px; } }
/* for 450 px width screen */
@media only screen and (max-width: 450px) { html, body { font-size: 18.9px; } }
/* for 414 px width screen */
@media only screen and (max-width: 414px) { html, body { font-size: 17.25px; } }
/* for 375 px width screen */
@media only screen and (max-width: 375px) { html, body { font-size: 15.625px; } }
/* for 320 px width screen */
@media only screen and (max-width: 320px) { html, body { font-size: 13.5px; } }
//前端学习裙:950919261

@media 可以针对不同的屏幕尺寸设置不同的样式

特别是如果你需要设置设计响应式的页面,@media 是非常有用的。

当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。

其实看到这里对于这个概念还是不明确,并且媒体查询中包含很多关键字,那我们常用的有 and not only

only关键字防止老旧的浏览器不支持带媒体属性的查询而应用到给定的样式

and关键字用于合并多个媒体属性或合并媒体属性与媒体类型

not关键字应用于整个媒体查询,在媒体查询为假时返回真

举个简单的例子:

/ 媒体查询支持最大宽度为320px应用以下CSS html body 的fontsize设置为13.5px /

@media only screen and (max-width: 320px) { html, body { font-size: 13.5px; } }

手机端页面自适应解决方案—rem布局

只需在页面引入这段原生js代码就可以了

(function (doc, win) {
       var docEl = doc.documentElement, //文档根标签
           resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', //viewport变化事,获取移动端屏幕是否翻转件源
           recalc = function () {
             //重置方法
               var clientWidth = docEl.clientWidth;
               if (!clientWidth) return;
               // 改变DOM根节点fontSize大小的值;
      // (屏幕宽度/设计图宽度) = 缩放或扩大的比例值;
               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);

如何使用?

这是rem布局的核心代码,这段代码的大意是:

如果页面的宽度超过了640px,那么页面中html的font-size恒为100px,否则,页面中html的font-size的大小为: 100 * (当前页面宽度 / 640)

为什么是640px?

  • 为什么是640px? 对于手机屏幕来说,640px的页面宽度是一个安全的最大宽度,保证了移动端页面两边不会留白。注意这里的px是css逻辑像素,与设备的物理像素是有区别的。如iPhone 5使用的是Retina视网膜屏幕,使用2px x 2px的 device pixel 代表 1px x 1px 的 css pixel,所以设备像素数为640 x 1136px,而它的CSS逻辑像素数为320 x 568px。
    如果要切移动端页面,你可以先把效果图宽度等比例缩放到640px,很好用。
  • 为什么要设置html的font-size? rem就是根元素(即:html)的字体大小。html中的所有标签样式凡是涉及到尺寸的(如: height,width,padding,margin,font-size。甚至,left,top等)你都可以放心大胆的用rem作单位。

设计图一般是640px的,这样相当于100px = 1rem,可以方便计算;

因为是640px所以应限制下页面的大小,所以最外层的盒子应该是:

position: relative;

width: 100%;

max-width: 640px;

min-width: 320px;

margin: 0 auto;

高清方案的源码

'use strict';

/**
 * @param {Boolean} [normal = false] - 默认开启页面压缩以使页面高清;  
 * @param {Number} [baseFontSize = 100] - 基础fontSize, 默认100px;
 * @param {Number} [fontscale = 1] - 有的业务希望能放大一定比例的字体;
 */
const win = window;
export default win.flex = (normal, baseFontSize, fontscale) => {
  const _baseFontSize = baseFontSize || 100;
  const _fontscale = fontscale || 1;

  const doc = win.document;
  const ua = navigator.userAgent;
  const matches = ua.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i);
  const UCversion = ua.match(/U3\/((\d+|\.){5,})/i);
  const isUCHd = UCversion && parseInt(UCversion[1].split('.').join(''), 10) >= 80;
  const isIos = navigator.appVersion.match(/(iphone|ipad|ipod)/gi);
  let dpr = win.devicePixelRatio || 1;
  if (!isIos && !(matches && matches[1] > 534) && !isUCHd) {
    // 如果非iOS, 非Android4.3以上, 非UC内核, 就不执行高清, dpr设为1;
    dpr = 1;
  }
  const scale = normal ? 1 : 1 / dpr;

  let metaEl = doc.querySelector('meta[name="viewport"]');
  if (!metaEl) {
    metaEl = doc.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    doc.head.appendChild(metaEl);
  }
  metaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);
  doc.documentElement.style.fontSize = normal ? '50px' : `${_baseFontSize / 2 * dpr * _fontscale}px`;
};

 

相关文章:

  • 使用 netlify 部署你的前端应用
  • 腾讯CDC团队:前端异常监控解决方案
  • 403- JavaScript 工具函数大全(新)
  • vue学习之深入响应式原理
  • 使用proxy实现一个双向绑定
  • 最全的 Vue 性能优化指南,经典收藏
  • web前端开发不可不知的十个小妙招,让工作更有效率,快收藏吧
  • 翻译:原型继承是如何工作的
  • 35岁并不是程序员的坎,只是你没有真的认清事实
  • Web安全的重要性(面试必备),被黑无数次还不怕吗?
  • 学前端,css与javascript是重难点,基础不好一切白费!
  • Web前端开发应该必备的编码原则
  • vue全家桶开发 去哪儿 项目总结
  • 这「五类人」最适合转Web前端,必须要了解的前端工程师
  • 每周分享,前端自学「书籍推荐」
  • SegmentFault for Android 3.0 发布
  • [译]CSS 居中(Center)方法大合集
  • 07.Android之多媒体问题
  • Akka系列(七):Actor持久化之Akka persistence
  • Android系统模拟器绘制实现概述
  • Date型的使用
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker 笔记(2):Dockerfile
  • emacs初体验
  • Github访问慢解决办法
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Iterator 和 for...of 循环
  • MQ框架的比较
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 一道闭包题引发的思考
  • 用element的upload组件实现多图片上传和压缩
  • 由插件封装引出的一丢丢思考
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Java总结 - String - 这篇请使劲喷我
  • raise 与 raise ... from 的区别
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (java)关于Thread的挂起和恢复
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (七)c52学习之旅-中断
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)菜鸟学数据库(三)——存储过程
  • *Django中的Ajax 纯js的书写样式1
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境