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

2023-11-03

相信很多刚开始写移动端页面的同学都要面对页面自适应的问题,当然解决方案很多,比如:百分比布局,弹性布局flex(什么是flex),也都能获得不错的效果,这里主要介绍的是本人在实践中用的最顺手最简单的布局方案——rem什么是rem)布局

(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);

原文链接: http://caibaojian.com/rem-responsive.html?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

如何使用?

这是rem布局的核心代码,这段代码的大意是:
如果页面的宽度超过了640px,那么页面中html的font-size恒为100px,否则,页面中html的font-size的大小为: 100 * (当前页面宽度 / 640)
于是,问题来了,为什么要这样?别急,我先来一一回答

  1. 为什么是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,很好用。
  2. 为什么要设置html的font-size?
    rem就是根元素(即:html)的字体大小。html中的所有标签样式凡是涉及到尺寸的(如: height,width,padding,margin,font-size。甚至,left,top等)你都可以放心大胆的用rem作单位。
    如果你把html的font-size设为20px,前面说过,rem就是html的字体大小,那么1rem = 20px。
    此时,此时宽60px,高40px的元素样式就这样设置如下 ↓

    via原文来自:http://caibaojian.com/rem-responsive.html?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

    width: 3rem;
    height: 2rem;

    那要是宽55px,高37px呢?然后经过换算,,设置如下 ↓

    //code from http://caibaojian.com/rem-responsive.html?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com
    width: 2.75rem;
    height: 1.85rem;

    是不是发现这换算起来有点麻烦啊,,,(当然,你要是心算帝请无视)
    如果我们一开始把html的font-size设为100px呢?此时1rem = 100px,那么上面的宽,高就可以这么设置 ↓

    width: 0.55rem;
    height: 0.37rem;

    是不是换算起来简单多了?!
    (当然可能有同学问,为什么不一开始把html的font-size设为1px呢,这样换算起来也简单,答:浏览器一般都有最小字体限制,比如谷歌浏览器,最小中文字体就是12px,所以实际上没有办法让1rem=1px。)
    根据上面的js代码,如果页面宽度低于640px,那么页面中html的font-size也会按照(当前页面宽度/640)的比例变化。这样,页面中凡是应用了rem的作尺寸单位的元素都会随着页面变化而等比例缩放了!

  3. 都哪些情况可以用rem布局?
    大部分情况下都可以用rem布局这个方法,当然具体还要看情况而定。拿我们公司项目举例,只有底部的导航不用rem,而是用的flex布局。因为导航点击最多,所以给它一个固定的大小(其实就是高度固定,宽度自适应的方案)。大家可以看看淘宝的这个手机页面 淘宝手机站,基本就是这种感觉,底部导航和顶部搜索框用的高固定,宽自适应的方案,其余的部分基本都是随着浏览器宽度变化在等比例缩放。

个人心得

在rem布局中,有一些自己积累的小技巧给大家分享下。

  • 页面中模块间距离一般为0.2rem。字体的大小一般分为四个档次 0.2rem 0.24rem 0.28rem 0.32rem。
  • 拿我们项目举例,我们移动端页面效果图的宽度都定在了640px。于是我在项目中,最外层的div样式就设置成了
    position: relative;
    width: 100%;
    max-width: 640px;
    min-width: 320px;
    margin: 0 auto;

    所有的元素都可以写在这个div中了,于是就可以开始写样式了

  • rem布局中,如果有个元素需要水平居中固定到页面底部,你会怎么设置它的样式呢。
    我是这样做的,前提是这个元素还是在前面说的最外层水平居中的大div中,样式如下

    position: fixed;
    bottom: 0;
    z-index: 100;
    width: 100%;
    max-width: 640px;
    min-width: 320px;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手机端页面自适应解决方案—rem布局 的相关文章

  • jest搭建vue项目单元测试-vue-cli创建新项目

    说到项目会分为新建的醒目和老项目两种 我们先来说新项目 新项目加入jest单元测试 1 创建项目 使用vue脚手架创建项目 test vue jest vue create test vue jest 2 创建项目过程中配置选项 在配置项中
  • OK彻底解决ping主机ping虚拟机之间ping不通的问题

    时间轴 一个月前 2022 8 重新玩虚拟机 因为计算机网络这块不扎实 知识点模糊 不懂其中各种原由 当然现在也不是很明白 后续还需要系统的回顾 在那是一直有几个问题 遇到以下问题需要解决 1 怎么选择桥接 nat的连接方式 现在也不清楚
  • 第七章 单行函数

    MySQL系列文章目录 http t csdn cn YTPe9 文章目录 MySQL系列文章目录 前言 一 函数的理解 1 什么是函数 2 不同DBMS函数的差异 3 MySQL的内置函数及分类 二 数值函数 1 基本函数 2 角度与弧度

