Share vì hữu ích

SCSS là một ngôn ngữ mới mang lại cách viết code CSS gọn gàng, dễ nhìn và tận dụng tối đa source trước khi compile hơn. Code Tốt xin giới thiệu một vài thủ thuật sử dụng trong SCSS mà có thể người mới làm quen với SCSS chưa biết tới

Sử dụng selector parent trong child

Bạn có thể đã quen với đoạn code sau:

.button {
  background: #fff;
  &:hover {
    background: #000;
  }
}

Sẽ render ra thành:

.button:hover { background: #000; }

Nhưng bạn cũng có thể nghĩ tới việc gọi parent class ngay trong child class như thế này:

.button {
  background: #000;
  .page-template-home & {
    background: #fff;
  }
}

Sẽ render ra thành:

.page-template-home .button { background: #fff; }

Sử dụng variable trong selector

Bạn có thể tạo ra các dynamic class của selector bằng cách sử dụng # ngay trước khi output variable trong cặp dấu ngoặc nhọn {}.

$alertClass: "error";
.message-#{$alertClass} {
 color: #232425;
}

Khi render code sẽ ra:

.message-error { color: #232425; }

Hoặc ví dụ như:

$breakpoint: 768px;

@media (max-width: #{$breakpoint}) {
    /* This block only applies to viewports <= #{$breakpoint} wide... */
}

Sẽ render thành:

@media (max-width: 768px) {
  /* This block only applies to viewports <= 768px wide... */
}

Variable mặc định

Thông thường bạn sẽ define variable và sử dụng chúng trong các thuộc tính:

// _my-module.scss:
$message-color: blue !default;
p.message {
    color: $message-color;
}

Với !default, nó sẽ chỉ apply khi chưa có thuộc tính được định nghĩa trước đó.

$message-color: black;
@import 'my-module'; // Calling $message-color: blue !default;

Thì output sẽ ra:

p.message {
  color: black;
}

Control directives

Với SCSS, bạn có thể sử dụng các function logic như `@if` một cách dễ dàng:

$debug: false; // TODO: move to _settings.scss
.article {
    color: #444;

    @if ($debug) { // visualizing layout internals
        border: 1px dotted red;
    }
}

Sẽ render ra code cho mục if debug = false như sau:

.article {
  color: #444;
}

Ta có thể làm tương tự với @for, @each@while như ví dụ dưới đây:

@each $name in 'save' 'cancel' 'help' {
    .icon-#{$name} {
        background-image: url('/images/#{$name}.png');
    }
}

Sẽ render ra thành:

.icon-save {
  background-image: url('/images/save.png');
}
.icon-cancel {
  background-image: url('/images/cancel.png');
}
.icon-help {
  background-image: url('/images/help.png');
}

Bạn có thể đọc thêm về phần này tại đây.

Danh sách dữ liệu

Ta có thể định nghĩa:

$buttonConfig: 'save' 50px, 'cancel' 50px, 'help' 100px; // TODO: move to _settings.scss

@each $tuple in $buttonConfig {
    .button-#{nth($tuple, 1)} {
        width: nth($tuple, 2);
    }
}

Và output sẽ là:

.button-save {
  width: 50px;
}
.button-cancel {
  width: 50px;
}
.button-help {
  width: 100px;
}

Điều này rất tiện khi bạn có 1 tập hợp các element gần giống nhau với sự khác biệt ở 1 thành phần, ví dụ icon web font.

Custom Function

Bạn có thể tự tạo function riêng để định nghĩa nếu cần:

@function make-greener($value) {
    @return $value + rgb(0,50,0); // arithmetic with colors is totally fine, btw
}
.box {
    background: make-greener(gray);
}

Thì có thể output ra:

.box {
  background: #80b280;
}

Biến mặc định

Trong mixins và function có hỗ trợ bạn thiết lập biến mặc định, chẳng hạn như trong tình huống dưới đây ta có xác định trước $elemall:

@mixin transition($elem: all) {
  transition: $elem .3s ease;
}

Vậy nếu bạn gọi:

.box {
  @include transition;
}

Thì code sẽ render ra sẵn:

.box { transition: all .3s ease; }

Lược dịch bởi Khôi.
Tham khảo thêm các thủ thuật SCSS khác tại đây.

Share vì hữu ích

Tác giả: Khôi 'Pro' Nguyễn

Technical Lead tại Solis Lab. Quản lý ngôn ngữ tại vi.wordpress.org.

Trả lời