Stylus PX to REM Mixin

By  on  

The REM unit is the hottest thing since Christina Ricci ... it's hot.  And it's especially hot when it comes to font size.  Rather than paraphrase a bunch of documentation as to why REM is important, I'd like to point you to Jonathan Snook's outstanding Font sizing with rem post, where he explains sizing with PX, EM, and how REM comes into the picture.  Here's how I implemented REM sizing within Stylus with a PX fallback!

The Stylus CSS

My method uses two mixins to accomplish the feat: one to set the base font-size and another to rem-ify the pixel unit:

set-font-size(value) {
    font-size: value; /* add PX (or original value) as backup */

    if (value is inherit) {
        /* do nothing, "inherit" has no unit */
    } else {
        font-size: remify(value);
    }
}

remify(value) { /* separate mixin, so it can be used elsewhere */
    u = unit(value);

    if (u is 'px') {
        return unit(value/16, 'rem');
    } else {
        return unit(value, u);
    }
}

The 16 within the remify unit represents the base font size, in pixels, that rems should be calculated by. The usage and output looks as follows:

.smaller {
	set-font-size(13px);
}

/*
	yields:

	.smaller {
		font-size: 13px;
		font-size: .8125rem;
	}

*/

Don't forget to set the base font size on the html element, usually 100%.  Also remember this mixin assumes a PX font is passed in, so if you aren't looking to use PX as backup, this isn't the solution for you.  If you do, however, there's no hurt in using these Stylus mixins!

Recent Features

  • By
    6 Things You Didn’t Know About Firefox OS

    Firefox OS is all over the tech news and for good reason:  Mozilla's finally given web developers the platform that they need to create apps the way they've been creating them for years -- with CSS, HTML, and JavaScript.  Firefox OS has been rapidly improving...

  • By
    Facebook Open Graph META Tags

    It's no secret that Facebook has become a major traffic driver for all types of websites.  Nowadays even large corporations steer consumers toward their Facebook pages instead of the corporate websites directly.  And of course there are Facebook "Like" and "Recommend" widgets on every website.  One...

Incredible Demos

  • By
    Multiple File Upload Input

    More often than not, I find myself wanting to upload more than one file at a time.  Having to use multiple "file" INPUT elements is annoying, slow, and inefficient.  And if I hate them, I can't imagine how annoyed my users would be.  Luckily Safari, Chrome...

  • By
    NSFW Blocker Using MooTools and CSS

    One of my guilty pleasures is scoping out the latest celebrity gossip from PerezHilton.com, DListed.com, and JoBlo.com. Unfortunately, these sites occasionally post NSFW pictures which makes checking these sites on lunch a huge gamble -- a trip to HR's office could be just a click away. Since...

Discussion

  1. You can also use this REM converter, which is really nice! https://offroadcode.com/prototypes/rem-calculator/

  2. I’ve been doing it px-ify style instead of remify!

    $default-font-size = 14px
    
    font-size(_size)
      if unit(_size) == 'rem'
        font-size: (_size * $default-font-size)px
      font-size: _size
    
    .bigger
      font-size(1.2rem)
    
  3. The first sentence in this post cracks me up every time. Oh and if anyone wants to remify multiple values you can just:

    remify() {
        remified = ();
    
        for arg in arguments {
            push(remified, unit(arg/16, 'rem'));
        }
        
        return remified;
    }
    

    so

    .foo {
        padding: remify(16px 32px 8px);
    }
    

    yields:

    .foo {
        padding: 1rem 2rem 0.5rem;
    }
    
  4. Mohamed Elkebir

    It’s best to let this code work with multi/mixed-values:

    pixify(property, sizes, base = 16)
      pixels = ()
      rems = ()
    
      for j, i in sizes
        if typeof(j) is 'unit'
          push(pixels, unit(j * base, 'px'))
          push(rems, unit(j, 'rem'))
        else
          push(pixels, j)
          push(rems, j)
    
      {property}: pixels
      {property}: rems
    

    Usage:

    pixify(border, 0.3 solid red)
    

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!