移动端布局rem与vw的区别

news2024/9/29 19:20:58

目录

1. rem 

2. rem的弊端与优点

3. rem布局前注意点

4. vw

5. vw单位和%单位对比

6. vw布局前注意点

7. vue项目中使用vw


1. rem 

先简单说下rem,官当文档是这样说的:

rem是css中的长度单位,1rem = 根元素html的font-size值。当页面中所有元素都使用rem单位时,你只需要改变根元素 font-size 值,所有元素就会按比例放大或者缩小。因此我们只需要写一小段js代码,根据屏幕宽度改变 html 的 font-size 值,就可以做到弹性布局。这种方法确实便捷,兼容性也很好,是目前非常主流的弹性布局方案。

这里提供一篇完整的、动态的、改变html标签的 font-size 大小的js代码:

(function flexible (window, document) {
  var docEl = document.documentElement
  var dpr = window.devicePixelRatio || 1

  // adjust body font size
  function setBodyFontSize () {
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit)
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      setRemUnit()
    }
  })

  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement('body')
    var testElement = document.createElement('div')
    testElement.style.border = '.5px solid transparent'
    fakeBody.appendChild(testElement)
    docEl.appendChild(fakeBody)
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
  }
}(window, document))

2. rem的弊端与优点

rem布局,需要在html文件头部放入一大段压缩过的js代码很难受,vw则能让你的代码更纯粹!

弊端之一:和根元素font-size值强耦合,系统字体放大或缩小时,会导致布局错乱

弊端之二:html文件头部需插入一段js代码

rem的优点:移动端rem布局比vw主流的原因 兼容性

vw单位兼容性比rem稍差,ios8、安卓4.4及以上才完全支持。

3. rem布局前注意点

① 视口设置完整

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />

② 设计图在量取的时候可以直接按照1倍图量取

③ 安装插件 px2rem 自动换算,插件中默认html的 font-size 的大小为16px,所以默认是除以16的,如果需要更改,需要进行配置( 如:设计图是375,html标签的font-size的大小为37.5px,此时应该除以37.5 )

4. vw

我们先来看看 vw vh 单位,w3c的官方解释:

vw:1% of viewport’s width  // 视口宽度的 1%
vh:1% of viewport’s height  // 视口高度的 1%

vmin:vw和vh中最小的那一个

vmax:vw和vh中最大的那一个

viewport 即浏览器可视区域大小
我们可以这样理解 100vw = window.innerwidth, 100vh = window.innerheight
在移动端我们可以认为,100vw 就是屏幕宽度。

5. vw单位和%单位对比

百分比%是根据父元素宽度或者高度进行计算,而vw vh固定按照viewport来计算,不会受父元素宽高度影响。
100vw包括了页面滚动条宽度(页面滚动条属于viewport范围内,100vw当然包括了页面滚动条宽度)。但把body或者html设置为width:100%时,是不包括页面滚动条的宽度的。也就是说100vw在有纵向滚动条的情况下,会比100%宽。 那么就会引发一个问题:pc端使用vw单位时,如果页面内容超出一屏长度,会出现了纵向滚动条,同时有元素width:100vw, 则会导致出现条横向滚动条,因为元素(100vw + 滚动条宽度)超出了viewport宽度。(移动端滚动条不占位,所以不会有这个问题)不过pc端一般不需要弹性布局,还是尽量使用width:100%更保险。

6. vw布局前注意点

① 确定设计稿的宽度(视口的宽度),得到 1vw = 视口的宽度的1%

② vw单位的尺寸 = px / 1vw

例如:

设计稿的宽度是 375px,那么 1vw = 375 / 100 = 3.75px

元素在设计稿中测量出的宽度是 450px

那么就把元素的width设置为 450 / 3.75 = 120vw

③ 能偷懒必须偷懒,咱们可以安装 px2vw 插件自动换算

④  选择vscode中的设置,搜索 px2vw,设置当前量取的设计稿的尺寸(默认是750)

7. vue项目中使用vw

① 安装 postcss-px-to-viewport 依赖

npm install postcss-px-to-viewport -D
# or
yarn add -D postcss-px-to-viewport
# or
pnpm add -D postcss-px-to-viewport

② 项目根目录下新建 postcss.config.js ,配置如下

// eslint-disable-next-line no-undef
module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
      // 视口宽度375计算vw的值,根据实际情况来修改
      viewportWidth: 375
    }
  }
}

③ 有一个控制台警告可忽略,或者使用 postcss-px-to-viewport-8-plugin 代替当前插件

