rem이 무엇인가요
아마도 라디오나 다른 음악 플레이어를 사용하기 전에 "R.E.M."이라는 단어를 들어보셨을 것입니다. 이 밴드의 눈에는 이 단어가 "light sleep while rapid eye movement"의 약어이고, CSS에서 rem은 "루트 요소를 참조로 하는 em 단위"를 의미합니다. 종교적 신념을 버리거나 달에 사는 사람을 믿게 만드는 것은 아니지만 조화롭고 매끄러운 디자인을 달성하는 데 도움이 될 수 있습니다.
W3C 사양의 1rem 정의에 따르면
1rem은 루트 요소의 글꼴 크기로 계산된 값과 같습니다. 루트 요소의 글꼴 크기가 명시적으로 지정되면 rem 단위는 속성의 초기 값을 참조합니다.
이는 1rem이 html 요소의 글꼴 크기와 동일하다는 의미입니다(대부분의 브라우저에서 루트 요소의 글꼴 크기는 16px입니다).
Rem 단위 대 Em 단위
em 단위를 사용하세요. 주요 문제는 이들이 사용자 요소와 연관되어 있다는 것입니다. 이 경우 이러한 요소는 서로 중첩되어 예상치 못한 결과를 초래할 수 있습니다. 다음 예를 고려해 보겠습니다. 루트 요소의 텍스트 크기가 기본값인 16px인 경우 모든 목록의 글꼴 크기를 12px로 설정하려고 합니다.
html { font-size: 100%; } ul { font-size: 0.75em; }
Under에 중첩된 목록이 있는 경우 다른 목록의 경우 내부 목록의 글꼴 크기는 외부 목록 글꼴 크기의 75%(즉, 9px)가 됩니다.
ul ul { font-size: 1em; }
html { font-size: 100%; } ul { font-size: 0.75rem; }
14px = 0.875rem16px = 1rem(기본)18px = 1.125rem20px = 1.25rem24px = 1.5rem30px = 1.875rem32px = 2rem보시다시피 이 값은 계산하기 매우 불편합니다. 따라서 Snook에서는 이 문제를 해결하기 위해 62.5라는 방법을 사용합니다. 그러나 이는 이미 em 단위에서 사용되었기 때문에 혁신이 아닙니다.
body { font-size:62.5%; } /* =10px */ h1 { font-size: 2.4em; } /* =24px */ p { font-size: 1.4em; } /* =14px */ li { font-size: 1.4em; } /* =14px? */
html { font-size: 62.5%; } /* =10px */ body { font-size: 1.4rem; } /* =14px */ h1 { font-size: 2.4rem; } /* =24px */
html { font-size: 62.5%; } body { font-size: 14px; font-size: 1.4rem; } h1 { font-size: 24px; font-size: 2.4rem; }
粗略的估计一个字节大小就是 1rem,利用这个方法我们就可以用一种移动优先的方式控制内容的单行文本流:
.container { width: 100%; } @media (min-width: 85rem) { .container { width: 65rem; } }
然而在媒体查询中使用 em 和 rem 单位作为媒体查询的条件时有一个有意思的细节:1 rem,1em 还有浏览器默认文字大小这三值表示这同一个值。这样做的原因可以在媒体查询规范得到解释(特别强调):
询中相对单位都是以一个初始值作为基准,这就意味着这些单位永远不会基于声明的结果。例如:在 HTML 中,em 单位与用户浏览器或者用户偏好设置中设置的初始文字大小有关,而不是页面上的样式中定义的文字大小。
让我们看一个关于这个特性的一个小例子:
在 CodePen 上看一个关于媒体查询的 demo
首先,在我们的 HTML 文档中,有一个元素将会展现视口的宽度:
`Document width: <span></span>px`
接下来是两条媒体查询语句,一条是使用 rem 单位,另一条使用 em 单位(这里为了简便,使用了 Sass)
html { font-size: 62.5%; /* 62.5% of 16px = 10px */ @media (min-width: 20rem) { /* 20*16px = 320px */ background-color: lemonchiffon; font-size: 200%; /* 200% of 16px = 32px */ } @media (min-width: 30em) { /* 30*16px = 480px */ background-color: lightblue; font-size: 300%; /* 300% of 16px = 48px */(译:原文是48px) } }
最后,我们使用一点 jQuery 在页面上显示视口的宽度,并且在窗口缩放的时候更新这个值:
$('span').text($(window).width()); $(window).on('resize', function(e) { $('span').text($(window).width()); });
在开头,我们使用了 62.5% 这个方法来说明,修改根元素字体大小不会对媒体查询产生任何影响。当我们更改窗口的宽度时,我们可以看到在 320 px 时,第一条媒体查询开始起作用,到480px第二条媒体查询开始起作用。任何一条在媒体查询中对文字大小声明的改变都没有起作用。唯一一个可以改变媒体查询中宽度的是在浏览器里更改默认文字大小。
因为这个原因,在媒体查询语句中使用 em 单位还是 rem 单位已经不那么重要了。事实上,无论是Foundation v5还是最近刚发布的Bootstrap v4 alpha都在他们的媒体查询中使用了 em 单位。
使用 rem 单位来缩放文档
我们能发现的第三种使用 rem 单位的方式是去构建可缩放组件。使用 rem 来定义元素的宽度,外边距和内边距 通过使用根元素的字体大小作为一个接口使元素缩放一致变为了可能。 我们可以通过下面两个例子来看这是怎么起作用的。
使用 rem 来缩放文档实例一
在这个例子里,我们通过媒体查询中更改根元素的文字大小。就像上一个章节所讲,这样做的目的是为用户定制不同设备下的不同阅读体验。通过 rem 单位来表示宽度,外边距,内边距,这样所有元素就会基于用户的设备大小缩放。
让我们看另一个例子:
代码可以看 SitePoint(@SitePoint点击预览) 在 CodePen 写的 《使用 rem 动态缩放模块》点击预览
在第二个例子中,我们使用 JavaScript 来做同样的操作。这次用户根据自己的需要手动控制界面的大小。我们可以使用多种方式(可以使用数据库,cookie 还有本地存储)来存储用户数据,这样就可以给用户搭建一个基于用户偏好的个性化系统。
总结
在这里总结一下到目前为止我们对 CSS 中 rem 单位的认识。很显然,在项目中使用 rem 有许多优点,比如:响应式,可缩放,增加阅读体验,增加自定义元素的灵活性。rem 虽然不是一个通用的解决方案,但是通过谨慎的使用,它还是可以解决困扰开发者多年的问题。 我们每个人都可以去挖掘 rem 的所有潜能。从你的编辑器开始吧,实验并向我们分享您的成果。