DON’T READ this Less CSS tutorial (highly addictive)

Less CSS logo

WARNING: If you like copy-pasting, find-replacing, scrolling in giant messy CSS files, not reusing your code, writing hundreds of times the same thing, you should definitely LEAVE THIS PAGE RIGHT NOW. I’m serious, if you start reading this tutorial, you might like it and could dangerously become way more productive. At the end of this read, you might even think crazy things like “pure CSS sucks” ! You’ve been warned…

EDIT: I strongly recommend reading or watching my talk about CSS Preprocessors and consider using Sass instead of Less.

If you’re a web developer or designer you probably faced this kind of situation before:
“I wonder if we should use a different theme on our website, can we try a blue one instead of the current green?”

2 possible answers:

  • A pure CSS developer: “Damn… Can you come back in 15 minutes?”
  • A Less CSS developer: “Sure! Wait just a second… Done, look!”

If you’re using pure CSS, even when respecting best practices, chances are that your answer will be the first one. Indeed, CSS is really far from being perfect. Hasn’t it come to your mind that some essential features are missing from a such widely used language? For instance, very basic things like variables.

Declaring a simple variable to store a color at the top of your stylesheet and being able to change the entire theme of your site by only changing this single variable would be pretty neat right? And what about all these repetitions each time you use CSS3 properties with vendor prefixes? Wouldn’t it be useful to have to declare that just once?

Well guess what, we’re gonna fix that! This article will demonstrate the power of Less, an enrichment of CSS using JavaScript. It adds tons of awesome features missing from CSS to make your web developer life so much easier. Trust me, once you’ve tried it, it changes the way you code your stylesheets forever and you’ll never come back to pure CSS!

What is Less?

A “dynamic” CSS

According to the official website, Less is a “dynamic stylesheet language”. I have a question for you now: How many stylesheet languages do you know?

Well except if you developed your own language and a dedicated browser to interpret it, chances are that you only know CSS. You might even have never thought about “What if there were another stylesheet language?”. Well Less is kind of one. “Kind of” because you develop using the Less language, but in the end, it’s compiled to pure CSS so that browsers can read it.

It’s also called “dynamic” because it enriches CSS with many common features available in most modern dynamic programming languages (like variables for instance). During the development phase, you’ll be able to use all those new cool features we’ll see in this tutorial and it will help you code way more efficiently.

Less compiler, which is written in JavaScript, will convert all your Less code into CSS to be interpretable by the client. When does this conversion happen? Well you have 3 options:

  • On the fly in the browser with less.js,
  • By using the lessc compiler via the command-line,
  • With some fancy app like CodeKit or LiveReload.

Compiling in the browser with less.js has a big tempting button to download less.js. It is not a good idea. At least not for production.

Less.js will perform AJAX requests to grab your Less files, will then process those files to convert them into CSS, and finally inject the resulting CSS in the head of your document. It is extremely inefficient in terms of performance and you should never use it in production. Plus, if the user’s JavaScript is deactivated, well… it will just not work at all.

But if you just want to do a quick Less prototype or if you don’t have access to your usual development environment, less.js is perfectly fine!

Lessc and the command-line

You can also execute Less in your terminal. In order to do this, you will need to install Node.js on your development machine, and then install the Less module by running:

npm install less -g

You can then simply run the following command to compile a style.less file to style.css:

lessc style.less > style.css

Simple and efficient, I highly recommend this method. But if you’re really scared of the command-line, you can also use an application to do it for you.

Using an application to compile for you

Here is a list of applications that you can run when you are working that will manage the compilation for you. It is taken from my slides about CSS Preprocessors:

Some of these apps are free, others are paid. I’ve personally tried Codekit on Mac, which costs $25 and works really well.

Okay sounds cool, let’s start!

