SlideShare a Scribd company logo
1 of 103
Dirk Ginader | Yahoo! Inc.

Sass, Compass &
the new Webdev tools



                             @ginader
“CSS Precompilers are
useless. I don’t need them.
 I can write CSS myself.”
                  -- me, early 2010
“CSS3 is awesome! Browsers
can now do rounded corners
      and Everything!”
             -- me, about the same time
“Damn!
writing all those Browser
  prefixes is tedious...”
           -- me, immediately afterwards
“WOAH! Livereload makes
  me forget about ⌘R!”
                -- me, mid 2011
http://livereload.com/
“The Web Developer Wonderland
 (a happy land where browsers don't need a
                Refresh button)
   CSS edits and image changes apply live.
CoffeeScript, Sass, LESS and others just work.”
                          -- the Livereload website
“What does LiveReload do?
LiveReload monitors changes in the file system. As soon
 as you save a file, it is preprocessed as needed, and the
                  browser is refreshed.
Even cooler, when you change a CSS file or an image, the
browser is updated instantly without reloading the page.”
                               -- the Livereload website
writing 8 lines of CSS to
   create 1 simple cross
browser gradient is a PITA...
                -- everybody, all the time
.box_gradient {
  // Old browsers
  background: black;
  // FF3.6+
  background: -moz-linear-gradient(top, black 0%, white 100%);
  // Chrome,Safari4+
  background: -webkit-gradient(linear, left top, left bottom,
     color-stop(0%, black), color-stop(100%, white));
  // Chrome10+,Safari5.1+
  background: -webkit-linear-gradient(top, black 0%, white 100%);
  // Opera 11.10+
  background: -o-linear-gradient(top, black 0%, white 100%);
  // IE10+
  background: -ms-linear-gradient(top, black 0%, white 100%);
  // W3C standard
  background: linear-gradient(to bottom, black 0%, white 100%);
  // IE6-9
  filter: progid:DXImageTransform.Microsoft.gradient(
     startColorstr='black',endColorstr='white',GradientType=0);
}
wait a second...
http://incident57.com/codekit/
Codekit != Livereload
•   Does almost the same    •   BUT:

•   compiles all the CSS        •   it only auto reloads
    Preprocessors                   webkit browsers on
                                    your Mac (it controls
•   Lints your Javascript           them using
                                    AppleScript
•   optimizes your Images
                                •   no Firefox or Opera
•   combo handles your
    CSS and Javascript          •   no mobile Devices ;-(
well if it’s *THAT* easy
   I could as well give
        it a try, right?
me, after having seen this toggle countless times...
http://sass-lang.com/
“Sass makes CSS fun again. Sass is an extension of
    CSS3, adding nested rules, variables, mixins,
 selector inheritance, and more. It’s translated to
well-formatted, standard CSS using the command
      line tool or a web-framework plugin.”
                                 -- the Sass Website
$ gem install sass
$ sudo gem install sass
alright - let’s see what
     this can do...
Mixins!
reusable chunks of code
/* style.scss */

@mixin linear-gradient {
  background-image: linear-gradient(top, #444, #999);
}

.box-with-gradient {
  @include linear-gradient;
}

.another-box-with-same-gradient {
  @include linear-gradient;
}
$ sass --watch style.scss:style.css


you don’t need that thanks to Livereload :-)
$ sass --watch my/sass:my/css


you don’t need that thanks to Livereload :-)
becomes
/* style.css */

.box-with-gradient {
  background-image: linear-gradient(top, #444, #999);
}

.another-box-with-same-gradient {
  background-image: linear-gradient(top, #444, #999);
}
Mixins can have Params
/* style.scss */

@mixin linear-gradient($from, $to) {
  background-image: linear-gradient(top, $from, $to);
}
/* style.scss */
@mixin linear-gradient($from, $to){
! // Old browsers
! background: $from;
! // FF3.6+
! background: -moz-linear-gradient(top, $from 0%, $to 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, $from), color-stop(100%, $to));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, $from 0%, $to 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, $from 0%, $to 100%);
! // IE10+
! background: -ms-linear-gradient(top, $from 0%, $to 100%);
! // W3C standard
! background: linear-gradient(to bottom, $from 0%, $to 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! startColorstr='$from',
! ! endColorstr='$to',GradientType=0
! );
}
/* style.scss */

.box_gradient {
  @include linear-gradient(#444444, #999999);
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
/* style.scss */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(

                                                       HUH?
! ! ! ! startColorstr='$from',
! ! ! ! endColorstr='$to',GradientType=0
! ! ! );
}
http://dir.kg/sass.interpolation
/* style.scss */
@mixin linear-gradient($from, $to){
! // Old browsers
! background: $from;
! // FF3.6+
! background: -moz-linear-gradient(top, $from 0%, $to 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, $from), color-stop(100%, $to));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, $from 0%, $to 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, $from 0%, $to 100%);
! // IE10+
! background: -ms-linear-gradient(top, $from 0%, $to 100%);
! // W3C standard
! background: linear-gradient(to bottom, $from 0%, $to 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! startColorstr='#{$from}',
! ! endColorstr='#{$to}',GradientType=0
! );
}
/* style.scss */

