rem
字体大小单位类似于 em
,只是它始终相对于根 (html) 元素 (更多信息)。它在现代浏览器中拥有良好的支持,只有 IE 8 及以下版本需要提供 px
作为后备。
为了避免重复代码,我们可以使用 LESS 或 SASS 的 Mixin 来保持代码简洁。这些 Mixin 假设
html {
font-size: 62.5%; /* Sets up the Base 10 stuff */
}
.font-size(@sizeValue) {
@remValue: @sizeValue;
@pxValue: (@sizeValue * 10);
font-size: ~"@{pxValue}px";
font-size: ~"@{remValue}rem";
}
@mixin font-size($sizeValue: 1.6) {
font-size: ($sizeValue * 10) + px;
font-size: $sizeValue + rem;
}
用法
p {
.font-size(13);
}
p {
@include font-size(13);
}
(感谢 Gabe Luethje)
Karl Merkli 提供了另一种 SCSS 实现方法,使用了不同的思路。
@function strip-unit($num) {
@return $num / ($num * 0 + 1);
}
@mixin rem-fallback($property, $values...) {
$max: length($values);
$pxValues: '';
$remValues: '';
@for $i from 1 through $max {
$value: strip-unit(nth($values, $i));
$pxValues: #{$pxValues + $value*16}px;
@if $i < $max {
$pxValues: #{$pxValues + " "};
}
}
@for $i from 1 through $max {
$value: strip-unit(nth($values, $i));
$remValues: #{$remValues + $value}rem;
@if $i < $max {
$remValues: #{$remValues + " "};
}
}
#{$property}: $pxValues;
#{$property}: $remValues;
}
所以你可以这样写:
@include rem-fallback(margin, 10, 20, 30, 40);
并得到:
body {
margin: 160px 320px 480px 640px;
margin: 10rem 20rem 30rem 40rem;
}
我发现 LESS 转义看起来很丑,所以在这种情况下我使用
font-size: @pxValue*1px;
同时定义 px 值和 rem 值,浏览器会同时显示它们,还是会取消不需要的那个?
如果浏览器同时支持 rem 和像素,在这种情况下它会使用哪一个?
谢谢,
Raj
它会使用 CSS 中最后声明的字体大小 (CSS 规则)。这就是为什么始终将字体大小声明排列为先 px 后 rem 是一个好习惯。
这样,如果支持 rem,它就会覆盖 px。
如果你真的,真的很懒(像我一样),可以为行高添加一点关爱,并添加一个基本的 1.5 倍数。
SASS 简直太棒了
一个小提示,请记住将值作为 em 而不是 px 输入;)
.foo{ @include fontsize:(1.5, 2);
哈!我知道我们迟早会在这里看到预处理器代码。
谢谢 Chris 和 Gabe。
为了更强大的尺寸控制,我使用以下 Mixin:
Rem 由 bitmanic 创建,在极端情况下,我使用 Scale,由 mrdanadams 创建。
继续加油。
不要忘记 Stylus!
Mixin
用法
*更正
制表符间距问题。
*下面是一种更透明的方法
用法
产生
谢谢你的分享!
奇怪的是,它输出的值更高 (240px / 24rem 而不是 24px / 2.4rem),所以我稍微修改了一下以满足我的需求。
你修正了数学计算后,居然没有人评论,这让我很惊讶。
我一直在随意使用 rem,但现在在下次更新之前,我尝试正确地实现它们。
上面示例中的值是不是错了?
如果 $sizeValue: 1.6,则值应为 font-size(1.3) 而不是 font-size(13)。这就能解释 Jonah 的问题了。
SASS 新手,如果我完全错了,请见谅。
行高最好使用无单位的值,对吧?
Mixin 不应该是这样的吗?
@mixin font-size($sizeValue: 1.6){
font-size: ($sizeValue) + px;
font-size: ($sizeValue/10) + rem;
}
你好。
我按照你写的添加了 Mixin,但在输出代码中,只出现了
不应该这样吗?
?
我的 Mixin
以及包含的代码片段。
错误在哪里?
我刚刚创建了一个 {less} Mixin 集合,可以帮助你将像素值转换为 rem。该集合包括对字体、边距、填充和位置属性的支持。我创建它们是因为似乎没有类似的东西来支持像我这样的开发者,他们大量使用 rem 单位。了解更多信息,请访问:https://github.com/christopher-ramirez/remixings
对于使用 Sass 的用户,我 编写了一个 Mixin 来处理 rem 转换(最初是从 @bitmanic 的代码派生而来)。我在查找与之无关的内容时偶然发现了这篇帖子,但认为其他人可能会发现它有用。
很棒的 Mixin,Ryan。我第一次尝试了一下,它工作得非常好。我尤其喜欢它可以接受 rem 和像素作为参数的事实。非常感谢。
关于何时将其整合到 Compass 中的消息吗?
你好,
我想知道是否将你的解决方案反过来会更好一些:
我只是假设我们大多数人都是用像素来思考和设计 (尤其是在使用 Photoshop 的时候),所以提供像素值然后计算 rem 可能更直观,而不是反过来。
当然,这只是个人喜好问题。也许当我像你一样厉害的时候,我就会开始用 rem 思考?:) (二进制 anyone?)
你好,
只是想知道是否有人将这段代码转换为可以在 Stylus 中使用,我已经尝试转换了,但没有成功。
谢谢
大家好!
如果 Mixin 中 body 的字体大小为 100% 会怎么样?
是否只需要除以 16 即可?
抱歉,我的数学不太好。
大家好,
是否考虑过使用
em
作为后备而不是px
,然后使用两个单独的 Mixin?我的很多网站现在只使用em
,并且在极少数情况下使用px
,所以我正在考虑一个类似这样的 Mixin:.font-size(@sizeValue, @baseFontSize: 16){
@remValue: @sizeValue;
@pxValue: (@sizeValue * 10);
@emValue:((@pxValue / @baseFontSize));
font-size: ~"@{emValue}em";
font-size: ~"@{remValue}rem";
}
@Sean rem 相比于 em 唯一的优势在于它更可预测,因为它相对于 html 的字体大小,而不是当前元素的字体大小。如果你打算处理 em,只需单独使用 em 即可。rem 需要后备的原因是它在旧版浏览器中支持不佳。目前,这是一个“二选一”的问题:使用 rem 以获得代码的可预测性和可维护性,但必须提供 px 作为后备,或者只使用 em 并注意字体大小。
哎呀,标签被剥离了。它应该写成:“em 的优势在于它更可预测,因为它相对于 html 的字体大小,而不是当前元素的字体大小。”
我是一个 Sass 新手,还没有实现超出 Mixin 和变量基本功能的太多内容。这是一种很棒/高效的编写字体大小 rem 后备的方法,但是,是否有人可以建议如何创建更通用的东西?例如,我想使用 rem (如上所示/在 http://snook.ca/archives/html_and_css/font-size-with-rem 中所示的基本大小),并且不必为行高、填充、边距、文本缩进等编写后备。
@Peter Marty 我为此类通用用途编写了一个 Sass Mixin:https://github.com/ry5n/rem。
我有一个解决方案,可以在任何属性上输出带有 px 回退的 rem 值。
https://gist.github.com/4153104/a5f13471af86e9835f18beda817ed772fcd9973a
rem 的优势之一是可以通过更改 html 上的基准大小来重新缩放整个样式。但是,当使用此 mixin 时,这将破坏 px 值。
经过一番思考,我想出了这段代码,它允许您添加相对于基准字体大小的字体大小,并允许您在需要时更改该基准(无论是在重新设计时还是在为不同的媒体类型使用不同的字体大小时)。
有点晚了,但我刚刚阅读了这篇文章,并为 Sass 创建了一些与 Compass 提供的垂直节奏工具配合使用的内容。
https://gist.github.com/4526784
它还包含一个
rel()
函数,用于计算其他所有内容的 px 到 em 值。… 我也不习惯 62.5% 的值……浏览器默认设置为 100%,所以为什么不保持原样,当结果相同的时候只将除数更改为 16…… :)
我发现函数比 mixin 更易于阅读样式,因此我编写了一些函数,并且对结果非常满意。Unitize 是一个 SASS 部分,它将
转换为
我喜欢这个 mixin 的想法,但我发现它会阻止使用简写。
font: italic 100 2rem/2 $font;
我们如何在不取消其简写的情况下应用此技术
font-size: 2rem;
font-size: 20px;
font-weight: 100;
line-height: 2;
font-family: $font;
等等
我同意,mixin 应该节省时间。我认为最好的解决方案是只对所有内容使用 rem 并使用此 Rem polyfill。
我用于 px2em 的方法(不记得应该感谢谁了)是
$font-size: 1em !default;
@function em($pxval, $base: 16px) {
@return ($pxval / $base) * $font-size;
}
p { font-size: em(22px) }
对于 Stylus 粉丝,我创建了一个基于 Karl Merkli 所做工作的小型脚本。脚本
// 许可证 MIT
// 作者:Jorge Avila jorge.e.avila@gmail.com
我正在使用一个基本的 Stylus REM mixin。
在 github 上查看
忘记添加结果了,它在这里
感谢您的帖子。这启发了以下 mixin,它将获取具有 rem/em 值的任何属性列表并创建 px 回退。
用法
其他
注意 mixin 中的“* 16px”?如果您的基本 em 单位不是 16px,请更改它。
如果有人正在寻找我上面提到的 mixin 的更全面/重构版本,我希望您发现以下内容有用。它包括一个 strip-unit() 函数、一个 rem() 函数以及与上述类似的 rem mixin。
用法
输出
抱歉,数学错误。@function rem 的第 8 行应该是……
对于感兴趣的人,我创建了一系列用于处理尺寸计算的函数。其中包括 rem 函数和 mixin。
看,sass-dimension
一些方便的函数,为尺寸计算提供了一个通用、方便的接口。
我还开始了一个网格系统,因为它似乎是尺寸函数的一个很好的测试用例。我必须承认,我还没有使用过足够的其他网格来了解它们的所有优点或我的网格是否更好,但我开始更喜欢它而不是 Susy 或 Foundation(尽管肯定还没有准备好投入生产)。
有人可以告诉我下面这行代码的作用吗?
取消我之前的问题。刚刚理解了 strip-unit 函数的作用。
对我来说,传递一个基于像素的参数并让 Sass 将其转换为 Rem 更容易。
我仍然可以考虑像素,但我的代码输出 Rem。
这应该返回
如果在您正在使用的网站上不需要 px 回退,则 Karl 的 mixin 可以缩短为
Zurb 的 Foundation 中有一个类似的 emCalc 函数,但这个函数功能更强大!
这正是我发布的库所做的,除了您可以将任何类型的单位传递给 mixin,它将输出一个带有 rem 值的 px 回退。
换句话说,如果 1rem = 1em = 16px…
将输出
请注意,px、rem 和 em 单位被传递给 mixin,但仅创建 px 回退和 rem 尺寸。
实际上,我将 sass-dimension 库重命名为 sass-unity,因为它都是关于为单位计算/转换提供通用接口。它有一个“unity”函数,用于标准化单位列表
我知道现在更容易想到像素,因为我们已经这样做了很久,但我们应该从代码的构思阶段就开始考虑比例。我们应该考虑,“这个盒子应该是变量基线(16)的 4 倍,而不是始终是 64(4×16)。”
我很难知道设备会对我们有什么期望。DPI 是营销战之一,可读性也很重要,因此我认为即使是我们那些还没有转换的人也隐隐觉得像素有点太死板了;但是,我也觉得 em 不稳定,无法用于尺寸(主要是高度和宽度)。使用 rem,我们可以有一个关键锚点,而不是绑定(px)或不可预测(em)。
基于 Karl Merkli 上面的方法,这首小曲允许进行基于 10 的计算,同时保持浏览器默认字体大小(假设的 16 像素默认值)……因为数学很糟糕。它也不需要“strip-unit”指令。
查看 gist.
您应该将无单位值乘以 1 个单位,而不是直接附加单位,这会导致字符串。
我今天写了一篇关于它的简短博文。
Chris 我认为在使用中是否有错误?应该是
.font-size(1.3);
而不是
.font-size(13);
不是吗?
如果为 13,在我的网站上看起来很大。并且 mixin 乘以 10……
或者我在这里遗漏了什么!:D
@migswd:要使用 .font-size(13),您需要将 mixin 调整为
大家好!我发现 rem-fallback mixin 非常棒,但它没有处理“auto”之类的值,会将“em”值转换为“rem”,而且我不知道它将如何处理百分比。为了弥补这一点,我修改了 mixin 并使其更加简洁。希望这对其他一些人有所帮助!
嘿 - 如果我错了请纠正我。但是,less mixin 示例不应该
和
示例使用 px,但 mixin 正在将值相乘而不是除以它。
Victor - less mixin 正确。
但是,为什么我们要将 html 设置为 62.5%?如果我们必须在纸上或使用计算器进行算术运算,我可以理解这一点 - 我们没有进行任何算术运算 - less、sass 或 stylus 正在执行工作。
我们只需要记住,无论我们将 HTML 设置为什么,像素值都将等于 1 rem。
16px(html 上的 100%)表示 16px = 1 rem
因此,我们的 mixin(对于 less)变为
我们需要把事情搞得这么复杂吗?或者我完全错过了重点?
我尝试使用一些变量来进行 less mixin。
旧主题,但可能对其他人有用
@mixin rempx($value){
font-size: $value + px;
font-size:($value / 10) + rem;
}
p{
@include rempx(16);
}
所以这些例子假设您想要将段落的字体大小设置为 130px?
这里的工作一如既往地出色,感谢您持续不断的灵感!我有一个关于使用 rem 进行响应式开发的问题。
Snook 的著名文章展示了在每个断点处更改根字体大小,但是像这样的函数每次都必须进行调整,因为它使用 1.6 作为基数,对吗?我们如何构建类似的东西,它还能允许在不同分辨率下更改根字体大小?
我认为您可以轻松地使用媒体查询来调整根字体大小。
嗨,伙计们,我只是想听听你们对这个 Sass mixin 的看法,有了它,您不必将 html 字体大小设置为 62.5%。
谢谢。非常有道理。太棒了。
那个 SCSS include 对我来说不起作用。但这个起作用了。
@include font-size(1.4);
怎么回事?
示例 @include 是错误的,示例中的 mixin 函数基于您输入 rem 值,而不是 px 值(就像示例 @include 所做的那样)。要在您的 @include 语句中使用 px,您需要将基本值从 1.6 调整为 16,将 rem 除以 16 并删除 px 的 * 10 部分 ^^
你好,
我在网上找到了一段 scss 代码并对其进行了自定义。
首先
使用 mixin 我们可以转换这个
到
但我添加了一些功能。
1. 仅将其转换为像素。
到
仅将其转换为 rem
将其转换为像素和 rem。
但是当我为每个变量赋予“false”值时,它会给我一个错误(在 codepen.io 上)。
这可能不是最需要的功能,但它是针对 CSS 框架的。它可能对其他人有用,或者用于学习 scss(如何使用 if-else 语句来构建高级 scss mixin)。
~ 对不起,我的英语不好。
抱歉忘记了放 CodePen 链接。
http://codepen.io/cyrildewit/pen/YwvErx
px 到 rem 的 sass 版本…
sass 版本
less 版本
LESS mixin 使我的字体变得很大,所以我对其进行了修改。
从此:
@remValue: @sizeValue;
@pxValue: (@sizeValue * 10);
到此:
@remValue: @sizeValue / 10;
@pxValue: (@sizeValue);
并保持其余部分不变。
嗨,您的 mixin 很有用,但我正在使用我自己的。
我的 mixin 可以设置完美的行高和根据不同字体大小计算的最大宽度。它非常有用且易于开发,因为要激活选项,我们需要写 1 或 yes :)
我认为这是我最好的 mixin。
大家好,
我正在使用 Karl Merkli 的方法。
我有一个问题,如果我的 16px 字体大小在移动设备上变为 14px,我如何计算 14px 的 rem?
谢谢
Max