In this entire scenario, my goal will be to draw CSS shapes with different colors and decorations (cause it’s visual and I know you like it). Of course you can, and should, imagine how you can apply this to a real project. I highly recommend that you implement this example for real, because it’s the best way to learn. Honestly, you should really do it. I know you’re lazy but trust me, it’s worth it. So create an empty HTML file and here we go!

Our HTML file

First, here is the HTML we’ll be using:

<!doctype html>
	<link rel="stylesheet" href="style.css">
	<div class="shape" id="shape1"></div>
	<div class="shape" id="shape2"></div>
	<div class="shape" id="shape3"></div>

A little bit of basic CSS styling

Okay, we can finally start! First, create and open a style.less file. Then we add some CSS styles to our shapes in order to see them. We’ll set the default shape to a simple light blue square:


Run lessc style.less > style.css to compile it and this is what your browser should display:

.shape{ 	display:inline-block; 	width:200px; 	height:200px; 	background:#ddf; 	margin:20px; }

Nothing surprising here, just pure and simple CSS for the moment. But what if our example gets mucher bigger and we declared the #ddf light blue color in several different places in the file? Even with very good CSS best practices, we would still have to replace every single declaration of this color in order to try a new theme for example. That’s not convenient at all. Let’s use a Less variable to handle this.


Less variables can be declared and used with the @ symbol. You give them a name and a value, and then you can refer to the name of the variable anywhere in your Less file:



Pretty cool right? But it won’t be very helpful if we have to change the references to @lightBlue everywhere in the code. So we can for instance declare an other variable for our “default theme”:

@lightRed:   #fdd;
@lightGreen: #dfd;
@lightBlue:  #ddf;



With this example you can see our code becoming more modular and reusable. We just have to change the @defaultThemeColor to @lightGreen to apply the new green theme:

Less CSS - Three green squares

You can see a Less best practice here as well: declaring all the dumb constants at the top of the file, and then adding some logic.Talking about constants, be aware that Less “variables” are actually just constants, and their value cannot be changed once they’re set. So like Indiana Jones, “choose wisely”!

Personal tip: I like to use the usual camelCase notation (lowercase for the first word, then uppercase for the first letter of the following words) for variables. You could also use the CSS-style naming convention with dashes-between-lowercase-words, it’s up to you. It personally helps me to differentiate Less from pure CSS.


Do you know how to draw rounds in CSS? You just have to set a very high CSS3 border-radius value. Let’s apply that to the first shape:


Less CSS - Round and squares

Since we used CSS3, if we want it to work for as many browsers as possible, we must provide the alternative -webkit- and -moz- vendor prefixes versions as well. So you would do something like this is regular CSS:


We see something interesting here: three properties with the same value. Pretty boring to write right? No problem, Less to the rescue!

With Less we can define “mixins”, which are something comparable to functions in other programming languages. In Less they’re used to group CSS instructions. We’ll use a mixin to handle the boring repetition of border-radius declarations. Just like variables, you have to declare a mixin before calling it, with the . symbol this time:



You can then apply this .Round mixin wherever you want to make something round without having to declare the border-radius instructions again. That’s already cool, but it gets even cooler with parameters.

Personal best practice: You probably noticed that I used a capitalized letter for the mixin name. Well since CSS class selectors also use the . symbol, there is no way to differentiate it from a Less mixin name. That’s why I always use capitalized letters. That also mimics Object Oriented Programming, which uses capitalized letters for classes.

Parametric mixins

I now want to be able to create rounded squares, not just rounds. Let’s modify our .Round mixin to something more generic: .RoundedShape. Our RoundedShape mixin should be able to handle rounds and rounded squares, depending on the parameters used to call it. To declare parameters, use parentheses after the mixin name:



A parameter can be used similarly to a variable inside the mixin, and you can specify a default value for the parameter if none is given when the mixin is called. I also used a variable for this default value to keep the code reusable and generic.

So now that we have our cool RoundedShape mixin, let’s create 2 other mixins which will call it to create rounds and rounded squares:



And then, all we have to do to is applying those Round and RoundedSquare to our shapes:



Now refresh your page and… BOOM!

Less CSS - Rounded rectangle

Since we haven’t passed any parameter to RoundedSquare, the 30px @defaultRadius variable is used, but we could also call it with parameters, on #shape3 for instance:


Less CSS : Round and rounded squares

With just 3 lines to call our mixins, we have a whole logic handling behind the scene that makes our code super reusable and easily maintainable. How cool is that? We can go way further with mixins. In my opinion, variables and mixins are so powerful that it’s a sufficient reason to move to Less! But since Less offers tons of other amazing features, let’s take a look at it.


One other powerful feature of Less is the ability to use mathematical operations in your stylesheets (I agree it sounds boring, but it’s actually very cool). Let’s declare a @defaultShapesWidth variable to set the default shapes widths to 200px instead of hard-coding it like we used to:


Now I want to add some borders to our shapes. Borders, whose size will always be 10% of the shape width. How would you do that in pure CSS? Yeah, exactly, you can’t at all! So thanks to Less, we can now do this kind of operation:

@borderSize:@defaultShapesWidth * 0.1;

You can add, subtract, multiply and divide values. So you might think “Yeah, but it only works for pixels right?”. Nope sir, it also works for colors!

@borderColor:@defaultThemeColor - #222;

We darkened the light blue color by subtracting 2 hexadecimal units to each RGB value. It can be confusing the first time. Just keep in mind that adding or subtracting #000 has no effect and #fff has a maximal effect.

And this is what we get when applying these new variables to a border rule:

border:@borderSize solid @borderColor;

Less CSS - Shapes with borders

The result is exactly as expected. That’s awesome. But the color operation we used was pretty simple. Adding a little bit of dark is easy, performing saturation operations is way more complicated and unintuitive. Fortunately, we can use some handy color functions to do that!

Side note: Remember that all this funky Less code will be converted to CSS in the end, so this will be static once generated. If you programmatically resize the width of a shape, the border won’t scale with it on the fly.

Color functions

Less provides the following color functions:

  • darken() and lighten(), which add some black or white,
  • saturate() and desaturate(), to make a color more “colorful” or more “grayscale”,
  • fadein() and fadeout(), to increase or reduce transparency,
  • and spin(), which modifies the hue of the color.

If, for instance, we want to make the border completely desaturated to get it’s equivalent on the grayscale, we would use the desaturate function like this:

@borderColor:desaturate(@defaultThemeColor, 100%);

And we can even use the output of a color function as the input of another:

@borderColor:darken(desaturate(@defaultThemeColor, 100%), 20%);

Which has the following result:

Less CSS - Color functions on shapes

All color operations take a color and a percentage as parameters, except spin, which uses integers between 0 and 255 instead of percentages to modify the hue:

@defaultThemeColor:spin(@lightBlue, 100);

Less CSS - Spin colors

Nested rules

When designing a complex page using CSS, you often have to chain selectors to aim a particular element in the DOM, like this:

#header h1{

#main h1{

Depending on the container of the h1 elements, their style will be different if they’re in the #header or the #main section. This syntax is fine when you have a very simple DOM, but if you have to chain 4 or 5 selectors it gets messy and visually hard to represent the hierarchy of your styles. With Less you can nest rules inside parent rules to mimic the DOM structure:

	/* #header styles */
		/* #header h1 styles */

This can be a little bit confusing at the beginning but when you get used to it, this syntax helps a lot to visualise where is located the element you’re working on.

There is also a super handy way to use pseudo-classes (you know, those special selectors like :hover). Let’s say we want to change our shapes’ color when hovering them with the mouse, we can use nested rules combined with the & selector:


This & symbol represents the current selected elements. It’s the equivalent of “this” in most programming languages. Very convenient! And here is the result:

Less CSS - Hover on shapes

Nested rules are pretty awesome, but there is a little drawback: since we use CSS syntax highlighting for our *.less files, many editors (including Eclipse) will go crazy and do some very bad syntax coloration with nested rules. If you can deal with broken syntax highlighting it will be fine, but for most of us, it’s really awful. The only thing we can do is wait for a proper plugin to bring a real Less support to our editors.

Personally, I only use nested rules for very simple one level nesting with few properties or for the &:hover thing. But it really depends on you.


Finally, the last thing I wanted to show you is how to import Less files. It’s a very good practice to separate your rules into different files instead of having a 1000 lines giant file.

Importing a file into another in Less is as simple as that:

@import “colors.less”;

You can even omit the .less extension and just declare:

@import “colors”;

So depending on your project, you can split your files in a relevant way. Personally, I like having separate files for:

  • CSS Reset or normalization,
  • Colors,
  • Fonts and typography,
  • UI Elements,
  • The main styles of the page,
  • …and any other relevant group of rules depending on your project.

You can take a look at the very good Twitter Bootstrap Github repository to see how those guys splitted up their files for a professional usage.

You may think that imports result in many unnecessary HTTP requests that will slow down the loading time of your page, and that’s true! But remember we’ll use the Less output as a new CSS. If we do so, we really don’t care about using multiple files, since at the end, everything will be concatenated into just one! So don’t be afraid of imports. They will really help you to structure your code.

Final Less code

Here is what the final code looks like (no import for such a little example):


@lightRed:   #fdd;
@lightGreen: #dfd;
@lightBlue:  #ddf;


@darkBlue: @lightBlue - #555;

//@defaultThemeColor:spin(@lightBlue, 100);

@borderSize:@defaultShapesWidth * 0.1;
@borderColor:@defaultThemeColor - #222; 
//@borderColor:darken(desaturate(@defaultThemeColor, 100%), 20%); 






	border:@borderSize solid @borderColor;

	&:hover{ background:@lightRed	}

#shape1{ .Round }
#shape2{ .RoundedSquare }
#shape3{ .RoundedSquare(60px) }

You will also notice that you can use single line comments, which is a very simple but clever addition to CSS!

And here is the demonstration of this Less CSS example.


We’ve seen a lot of amazing features in this tutorial, and I hope it made you want to start using Less. I personally think Less is a real game changer for web development, and I cannot even consider going back to pure CSS. Less is like CSS5 in 2011!

There are still very interesting things I haven’t covered in this tutorial so if you’re interested in learning more about Less, you should definitely check the official documentation. Oh and by the way, since Less is also open source and hosted on Github you can easily get involved, report issues, or fork it. This great comment also gives some very interesting tips you should be aware of.

That’s all folks! Thanks for reading and feel free to share your thoughts and previous experience about Less in the comments section. I’d love to know if you enjoy it as much as I do!

63 thoughts on “DON’T READ this Less CSS tutorial (highly addictive)

  1. That is very cool, how would you compare this to SASS and SCSS? It’s difficult to know what’s best to use for future proofing and general standards

    • Hi Elliott,
      Both embrace the same philosophy, and since Less and SASS syntax are really close, you can easily move from one to another if you have (or want) to. In my opinion it really just depends on your development environment. If I had to use Ruby I would prefer SASS.

      • I actually have directly addressed this question and there are 4 key differences (in my opinion) between LESS and SASS:

        – Compass is USUALLY acquired with SASS, it is a library containing a plethora of mixins and enhancements ready-to-use for SASS, including automatic sprite generation based on your CSS, more color and browser rules, and common utilities (such as micro clearfix, etc) that I just don’t remember right now
        – LESS does not have ‘extending’ like SASS does. This is a BIG deal when your output CSS starts creating a noticeable footprint. Every time you use a mixin, you’re re-generating the css for that mixin. However, every time you ‘extend’ a selector, you are in fact just adding more selectors to the original rule, which can be a GREAT way to reduce the output CSS without making your code more confusing.
        – LESS requires users to install NodeJs. Although it’s all the rage right now, not every designer has bothered going through this process, and it can be confusing / daunting to the un-initiated. SASS only depends on ruby, which comes pre-installed on mac (and I’m assuming most *nix machines).
        – SASS handles multiple files gracefully. By using an _ (underscore) prefix on your files, they will not be compiled into their own files, and are assumed to be partials. All other SASS files encountered during the watch or compile will be generated into equivalent css files, along with identical folder structure. This is great if you actually NEED multiple css files (at least while developing).

        • This is a powerful argument for using SASS over Less and a very good counter to the Twitter Bootstap post which Twitter Bootstrap Less files are all unorganized….etc.

  2. Nice article! I’ve been using the “lesscss” since 2010 else or I am mistaken …
    The solution to compile and the following:

    Less.js I install on my server and I Node.js compile the file when I saved.
    Use the editor came up with this code:

    autocmd FileWritePost,BufWritePost *.less :call LessCSSCompress()
    function! LessCSSCompress()
    let cwd = expand(':p:h')
    let name = expand(':t:r')
    if (executable('lessc'))
    cal system('lessc '.cwd.'/'.name.'.less > '.cwd.'/'.name.'.css &')

  3. Two more hints / tricks:
    For mixins that you define to reference later (like .Round in your example) you can add empty parentheses when you define them: .Round(){definition}
    – This way the initial definition isn’t included in the rendered CSS, only the code where the mixin is being used, like #shape1 in your example. This both shortens your output code and allows you to keep a library of definitions that don’t add to the weight of the output until they are actually used.

    It also helps with naming; .someName is a CSS class I use as such, .someName() is a mixin.

    Also tools like (OS X) and SimpLESS (OSX, Win, Linux) can watch the .less files (on your development computer) and compile them to .css on your every save. Eliminating the need to copy from the browser or install Node.js.

  4. Hi,
    I’m starting a new project, and I’d really like to use LESS.
    But I find a big problem here. It’s, How do you debug with Firebug? All styles appear in Html file and line numbers get wrong…. Thx for your answer!

    • Hi Carol,
      Indeed it’s a problem. To debug LESS, it’s easier to use an other LESS compiler than the in-browser less.js. With lessc you can pass options to deactivate compression or optimization, which make it way more readable for development. It could also work with less.js if you dig a little bit into their code to change its options. Good luck!

  5. Another useful tip: on Mac OS, use livereload wich is an awesome app that hit the F5 button for you every time you save a file in your project.
    And … it compiles your LESS code into CSS and returns errors.

  6. Great tutorial, you’ve summed up the concepts and implementations nicely!

    Wondering if you have any insights into employing LESS in a team based front end dev environment? I’m trying to push my team to jump on the bandwagon, but could use some backup.

    Thanks for the tut!

  7. Thanks for this tutorial! LESS is awesome!

    For Geany users on Ubuntu, to avoid installing node.js, you can add a Build Command for CSS.

    First install lessc:
    $ sudo apt-get install lessc
    Then, in Geany:
    Build -> Set Build Commands
    Label: LESS
    Command: lessc -x %f > %e.css

    Now when editing the LESS file, just hit F8 — this will save the file and compile it.

  8. I have been dreaming of something like this for a while now and here it is better than i imagined – incredible ! Cant wait to try it out – thanks so much for taking the time to break this down into a simple yet informative article.

    Keep up the good work!

  9. Excellent. Just a reaction to “Borders, whose size will always be 10% of the shape width. How would you do that in pure CSS?”
    The answer is : by using em instead of px values. The reference propertie for em value on an element can be set with font-size (which 1.also work for non text element, 2. can event be set with em for a size relative to its parent). So, a border of 0.1em will always be 10% of the reference size, even if you resize the object or its parent. Here’s an example of a clock with almost everything set as em that will be resize with the window by only altering container size :

  10. Thanks a lot for this great tutorial! Really, really useful!
    Too bad that I just finished a lot of CSS for a current project. Really looking forward to the next web project I can use LESS on. And I will, I promise! ;-)

    • Yes! The best way to figure out if you can or not is to check the output.
      Less CSS is More is a Less playground where you can paste some code and see the CSS output easily. Great for testing:

      .outer-mixin() {

      .inner-mixin() {
      color: red;


      === Output ===

      color: red;

  11. Your variables aren’t in Hungarian notation as stated in one of Personal Tips- box. You are using CamelCase notation. But nice article.

  12. Great article! Short and sweet. There’s talk that something like less becoming a web standard. CSS definitely needs improvement, but I wonder if turning it into another scripting language is akin adding another mouse button. When does the mouse become another keyboard and likewise when does CSS become yet another scripting language?

    Shouldn’t we instead start rethinking the entire web page development model instead of adding more bandages? If this was the print industry, it would be like coming up with new tools to manipulate PostScript, instead of coming up with page layout and document imaging applications.

  13. I would really love to switch from pure css to Less! But… even the very own is not rendered on IE 8!

  14. Great article. Very nicely explained.

    I’ve been using LESS for a couple of months… firstly on a personal project, and more recently at work, converting 80+ CSS files to LESS.

    I can’t recommend CSS pre-processors enough, whether it be LESS or SASS. Just to be able to nest code, create re-usable mixins & variables, and have some basic functions & operations makes writing CSS so much easier.

    • Thanks Jonathan for writing a kick-butt article on the benefits of css-preprocessors. Sadly, I overlooked this a couple of years ago and just came back across it (thanks to the Bones WP theme) – just wish I could get back some of the time I wasted. Robert – your addons look super promising! I love how you can include functions in the .scss files!

  15. Really useful, thanks – wanted a quick way to get up to speed with LESS and this was perfect. Having done the example I can quickly refer to all the different kind of rules which is very handy.

  16. It might also be interesting to mention that the current version of less now supports variable media queries which allow you to stuff like this:

    @mobile: ~”only screen and (max-width: 320px)”;

    .logo {
    background: url(/static/images/logo.png) no-repeat 0 0;
    @mobile {
    background-image: url(/static/images/logo@2x.png);
    background-size: contain;

    I think this is a great article:

  17. Just saw this post while looking for any write ups on doing something like creating an incremental increase in font-size for individual letters while using the Lettering.js plugin that the guys at Paravel, Inc. created. I’ve primarily been a CSS guy and I’m rusty on this whole end so I’m trying to think of how to write it up so that the class .charN increases by one and gets the font-size increased each time so it would look like
    .char1 { font-size: 60px; }
    .char2 ( font-size: 69px; }
    .char3 ( font-size: 78px; }

    • With Sass, you can use a @for loop for that:

      @for $i from 1 through 4 {
      .char#{$i} {
      font-size: 51px + 9 * $i

      Which renders:

      .char1 {
      font-size: 60px; }

      .char2 {
      font-size: 69px; }

      .char3 {
      font-size: 78px; }

      .char4 {
      font-size: 87px; }

      Try it here. Enjoy :)

  18. I like the helpful information you provide on your articles. I will bookmark your weblog and take a look at again right here regularly. I am somewhat certain I’ll be informed many new stuff right here! Good luck for the following!

  19. I’m using Less in Sublime Text 2. It has a plugin you can download to build the css file from the .less file by just hitting ctrl + b. I love it. I also use CSS tidy which works great on CSS files (it formats them nicely). Does anyone know of a good LESS formatter? CSS Tidy blows up my Less files – so I have to manually format them which kind of blows. Great post. Thanks.

  20. Is there any way, using LESS, to kind of “automatically” add a “x” prefix to each one of the classes in the file?

    Namespace doesn’t work for me as there is another .css file interfering with mine and I see the only solution having very differente class names… but I don’t find it logic to going one by one adding this.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>