Getting started with using Sass in your existing website

Sass is a CSS-compatible preprocessor for CSS. It allows you to reduce the amount of duplication and complexity in your CSS by using variables, mixins (functions), nesting, and other cool things that should have existed in the CSS spec from the beginning.

From the Sass website:

CSS on its own can be fun, but stylesheets are getting larger, more complex, and harder to maintain. This is where a preprocessor can help. Sass lets you use features that don’t exist in CSS yet like variables, nesting, mixins, inheritance and other nifty goodies that make writing CSS fun again.

As I mentioned, Sass brings a bunch of features to the table to make authoring your styles a lot faster. Here are some examples of those features:

Variables

$primary_link_color: #6792a6;
$font_stack: Helvetica, Arial, sans-serif;
$font_base_size: 16px;
$column_width: 60px;
$site_width: 12 * $column_width;

Calculations

As you may have noticed above, you can use calculations in variables; You can also use them inline. Calculations can use standard math operators like +, -, *, /, and %.

$site_width: 960px;
$column_width: $site_width / 12;

aside {
    width: $column_width * 2;
}

Output:

aside {
    width: 160px;
}

Partials

If you want to organise your styles, you can do it by breaking them up in to individual files, such as _fonts.scss. Partials should be named starting with an underscore, so that Sass won’t pick them up and try and compile them to CSS files.

To use your partial, you can do something like this:

@import 'fonts';

As you can see, I omitted the .scss when importing. You can import with and without the .scss, it’s completely up to you.

Mixins

Mixins are Sass’ functions. This is where the true power of Sass can be demonstrated.

Mixins can have parameters, like functions, and can be used to either handle part of a style declaration, or a complete declaration.

You can provide default values for parameters to make them optional.

Declaring a mixin:

@mixin some-mixin($parameter_one, $parameter_two: #f0f) {
    color: $parameter_one;
    background-color: $parameter_two;
}

Using a mixin:

body {
    @include some-mixin(#f00);
}

Output:

body {
    color: #f00;
    background-color: #f0f;
}

Here are some of the Sass mixins that I use:

Border-radius

@mixin border-radius($radius) {
    -moz-border-radius: $radius;
    -webkit-border-radius: $radius;
    -ms-border-radius: $radius;
    border-radius: $radius;
}

Box-shadow

@mixin box-shadow($shadow) {
    -moz-box-shadow: $shadow;
    -webkit-box-shadow: $shadow;
    box-shadow: $shadow;
}

Transitions

@mixin transition($duration, $property: all, $timing-function: linear) {
    -moz-transition: $property $duration $timing-function;
    -webkit-transition: $property $duration $timing-function;
    -o-transition: $property $duration $timing-function;
    transition: $property $duration $timing-function;
}

Keyframes

@mixin keyframes($name) {
    @-webkit-keyframes #{$name} {
        @content;
    }
    @-moz-keyframes #{$name} {
        @content;
    }
    @-o-keyframes #{$name} {
        @content;
    }
    @keyframes #{$name} {
        @content;
    }
}

Animation

@mixin animation($name, $duration: 1s, $easing: linear, $direction: forwards) {
    -webkit-animation: $name $duration $easing $direction;
    -moz-animation: $name $duration $easing $direction;
    animation: $name $duration $easing $direction;
}

Media queries

@mixin breakpoint($breakpoint) {
    @if $breakpoint == "big-screen" {
        @media all and (min-width: 80em) {
            @content;
        }
    }
    @else if $breakpoint == "not-big-screen" {
        @media all and (max-width: 80em) {
            @content;
        }
    }
    @else if $breakpoint == "medium-screen" {
        @media all and (max-width: 50em) {
            @content;
        }
    }
    @else if $breakpoint == "small-screen" {
        @media all and (max-width: 30em)  {
            @content;
        }
    }
    @else {
        @media all and ($breakpoint) {
            @content;
        }
    }
}

Deploying your Sass

So now that you know what Sass is, and how to use it, let’s look at the ways that you can use it with your website.

You’ve got a couple of options here:

  • Compile the Sass locally, and then upload the compiled CSS to your web server.
  • Use a server-side Sass processor to compile and serve the Sass as CSS.

So let’s look at each of these in a bit more detail.

Compile Sass locally and deploy compiled CSS

The Sass website lists a bunch of software for all platforms that you can use to compile your Sass files to CSS locally. You can check that out on the Sass install page.

Compile Sass on the server and serve compiled CSS

If your web host supports PHP (most do) you can use SCSSPHP. SCSSPHP is a PHP script that compiles your SCSS (Sass using CSS-like syntax) files to CSS on the server, and serves the compiled CSS.

This is how to set it up:

Grab the latest SCSSPHP files from the SCSSPHP GitHub repository.

Upload scss.inc.php to your serve somewhere (such as your styles directory).

Create a new file in the same directory called s.php, and put the following inside it:

<?php
require "scss.inc.php";
$scss = new scssc();
$scss->setFormatter("scss_formatter_compressed");
$server = new scss_server("stylesheets", null, $scss);
$server->serve();
?>

Now, make a directory called stylesheets and make it so that the s.php script can write to it. Upload your .scss files to the stylesheets directory.

You should now have something like the following:

css/
    s.php
    scss.inc.php
    stylesheets/
        style.scss

Now, instead of linking to your .css files in your HTML, you link to the s.php script, and specify the .scss file to load:

<link rel="stylesheet" href="css/s.php/style.scss" />

That’s it really, now if you make changes to your .scss file, s.php will generate CSS automatically and cache it.

You could take it one step further and use .htaccess to hide the s.php part of the url like this:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^css/(.*)\.css$ /css/s.php/$1.scss [R=301,L]

Then you can just link to your CSS as usual, like the following example for style.scss:

<link rel="stylesheet" href="css/style.css" />

[Comments]

Want to comment? You can do so via Github.
Comments via Github are currently closed.

[Webmentions]

Want to reply? I've hooked up Webmentions, so give it a go!