前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >移动端页面的自适应rem

移动端页面的自适应rem

作者头像
javascript艺术
发布2021-05-28 14:03:33
2.4K0
发布2021-05-28 14:03:33
举报
文章被收录于专栏:javascript艺术

移动端页面rem

写移动端页面最麻烦的是什么,不同分辨率的适配!

一、什么是rem

具体来说,有的屏幕320px宽,有的屏幕640px宽,有的更宽,如果你写固定px,那么要么小的放不下,要么大的有大片空白。

比如320px的10%是32px,640px的10%是64px,

如果10个10%宽度的元素放在一起,那肯定就是100%,即挤满屏幕(宽度),不会超出,也不会留白。

简单理解:

rem 就是指屏幕宽度的百分之x;

或者说,n个rem = 用户可视区域100%宽度

二、rem怎么用?

rem和em很容易混淆,其实两个都是css的单位,并且也都是相对单位,现有的em,css3才引入的rem,在介绍rem之前,我们先来了解下

emem作为font-size的单位时,其代表父元素的字体大小,em作为其他属性单位时,代表自身字体大小——MDN

em做弹性布局的缺点还在于牵一发而动全身,一旦某个节点的字体大小发生变化,那么其后代元素都得重新计算

rem作用于非根元素时,相对于根元素字体大小;rem作用于根元素字体大小时,相对于其出初始字体大小——MDN

rem取值分为两种情况,设置在根元素时和非根元素时,举个例子

代码语言:javascript
复制
/* 作用于根元素,相对于原始大小(16px),所以html的font-size为32px*/html {font-size: 2rem}/* 作用于非根元素,相对于根元素字体大小,所以为64px */p {font-size: 2rem}

三、Rem布局原理

如果子元素设置rem单位的属性,通过更改html元素的字体大小,就可以让子元素实际大小发生变化

代码语言:javascript
复制
html {font-size: 16px}p {width: 2rem} /* 32px*/html {font-size: 32px}p {width: 2rem} /*64px*/

如何让html字体大小一直等于屏幕宽度的百分之一呢? 可以通过js来设置,一般需要在页面dom ready、resize和屏幕旋转中设置

document.documentElement.style.fontSize = document.documentElement.clientWidth / 100 + 'px';

那么如何把UE图中的获取的像素单位的值,转换为已rem为单位的值呢?公式是元素宽度 / UE图宽度 * 100,让我们举个例子,假设UE图尺寸是640px,UE图中的一个元素宽度是100px,根据公式100/640*100 = 15.625

rem是弹性布局的一种实现方式,弹性布局可以算作响应式布局的一种,但响应式布局不是弹性布局,弹性布局强调等比缩放,100%还原;响应式布局强调不同屏幕要有不同的显示,比如媒体查询

一些偏向app类的,图标类的,图片类的,比如淘宝,活动页面,比较适合使用rem,因为调大字体时并不能调大图标的大小

四、Rem布局方案

rem+js方案,同时还要解决noscript问题,解决字体问题,解决屏幕过宽问题

html代码如下

[html] view plain copy

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>rem布局</title>
  7. </head>
  8. <body>
  9. <noscript>开启JavaScript,获得更好的体验</noscript>
  10. <div class="p1">
  11. 宽度为屏幕宽度的50%,字体大小1.2em
  12. <div class="s1">
  13. 字体大小1.2.em
  14. </div>
  15. </div>
  16. <div class="p2">
  17. 宽度为屏幕宽度的40%,字体大小默认
  18. <div class="s2">
  19. 字体大小1.2em
  20. </div>
  21. </div>
  22. </body>
  23. </html>

css代码如下

[html] view plain copy

  1. html {
  2. font-size: 32px; /* 320/10 */
  3. }
  4. body {
  5. font-size: 16px; /* 修正字体大小 */
  6. /* 防止页面过宽 */
  7. margin: auto;
  8. padding: 0;
  9. width: 10rem;
  10. /* 防止页面过宽 */
  11. outline: 1px dashed green;
  12. }
  13. /* js被禁止的回退方案 */
  14. @media screen and (min-width: 320px) {
  15. html {font-size: 32px}
  16. body {font-size: 16px;}
  17. }
  18. @media screen and (min-width: 481px) and (max-width:640px) {
  19. html {font-size: 48px}
  20. body {font-size: 18px;}
  21. }
  22. @media screen and (min-width: 641px) {
  23. html {font-size: 64px}
  24. body {font-size: 20px;}
  25. }
  26. noscript {
  27. display: block;
  28. border: 1px solid #d6e9c6;
  29. padding: 3px 5px;
  30. background: #dff0d8;
  31. color: #3c763d;
  32. }
  33. /* js被禁止的回退方案 */
  34. .p1, .p2 {
  35. border: 1px solid red;
  36. margin: 10px 0;
  37. }
  38. .p1 {
  39. width: 5rem;
  40. height: 5rem;
  41. font-size: 1.2em; /* 字体使用em */
  42. }
  43. .s1 {
  44. font-size: 1.2em; /* 字体使用em */
  45. }
  46. .p2 {
  47. width: 4rem;
  48. height: 4rem;
  49. }
  50. .s2 {
  51. font-size: 1.2em /* 字体使用em */
  52. }

js代码如下

[html] view plain copy

  1. var documentElement = document.documentElement;
  2. function callback() {
  3. var clientWidth = documentElement.clientWidth;
  4. // 屏幕宽度大于780,不在放大
  5. clientWidth = clientWidth < 780 ? clientWidth : 780;
  6. documentElement.style.fontSize = clientWidth / 10 + 'px';
  7. }
  8. document.addEventListener('DOMContentLoaded', callback);
  9. window.addEventListener('orientationchange' in window ? 'orientationchange' : 'resize', callback);

参考博客http://blog.csdn.net/qq_36263601/article/details/78366710

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 javascript艺术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 移动端页面rem
    • 二、rem怎么用?
      • 三、Rem布局原理
        • 四、Rem布局方案
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档