UNPKG

sass-rem

Version:

Sass function and mixin to use rem units with optional pixel fallback.

239 lines (177 loc) 5.95 kB
# sass-rem [![Node.js CI](https://github.com/pierreburel/sass-rem/actions/workflows/node.js.yml/badge.svg)](https://github.com/pierreburel/sass-rem/actions/workflows/node.js.yml) Sass function and mixin to use rem units with optional pixel fallback. ## Breaking changes - **4.0**: changed default function name when imported globally (`@use "rem" as *;` or `@import "sass-rem";`) to `rem-convert`, as [CSS now use `rem()` for calculating the remainder](https://developer.mozilla.org/en-US/docs/Web/CSS/rem). It shouldn't change anything if you used Sass Modules introduced in 3.0 (`rem.convert`). - **3.0**: now using [Sass Modules](https://sass-lang.com/blog/the-module-system-is-launched), using `@use` and `rem` is renamed to `rem.convert`. You could still use `@import` with no changes (see usage below), but **if you need LibSass/node-sass and Ruby Sass support (both deprecated), you should stay on 2.0** (which works fine) or use the [PostCSS](https://github.com/pierreburel/postcss-rem) version. - **2.0**: `$rem-fallback` is now set to `false` ([see support](http://caniuse.com/#feat=rem)) and `$rem-baseline` to `16px` by default. --- ## Installation Install with [Yarn](https://yarnpkg.com/) or [npm](https://www.npmjs.com/): * `yarn add sass-rem` * `npm install sass-rem` --- ## Usage Import in your project depending of your setup: ```scss @use "rem"; // or @use "~sass-rem" as rem; // or @use "../node_modules/sass-rem" as rem; .demo { font-size: rem.convert(24px); // Simple padding: rem.convert(5px 10px); // Multiple values border-bottom: rem.convert(1px solid black); // Multiple mixed values box-shadow: rem.convert(0 0 2px #ccc, inset 0 0 5px #eee); // Comma-separated values // Multiple properties @include rem.convert(( margin: 10px 5px, text-shadow: (1px 1px #eee, -1px -1px #eee) // Parentheses needed because of comma )); } ``` Will output: ```css .demo { font-size: 1.5rem; padding: 0.3125rem 0.625rem; border-bottom: 0.0625rem solid black; box-shadow: 0 0 0.125rem #ccc, inset 0 0 0.3125rem #eee; margin: 0.625rem 0.3125rem; text-shadow: 0.0625rem 0.0625rem #eee, -0.0625rem -0.0625rem #eee; } ``` --- ## Namespace You can change the namespace when importing and use `rem` function and mixin instead of `convert`: ```scss @use "rem" as to; // Because why not? .demo { font-size: to.rem(24px); } ``` Or you can even load the library globally (but beware of conflicts, avoided by the idea of modules): ```scss @use "rem" as *; .demo { font-size: rem-convert(24px); } ``` --- ## Using pixel fallback You can enable pixel fallback by setting `$fallback` to `true`, but you will have to use the mixin instead of the function. The mixin accepts a map to convert multiple properties at once too: ```scss @use "rem" with ( $fallback: true ); .demo { @include rem.convert(font-size, 24px); // Simple @include rem.convert(padding, 5px 10px); // Multiple values @include rem.convert(border-bottom, 1px solid black); // Multiple mixed values @include rem.convert(box-shadow, 0 0 2px #ccc, inset 0 0 5px #eee); // Comma-separated values // Multiple properties @include rem.convert(( margin: 10px 5px, text-shadow: (1px 1px #eee, -1px -1px #eee) // Parentheses needed because of comma )); } ``` Will output: ```css .demo { font-size: 24px; font-size: 1.5rem; padding: 5px 10px; padding: 0.3125rem 0.625rem; border-bottom: 1px solid black; border-bottom: 0.0625rem solid black; box-shadow: 0 0 2px #ccc, inset 0 0 5px #eee; box-shadow: 0 0 0.125rem #ccc, inset 0 0 0.3125rem #eee; margin: 10px 5px; margin: 0.625rem 0.3125rem; text-shadow: 1px 1px #eee, -1px -1px #eee; text-shadow: 0.0625rem 0.0625rem #eee, -0.0625rem -0.0625rem #eee; } ``` --- You can totally disable rem units by setting `$px-only` to `true` (for a lt-ie9 only stylesheet for example): ```css .demo { font-size: 24px; padding: 5px 10px; border-bottom: 1px solid black; box-shadow: 0 0 2px #ccc, inset 0 0 5px #eee; margin: 10px; text-shadow: 1px 1px #eee, -1px -1px #eee; } ``` --- ## Changing baseline By default, sass-rem now uses a 16px baseline, but you can change this value with `$baseline` and by using the `baseline` mixin on the html element to adjust the root font size. The `rem` function and mixin will calculate rem values accordingly. For example, you can set `$baseline` to 10px to have a root font size of 62.5% and improve readability (10px = 1rem), which was the pre-2.0 behavior: ```scss @use "rem" with ( $baseline: 10px ); html { @include rem.baseline; } .demo { font-size: rem.convert(24px); } ``` Will output: ```css html { font-size: 62.5%; } .demo { font-size: 2.4rem; } ``` --- You can also change the baseline zoom by passing the desired zoom to the `baseline` mixin which will calculate it depending of `$baseline`. Useful for creating responsive typography depending on viewport, especially with a different baseline than 16px: ```scss @use "rem" with ( $baseline: 10px ); html { @include rem.baseline; // Default zoom to 100% @media (max-width: 400px) { @include rem.baseline(75%); } @media (min-width: 800px) { @include rem.baseline(125%); } } ``` Will output: ```css html { font-size: 62.5%; } @media (max-width: 400px) { html { font-size: 46.875%; } } @media (min-width: 800px) { html { font-size: 78.125%; } } ``` ## Legacy import If you don't want to use Sass Modules, you can still use `@import` with `rem-convert` function, mixin and namespaced `$rem-*` variables: ```scss @import "sass-rem"; // or @import "~sass-rem"; // or @import "../node_modules/sass-rem"; $rem-baseline: 10px; .demo { font-size: rem-convert(24px); } ``` --- ## See also - PostCSS version: https://github.com/pierreburel/postcss-rem - JavaScript version: https://github.com/pierreburel/startijenn-rem - `sass-em` https://github.com/pierreburel/sass-em