LESS – ยุคใหม่ของ CSS – 2

จากความเดิมตอนที่แล้ว LESS – ยุคใหม่ของ CSS ไม่นึกว่าจะยาวขนาดนี้
เลยยกมาเป็น Part 2 ซะเลย มาเริ่มกันเลยดีกว่าครับ

Get Started #2

4. Nested rules การเขียนเป็น ชั้นๆ

Featured นี้สามารถทำให้เราเขียน CSS ได้ง่ายขึ้นมากครับ (แนะนำๆ)

// In LESS you can nest your rulesets.
// This is a very important feature because:
// -You don't have to write out repeating long
//  selectors
// -It helps to structurize your code

#content {
  width: 500px;
  a {
    color: white;

    // You can use the '&'-selector to
    // apply a nested selector to the
    // parent selector:
    &:hover {
      color: blue;
    }
    &.selected {
      color: yellow
    }
  }
}
#content {
  width: 500px;
}
#content a {
  color: white;
}
#content a:hover {
  color: blue;
}
#content a.selected {
  color: #ffff00;
}

5. Operations ก็เป็นการคำนวณคณิตศาสตร์ทั่วๆไปครับ

// In LESS you can operate on any number,
// color or variable.

// Basic operations
@base: 200px;
@height: @base * 2;
@min-width: @base + 100;
@max-width: (@min-width - 50) * 2;

.basic_operations {
  height: @height;
  min-width: @min-width;
  max-width: @max-width;
}

// Operating on colors:
@base-color: #444;

.color_operations {
  color: @base-color / 4;
  background-color: @base-color + #111;
}
// Output
.basic_operations {
  height: 400px;
  min-width: 300px;
  max-width: 500px;
}
.color_operations {
  color: #111111;
  background-color: #555555;
}

6. Color functions เป็น Function ที่ LESS มีมาให้นะครับเกี่ยวกับพวกสีต่างๆ

นอกจากหมวดสีแล้วยังมี อย่างอื่นด้วยนะครับ ลองเข้าไปชมที่ Official LESS documentation ได้เลยครับ

// Using the functions to set a property
// works as expected:
@base: #f04615;
.class {
  color: saturate(@base, 5%);
  background-color: lighten(spin(@base, 8), 25%);
}
// Output
.class {
  color: #f6430f;
  background-color: #f8b38d;
}

7. Namespaces

// In LESS you can use namespaces. This can
// help you to organize your code, and it
// offers you encapsulation.

// We declare the '.button'-mixin in the
// '#myNamespace' namespace.
#myNamespace {
  .button() {
    display: block;
    border: 1px solid black;
    background-color: grey;
    &:hover { 
      background-color: white;
    }
  }
}

// Using the '.button'-mixin:
#header a {
  color: red;
  #myNamespace > .button();
}
// Output
#header a {
  color: red;
  display: block;
  border: 1px solid black;
  background-color: grey;
}
#header a:hover {
  background-color: white;
}

ทำไมต้องมี Namespace ด้วยสร้าง mixin แบบ ธรรมดาไม่ได้หรอ ?

ประโยชน์ของ Namespace คือทำให้มันเปลี่ยนกลุ่มก้อนเดียวกันครับ
จะได้เข้าใจได้ง่ายว่ามันอยู่ในหมวดอะไร เช่น animation ของ css มันจะมีหลายแบบ
เวลาเราเรียกใช้ก็จะเป็น #animation > .animation(...) อะไรแบบนี้ครับ มันทำให้เป็นหมวดหมู่

// Animation
#animation {
  .animation(...) {
    -webkit-animation: @arguments;
       -moz-animation: @arguments;
        -ms-animation: @arguments;
         -o-animation: @arguments;
            animation: @arguments;
  }
  .animation-name(...) {
    -webkit-animation-name: @arguments;
       -moz-animation-name: @arguments;
        -ms-animation-name: @arguments;
         -o-animation-name: @arguments;
            animation-name: @arguments;
  }
  .animation-delay(...) {
    -webkit-animation-delay: @arguments;
       -moz-animation-delay: @arguments;
        -ms-animation-delay: @arguments;
         -o-animation-delay: @arguments;
            animation-delay: @arguments;
  }
}

8. Scope

// Scope in LESS is very similar to that of
// programming languages. Variables and mixins
// are first looked up locally, and if they
// aren't found, the compiler will look in the
// parent scope, and so on.

@var: red;

#page {
  @var: white;
  #header {
    color: @var; // white
  }
}
#footer {
  color: @var; // red  
}
// Output
#page #header {
  color: #ffffff;
}

#footer {
  color: #ff0000;
}

9. Comments

จะมี 2 แบบครับ ถ้า comment แบบ // จะไม่มีมาที่ Output CSS ครับ
แต่ถ้า comment แบบ /*...*/ ก็จะมีมาให้เห็นใน Output CSS

// CSS-style comments are preserved by LESS,
// LESS-style comments are 'silent', they
// don't show up in the compiled CSS output.

/* Hello, I'm a CSS-style comment */
// Hi, I'm a silent comment, I won't show up
// in your CSS
.class { color: black }
/* Hello, I'm a CSS-style comment */
.class {
  color: #000000;
}

10. Importing

จะเป็นการ import ไฟล์อื่นเข้ามาเพื่อทำให้เราเรียกใช้ mixin หรือ ตัวแปรที่เราได้กำหนดไว้ในไฟล์อื่นได้ครับ

// You can import .less files, and all the
// variables and mixins in them will be made
// available to the main file. The .less
// extension is optional, so both of these are
// valid:

// @import "lib.less";
// @import "lib";

// If you want to import a CSS file, and don't
// want LESS to process it, just use the .css
// extension:

// @import "lib.css";


// And to show that it works we import the
// winLESS.org LESS file:
@import "/style/less/main";

11. String interpolation ตัวแปร String นั่นเองครับ

// Variables can be embeded inside strings in
// a similar way to ruby or PHP, with the
// @{name} construct:

@base-url: "http://assets.fnord.com";
.container {
    background-image: url("@{base-url}/images/bg.png");
}
.container {
  background-image: url("http://assets.fnord.com/images/bg.png");
}

12. Escaping

จะช่วยในการเล่นกับ string ครับ ในตัวอย่างจะเป็นการเล่นกับ `String interpolation`

// Sometimes you might need to output a CSS
// value which is either not valid CSS syntax,
// or uses propriatery syntax which LESS
// doesn't recognize.

// To output such value, we place it inside a
// string prefixed with ~, for example:

@border-preset: "1px solid #f1f1f1";

.class {
  filter: ~"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')";
  color: ~"@eee";
  margin: ~"0 20px";
  border: ~"@{border-preset}";
}
// Output
.class {
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png');
  color: @eee;
  margin: 0 20px;
  border: 1px solid #f1f1f1;
}

13. Javascript สามารถใช้งานร่วมกับ Javascript ได้

// You can also use the previously mentioned interpolation:
@str: "howdy";

// @str becomes 'HOWDY'
@str-before: `"happy".toUpperCase()`; 

// becomes 'HOWDY'
@str-after: ~`'@{str}'.toUpperCase()`;

// Here we access part of the document
@height: `document.body.clientHeight`;

.class {
  height: @height;
}

.class:before {
  content:  @str-before;
}

.class:after {
  content:  @str-after;
}
// Output
.class {
  height: 1332;
}
.class:before {
  content: "HAPPY";
}
.class:after {
  content: "HOWDY";
}

จบแล้วครับ คงได้เห็นประโยชน์ของ CSS Preprocessor ตัวนี้กันแล้ว อย่าลืมไปทดลองเล่นกันนะครับ