rem 和 em 到底该怎么用才不会乱? 欧阳恩希 提问于 2026-03-05 12:04:19 阅读 39 移动 我最近在做移动端页面,想用 rem 做响应式布局,但发现字体和间距老是对不齐。 我在根元素设了 font-size: 16px,然后组件里用 em 写 padding,结果不同父级下大小完全不一样,是不是 em 不能随便用? 试过统一用 rem,但有些局部缩放又显得太死板。有没有推荐的使用规范?比如什么场景用 rem,什么用 em? 我来解答 赞 8 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 开发者利娇 Lv1 em 这个东西吧,确实坑不少人。你说的情况我太懂了——在组件里用 em 写 padding,结果父级 font-size 一变,整个组件就歪了。 先说原理。em 实际上是相对于当前元素的 font-size,不是父级。假设你有个按钮,font-size 是 14px,你写 padding: 1em,那上下padding 就是 14px。但如果你在这个按钮外面包了一层,而这一层的 font-size 变成了 20px,按钮本身的 font-size 如果没变,padding 还是 14px——em 只看自己的 font-size。 那为什么你会觉得"不同父级下大小不一样"?很可能是因为你组件内部的 font-size 继承了父级的值。比如外层是 20px,里面的小字是 12px,小字下面的 padding: 1em 就是 12px,而大字下面的 padding: 1em 就是 20px。 所以使用规范很简单: 用 rem 的场景:页面整体的布局尺寸、容器宽度、间距。这些需要保持一致,不应该被局部字体影响。比如你的页面主题色间距、卡片宽度、整体布局的 margin。 用 em 的场景:组件内部需要跟随字体大小变化的尺寸。比如按钮的 padding、段落的行高、胶囊按钮的内边距。这样当用户调整字体大小时,组件会成比例缩放,不会出现文字变大了但按钮还是那么小的情况。 还有个关键点,如果你的组件可能被嵌套在不同的父级下,而且父级的 font-size 不确定,那组件内部最好用 rem 固定值,或者把组件根元素的 font-size 用 rem 固定住。比如: .btn { font-size: 1rem; /* 固定为根元素的 16px */ padding: 0.5em 1em; /* 这样 padding 就是 8px 16px,不会受父级影响 */ } 或者更干脆的做法——组件内部全部用 rem,布局间距用 rem,字体用 rem,只在极少数需要随字体缩放的局部用 em。这是我比较推荐的做法,清晰不容易乱。 你要是实在不想记这些规矩,还有一个偷懒方案——全部用 rem 就完事了。响应式布局里 rem 足够用,局部缩放的问题通过媒体查询调根元素的 font-size 来解决,虽然粗糙一点但绝对不会出错。 回复 点赞 2026-03-18 19:21 UX乐萱 Lv1 哎这个我太有感触了,之前也被 rem 和 em 折磨得够呛。可以试试这样来区分: 1. 全局缩放用 rem:在 html 标签设 font-size,比如 html { font-size: 16px },然后其他尺寸都用 rem。这样整个页面会跟着根字号等比缩放,做响应式很方便。 2. 局部相对尺寸用 em:比如按钮内部的图标和文字间距,或者某个组件内部的 padding。记住 em 是相对于当前元素的 font-size,所以最好给父元素明确设置 font-size,不然会继承到不确定的值。比如: .card { font-size: 1rem; /* 明确设置 */ padding: 1em; /* 这时 1em=16px */ } .card-title { font-size: 1.2em; /* 1.2×16px=19.2px */ margin-bottom: 0.5em; /* 0.5×19.2px=9.6px */ } 3. 简单经验法则: - 涉及整体布局的(宽度、边距)用 rem - 组件内部细节(padding、行高)用 em - 字体大小建议都用 rem 保持统一 我之前踩的坑就是在一个没设 font-size 的 div 里用 em,结果发现 padding 忽大忽小,最后发现是继承了浏览器默认字号...现在都会习惯性先写 font-size 再玩 em。 回复 点赞 1 2026-03-05 13:07 加载更多 相关推荐 2 回答 66 浏览 <em>remem>和em在Vue组件里到底该怎么用才不会乱? 我在做移动端页面,想用<em>remem>做响应式布局,但发现组件里的字体大小有时候特别奇怪,明明根字体设了,子元素用em就失控了。比如下面这个按钮: <template> <div class=... 司徒爱香 移动 2026-03-10 21:41:21 1 回答 44 浏览 <em>remem>和vw到底该怎么选?适配方案总出问题怎么办? 最近做移动端项目,用<em>remem>适配时在不同机型上布局老是错位,换成vw又怕兼容性不好。我试了动态设置html的font-size,但效果不稳定,尤其在iPhone和安卓机上表现不一致。 比如下面这段代码,... 爱学习的彦霞 优化 2026-03-13 17:22:26 1 回答 83 浏览 <em>Remem>atch中dispatch后状态没更新是怎么回事? 我在用<em>Remem>atch做状态管理,调用dispatch更新了state,但组件里拿到的还是旧值,render也没触发。是不是哪里写错了? 我试过在reducer里console.log新state,确实... A. 艳雯 框架 2026-03-13 13:25:21 2 回答 40 浏览 VSCode <em>Remem>ote连接后React组件不热更新怎么办? 我在用 VSCode <em>Remem>ote-SSH 连接到远程服务器开发 React 项目,本地修改代码后页面完全不热更新,手动刷新也不生效,但终端里 Webpack 显示编译成功了。这是怎么回事? 我试过重... 设计师明硕 工具 2026-03-02 20:57:25 2 回答 39 浏览 <em>remem>和vw到底该用哪个做移动端适配? 最近在做一个移动端项目,UI给的设计稿是375px宽。我之前用<em>remem>配合js动态设置html的font-size,但听说现在主流都用vw了?试了下直接写width: 50vw确实方便,但有些老机型好像... IT人士轩 优化 2026-02-25 19:05:20 2 回答 113 浏览 <em>remem>适配时页面元素在不同手机上缩放比例不一致怎么办? 我用<em>remem>方案开发移动端时,设置了根字体大小根据屏幕宽度计算,但iPhone12和小米11上按钮大小明显不一样,html{font-size:50px}明明是动态计算的啊... 代码是这样写的:fun... 开发者阳阳 移动 2026-02-16 01:20:30 2 回答 211 浏览 <em>Remem>ax中使用Page组件时小程序正常但Web端显示空白页面怎么办? 我在用<em>Remem>ax开发多端应用时遇到奇怪问题,同样的Page组件在小程序端能正常渲染内容,但Web端只显示空白页面。检查过网络请求都没问题,控制台也没有报错。 尝试把页面代码简化到只剩最基础的结构还是不... 设计师卜楷 移动 2026-02-06 21:49:29 2 回答 105 浏览 <em>remem>方案中根字体大小动态计算后页面元素错位怎么办? 我按照教程用JS动态计算<em>remem>,但手机旋转屏幕后文字和图片比例不对,有时候文字太大或太小。 代码检查了好几遍没问题,是不是哪里漏了?比如这个计算函数: function set<em>Remem>() { cons... 欣辰(打工版) 移动 2026-01-27 10:28:27 2 回答 45 浏览 VSCode <em>Remem>ote连接后本地HTML文件样式不生效? 我用 VSCode 的 <em>Remem>ote-SSH 连到服务器开发,本地写了个简单的 HTML 页面,但在远程环境下打开时 CSS 样式完全没加载,控制台也没报错,很奇怪。 本地直接双击打开是正常的,但通过... 百里明月 工具 2026-03-26 20:49:18 2 回答 58 浏览 <em>remem>适配在不同机型上为啥还是错位? 我用<em>remem>做移动端适配,按照设计稿750px来设置根字体大小,但真机测试时发现iPhone和安卓显示效果不一致,有些元素明显偏移了。 我在html里动态设置了font-size,代码是这样的: fun... 志选 Dev 移动 2026-03-22 23:25:20
先说原理。em 实际上是相对于当前元素的 font-size,不是父级。假设你有个按钮,font-size 是 14px,你写 padding: 1em,那上下padding 就是 14px。但如果你在这个按钮外面包了一层,而这一层的 font-size 变成了 20px,按钮本身的 font-size 如果没变,padding 还是 14px——em 只看自己的 font-size。
那为什么你会觉得"不同父级下大小不一样"?很可能是因为你组件内部的 font-size 继承了父级的值。比如外层是 20px,里面的小字是 12px,小字下面的 padding: 1em 就是 12px,而大字下面的 padding: 1em 就是 20px。
所以使用规范很简单:
用 rem 的场景:页面整体的布局尺寸、容器宽度、间距。这些需要保持一致,不应该被局部字体影响。比如你的页面主题色间距、卡片宽度、整体布局的 margin。
用 em 的场景:组件内部需要跟随字体大小变化的尺寸。比如按钮的 padding、段落的行高、胶囊按钮的内边距。这样当用户调整字体大小时,组件会成比例缩放,不会出现文字变大了但按钮还是那么小的情况。
还有个关键点,如果你的组件可能被嵌套在不同的父级下,而且父级的 font-size 不确定,那组件内部最好用 rem 固定值,或者把组件根元素的 font-size 用 rem 固定住。比如:
或者更干脆的做法——组件内部全部用 rem,布局间距用 rem,字体用 rem,只在极少数需要随字体缩放的局部用 em。这是我比较推荐的做法,清晰不容易乱。
你要是实在不想记这些规矩,还有一个偷懒方案——全部用 rem 就完事了。响应式布局里 rem 足够用,局部缩放的问题通过媒体查询调根元素的 font-size 来解决,虽然粗糙一点但绝对不会出错。
1. 全局缩放用 rem:在 html 标签设 font-size,比如
html { font-size: 16px },然后其他尺寸都用 rem。这样整个页面会跟着根字号等比缩放,做响应式很方便。2. 局部相对尺寸用 em:比如按钮内部的图标和文字间距,或者某个组件内部的 padding。记住 em 是相对于当前元素的 font-size,所以最好给父元素明确设置 font-size,不然会继承到不确定的值。比如:
3. 简单经验法则:
- 涉及整体布局的(宽度、边距)用 rem
- 组件内部细节(padding、行高)用 em
- 字体大小建议都用 rem 保持统一
我之前踩的坑就是在一个没设 font-size 的 div 里用 em,结果发现 padding 忽大忽小,最后发现是继承了浏览器默认字号...现在都会习惯性先写 font-size 再玩 em。