随机推荐

  • C 语言char类型与int类型的转化

    目录 一 char转int 法一 直接转换 ASSCII编码表 ASCII可显示字符 法二 利用库函数转换 二 数字换成字符串 1 用sprintf 2 用库函数 char和int的转换有两种方式 这两种方式适合于在输出时使用 一 char
  • Android studio实现个人体重指数计算

    Java代码 package com example work1 import android app Activity import android app AlertDialog import android content Dialo
  • 基于 Android NDK 的学习之旅----- C调用Java(附源码)

    许多成熟的C引擎要移植到Android 平台上使用 一般都会 提供 一些接口 让Android sdk 和 jdk 实现 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法 1 主要流程 1 新建一个测试类TestP
  • linux执行命令缺少共享库解决方法和ldd命令说明

    linux执行命令缺少共享库解决方法和ldd命令说明 root xiaogaokui which ldd usr bin ldd root xiaogaokui file usr bin ldd usr bin ldd Bourne Aga
  • ZStack-K8s三层互联互通方案

    1 准备条件 zstack社区版 kubernetes 1 15 0 zstack 创建私有网络 kubernetes 选择Calico网络方案 kubernetes创建在zstack创建的扁平网络中或者是kubernetes和zstack
  • web H5 调用高德地图 通过ip定位获取当前城市

    web H5 调用高德地图 通过ip定位获取当前城市 一 使用步骤注册高德账号 创建应该获取key 登录之后 点击 应用 头部导航栏 注册地址拿走 https lbs amap com dev id choose 注意这里有服务类型 提交完
  • 拉格朗日法插补数据缺失值(Python代码实现)

    1 查询缺失值位置 isnull for i in df columns for j in df index if df isnull loc j i isnull append j i isnull 2 拉格朗日插值 传入存在缺失值的列
  • PCL 三维点云边界提取(C++详细过程版)

    边界提取 一 概述 二 代码实现 三 结果展示 本文由CSDN点云侠原创 爬虫自重 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 概述 点云边界提取在PCL里有现成的调用函数 具体算法原理和实现代码见 PCL 点云边界
  • r语言插补法_R语言缺失值的处理:线性回归模型插补

    在当我们缺少值时 系统会告诉我用 1代替 然后添加一个指示符 该变量等于 1 这样就可以不删除变量或观测值 我们在这里模拟数据 然后根据模型生成数据 未定义将转换为NA 一般建议是将缺失值替换为 1 然后拟合未定义的模型 默认情况下 R的策
  • Wireshark网络封包分析软件使用心得

    Wireshark网络封包分析软件使用心得 Wireshark 前称Ethereal 是一个网络封包分析软件 网络封包分析软件的功能是截取网络封包 并尽可能显示出最为详细的网络封包资料 Wireshark使用WinPCAP作为接口 直接与网
  • 资源池 'default' 没有足够的系统内存来运行此查询

    今天 有个客户突然打电话跟我说他的系统出了点问题 一个查询查了几十秒才出来 有时候还出不来 于是我上去看了一下 打开数据库看了相关视图 发现查询确实很慢 运行多次之后出现 资源池 default 没有足够的系统内存来运行此查询 嗯 这句话的
  • selenium抓取元素排除某个特定的class标签

    排除某个因素 第一优选想到正则表达式 无奈折腾半天没有成功 感觉是对元素的attrs按search在操作 对字符串末尾检测都没什么用 语法如下 text match By XPATH tr 5 td 11 div r 0 1 1 0 9 6
  • 【问题及解决】ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory

    报错 是说少了一个libpython3 7m so 1 0的库 解决参考 https github com deepmind acme issues 47 解决办法 export LD LIBRARY PATH path to libpyt
  • 7 个建议让 Code Review 高效又高质

    简介 Code Review CR 的本质是什么 是为了查错 还是为了 KPI 本文分享阿里资深技术专家的看法 CR 是一种关于社会学的长期行为和组织文化 通过 CR 形成一种良性互动的技术氛围 传播和分享知识 提升代码质量 并给出了 7
  • 签约减碳计算模型背后:重新定义ESG

    如果将法大大比做电子签界的 支付宝 那么其减碳计算模型更像是 蚂蚁森林 向内输血 向外赋能 作者 斗斗 出品 产业家 纸张 打印 包装 运输 所有环节的碳排放因子被带入公式后 签约场景的碳排放清晰可见 至此 每一份合同的碳排放都有了清晰的度
  • L2-005 集合相似度 (25 分)

    题目 题目链接 题解 STL 一开始我用的map 由于使用其size函数 一直出错 我发现map的size函数很不稳定 我是定义的
  • 并行程序设计作业7/12

    这里用的是信号量 有需求可以改成其他的 首先要新开一个桶存起来 然后得到资源在写进结果数组 如果不这样多核会比单核还慢 因为写操作并没有优化 然后我这里用了map 如果桶编号大 每个核心结果离散度比较大时 用数组会慢很多 map在离散度大的
  • 快速排序(一)

    快速排序是冒泡排序 选择排序 插入排序 奇偶排序 归并排序 希尔排序中最快的排序 所以我们当然有必要去深入了解快速排序 我们首先来了解一下划分算法 何谓划分算法 其实就是以一个数为基准 枢纽 这个比枢纽大的数 把我们它放在数组的右边 这个比
  • Jscript 访问 Json文件

    通过 XMLHttpRequest 访问 Json 文件 我们存在文件结构 我想通过Js来访问Test json的文本 Json文本为 我们需要 1 创建一个 XMLHttpRequest 对象 var request new XMLHtt
  • 手机端页面自适应解决方案—rem布局

    相信很多刚开始写移动端页面的同学都要面对页面自适应的问题 当然解决方案很多 比如 百分比布局 弹性布局flex 什么是flex 也都能获得不错的效果 这里主要介绍的是本人在实践中用的最顺手最简单的布局方案 rem 什么是rem 布局 fun