.box_gradient {
  @include linear-gradient(#444444, #999999);
}
/* style.css */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='#444',
! ! ! ! endColorstr='#999',GradientType=0
! ! ! );
}
/* style.css */
.box_gradient{
! // Old browsers
! background: #444;
! // FF3.6+
! background: -moz-linear-gradient(top, #444 0%, #999 100%);
! // Chrome,Safari4+
! background: -webkit-gradient(linear, left top, left bottom,
! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999));
! // Chrome10+,Safari5.1+
! background: -webkit-linear-gradient(top, #444 0%, #999 100%);
! // Opera 11.10+
! background: -o-linear-gradient(top, #444 0%, #999 100%);
! // IE10+
! background: -ms-linear-gradient(top, #444 0%, #999 100%);
! // W3C standard
! background: linear-gradient(to bottom, #444 0%, #999 100%);
! // IE6-9
! filter: progid:DXImageTransform.Microsoft.gradient(
! ! ! ! startColorstr='#444',
! ! ! ! endColorstr='#999',GradientType=0
! ! ! );
}
write once and reuse
/* style.scss */

.box-with-gradient {
  @include linear-gradient(#444444, #999999);
}

.box-with-another-gradient {
  @include linear-gradient(#000, #fff);
}
wait - I never have to
write prefixes again?
         Ever?
Ok. I’m convinced -
what else do we have?
Nesting!
no more repetitive
          selector writing!
/* style.scss */                    /* style.css */
#navbar {                           #navbar {
  width: 80%;                         width: 80%;
  height: 23px;                       height: 23px; }
                                      #navbar ul {
    ul { list-style-type: none; }       list-style-type: none; }
    li {                              #navbar li {
      float: left;                      float: left; }
      a { font-weight: bold; }          #navbar li a {
    }                                     font-weight: bold; }
}
even properties
         are nestable!
/* style.scss */     /* style.css */
.fakeshadow {        .fakeshadow {
  border: {            border-style: solid;
    style: solid;      border-left-width: 4px;
    left: {            border-left-color: #888;
      width: 4px;      border-right-width: 2px;
      color: #888;     border-right-color: #ccc; }
    }
    right: {
      width: 2px;
      color: #ccc;
    }
  }
}
use the & (parent reference)
    i.e. for pseudoclasses
/* style.scss */                  /* style.css */
a {                               a {
  color: #ce4dd6;                   color: #ce4dd6; }
  &:hover { color: #ffb3ff; }       a:hover {
  &:visited { color: #c458cb; }       color: #ffb3ff; }
  .module &{                        a:visited {
  !color: red;                        color: #c458cb; }
  }                                 .module a {
}                                     color: red; }
Variables!
define standard settings and
 reuse across your project
/* style.scss */                  /* style.css */
                                  #navbar {
$main-color: #ce4dd6;               border-bottom-color: #ce4dd6;
$style: solid;                      border-bottom-style: solid; }

#navbar {                         a {
  border-bottom: {                  color: #ce4dd6; }
    color: $main-color;             a:hover {
    style: $style;                    border-bottom: solid 1px; }
  }
}

a {
  color: $main-color;
  &:hover {
     border-bottom: $style 1px;
  }
}
built in functions!
modify and transform
/* style.scss */                       /* style.css */
$linkcolor: #ce4dd6;                   a {
                                         color: #ce4dd6; }
a {
                                         a:hover {
  color: $linkcolor;
                                           color: #f0c9f3; }
  &:hover {
                                         a:active {
    color: lighten($linkcolor, 30%);
                                           color: #6b1a70; }
  }
  &:active {
    color: darken($linkcolor, 30%);
  }
}
calculate!
Boundary of the content container




height            width




         margin             padding
                  border
the Box Model
  content area width
   + left padding
   + right padding
   + left border
   + right border

  = total box width
calculate the s**t out
        of the Box Model!
/* style.scss */                     /* style.css */
                                     .box {
$box-width : 100px;                    margin: 10px;
$box-border : 3px;                     padding: 10px;
$box-padding : 10px;                   border: 3px solid black;
$box-margin : 10px;                    width: 74px; }

.box{
! margin : $box-margin;
! padding : $box-padding;
! border: $box-border solid black;
! width : $box-width
! !     ! - $box-border * 2
! ! !     - $box-padding * 2;
}
@import
@import?
isn’t that in CSS already?
         Yes it is - but...
combine them instead of
loading one after the other!
  /* style.scss */       /* style.css */
                         .box {
  @import 'box-model';     width: 74px;
  @import 'calculate';     margin: 10px; }
  @import 'function';
                         #navbar {
                           width: 800px; }
                           #navbar li {
                             float: left;
                             width: 150px; }

                         a {
                           color: #ce4dd6; }
                           a:hover {
                             color: #f0c9f3; }
                           a:active {
                             color: #6b1a70; }
http://compass-style.org/
“Compass is an open-
source CSS Authoring
    Framework.”
           -- the Compass website
“Compass is an excellent set of
ready made and well documented
CSS3 mixins, functions and helpers
 that make SASS more awesome”
                              -- me
$ sudo gem update --system
$ sudo gem install compass
$ cd <myproject>
$ compass install bare
$ compass watch
CSS3 mixins
•   Appearance          •   Flexbox

•   Background Clip     •   Box Shadow

•   Background Origin   •   Box Sizing

•   Background Size     •   Columns

•   Border Radius       •   Filter
CSS3 mixins
•   Font Face         •   CSS Regions

•   Hyphenation       •   Text Shadow

•   Gradients         •   Transform

•   Inline Block      •   Transition

•   Opacity
http://dir.kg/box.ftw
/* style.scss */
.box{
  $experimental-support-for-svg: true;
  @include background-image(
  !linear-gradient(
  !! left,
  !! #2ac363, #cd8c14, #9c4cc2
  !)
  );
  width: 80px;
  height: 80px;
}
/* style.css */
.box {
  background-image: url('data:image/svg
+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2
ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM
+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblV
zZSIgeDE9IjAlIiB5MT0iNTAlIiB4Mj0iMTAwJSIgeTI9IjUwJSI
+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJhYzM2MyIvPjxzdG9wIG9mZnNldD0
iNTAlIiBzdG9wLWNvbG9yPSIjY2Q4YzE0Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWN
vbG9yPSIjOWM0Y2MyIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM
+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJ
sKCNncmFkKSIgLz48L3N2Zz4g');
  background-size: 100%;
  background-image: -webkit-gradient(linear, 0% 50%, 100% 50%, color-
stop(0%, #2ac363), color-stop(50%, #cd8c14), color-stop(100%, #9c4cc2));
  background-image: -webkit-linear-gradient(left, #2ac363, #cd8c14,
#9c4cc2);
  background-image: -moz-linear-gradient(left, #2ac363, #cd8c14,
#9c4cc2);
  background-image: -o-linear-gradient(left, #2ac363, #cd8c14, #9c4cc2);
  background-image: -ms-linear-gradient(left, #2ac363, #cd8c14,
#9c4cc2);
  background-image: linear-gradient(left, #2ac363, #cd8c14, #9c4cc2);
  width: 80px;
  height: 80px;
}
http://dir.kg/ultimate
http://csshat.com/
best practices built in
/* style.scss */           /* style.css */
.inline-box{               .inline-box {
! @include inline-block;     display: -moz-inline-box;
}                            -moz-box-orient: vertical;
                             display: inline-block;
                             vertical-align: middle;
                             *vertical-align: auto;
                           }

                           .inline-box {
                             *display: inline;
                           }
best practices built in
/* style.scss */       /* style.css */
.box{                  .box {
! @include clearfix;     overflow: hidden;
}                        *zoom: 1;
                       }
best practices built in
/* style.scss */           /* style.css */

.other-box{                .other-box {
! @include pie-clearfix;     *zoom: 1;
}                          }
                           .other-box:after {
                             content: "";
                             display: table;
                             clear: both;
                           }
helpers
did you *EVER* expect
        Sprites to be fun?
@import "compass";           .icon-sprite, .icon-mail-attachment,
                             .icon-mail-delete, .icon-mail-reply {
@import "icon/*.png";          background:
                                 url('../images/icon-s10b2c68b42.png')
@include all-icon-sprites;       no-repeat;
                             }
                             .icon-mail-attachment {
                               background-position: -26px -2771px;
                             }
                             .icon-mail-delete {
                               background-position: -27px -2658px;
                             }
                             ...
@import "compass";

$icon-spacing: 100px;
$icon-position: 50%;

@import "icon/*.png";

.attachment{
    @include icon-sprite(mail-attachment);
}
.delete{
    @include icon-sprite(mail-delete);
}
.reply{
    @include icon-sprite(mail-reply);
}
@import "compass";

$icon-layout: diagonal;

@import "icon/*.png";

.attachment{
    @include icon-sprite(mail-attachment);
}
.delete{
    @include icon-sprite(mail-delete);
}
.reply{
    @include icon-sprite(mail-reply);
}
.attachment{                       .attachment {
  background:                        background: url('data:image/
    inline-image(                  png;base64,iVBORw0KGgoAAAANSUh
      'icon/mail-attachment.png'   EUgAAAA0AAAAOBAMAAAAGUYvhAAAAA
    ) no-repeat;                   3NCSVQICAjb4U/gAAAAHlBMVEX///
}                                  8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                                   AAAAAACGjDitAAAACnRSTlMAESIzRF
                                   Vmd4iZu4Nz1gAAAAlwSFlzAAALEgAA
                                   CxIB0t1+/
                                   AAAABR0RVh0Q3JlYXRpb24gVGltZQA
                                   0LzQvMTI1uCR/
                                   AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZS
                                   BGaXJld29ya3MgQ1M0BrLToAAAAFNJ
                                   REFUCJljYAACjWkCIIqpRSwBzDVgLg
                                   BxGwTEA0Bc9sAyMLdMPAHMTSxjhHKb
                                   GBg4DAvLOBQYGNQZ1EFcBg2gEJDLwG
                                   HAAuIyMJangg1nYARTACNTDXDO7nbI
                                   AAAAAElFTkSuQmCC') no-repeat;
                                   }
                                   ...
li{
! padding-left:
     image-width(
       'icon/mail-attachment.png'
     ) + 10;
! background-repeat:no-repeat;
}
That’s nice and all but
now I can’t debug my
CSS in the Inspector
  anymore, right?
FireSass for Firefox




    http://dir.kg/firesass
Sass-Sleuth for Webkits




     http://dir.kg/sass-sleuth
needs --debug-info
 /* config.rb */

 sass_options = {:debuginfo => true}

@media -sass-debug-info{filename{font-family:file:/
//Users/user/Documents/project/src/scss/
_defaults.scss}line{font-family:00003213}}
#x-main hr {
    height: 1px;
    margin: 36px 0;
    background-color: #e3e3e3;
    border: 0;
}
please welcome
   the others:
please welcome
         the others:

• Less:
  http://lesscss.org
• Stylus:
  http://learnboost.github.com/stylus/
SASS ultimately won out because it's
   the most mature, easiest to find
 information and help about, seems
 to have the most active and robust
development, and has the least bugs.
                       -- Chris Coyier, just recently




 http://css-tricks.com/musings-on-preprocessing/
thank you :-)

•http://dir.kg/me
•http://dir.kg/twitter
•http://dir.kg/github
•http://dir.kg/slides

Wanna play with a the new toys?
I’m looking for a new teammate!
•http://dir.kg/job

More Related Content

What's hot

SPI server centric SEO compatible stateless web sites... ALLELUIA!
SPI server centric SEO compatible stateless web sites... ALLELUIA!SPI server centric SEO compatible stateless web sites... ALLELUIA!
SPI server centric SEO compatible stateless web sites... ALLELUIA!Jose María Arranz
 
Joomla!Day 2013 Nürnberg; Vortrag von Johannes Hock
Joomla!Day 2013 Nürnberg; Vortrag von Johannes HockJoomla!Day 2013 Nürnberg; Vortrag von Johannes Hock
Joomla!Day 2013 Nürnberg; Vortrag von Johannes HockadhocgraFX
 
Survey of Front End Topics in Rails
Survey of Front End Topics in RailsSurvey of Front End Topics in Rails
Survey of Front End Topics in RailsBenjamin Vandgrift
 
How to choose a web framework and be surprised
How to choose a web framework and be surprisedHow to choose a web framework and be surprised
How to choose a web framework and be surprisedJose María Arranz
 
LESS CSS Pre-processor
LESS CSS Pre-processorLESS CSS Pre-processor
LESS CSS Pre-processorKannika Kong
 
Big Design Conference: CSS3
Big Design Conference: CSS3 Big Design Conference: CSS3
Big Design Conference: CSS3 Wynn Netherland
 
Accelerated Native Mobile Development with the Ti gem
Accelerated Native Mobile Development with the Ti gemAccelerated Native Mobile Development with the Ti gem
Accelerated Native Mobile Development with the Ti gemWynn Netherland
 
CSS 開發加速指南-Sass & Compass
CSS 開發加速指南-Sass & CompassCSS 開發加速指南-Sass & Compass
CSS 開發加速指南-Sass & CompassLucien Lee
 
Jacob Waller: Webifying Titanium Development
Jacob Waller: Webifying Titanium DevelopmentJacob Waller: Webifying Titanium Development
Jacob Waller: Webifying Titanium DevelopmentAxway Appcelerator
 
iPhone Web Applications: HTML5, CSS3 & dev tips for iPhone development
iPhone Web Applications: HTML5, CSS3 & dev tips for iPhone developmentiPhone Web Applications: HTML5, CSS3 & dev tips for iPhone development
iPhone Web Applications: HTML5, CSS3 & dev tips for iPhone developmentEstelle Weyl
 
LESS(CSS preprocessor)
LESS(CSS preprocessor)LESS(CSS preprocessor)
LESS(CSS preprocessor)VIPIN KUMAR
 
3 Steps to Make Better & Faster Frontends
3 Steps to Make Better & Faster Frontends3 Steps to Make Better & Faster Frontends
3 Steps to Make Better & Faster FrontendsNico Hagenburger
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIDirk Ginader
 
Compass, Sass, and the Enlightened CSS Developer
Compass, Sass, and the Enlightened CSS DeveloperCompass, Sass, and the Enlightened CSS Developer
Compass, Sass, and the Enlightened CSS DeveloperWynn Netherland
 
3 ways-to-create-sprites-in-rails
3 ways-to-create-sprites-in-rails3 ways-to-create-sprites-in-rails
3 ways-to-create-sprites-in-railsNico Hagenburger
 
How to configure with Spring an api not based on Spring
How to configure with Spring an api not based on SpringHow to configure with Spring an api not based on Spring
How to configure with Spring an api not based on SpringJose María Arranz
 
Pane web & salame 3 - Un bel tagliere di storie dal web
Pane web & salame 3 - Un bel tagliere di storie dal webPane web & salame 3 - Un bel tagliere di storie dal web
Pane web & salame 3 - Un bel tagliere di storie dal webGummy Industries
 

What's hot (20)

SPI server centric SEO compatible stateless web sites... ALLELUIA!
SPI server centric SEO compatible stateless web sites... ALLELUIA!SPI server centric SEO compatible stateless web sites... ALLELUIA!
SPI server centric SEO compatible stateless web sites... ALLELUIA!
 
Joomla!Day 2013 Nürnberg; Vortrag von Johannes Hock
Joomla!Day 2013 Nürnberg; Vortrag von Johannes HockJoomla!Day 2013 Nürnberg; Vortrag von Johannes Hock
Joomla!Day 2013 Nürnberg; Vortrag von Johannes Hock
 
Survey of Front End Topics in Rails
Survey of Front End Topics in RailsSurvey of Front End Topics in Rails
Survey of Front End Topics in Rails
 
How to choose a web framework and be surprised
How to choose a web framework and be surprisedHow to choose a web framework and be surprised
How to choose a web framework and be surprised
 
LESS CSS Pre-processor
LESS CSS Pre-processorLESS CSS Pre-processor
LESS CSS Pre-processor
 
Big Design Conference: CSS3
Big Design Conference: CSS3 Big Design Conference: CSS3
Big Design Conference: CSS3
 
Accelerated Native Mobile Development with the Ti gem
Accelerated Native Mobile Development with the Ti gemAccelerated Native Mobile Development with the Ti gem
Accelerated Native Mobile Development with the Ti gem
 
CSS 開發加速指南-Sass & Compass
CSS 開發加速指南-Sass & CompassCSS 開發加速指南-Sass & Compass
CSS 開發加速指南-Sass & Compass
 
Jacob Waller: Webifying Titanium Development
Jacob Waller: Webifying Titanium DevelopmentJacob Waller: Webifying Titanium Development
Jacob Waller: Webifying Titanium Development
 
iPhone Web Applications: HTML5, CSS3 & dev tips for iPhone development
iPhone Web Applications: HTML5, CSS3 & dev tips for iPhone developmentiPhone Web Applications: HTML5, CSS3 & dev tips for iPhone development
iPhone Web Applications: HTML5, CSS3 & dev tips for iPhone development
 
LESS(CSS preprocessor)
LESS(CSS preprocessor)LESS(CSS preprocessor)
LESS(CSS preprocessor)
 
3 Steps to Make Better & Faster Frontends
3 Steps to Make Better & Faster Frontends3 Steps to Make Better & Faster Frontends
3 Steps to Make Better & Faster Frontends
 
Big Frontends Made Simple
Big Frontends Made SimpleBig Frontends Made Simple
Big Frontends Made Simple
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp II
 
Taking your Web App for a walk
Taking your Web App for a walkTaking your Web App for a walk
Taking your Web App for a walk
 
Compass, Sass, and the Enlightened CSS Developer
Compass, Sass, and the Enlightened CSS DeveloperCompass, Sass, and the Enlightened CSS Developer
Compass, Sass, and the Enlightened CSS Developer
 
3 ways-to-create-sprites-in-rails
3 ways-to-create-sprites-in-rails3 ways-to-create-sprites-in-rails
3 ways-to-create-sprites-in-rails
 
How to configure with Spring an api not based on Spring
How to configure with Spring an api not based on SpringHow to configure with Spring an api not based on Spring
How to configure with Spring an api not based on Spring
 
JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Pane web & salame 3 - Un bel tagliere di storie dal web
Pane web & salame 3 - Un bel tagliere di storie dal webPane web & salame 3 - Un bel tagliere di storie dal web
Pane web & salame 3 - Un bel tagliere di storie dal web
 

Similar to HTML5 Dev Conf - Sass, Compass & the new Webdev tools

Ease into HTML5 and CSS3
Ease into HTML5 and CSS3Ease into HTML5 and CSS3
Ease into HTML5 and CSS3Brian Moon
 
[Worskhop Summits] CSS3 Workshop
[Worskhop Summits] CSS3 Workshop[Worskhop Summits] CSS3 Workshop
[Worskhop Summits] CSS3 WorkshopChristopher Schmitt
 
About Best friends - HTML, CSS and JS
About Best friends - HTML, CSS and JSAbout Best friends - HTML, CSS and JS
About Best friends - HTML, CSS and JSNaga Harish M
 
CSS3: The Future is Now at DrupalCon San Francisco
CSS3: The Future is Now at DrupalCon San FranciscoCSS3: The Future is Now at DrupalCon San Francisco
CSS3: The Future is Now at DrupalCon San FranciscoJen Simmons
 
CSS3: the new style council
CSS3: the new style councilCSS3: the new style council
CSS3: the new style councilChris Mills
 
CSS3: Are you experienced?
CSS3: Are you experienced?CSS3: Are you experienced?
CSS3: Are you experienced?Denise Jacobs
 
[WebVisions 2010] CSS3 Workshop (Afternoon)
[WebVisions 2010] CSS3 Workshop (Afternoon)[WebVisions 2010] CSS3 Workshop (Afternoon)
[WebVisions 2010] CSS3 Workshop (Afternoon)Christopher Schmitt
 
Modern Front-End Development
Modern Front-End DevelopmentModern Front-End Development
Modern Front-End Developmentmwrather
 
It's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking ModernizrIt's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking ModernizrMichael Enslow
 
HTML5 應用程式開發簡介
HTML5 應用程式開發簡介HTML5 應用程式開發簡介
HTML5 應用程式開發簡介Timothy Chien
 
Rapid Prototyping
Rapid PrototypingRapid Prototyping
Rapid PrototypingEven Wu
 
UIWebViewでつくるUI
UIWebViewでつくるUIUIWebViewでつくるUI
UIWebViewでつくるUIcocopon
 
From PSD to WordPress Theme: Bringing designs to life
From PSD to WordPress Theme: Bringing designs to lifeFrom PSD to WordPress Theme: Bringing designs to life
From PSD to WordPress Theme: Bringing designs to lifeDerek Christensen
 

Similar to HTML5 Dev Conf - Sass, Compass & the new Webdev tools (20)

Css3 101
Css3 101Css3 101
Css3 101
 
Ease into HTML5 and CSS3
Ease into HTML5 and CSS3Ease into HTML5 and CSS3
Ease into HTML5 and CSS3
 
[heweb11] CSS3 Makeover
[heweb11] CSS3 Makeover[heweb11] CSS3 Makeover
[heweb11] CSS3 Makeover
 
[Worskhop Summits] CSS3 Workshop
[Worskhop Summits] CSS3 Workshop[Worskhop Summits] CSS3 Workshop
[Worskhop Summits] CSS3 Workshop
 
About Best friends - HTML, CSS and JS
About Best friends - HTML, CSS and JSAbout Best friends - HTML, CSS and JS
About Best friends - HTML, CSS and JS
 
CSS3: The Future is Now at DrupalCon San Francisco
CSS3: The Future is Now at DrupalCon San FranciscoCSS3: The Future is Now at DrupalCon San Francisco
CSS3: The Future is Now at DrupalCon San Francisco
 
CSS3: the new style council
CSS3: the new style councilCSS3: the new style council
CSS3: the new style council
 
CSS3 3D Workshop
CSS3 3D WorkshopCSS3 3D Workshop
CSS3 3D Workshop
 
Echo HTML5
Echo HTML5Echo HTML5
Echo HTML5
 
CSS3: Are you experienced?
CSS3: Are you experienced?CSS3: Are you experienced?
CSS3: Are you experienced?
 
Responsive design
Responsive designResponsive design
Responsive design
 
[WebVisions 2010] CSS3 Workshop (Afternoon)
[WebVisions 2010] CSS3 Workshop (Afternoon)[WebVisions 2010] CSS3 Workshop (Afternoon)
[WebVisions 2010] CSS3 Workshop (Afternoon)
 
Modern Front-End Development
Modern Front-End DevelopmentModern Front-End Development
Modern Front-End Development
 
It's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking ModernizrIt's a Mod World - A Practical Guide to Rocking Modernizr
It's a Mod World - A Practical Guide to Rocking Modernizr
 
HTML5 應用程式開發簡介
HTML5 應用程式開發簡介HTML5 應用程式開發簡介
HTML5 應用程式開發簡介
 
Rapid Prototyping
Rapid PrototypingRapid Prototyping
Rapid Prototyping
 
UIWebViewでつくるUI
UIWebViewでつくるUIUIWebViewでつくるUI
UIWebViewでつくるUI
 
Look ma! No images!
Look ma! No images!Look ma! No images!
Look ma! No images!
 
CSS for Mobile
CSS for MobileCSS for Mobile
CSS for Mobile
 
From PSD to WordPress Theme: Bringing designs to life
From PSD to WordPress Theme: Bringing designs to lifeFrom PSD to WordPress Theme: Bringing designs to life
From PSD to WordPress Theme: Bringing designs to life
 

More from Dirk Ginader

Making your Angular.js Application accessible
Making your Angular.js Application accessibleMaking your Angular.js Application accessible
Making your Angular.js Application accessibleDirk Ginader
 
Teach your Browser new tricks
Teach your Browser new tricksTeach your Browser new tricks
Teach your Browser new tricksDirk Ginader
 
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]Dirk Ginader
 
Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Dirk Ginader
 
Javascript done right - Open Web Camp III
Javascript done right - Open Web Camp IIIJavascript done right - Open Web Camp III
Javascript done right - Open Web Camp IIIDirk Ginader
 
The accessibility features of Yahoo! Finance
The accessibility features of Yahoo! FinanceThe accessibility features of Yahoo! Finance
The accessibility features of Yahoo! FinanceDirk Ginader
 
Javascript done right
Javascript done rightJavascript done right
Javascript done rightDirk Ginader
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Dirk Ginader
 
Das Web Als Datenbank Mit Yql Und Pipes
Das Web Als Datenbank Mit Yql Und PipesDas Web Als Datenbank Mit Yql Und Pipes
Das Web Als Datenbank Mit Yql Und PipesDirk Ginader
 
Die 5 Ebenen Barriererfreier Web Entwicklung
Die 5 Ebenen Barriererfreier Web EntwicklungDie 5 Ebenen Barriererfreier Web Entwicklung
Die 5 Ebenen Barriererfreier Web EntwicklungDirk Ginader
 
The 5 Layers of Web Accessibility
The 5 Layers of Web AccessibilityThe 5 Layers of Web Accessibility
The 5 Layers of Web AccessibilityDirk Ginader
 
Accessible Javascript with and without WAI ARIA
Accessible Javascript with and without WAI ARIAAccessible Javascript with and without WAI ARIA
Accessible Javascript with and without WAI ARIADirk Ginader
 
Avoiding common Accessibility mistakes
Avoiding common Accessibility mistakesAvoiding common Accessibility mistakes
Avoiding common Accessibility mistakesDirk Ginader
 
Accessible Javascript using Frameworks - Barcamp London 5
Accessible Javascript using Frameworks - Barcamp London 5Accessible Javascript using Frameworks - Barcamp London 5
Accessible Javascript using Frameworks - Barcamp London 5Dirk Ginader
 
Accessible Javascript mit Frameworks - Best of Accessibility 2008
Accessible Javascript mit Frameworks - Best of Accessibility 2008Accessible Javascript mit Frameworks - Best of Accessibility 2008
Accessible Javascript mit Frameworks - Best of Accessibility 2008Dirk Ginader
 
Accessible Javascript - Barcamp Brighton 2
Accessible Javascript - Barcamp Brighton 2Accessible Javascript - Barcamp Brighton 2
Accessible Javascript - Barcamp Brighton 2Dirk Ginader
 

More from Dirk Ginader (16)

Making your Angular.js Application accessible
Making your Angular.js Application accessibleMaking your Angular.js Application accessible
Making your Angular.js Application accessible
 
Teach your Browser new tricks
Teach your Browser new tricksTeach your Browser new tricks
Teach your Browser new tricks
 
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
 
Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!
 
Javascript done right - Open Web Camp III
Javascript done right - Open Web Camp IIIJavascript done right - Open Web Camp III
Javascript done right - Open Web Camp III
 
The accessibility features of Yahoo! Finance
The accessibility features of Yahoo! FinanceThe accessibility features of Yahoo! Finance
The accessibility features of Yahoo! Finance
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010
 
Das Web Als Datenbank Mit Yql Und Pipes
Das Web Als Datenbank Mit Yql Und PipesDas Web Als Datenbank Mit Yql Und Pipes
Das Web Als Datenbank Mit Yql Und Pipes
 
Die 5 Ebenen Barriererfreier Web Entwicklung
Die 5 Ebenen Barriererfreier Web EntwicklungDie 5 Ebenen Barriererfreier Web Entwicklung
Die 5 Ebenen Barriererfreier Web Entwicklung
 
The 5 Layers of Web Accessibility
The 5 Layers of Web AccessibilityThe 5 Layers of Web Accessibility
The 5 Layers of Web Accessibility
 
Accessible Javascript with and without WAI ARIA
Accessible Javascript with and without WAI ARIAAccessible Javascript with and without WAI ARIA
Accessible Javascript with and without WAI ARIA
 
Avoiding common Accessibility mistakes
Avoiding common Accessibility mistakesAvoiding common Accessibility mistakes
Avoiding common Accessibility mistakes
 
Accessible Javascript using Frameworks - Barcamp London 5
Accessible Javascript using Frameworks - Barcamp London 5Accessible Javascript using Frameworks - Barcamp London 5
Accessible Javascript using Frameworks - Barcamp London 5
 
Accessible Javascript mit Frameworks - Best of Accessibility 2008
Accessible Javascript mit Frameworks - Best of Accessibility 2008Accessible Javascript mit Frameworks - Best of Accessibility 2008
Accessible Javascript mit Frameworks - Best of Accessibility 2008
 
Accessible Javascript - Barcamp Brighton 2
Accessible Javascript - Barcamp Brighton 2Accessible Javascript - Barcamp Brighton 2
Accessible Javascript - Barcamp Brighton 2
 

HTML5 Dev Conf - Sass, Compass & the new Webdev tools

  • 1. Dirk Ginader | Yahoo! Inc. Sass, Compass & the new Webdev tools @ginader
  • 2. “CSS Precompilers are useless. I don’t need them. I can write CSS myself.” -- me, early 2010
  • 3. “CSS3 is awesome! Browsers can now do rounded corners and Everything!” -- me, about the same time
  • 4. “Damn! writing all those Browser prefixes is tedious...” -- me, immediately afterwards
  • 5. “WOAH! Livereload makes me forget about ⌘R!” -- me, mid 2011
  • 6.
  • 8. “The Web Developer Wonderland (a happy land where browsers don't need a Refresh button) CSS edits and image changes apply live. CoffeeScript, Sass, LESS and others just work.” -- the Livereload website
  • 9. “What does LiveReload do? LiveReload monitors changes in the file system. As soon as you save a file, it is preprocessed as needed, and the browser is refreshed. Even cooler, when you change a CSS file or an image, the browser is updated instantly without reloading the page.” -- the Livereload website
  • 10. writing 8 lines of CSS to create 1 simple cross browser gradient is a PITA... -- everybody, all the time
  • 11. .box_gradient { // Old browsers background: black; // FF3.6+ background: -moz-linear-gradient(top, black 0%, white 100%); // Chrome,Safari4+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, black), color-stop(100%, white)); // Chrome10+,Safari5.1+ background: -webkit-linear-gradient(top, black 0%, white 100%); // Opera 11.10+ background: -o-linear-gradient(top, black 0%, white 100%); // IE10+ background: -ms-linear-gradient(top, black 0%, white 100%); // W3C standard background: linear-gradient(to bottom, black 0%, white 100%); // IE6-9 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='black',endColorstr='white',GradientType=0); }
  • 14. Codekit != Livereload • Does almost the same • BUT: • compiles all the CSS • it only auto reloads Preprocessors webkit browsers on your Mac (it controls • Lints your Javascript them using AppleScript • optimizes your Images • no Firefox or Opera • combo handles your CSS and Javascript • no mobile Devices ;-(
  • 15. well if it’s *THAT* easy I could as well give it a try, right? me, after having seen this toggle countless times...
  • 17. “Sass makes CSS fun again. Sass is an extension of CSS3, adding nested rules, variables, mixins, selector inheritance, and more. It’s translated to well-formatted, standard CSS using the command line tool or a web-framework plugin.” -- the Sass Website
  • 19.
  • 20. $ sudo gem install sass
  • 21. alright - let’s see what this can do...
  • 23. reusable chunks of code /* style.scss */ @mixin linear-gradient { background-image: linear-gradient(top, #444, #999); } .box-with-gradient { @include linear-gradient; } .another-box-with-same-gradient { @include linear-gradient; }
  • 24. $ sass --watch style.scss:style.css you don’t need that thanks to Livereload :-)
  • 25. $ sass --watch my/sass:my/css you don’t need that thanks to Livereload :-)
  • 26. becomes /* style.css */ .box-with-gradient { background-image: linear-gradient(top, #444, #999); } .another-box-with-same-gradient { background-image: linear-gradient(top, #444, #999); }
  • 27. Mixins can have Params /* style.scss */ @mixin linear-gradient($from, $to) { background-image: linear-gradient(top, $from, $to); }
  • 28. /* style.scss */ @mixin linear-gradient($from, $to){ ! // Old browsers ! background: $from; ! // FF3.6+ ! background: -moz-linear-gradient(top, $from 0%, $to 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, $from), color-stop(100%, $to)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, $from 0%, $to 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, $from 0%, $to 100%); ! // IE10+ ! background: -ms-linear-gradient(top, $from 0%, $to 100%); ! // W3C standard ! background: linear-gradient(to bottom, $from 0%, $to 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! startColorstr='$from', ! ! endColorstr='$to',GradientType=0 ! ); }
  • 29. /* style.scss */ .box_gradient { @include linear-gradient(#444444, #999999); }
  • 30. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 31. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 32. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 33. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 34. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 35. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 36. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 37. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 38. /* style.scss */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( HUH? ! ! ! ! startColorstr='$from', ! ! ! ! endColorstr='$to',GradientType=0 ! ! ! ); }
  • 39.
  • 41. /* style.scss */ @mixin linear-gradient($from, $to){ ! // Old browsers ! background: $from; ! // FF3.6+ ! background: -moz-linear-gradient(top, $from 0%, $to 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, $from), color-stop(100%, $to)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, $from 0%, $to 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, $from 0%, $to 100%); ! // IE10+ ! background: -ms-linear-gradient(top, $from 0%, $to 100%); ! // W3C standard ! background: linear-gradient(to bottom, $from 0%, $to 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! startColorstr='#{$from}', ! ! endColorstr='#{$to}',GradientType=0 ! ); }
  • 42. /* style.scss */ .box_gradient { @include linear-gradient(#444444, #999999); }
  • 43. /* style.css */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='#444', ! ! ! ! endColorstr='#999',GradientType=0 ! ! ! ); }
  • 44. /* style.css */ .box_gradient{ ! // Old browsers ! background: #444; ! // FF3.6+ ! background: -moz-linear-gradient(top, #444 0%, #999 100%); ! // Chrome,Safari4+ ! background: -webkit-gradient(linear, left top, left bottom, ! ! ! ! ! color-stop(0%, #444), color-stop(100%, #999)); ! // Chrome10+,Safari5.1+ ! background: -webkit-linear-gradient(top, #444 0%, #999 100%); ! // Opera 11.10+ ! background: -o-linear-gradient(top, #444 0%, #999 100%); ! // IE10+ ! background: -ms-linear-gradient(top, #444 0%, #999 100%); ! // W3C standard ! background: linear-gradient(to bottom, #444 0%, #999 100%); ! // IE6-9 ! filter: progid:DXImageTransform.Microsoft.gradient( ! ! ! ! startColorstr='#444', ! ! ! ! endColorstr='#999',GradientType=0 ! ! ! ); }
  • 45. write once and reuse /* style.scss */ .box-with-gradient { @include linear-gradient(#444444, #999999); } .box-with-another-gradient { @include linear-gradient(#000, #fff); }
  • 46. wait - I never have to write prefixes again? Ever?
  • 47.
  • 48. Ok. I’m convinced - what else do we have?
  • 50. no more repetitive selector writing! /* style.scss */ /* style.css */ #navbar { #navbar { width: 80%; width: 80%; height: 23px; height: 23px; } #navbar ul { ul { list-style-type: none; } list-style-type: none; } li { #navbar li { float: left; float: left; } a { font-weight: bold; } #navbar li a { } font-weight: bold; } }
  • 51. even properties are nestable! /* style.scss */ /* style.css */ .fakeshadow { .fakeshadow { border: { border-style: solid; style: solid; border-left-width: 4px; left: { border-left-color: #888; width: 4px; border-right-width: 2px; color: #888; border-right-color: #ccc; } } right: { width: 2px; color: #ccc; } } }
  • 52.
  • 53. use the & (parent reference) i.e. for pseudoclasses /* style.scss */ /* style.css */ a { a { color: #ce4dd6; color: #ce4dd6; } &:hover { color: #ffb3ff; } a:hover { &:visited { color: #c458cb; } color: #ffb3ff; } .module &{ a:visited { !color: red; color: #c458cb; } } .module a { } color: red; }
  • 55. define standard settings and reuse across your project /* style.scss */ /* style.css */ #navbar { $main-color: #ce4dd6; border-bottom-color: #ce4dd6; $style: solid; border-bottom-style: solid; } #navbar { a { border-bottom: { color: #ce4dd6; } color: $main-color; a:hover { style: $style; border-bottom: solid 1px; } } } a { color: $main-color; &:hover { border-bottom: $style 1px; } }
  • 57. modify and transform /* style.scss */ /* style.css */ $linkcolor: #ce4dd6; a { color: #ce4dd6; } a { a:hover { color: $linkcolor; color: #f0c9f3; } &:hover { a:active { color: lighten($linkcolor, 30%); color: #6b1a70; } } &:active { color: darken($linkcolor, 30%); } }
  • 59. Boundary of the content container height width margin padding border
  • 60.
  • 61. the Box Model content area width + left padding + right padding + left border + right border = total box width
  • 62. calculate the s**t out of the Box Model! /* style.scss */ /* style.css */ .box { $box-width : 100px; margin: 10px; $box-border : 3px; padding: 10px; $box-padding : 10px; border: 3px solid black; $box-margin : 10px; width: 74px; } .box{ ! margin : $box-margin; ! padding : $box-padding; ! border: $box-border solid black; ! width : $box-width ! ! ! - $box-border * 2 ! ! ! - $box-padding * 2; }
  • 64. @import? isn’t that in CSS already? Yes it is - but...
  • 65.
  • 66. combine them instead of loading one after the other! /* style.scss */ /* style.css */ .box { @import 'box-model'; width: 74px; @import 'calculate'; margin: 10px; } @import 'function'; #navbar { width: 800px; } #navbar li { float: left; width: 150px; } a { color: #ce4dd6; } a:hover { color: #f0c9f3; } a:active { color: #6b1a70; }
  • 67.
  • 69. “Compass is an open- source CSS Authoring Framework.” -- the Compass website
  • 70. “Compass is an excellent set of ready made and well documented CSS3 mixins, functions and helpers that make SASS more awesome” -- me
  • 71. $ sudo gem update --system $ sudo gem install compass
  • 72.
  • 73. $ cd <myproject> $ compass install bare $ compass watch
  • 74.
  • 75.
  • 76. CSS3 mixins • Appearance • Flexbox • Background Clip • Box Shadow • Background Origin • Box Sizing • Background Size • Columns • Border Radius • Filter
  • 77. CSS3 mixins • Font Face • CSS Regions • Hyphenation • Text Shadow • Gradients • Transform • Inline Block • Transition • Opacity
  • 79. /* style.scss */ .box{ $experimental-support-for-svg: true; @include background-image( !linear-gradient( !! left, !! #2ac363, #cd8c14, #9c4cc2 !) ); width: 80px; height: 80px; }
  • 80. /* style.css */ .box { background-image: url('data:image/svg +xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2 ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM +PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblV zZSIgeDE9IjAlIiB5MT0iNTAlIiB4Mj0iMTAwJSIgeTI9IjUwJSI +PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJhYzM2MyIvPjxzdG9wIG9mZnNldD0 iNTAlIiBzdG9wLWNvbG9yPSIjY2Q4YzE0Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWN vbG9yPSIjOWM0Y2MyIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM +PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJ sKCNncmFkKSIgLz48L3N2Zz4g'); background-size: 100%; background-image: -webkit-gradient(linear, 0% 50%, 100% 50%, color- stop(0%, #2ac363), color-stop(50%, #cd8c14), color-stop(100%, #9c4cc2)); background-image: -webkit-linear-gradient(left, #2ac363, #cd8c14, #9c4cc2); background-image: -moz-linear-gradient(left, #2ac363, #cd8c14, #9c4cc2); background-image: -o-linear-gradient(left, #2ac363, #cd8c14, #9c4cc2); background-image: -ms-linear-gradient(left, #2ac363, #cd8c14, #9c4cc2); background-image: linear-gradient(left, #2ac363, #cd8c14, #9c4cc2); width: 80px; height: 80px; }
  • 83. best practices built in /* style.scss */ /* style.css */ .inline-box{ .inline-box { ! @include inline-block; display: -moz-inline-box; } -moz-box-orient: vertical; display: inline-block; vertical-align: middle; *vertical-align: auto; } .inline-box { *display: inline; }
  • 84. best practices built in /* style.scss */ /* style.css */ .box{ .box { ! @include clearfix; overflow: hidden; } *zoom: 1; }
  • 85. best practices built in /* style.scss */ /* style.css */ .other-box{ .other-box { ! @include pie-clearfix; *zoom: 1; } } .other-box:after { content: ""; display: table; clear: both; }
  • 87. did you *EVER* expect Sprites to be fun? @import "compass"; .icon-sprite, .icon-mail-attachment, .icon-mail-delete, .icon-mail-reply { @import "icon/*.png"; background: url('../images/icon-s10b2c68b42.png') @include all-icon-sprites; no-repeat; } .icon-mail-attachment { background-position: -26px -2771px; } .icon-mail-delete { background-position: -27px -2658px; } ...
  • 88.
  • 89. @import "compass"; $icon-spacing: 100px; $icon-position: 50%; @import "icon/*.png"; .attachment{ @include icon-sprite(mail-attachment); } .delete{ @include icon-sprite(mail-delete); } .reply{ @include icon-sprite(mail-reply); }
  • 90. @import "compass"; $icon-layout: diagonal; @import "icon/*.png"; .attachment{ @include icon-sprite(mail-attachment); } .delete{ @include icon-sprite(mail-delete); } .reply{ @include icon-sprite(mail-reply); }
  • 91.
  • 92. .attachment{ .attachment { background: background: url('data:image/ inline-image( png;base64,iVBORw0KGgoAAAANSUh 'icon/mail-attachment.png' EUgAAAA0AAAAOBAMAAAAGUYvhAAAAA ) no-repeat; 3NCSVQICAjb4U/gAAAAHlBMVEX/// } 8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAACGjDitAAAACnRSTlMAESIzRF Vmd4iZu4Nz1gAAAAlwSFlzAAALEgAA CxIB0t1+/ AAAABR0RVh0Q3JlYXRpb24gVGltZQA 0LzQvMTI1uCR/ AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZS BGaXJld29ya3MgQ1M0BrLToAAAAFNJ REFUCJljYAACjWkCIIqpRSwBzDVgLg BxGwTEA0Bc9sAyMLdMPAHMTSxjhHKb GBg4DAvLOBQYGNQZ1EFcBg2gEJDLwG HAAuIyMJangg1nYARTACNTDXDO7nbI AAAAAElFTkSuQmCC') no-repeat; } ...
  • 93. li{ ! padding-left: image-width( 'icon/mail-attachment.png' ) + 10; ! background-repeat:no-repeat; }
  • 94. That’s nice and all but now I can’t debug my CSS in the Inspector anymore, right?
  • 95. FireSass for Firefox http://dir.kg/firesass
  • 96. Sass-Sleuth for Webkits http://dir.kg/sass-sleuth
  • 97. needs --debug-info /* config.rb */ sass_options = {:debuginfo => true} @media -sass-debug-info{filename{font-family:file:/ //Users/user/Documents/project/src/scss/ _defaults.scss}line{font-family:00003213}} #x-main hr { height: 1px; margin: 36px 0; background-color: #e3e3e3; border: 0; }
  • 98.
  • 99. please welcome the others:
  • 100. please welcome the others: • Less: http://lesscss.org • Stylus: http://learnboost.github.com/stylus/
  • 101. SASS ultimately won out because it's the most mature, easiest to find information and help about, seems to have the most active and robust development, and has the least bugs. -- Chris Coyier, just recently http://css-tricks.com/musings-on-preprocessing/
  • 102.
  • 103. thank you :-) •http://dir.kg/me •http://dir.kg/twitter •http://dir.kg/github •http://dir.kg/slides Wanna play with a the new toys? I’m looking for a new teammate! •http://dir.kg/job

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. new in Sass 3.2 that was released only a few weeks ago\n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n