④ 有了 postcss-px-to-viewport,我们在布局的时候直接写固定px,项目 npm run dev或 npm run build 后会自动将 px 转换成 vw

⑤ 一些特殊的情况,像1px不进行转换,忽略某些文件内的px,可以继续操作 postcss.config.js

module.exports = {
		plugins: {
	        autoprefixer: {},
	        "postcss-px-to-viewport": {
	            viewportWidth: 375, //视口的宽度,对应的时设计稿的宽度/2,一般为750,对应iPhone6的宽度
	            viewportHeight: 667, //视口的高度,对应的是设计稿的高度(也可以不配置)
	            unitPrecision: 5, //指定‘px’转换为视口单位值的小数位数(很多时候无法整除)小数位为5位
	            viewportUnit: 'vw', //指定需要转换成的视口单位,建议使用vw(宽度)
	            selectorBlankList: ['ignore'], //指定不需要转换的类(class类名,使用ignore,在元素的class里加入ignore,则该元素里的px不会进行转化)
	            minPixelValue: 1, //小于或等于‘1px’不转换为视口单位
	            mediaQuery: false,//允许在媒体查询中转换为‘px’,使用媒体查询,再对一些东西进行配置
            	exclude: [/TabBar/]  //不需要转化的组件文件名正则,必须是正则表达式
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔试强训选择题】Day6.习题(错题)解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、Day6习题&#xff08;错题&#xff09;解析 二、Day6习题&#xff08;原题&#xff09;练习 总结 前言 一、Day6习题&#xff08;错题&#xff09;解析…

chatgpt智能提效职场办公--ppt怎么做

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 导入PPT有 1.通过菜单导入 打开PowerPoint 找到菜单栏中的 点击"插入" 总结 最后的最后 以上是chatgpt能力的冰山一角。…

<Linux> 常用指令

文章目录ls 指令pwd命令cd 指令touch指令mkdir指令&#xff08;重要&#xff09;&#xff1a;rmdir指令 && rm 指令man指令cp指令mv指令cat指令more指令less指令&#xff08;重要&#xff09;head指令tail指令date指令Cal指令find指令&#xff1a; -namegrep指令zip/un…

Springboot —— 根据docx填充生成word文件,并导出pdf

文章目录前言将docx模板填充数据生成doc文件1、依赖引入2、doc文件转换docx&#xff0c;并标注别名3、编写java代码实现数据填充docx文件填充数据导出pdf(web)1、依赖引入2、字体文件3、编写工具类4、编写测试接口请求测试参考资料前言 在项目中碰见一个需求&#xff0c;需要将…

[4] 实现无头单向非循环链表

目录 一、框架 二、实现各个方法 三、测试各个方法 四、源码 一、框架 一个单向链表的节点&#xff0c;有数值域和下一个节点的地址 我们可以设计一个链表类&#xff0c;在这个链表类设计一个节点内部类&#xff0c;这里设计成内部类的形式&#xff0c;因为链表是由节点组…

《论文阅读》SetGNER:General Named Entity Recognition as Entity Set Generation

0.总结 不知道是不是大模型的流行还是什么其他原因&#xff0c;导致现在网上都没有人来分享NER模型的相关论文了~本文方法简单&#xff0c;代码应该也比较简单&#xff08;但是没见作者放出来&#xff09;。推荐指数&#xff1a;★★☆☆☆ 1. 动机 处理三种不同场景的NER 与…

python笔记:datetime

处理日期和时间 1 常量 MINYEAR datetime允许的最小年份 MAXYEAR datetime允许的最大年份 2 数据类型 datetime.date带有属性year,month,daydatetime.time带有属性hour,minute,second,microsecond,tzinfodatetime.datetime带有属性year,month,day,hour,minute,second,m…

【网络安全】文件包含漏洞

文件包含漏洞文件包含漏洞原理文件包含漏洞经常出现的函数尝试查看etc/passwd敏感文件渗透过程上传phpinfo和webshell到服务器并使用工具连接其他方式包含日志文件getshell包含环境变量getshell文件包含漏洞原理 文件包含漏洞是指&#xff0c;程序开发人员一般会把重复使用的函…

【C语言学习4——整型数据类型】

C语言学习4——整型数据类型整型数据类型用sizeof关键词来测量大小三位二进制表示的数值范围数值的补码表示法各种整型类型的数值范围是多少无符号整型整型数据类型 在上一节当中&#xff0c;我们遇到了用int关键词&#xff08;整数integer的缩写&#xff09;来表示一个整数的…

Python Qt5 入门教程

Python Qt5 入门教程 Python Qt5是一个强大的GUI工具包&#xff0c;可以用来设计各种桌面应用程序&#xff0c;包括图形用户界面、数据库应用程序等。本教程将带你入门Python Qt5&#xff0c;从安装开始到图形界面的设计以及常见的控件和事件。 安装 Python Qt5需要使用PyQt5…

好用的便签APP排行榜前十名?

我是一名时间管理与自律达人&#xff0c;而便签应用程序就是必备与理想的时间管理工具。经过自己长期的总结认为好用的电脑手机云便签APP应用程序应该具备以下功能。 1、多设备同步&#xff1a;可以方便地将电脑和手机之间的数据同步&#xff0c;随时随地管理便签内容。 2、分…

海思部署分类模型

1、原始模型 onnx转caffe报错没有globalaverage层。 于是转化成&#xff1a; onnx转化caffe之后&#xff0c;修改prototxt文件&#xff0c;加上globalaverage和reshape层. 参考&#xff1a;https://blog.csdn.net/z649431508/article/details/113425275 layer { name: “Glob…

PPO算法-理论篇

1. Policy Gradient 【李宏毅深度强化学习笔记】1、策略梯度方法&#xff08;Policy Gradient&#xff09; 李宏毅深度强化学习-B站 2. PPO PPO 算法 PPO算法更新过程如下&#xff1a; 初始化policy参数θ0\theta^0θ0在每一步迭代中&#xff1a; 使用θk\theta^kθk与环境…

架构师:不想当架构师的程序员不是好程序员

引言 不想当将军的士兵不是好士兵。 很多程序员的梦想&#xff0c;就是将来能成为一名架构师。 包括我刚学编程那时候&#xff0c;也是以当架构师为目标&#xff0c;觉得不想当架构师的程序员不是好程序员&#xff0c;希望将来能成为一个优秀的架构师。就像拿破仑那句名言&am…

进程调度算法(操作系统)

1、 前置知识 1.1 非抢占式与抢占式 1.1.1 非抢占式 非抢占式指的是一个线程的在执行期间&#xff0c;另一个线程的到达&#xff0c;尽管各项标准都优于执行线程&#xff08;例如优先级高于当前执行线程&#xff09;&#xff0c;也不会抢占CPU资源&#xff0c;会耐心的等待该…

【matlab程序】海图坐标轴单位的唯一

【matlab程序】海图坐标轴单位的唯一 【matlab程序】海图坐标轴单位的唯一 本文写作来源&#xff0c;从实际出发&#xff0c;用于实际&#xff1a; 热带海洋学报&#xff0c;投稿须知&#xff1a; 其中一条关于海图制作规范中&#xff1a; 经度标识&#xff08;E, W&#…

真题详解(0/1背包)-软件设计(四十九)

真题详解(线性表)-软件设计&#xff08;四十八)https://blog.csdn.net/ke1ying/article/details/130119249 多态有四种类型&#xff1a; 参数多态&#xff1a;应用比较广泛的多态&#xff0c;称为最纯多态。 包含多态&#xff1a;最常见的就是子类型化。 过载多态&#xff1…

Nfinity: YouTube创作者如何通过SocialFi变现

Nfinity推出了一个具有革命性的SocialFi平台&#xff1a;该平台通过生成NFT来帮助YouTube创作者实现内容变现。 YouTube做为全球第一大视频内容平台&#xff0c;尽管通过付费会员和广告收入的分成&#xff0c;为创作者们提供了大量的盈利机会&#xff0c;但它也存在很多的局限性…

【MybatisPlus快速入门】—— 基础入门

入门篇 我们先简单回顾一下 Mybatis 的用法&#xff0c;再引出MybatisPlus 1.1 Mybatis 框架回顾 &#x1f314; 1、什么是Mybatis框架呢&#xff1f; 一个持久层框架&#xff0c;目的是简化持久层的开发我们就使用springboot整合Mybatis&#xff0c;实现Mybatis框架的搭建…

NBT - 生成式蛋白设计,AI带来的蛋白质工程飞跃

科学家们创建了一个能够从头合成人工酶的人工智能系统。实验测试发现&#xff0c;一些酶与自然界中发现的酶具有相同的功效&#xff0c;即使人工生成的氨基酸序列与任何已知的天然蛋白质明显不同。实验表明&#xff0c;尽管自然语言处理是为了阅读和编写语言文本而开发的&#…