Moreover these developers are not in the hype bandwagon (or they would be able to read SASSy/LESSy/whatever fashionable now), so they may need the most the said tutorials.
Moreover these developers are not in the hype bandwagon (or they would be able to read SASSy/LESSy/whatever fashionable now), so they may need the most the said tutorials.
So you know that Sass and Less allow you to nest rules, right? e.g.:
.foo {
p {
// rules go here
}
}
translates into .foo p { rules go here }Here are the examples from the article:
&:hover { opacity: 1; }
The ampersand simply means 'I am applied in the context of whatever rule I happen to be in'. So, .home { &:hover { } } is equivalent to writing this normal CSS: .home:hover {
}
@include is like #include in C. It literally includes the referenced content in the rules you're writing. That means that .home {
@include bg-size(60px,auto);
}
is including something that (inferring from the name, here) sets the background size for the element. Given the parameters, it probably expands into: .home {
background-size: 60px auto;
}
plus another rule for handling 2x images in Webkit.This is a variable. Nuff said.
$sprite_url_2x: "http://turbo.paulstamatiou.com/assets/pstam-sprite-v2-@2x.png";
make sense?I am sure these is some extra magic you are not telling us, but given that you are assuming we don't know about SASS and Less, you are obviously missing something important :)
His examples are simple, meant to give you an idea of how sass/less work on a basic level. But I'm currently working on site that is several thousand lines of CSS, employing enormously complex css structures. Pseudo-selectors are in use everywhere. As are complex gradients, shadows, sprites...
It's imperative to have some sort of organization in your code. Working with really long class names or IDs isn't an option.
For instance, on this project, we have a defined color set of colours. The red we're using is #c03838. The blue is #2767d1. A shadow used throughout the site is 1px 1px 3px rgba(0,0,0,0.2), and one of the gradients (used in a few places) looks like this when written out fully: http://i.imgur.com/YZi3f0B.png
It wouldn't make sense to memorize those values/strings. Not only that, but it would become a pain in the ass to change them in specific places over dozens of iterations if that becomes necessary. Instead, if I define things like $headline-color and $highlight-color, I can refer back to those in my header file, and change them throughout the site simply.
In the case of complex selectors, it becomes vastly more simple. Not only is your style sheet organized analogously to your dom tree, but it's infinitely more flexible, and doesn't require duplicate writing in the case of long chains.
Less/sass are a huge boon to front end development because they help you manage complexity. That won't come through in simple examples, but it should be obvious if you've ever written a stylesheet more than a few hundred lines long.
How does SASS/LESS solve this? Don't you still need the class names and IDs to hook it up with the DOM?
Say you're building a windows-style scrollbar:
|-> up arrow button
scrollbar --|-> track -> drag button
|-> down arrow button
Rather than having a CSS file (1) full of long, convoluted global class names: .scrollbar-frame{}
.scrollbar-button-up{}
.scrollbar-button-down{}
.scrollbar-track{}
.scroolbar-track-drag-button{}
or (2) full of overly-verbose endless trails (imagine how this gets when you're working with a complex object 5-6 levels deep) .scrollbar-frame{}
.scrollbar-frame > .button-up{}
.scrollbar-frame > .button-down{}
.scrollbar-frame > .track{}
.scrollbar-frame > .track > .drag-button{}
you can do this: .scrollbar-frame{
.button-up{}
.button-down{}
.track{
.drag-button{}
}
}
On compilation, you'll end up with a final result somewhat like example 2 -- but you weren't forced to write your first-level selector over and over the whole time. Your code also resembles the structure logic much closer at write time.It gets better, too. Let's say we wanted to define our buttons in the classic windows 95/98 style -- grey, with a 1px relief border. In the classic CSS style, using example 2 as a pattern, we'd have to do it this way, duplicating our definitions the whole way:
.scrollbar-frame{}
.scrollbar-frame > .button-up{
height: 20px;
width: 20px;
background: #ccc;
border-top: 1px solid #ddd;
border-left: 1px solid #ddd;
border-bottom: 1px solid #888;
border-right: 1px solid #888;
}
.scrollbar-frame > .button-down{
height: 20px;
width: 20px;
background: #ccc;
border-top: 1px solid #ddd;
border-left: 1px solid #ddd;
border-bottom: 1px solid #888;
border-right: 1px solid #888;
}
.scrollbar-frame > .track{}
.scrollbar-frame > .track > .drag-button{
width: 20px;
background: #ccc;
border-top: 1px solid #ddd;
border-left: 1px solid #ddd;
border-bottom: 1px solid #888;
border-right: 1px solid #888;
}
However, using SASS/LESS, we could define a mixin. Using SASS, here's how you'd achieve the exact same thing: //Define a mixin
@mixin greybtn{
width: 20px;
background: #ccc;
border-top: 1px solid #ddd;
border-left: 1px solid #ddd;
border-bottom: 1px solid #888;
border-right: 1px solid #888;
}
.scrollbar-frame{
.button-up{
height: 20px
@include greybtn; //Include our mixin.
}
.button-down{
height: 20px
@include greybtn;
}
.track{
.drag-button{
@include greybtn;
}
}
}
The resultant code will be almost exactly the same, but you just wrote a lot less to get there, and will have an easier time of modifying it in the future. You can see the massive benefit in both speed and organization this allows, especially on large projects.Plus, you could turn this into a mixin "function", with the actual colors of the states changed depending on where you include it.
So the way he writes it, you could have a green, blue, whatever version of those borders, with the same one line (plus a parameter), whereas in CSS you would have to do:
up-blue, up-red, up-green, down-blue, down-red, down-green etc classes.
a.btn {
&-primary,
&-info,
&-success,
&-warning,
&-danger {
&, &:link { color: #fff; }
}
}
Where the & is replaced with the previous mark, so it would create a.btn-primary, a.btn-info. You might still argue that you could get close to the amount of characters with vanilla CSS, but as soon as you have to change small bits of this, you end up refactoring a lot of code.With LESS and SASS, you have a built-in capability to refactor things very quickly.
In none of aaronbrethorst's examples were multiple terms put inside a single pair of { }. Now I can see the advantage, as (obviously) when writing CSS it is common to have a lot of repetition of the type this lets you reduce.
Now, I can see the purpose of LESS and SASS. Sometimes when explaining something to someone, the most useful feature can seem so obvious as to not need explaining.
Bulk indentation is one of the main reasons I switch over to vim for editing web text.
Nesting rules allow you to turn
.foo p {
}
.foo p a {
}
.foo p div {
}
into .foo {
p {
a {
}
div {
}
}
}
Less duplicate code and more obvious hierarchy.'&' context reference allows you to turn this.
.widget a.button { ... }
.widget a.button:hover { ... }
.widget a.button:active, .widget a.button:focus { ... }
Into .widget a.button {
...
&:hover { ... }
&:focus, &:active { ... }
}
Again, less duplication, less code to read/change. More obvious hierarchy.@includes is like writing function. Which is very useful when you have to write browser-specific style. You can define `round-border` mixin once.
@mixin round-border($radius) {
border-radius: $radius;
-moz-border-radius: $radius;
-webkit-border-radius: $radius;
}
.dialog {
@include round-border(10px);
}
.color-picker {
@include round-border(5px);
}
.button {
@include round-border(3px);
...
}
Is that less clear or harder to maintain than CSS version?You could say the same objections to anything you don't know. CSS, HTML, JS whatever.
When you try to use it and understand it you will see why its useful. Or, if you still don't find it useful, you will at least have a reason, besides "I don't know it".
I assure it they are very useful. I use LESS.
You can use as little or as much of LESS as you want. A valid CSS file is also valid LESS (just uses 0% of it's features). You can start using some features as you learn it.
For a simple example, in order not to repeat 100 times a color, you can save it as a variable:
@main_color: #ddd;
then you can use it in rules like this:
blockquote { color: @main_color; }
.logo { border: 1px solid @main_color; }
So changing all the colors in a site it's as easy as changing ONE line, not hunting for #ddd; everywhere.
Basically, LESS is to a CSS file, what a CSS file is to setting things directly on the style attribute of each element.
You wouldn't style each element directly on the page, right? You'd use a referenced CSS stylesheet. Well, for the same --or very similar-- reasons, I wouldn't use a mere CSS file anymore.
Since they don't use it every day due to setup woes, they can't easily read it fluently.
I was reluctant to try it as I feel like there are already so many moving configurable layers to my dev stack and all I could think was "I have this nice static css file here - I just include it and everything works" and the only real exposure I had had to LESS/SASS was exactly the same sort of context free dozen lines of mixin code that does something awesome in some blog post just like you are describing (which made it seem much more intimidating than it actually was).
Now here's the real kicker: I didn't realize that I already know how to code css in LESS. Since LESS is a superset of CSS you can take any CSS file (even one from an existing application) and put it through a LESS processor and get back a usable CSS file. This is awesome as it makes it possible to start using LESS in the middle of a project and it makes it very easy to slowly stop doing all of the soul crushing find+replace that takes forever working with CSS as you ramp up with LESS.
I'd really encourage you to give LESS (or SASS or whatever you find fashionable) a try - I think you'll like it. If you get stuck or need help shoot me an email (on my acct page).