I love Sass, and I love using icon fonts.
However, I do not like the limitations of using inline non-semantic, presentational markup to place these wonderful symbols, e.g.
<i class="fa fa-trash-o"></i>
What if we could keep the embellishments in our stylesheet, minimize the HTML markup, and keep things a bit more semantic?
I think we can, and this is what we’ll accomplish in a few steps. I first came across this approach from Jayden Seric’s post, Fun With Sass & Font Icons.
We’ll be using the Font Awesome icon library for this example. Font Awesome offers a comprehensive library of icons, and they’re all free and GPL compatible.
Set a Sass variable for font-family of icon font
Let’s say we want to set up a social nav, and a Search bar icon as featured on our site.
![]()
We’ll assume we already have Font Awesome enqueued properly in our WordPress theme (see wd_s for example). First, let’s declare our Font Awesome font-family as a Sass variable:
$font-icon: "FontAwesome";
Sass @mixin for icon fonts
We can use our newly defined $font-icon variable (line 18 below) within our new handy mixin to Kiss It Simple, Stupid (K.I.S.S.):
// For adding font icons to elements using CSS pseudo-elements
// http://jaydenseric.com/blog/fun-with-sass-and-font-icons
@mixin icon($position: before, $icon: false, $styles: true) {
    @if $position == both {
        $position: 'before, &:after';
    }
    // Either a :before or :after pseudo-element, or both, defaulting to :before
    &:#{$position} {
        @if $icon {
            // A particular icon has been specified
            content: "#{map-get($icons, $icon)}";
        }
        @if $styles {
            // Supportive icon styles required
            speak: none;
            font-style: normal;
            font-weight: normal;
            font-family: $font-icon;
        }
        // Include any extra rules supplied for the pseudo-element
        @content;
    }
}
			Map Unicode Characters to Custom Aliases
Now here is where it gets interesting, because typically Font Awesome gives us icon classes with unicode characters, like:
- .fa-search / Unicode: f002
 - .fa-facebook / Unicode: f09a
 - .fa-twitter / Unicode: f099
 - and so on…
 
But now we can create our own mapping, and use any semantic, or non-semantic aliases:
// Map icon names to font unicode characters
$icons: (
    search: "\f002",
    facebook: "\f09a",
    twitter: "\f099",
    // or goofy aliases, like
    magnifying-doohickey: "\f002"
);
			And now we use our mixin to assign our custom magnifying-doohickey icon to our Search, like so:
[href^="#search-popup"] {
    @include icon(before, magnifying-doohickey) {
        color: #b4b4b6;
        font-size: 24px;
    }
}
			At first, this may seem like a bit of extra overhead because you’re having to manage the font mapping. However, this opens up the ability to mix-and-match your own custom SVG icons with existing libraries, like Font Awesome. Tools like Font Custom can auto-magically generate the icon mapping for you.
How often do we see icons that do not align with their contextual information, like the bullhorn icon sitting next to “Contact” in a main navigation?

Now we can map an alias so in our project we can use @include icon(before, contact); instead of @include icon(before, bullhorn);, or better yet put it all in an @each loop
$icons: (
    // Font Awesome's .fa-user
    about: "\f007",
    // Font Awesome's .fa-bullhorn
    contact: "\f0a1",
    // Font Awesome's .fa-newspaper-o
    news: "\f1ea",
);
			@each $nav-item in about, news, contact {
    & > li.#{$nav-item} > a {
        @include icon(before, #{$nav-item});
    }
}
			I find this easier to manage in the long run, and hope you find it useful!
Nice idea explained for CSS noobs like me 🙂
Totally unrelated: tag links seem to not work here, eg wds.com/tag/whatever
Hi!
Good tips, I like it.
For my everyday call to icon-font on custom class, I used @extend, like this:
.classe{
...
&:before{
@extend .fa-facebook;
...
}
}
It’s very usefull when you use custom icon-font (like fontello) where the code can change on every edit.