Sass vs Less

What is a preprocessor ?

A Few Reasons Why

  • It saves time
  • Easier to maintain
  • Easier to read
  • Make your websites looks better
  • Frameworks

How Does it Work?

Sass & Less

Introduction

Sass - syntactically awesome stylesheets.

Designed by: Hampton Catlin
First appeared: November 28, 2006
Stable release: 3.5.1 / July 13, 2017
Filename extensions: .sass, .scss
Implem. language: Ruby
Website:

Less - Language for End System Services

Designed by: Alexis Sellier
First appeared: 2009
Stable release: 2.7.2 / January 4, 2017
Filename extensions: .less
Implem. language: JavaScript
Website:

Variables

@font-size: 16px;

div {
    font-size: @font-size;
}
$font-size: 16px;

div {
    font-size: $font-size;
}
div {
    font-size: 16px;
}

Nested Selectors

$link-color: #999;
$link-hover: #229ed3;

ul {
    margin: 0;

    li {
        float: left;
    }

    a {
        color: $link-color;

        &:hover {
            color: $link-hover;
        }
    }
}
@link-color: #999;
@link-hover: #229ed3;

ul {
    margin: 0;

    li {
        float: left;
    }

    a {
        color: @link-color;

        &:hover {
            color: @link-hover;
        }
    }
}
ul { margin: 0; }
ul li { float: left; }
ul a { color: #999; }
ul a:hover { color: #229ed3; }

Mixins

@mixin bordered($width) {
    border: $width solid #ddd;

    &:hover {
        border-color: #999;
    }
}

h1 {
    @include bordered(5px);
}
.bordered (@width) {
    border: @width solid #ddd;

    &:hover {
        border-color: #999;
    }
}

h1 {
    .bordered(5px);
}
h1 { border: 5px solid #ddd; }
h1:hover { border-color: #999; }

Mixins with arguments

@mixin bordered($width:2px){
  border:$width 2px black;
}

#menu a{
  @include bordered(4px);
  background: green;
}
.bordered(@width:2px){
  border:@width solid black;
}

#menu a{
  .bordered(4px);
  background: green;
}
#menu a {
  border: 4px 2px black;
  background: green;
}

Selector Inheritance

.block { margin: 10px 5px; }

p {
  @extend .block;
  border: 1px solid #eee;
}

ul, ol {
  @extend .block;
  color: #333;
  text-transform: uppercase;
}
.block { margin: 10px 5px; }

p {
  &:extend(.block);
  border: 1px solid #eee;
}

ul, ol {
  &:extend(.block);
  color: #333;
  text-transform: uppercase;
}
.block, p, ul, ol { 
    margin: 10px 5px; 
}
p { 
    border: 1px solid #eee; 
}
ul, ol {
    color: #333;
    text-transform: uppercase; 
}

Conditionals & control Structures

@if lightness($color) > 30% {
    background-color: black;
}

@else {
    background-color: white;
}

@for $i from 1px to 3px {
    .border-#{i} {
        border: $i solid blue;
    }
}
.mixin (@color) when (lightness(@color) > 30%) {
    background-color: black;
}
.mixin (@color) when (lightness(@color) =<; 30%) {
    background-color: white;
}

.loop(@counter) when (@counter > 0){
    .loop((@counter - 1));

    .border-@{counter} {
        border: 1px * @counter solid blue;
    }
}

Main question

Why Sass Better than Less

  • @ definition of variables
  • constructs  & when, & when not ...
  • less structured

Example 

.keyframes(...) {
@process: ~`(function(e){function r(r,t,c)
{var i="}\n",u=n.split(/(^[a-zA-Z0-9-]+),/g),
s=t+" "+u[1]+"{",o=["-webkit-","-moz-","-ms-",""];
c?a.forEach(function(r){-1!==e.indexOf(r)
&&(u[2]=u[2].replace(new RegExp(r,"g"),function(e)
{return c+e}))}):u[2]=u[2].replace(/{([^}]+)}/g,
function(e,r){var t=r.split(";");t.forEach(function(e,r)
{a.forEach(function(n){-1!==e.indexOf(n)&&(t[r]="",
o.forEach(function(a){t[r]+=e.trim()
.replace(new RegExp(n,"g"),function(e){return a+e})+
";"}))})});var n=t.join(";").replace(/;;/g,";");
return e.replace(r,n)}),s+=u[2]+i,"start"==r?e="0; } 
\n"+s:"startend"==r?e="0; } \n"+s.replace(i,""):e+="end"
==r?s.replace(i,""):s}e=e||8121991;var t="@{state}",n=e;
if(8121991==e)return e;var a=["animation","transform",
"filter"];switch(t){case"1":r("start",
"@-webkit-keyframes","-webkit-"),r(null,"@-moz-keyframes"
,"-moz-"),r(null,"@-o-keyframes","-o-"),r("end",
"@keyframes");break;case"2":r("start","@-webkit-keyframes"
,"-webkit-"),r(null,"@-moz-keyframes","-moz-"),r("end",
"@keyframes");break;case"3":r("start","@-webkit-keyframes",
"-webkit-"),r(null,"@-moz-keyframes","-moz-"),r("end",
"@-o-keyframes","-o-");break;case"4":r("start",
"@-webkit-keyframes","-webkit-"),r(null,"@-o-keyframes",
"-o-"),r("end","@keyframes");break;case"5":r("start",
"@-webkit-keyframes","-webkit-"),r("end","@-moz-keyframes",
"-moz-");break;case"6":r("start","@-webkit-keyframes",
"-webkit-"),r("end","@-o-keyframes","-o-");break;
case"7":r("start","@-webkit-keyframes","-webkit-"),
r("end","@keyframes");break;case"8":r("startend",
"@-webkit-keyframes","-webkit-");break;case"9":r("start",
"@-moz-keyframes","-moz-"),r(null,"@-o-keyframes","-o-"),
r("end","@keyframes");break;case"10":r("start",
"@-moz-keyframes","-moz-"),r("end","@-o-keyframes",
"-o-");break;case"11":r("start","@-moz-keyframes",
"-moz-"),r("end","@keyframes");break;case"12":r("startend",
"@-moz-keyframes","-moz-");break;case"13":r("start",
"@-o-keyframes","-o-"),r("end","@keyframes");break;
case"14":r("startend","@-o-keyframes","-o-");break;
case"15":r("startend","@keyframes")}return e})
((function(){var e="@{arguments}";return 
e=e.replace(/^\[|\]$/g,"")})())`; @state: 1;
 lesshat-selector { -lh-property: @process; }
}
@mixin keyframes ($name) {
@-webkit-keyframes #{$name} {
@content;
}
@-moz-keyframes #{$name} {
@content;
}
@-ms-keyframes #{$name} {
@content;
}
@keyframes #{$name} {
@content;
}
}

+

Thank you for attention!

Sass vs Less

By supersmf

Sass vs Less

  • 276