Advertisement
  1. Code
  2. HTML & CSS

Sass vs. LESS vs. Stylus: Preprocessor Shootout

Scroll to top
Read Time: 16 min

Indonesian (Bahasa Indonesia) translation by Fodal Fadul (you can also view the original English article)

Menghasilkan kekuatan sebenarnya dari preprocessor CSS adalah sebuah petualangan. Ada banyak bahasa, sintaks, dan fitur, semua siap digunakan sekarang.

Dalam artikel ini, kita akan membahas berbagai fitur dan manfaat menggunakan tiga preprocessor yang berbeda - Sass, LESS, dan Stylus.


Pengenalan

Preprocessor menghasilkan CSS yang berfungsi di semua browser.

CSS3 preprocessor adalah bahasa yang ditulis untuk tujuan semata-mata menambahkan fitur inventif yang keren ke CSS tanpa merusak kompatibilitas browser. Mereka melakukan ini dengan menyusun kode yang kita tulis ke CSS biasa yang dapat digunakan di browser apa pun sepanjang perjalanan kembali ke zaman batu. Ada ribuan fitur yang dibawa oleh preprocessors, dan dalam artikel ini kita akan membahas beberapa yang dipublikasikan, dan beberapa yang tidak dipublikasikan. Mari kita mulai.


Sintaks

Bagian terpenting dari penulisan kode dalam preprocessor CSS adalah memahami sintaks. Untungnya bagi kami, sintaksnya (atau bisa juga) identik dengan CSS biasa untuk ketiga preprocessor.

Sass & LESS

Sass dan LESS keduanya menggunakan sintaks CSS standar. Ini membuatnya sangat mudah untuk mengonversi file CSS yang ada ke preprocessor. Sass menggunakan ekstensi file .scss dan LESS menggunakan ekstensi .less. File Sass atau LESS dasar dapat diatur seperti di bawah ini:

1
/* style.scss or style.less */
2
h1 {
3
  color: #0982C1;
4
}

Seperti yang Anda ketahui, ini hanya CSS biasa, yang dikompilasi dengan sempurna di Sass dan LESS.

Penting untuk dicatat bahwa Sass juga memiliki sintaks yang lebih tua, yang menghilangkan tanda titik koma dan kurung kurawal. Meskipun ini masih ada, sudah tua dan kami tidak akan menggunakannya melewati contoh ini. Sintaksnya menggunakan ekstensi file .sass dan terlihat seperti ini:

1
/* style.sass */
2
h1
3
  color: #0982c1

Stylus

Sintaks untuk Stylus jauh lebih banyak lagi. Menggunakan ekstensi file .styl, Stylus menerima sintaks CSS standar, tetapi juga menerima beberapa variasi lain di mana tanda kurung, titik dua, dan titik dua adalah opsional. Sebagai contoh:

1
/* style.styl */
2
h1 {
3
  color: #0982C1;
4
}
5
6
/* omit brackets */
7
h1
8
  color: #0982C1;
9
10
/* omit colons and semi-colons */
11
h1
12
  color #0982C1

Menggunakan variasi yang berbeda dalam stylesheet yang sama juga valid, jadi berikut ini akan dikompilasi tanpa kesalahan.

1
h1 {
2
  color #0982c1
3
}
4
h2
5
  font-size: 1.2em

Variabel

Variabel dapat dideklarasikan dan digunakan di seluruh stylesheet. Mereka dapat memiliki nilai apa pun yang merupakan nilai CSS (misalnya warna, angka [satuan termasuk], atau teks.), Dan dapat dirujuk di mana saja di seluruh stylesheet kami.

Sass

Variabel Sass ditambahkan dengan simbol $ dan nilai dan nama dipisahkan dengan titik koma, seperti halnya properti CSS.

1
$mainColor: #0982c1;
2
$siteWidth: 1024px;
3
$borderStyle: dotted;
4
5
body {
6
  color: $mainColor;
7
  border: 1px $borderStyle $mainColor;
8
  max-width: $siteWidth;
9
}

LESS

Variabel LESS persis sama dengan variabel Sass, kecuali nama variabel yang ditambahkan dengan simbol @.

1
@mainColor: #0982c1;
2
@siteWidth: 1024px;
3
@borderStyle: dotted;
4
5
body {
6
  color: @mainColor;
7
  border: 1px @borderStyle @mainColor;
8
  max-width: @siteWidth;
9
}

Stylus

Variabel-variabel stylus tidak memerlukan apa-apa untuk ditambahkan ke mereka, meskipun itu memungkinkan simbol $. Seperti biasa, titik koma akhir tidak diperlukan, tetapi tanda sama di antara nilai dan variabel. Satu hal yang perlu diperhatikan adalah Stylus (0.22.4) mengkompilasi jika kita menambahkan simbol @ ke nama variabel, tetapi tidak akan menerapkan nilai ketika direferensikan. Dengan kata lain, jangan lakukan itu.

1
mainColor = #0982c1
2
siteWidth = 1024px
3
$borderStyle = dotted
4
5
body
6
  color mainColor
7
  border 1px $borderStyle mainColor
8
  max-width siteWidth

CSS yang dikompilasi

Setiap file di atas akan dikompilasi ke CSS yang sama. Anda dapat menggunakan imajinasi Anda untuk melihat bagaimana variabel yang berguna dapat. Kami tidak perlu lagi mengubah satu warna dan harus mengetik ulang dua puluh kali, atau ingin mengubah lebar situs kami dan harus menggali sekitar untuk menemukannya. Berikut ini CSS setelah kompilasi:

1
body {
2
  color: #0982c1;
3
  border: 1px dotted #0982c1;
4
  max-width: 1024px;
5
}

Bersarang

Jika kita perlu mereferensikan beberapa elemen dengan induk yang sama dalam CSS kita, itu bisa membosankan untuk terus menulis induk berulang-ulang.

1
section { 
2
  margin: 10px;
3
}
4
section nav { 
5
  height: 25px;
6
}
7
section nav a { 
8
  color: #0982C1;
9
}
10
section nav a:hover {
11
  text-decoration: underline;
12
}

Sebagai gantinya, dengan menggunakan preprocessor, kita dapat menulis selektor anak-anak di dalam tanda kurung orang tua. Juga, simbol & referensi pemilih induk.

Sass, LESS, & Stylus

Ketiga preprocessors memiliki sintaks yang sama untuk pemilih yang bersarang.

1
section {
2
  margin: 10px;
3
4
  nav {
5
    height: 25px;
6
7
    a {
8
      color: #0982C1;
9
  
10
      &:hover {
11
        text-decoration: underline;
12
      }
13
    }
14
  }
15
}

CSS yang dikompilasi

Ini adalah CSS yang dikompilasi dari kode di atas. Ini persis sama seperti ketika kita mulai — betapa nyamannya!

1
section {
2
  margin: 10px;
3
}
4
section nav {
5
  height: 25px;
6
}
7
section nav a {
8
  color: #0982C1;
9
}
10
section nav a:hover {
11
  text-decoration: underline;
12
}

Mixin

Mixins adalah fungsi yang memungkinkan penggunaan kembali properti di seluruh stylesheet kami. Daripada harus pergi ke seluruh stylesheet dan mengubah properti beberapa kali, sekarang kita dapat mengubahnya di dalam mixin kami. Ini dapat benar-benar berguna untuk styling khusus dari elemen dan awalan vendor. Ketika mixin dipanggil dari dalam pemilih CSS, argumen mixin dikenali dan gaya di dalam mixin diterapkan ke pemilih.

Sass

1
/* Sass mixin error with (optional) argument $borderWidth which defaults to 2px if not specified */
2
@mixin error($borderWidth: 2px) {
3
  border: $borderWidth solid #F00;
4
  color: #F00;
5
}
6
7
.generic-error {
8
  padding: 20px;
9
  margin: 4px;
10
  @include error(); /* Applies styles from mixin error */
11
}
12
.login-error {
13
  left: 12px;
14
  position: absolute;
15
  top: 20px;
16
  @include error(5px); /* Applies styles from mixin error with argument $borderWidth equal to 5px*/
17
}

LESS

1
/* LESS mixin error with (optional) argument @borderWidth which defaults to 2px if not specified */
2
.error(@borderWidth: 2px) {
3
  border: @borderWidth solid #F00;
4
  color: #F00;
5
}
6
7
.generic-error {
8
  padding: 20px;
9
  margin: 4px;
10
  .error(); /* Applies styles from mixin error */
11
}
12
.login-error {
13
  left: 12px;
14
  position: absolute;
15
  top: 20px;
16
  .error(5px); /* Applies styles from mixin error with argument @borderWidth equal to 5px */
17
}

Stylus

1
/* Stylus mixin error with (optional) argument borderWidth which defaults to 2px if not specified */
2
error(borderWidth= 2px) {
3
  border: borderWidth solid #F00;
4
  color: #F00;
5
}
6
7
.generic-error {
8
  padding: 20px;
9
  margin: 4px;
10
  error(); /* Applies styles from mixin error */
11
}
12
.login-error {
13
  left: 12px;
14
  position: absolute;
15
  top: 20px;
16
  error(5px); /* Applies styles from mixin error with argument borderWidth equal to 5px */
17
}

CSS yang dikompilasi

Semua preprocessors dikompilasi ke kode yang sama di bawah ini:

1
.generic-error {
2
  padding: 20px;
3
  margin: 4px;
4
  border: 2px solid #f00;
5
  color: #f00;
6
}
7
.login-error {
8
  left: 12px;
9
  position: absolute;
10
  top: 20px;
11
  border: 5px solid #f00;
12
  color: #f00;
13
}

Pewarisan

Saat menulis CSS dengan cara lama, kita bisa menggunakan kode berikut untuk menerapkan gaya yang sama ke beberapa elemen sekaligus:

1
p,
2
ul,
3
ol {
4
  /* styles here */
5
}

Ini berfungsi dengan baik, tetapi jika kita perlu untuk lebih lanjut menata elemen secara individual, pemilih lain harus dibuat untuk masing-masing dan itu dapat dengan cepat menjadi lebih berantakan dan lebih sulit untuk dipertahankan. Untuk mengatasi ini, pewarisan dapat digunakan. Warisan adalah kemampuan untuk pemilih CSS lainnya untuk mewarisi sifat pemilih lain.

Sass & Stylus

1
.block {
2
  margin: 10px 5px;
3
  padding: 2px;
4
}
5
6
p {
7
  @extend .block; /* Inherit styles from '.block' */
8
  border: 1px solid #EEE;
9
}
10
ul, ol {
11
  @extend .block; /* Inherit styles from '.block' */
12
  color: #333;
13
  text-transform: uppercase;
14
}

CSS yang dikompilasi (Sass & Stylus)

1
.block, p, ul, ol {
2
  margin: 10px 5px;
3
  padding: 2px;
4
}
5
p {
6
  border: 1px solid #EEE;
7
}
8
ul, ol {
9
  color: #333;
10
  text-transform: uppercase;
11
}

LESS

LESS tidak benar-benar mendukung gaya mewarisi seperti Sass dan Stylus. Alih-alih menambahkan beberapa pemilih ke satu set properti, ia memperlakukan warisan seperti mixin tanpa argumen dan mengimpor gaya ke pemilih mereka sendiri. Kelemahan untuk ini adalah bahwa properti diulang dalam stylesheet dikompilasi Anda. Beginilah cara Anda menyiapkannya:

1
.block {
2
  margin: 10px 5px;
3
  padding: 2px;
4
}
5
6
p {
7
  .block; /* Inherit styles from '.block' */
8
  border: 1px solid #EEE;
9
}
10
ul, ol {
11
  .block; /* Inherit styles from '.block' */
12
  color: #333;
13
  text-transform: uppercase;
14
}

CSS yang dikompilasi (LESS)

1
.block {
2
  margin: 10px 5px;
3
  padding: 2px;
4
}
5
p {
6
  margin: 10px 5px;
7
  padding: 2px;
8
  border: 1px solid #EEE;
9
}
10
ul,
11
ol {
12
  margin: 10px 5px;
13
  padding: 2px;
14
  color: #333;
15
  text-transform: uppercase;
16
}

Seperti yang Anda lihat, gaya dari .block dimasukkan ke pemilih yang ingin kami beri warisan. Penting untuk dicatat bahwa prioritas dapat menjadi masalah di sini, jadi berhati-hatilah.


Pengimporan

Dalam komunitas CSS, mengimpor CSS disukai karena memerlukan beberapa permintaan HTTP. Namun, mengimpor dengan preprocessor bekerja secara berbeda. Jika Anda mengimpor file dari salah satu dari tiga preprocessors, itu benar-benar akan memasukkan impor selama kompilasi, hanya menciptakan satu file. Harap diingat bahwa mengimpor file .css biasa dikompilasi dengan file @import "file.css" default; Kode. Juga, mixin dan variabel dapat diimpor dan digunakan dalam stylesheet utama Anda. Impor membuat pembuatan file terpisah untuk organisasi sangat bermanfaat.

Sass, LESS, & Stylus

1
/* file.{type} */
2
body {
3
  background: #EEE;
4
}
1
@import "reset.css";
2
@import "file.{type}";
3
4
p {
5
  background: #0982C1;
6
}

CSS yang dikompilasi

1
@import "reset.css";
2
body {
3
  background: #EEE;
4
}
5
p {
6
  background: #0982C1;
7
}

Fungsi Warna

Fungsi warna dibangun dalam fungsi yang akan mengubah warna pada kompilasi. Ini bisa sangat berguna untuk membuat gradien, warna warna yang lebih gelap, dan banyak lagi.

Sass

1
lighten($color, 10%); /* returns a color 10% lighter than $color */
2
darken($color, 10%);  /* returns a color 10% darker than $color */
3
4
saturate($color, 10%);   /* returns a color 10% more saturated than $color */
5
desaturate($color, 10%); /* returns a color 10% less saturated than $color */
6
7
grayscale($color);  /* returns grayscale of $color */
8
complement($color); /* returns complement color of $color */
9
invert($color);     /* returns inverted color of $color */
10
11
mix($color1, $color2, 50%); /* mix $color1 with $color2 with a weight of 50% */

Ini hanya daftar pendek dari fungsi warna yang tersedia di Sass, daftar lengkap fungsi warna Sass yang tersedia dapat ditemukan dengan membaca Dokumentasi Sass.

Fungsi warna dapat digunakan di mana saja bahwa warna adalah CSS yang valid. Inilah contohnya:

1
$color: #0982C1;
2
3
h1 {
4
  background: $color;
5
  border: 3px solid darken($color, 50%);
6
}

LESS

1
lighten(@color, 10%); /* returns a color 10% lighter than @color */
2
darken(@color, 10%);  /* returns a color 10% darker than @color */
3
4
saturate(@color, 10%);   /* returns a color 10% more saturated than @color */
5
desaturate(@color, 10%); /* returns a color 10% less saturated than @color */
6
7
spin(@color, 10);  /* returns a color with a 10 degree larger in hue than @color */
8
spin(@color, -10); /* returns a color with a 10 degree smaller hue than @color */
9
10
mix(@color1, @color2); /* return a mix of @color1 and @color2 */

Daftar semua fungsi LESS dapat ditemukan dengan membaca Dokumentasi LESS.

Berikut ini contoh cara menggunakan fungsi warna dalam LESS:

1
@color: #0982C1;
2
3
h1 {
4
  background: @color;
5
  border: 3px solid darken(@color, 50%);
6
}

Stylus

1
lighten(color, 10%); /* returns a color 10% lighter than 'color' */
2
darken(color, 10%);  /* returns a color 10% darker than 'color' */
3
4
saturate(color, 10%);   /* returns a color 10% more saturated than 'color' */
5
desaturate(color, 10%); /* returns a color 10% less saturated than 'color' */

Daftar lengkap semua fungsi warna Stylus dapat ditemukan dengan membaca Dokumentasi Stylus.

Berikut ini contoh menggunakan fungsi warna Stylus:

1
color = #0982C1
2
3
h1
4
  background color
5
  border 3px solid darken(color, 50%)

Operasi

Melakukan matematika dalam CSS cukup bermanfaat, dan sekarang sepenuhnya mungkin. Ini sederhana dan ini adalah bagaimana melakukannya:

Sass, LESS, & Stylus

1
body {
2
  margin: (14px/2);
3
  top: 50px + 100px;
4
  right: 100px - 50px;
5
  left: 10 * 10;
6
}

Aplikasi praktis

Kami telah membahas banyak fitur dan hal-hal baru yang dapat dilakukan oleh preprosesor, tetapi kami belum membahas apa pun secara langsung atau praktis. Berikut adalah daftar singkat aplikasi dunia nyata di mana menggunakan preprocessor adalah penyelamat kehidupan.

Vendor Prefiks

Ini adalah salah satu alasan yang dikaburkan untuk menggunakan preprocessor dan untuk alasan yang sangat baik — menghemat banyak waktu dan air mata. Membuat mixin untuk menangani awalan vendor mudah dan menghemat banyak pengulangan dan penyuntingan yang menyakitkan. Inilah cara melakukannya:

Sass

1
@mixin border-radius($values) {
2
  -webkit-border-radius: $values;
3
     -moz-border-radius: $values;
4
          border-radius: $values;
5
}
6
7
div {
8
  @include border-radius(10px);
9
}

LESS

1
.border-radius(@values) {
2
  -webkit-border-radius: @values;
3
     -moz-border-radius: @values;
4
          border-radius: @values;
5
}
6
7
div {
8
  .border-radius(10px);
9
}

Stylus

1
border-radius(values) {
2
  -webkit-border-radius: values;
3
     -moz-border-radius: values;
4
          border-radius: values;
5
}
6
7
div {
8
  border-radius(10px);
9
}

CSS yang dikompilasi

1
div {
2
  -webkit-border-radius: 10px;
3
     -moz-border-radius: 10px;
4
          border-radius: 10px;
5
}

Teks 3D

Memalsukan teks 3D menggunakan banyak text-shadows adalah ide yang cerdas. Satu-satunya masalah adalah mengubah warna setelah fakta itu sulit dan tidak praktis. Menggunakan fungsi mixins dan warna, kita dapat membuat teks 3D dan mengubah warna dengan cepat!

Sass

1
@mixin text3d($color) {
2
  color: $color;
3
  text-shadow: 1px 1px 0px darken($color, 5%),
4
               2px 2px 0px darken($color, 10%),
5
               3px 3px 0px darken($color, 15%),
6
               4px 4px 0px darken($color, 20%),
7
               4px 4px 2px #000;
8
}
9
10
h1 {
11
  font-size: 32pt;
12
  @include text3d(#0982c1);
13
}

LESS

1
.text3d(@color) {
2
  color: @color;
3
  text-shadow: 1px 1px 0px darken(@color, 5%),
4
               2px 2px 0px darken(@color, 10%),
5
               3px 3px 0px darken(@color, 15%),
6
               4px 4px 0px darken(@color, 20%),
7
               4px 4px 2px #000;
8
}
9
10
span {
11
  font-size: 32pt;
12
  .text3d(#0982c1);
13
}

Stylus

1
text3d(color)
2
  color: color
3
  text-shadow: 1px 1px 0px darken(color, 5%), 2px 2px 0px darken(color, 10%), 3px 3px 0px darken(color, 15%), 4px 4px 0px darken(color, 20%), 4px 4px 2px #000
4
span
5
  font-size: 32pt
6
  text3d(#0982c1)

Saya memilih untuk menulis stylus text-shadows pada satu baris karena saya menghilangkan tanda kurung kurawal.

CSS yang dikompilasi

1
span {
2
  font-size: 32pt;
3
  color: #0982c1;
4
  text-shadow: 1px 1px 0px #097bb7, 
5
               2px 2px 0px #0875ae, 
6
               3px 3px 0px #086fa4, 
7
               4px 4px 0px #07689a, 
8
               4px 4px 2px #000;
9
}

Hasil akhir

Kolom

Menggunakan operasi angka dan variabel untuk kolom adalah ide yang saya temukan ketika saya pertama kali bermain dengan CSS preprocessors. Dengan menyatakan lebar yang diinginkan dalam variabel, kita dapat dengan mudah mengubahnya di jalan tanpa matematika mental. Begini caranya:

Sass

1
$siteWidth: 1024px;
2
$gutterWidth: 20px;
3
$sidebarWidth: 300px;
4
5
body {
6
  margin: 0 auto;
7
  width: $siteWidth;
8
}
9
.content {
10
  float: left;
11
  width: $siteWidth - ($sidebarWidth+$gutterWidth);
12
}
13
.sidebar {
14
  float: left;
15
  margin-left: $gutterWidth;
16
  width: $sidebarWidth;
17
}

LESS

1
@siteWidth: 1024px;
2
@gutterWidth: 20px;
3
@sidebarWidth: 300px;
4
5
body {
6
  margin: 0 auto;
7
  width: @siteWidth;
8
}
9
.content {
10
  float: left;
11
  width: @siteWidth - (@sidebarWidth+@gutterWidth);
12
}
13
.sidebar {
14
  float: left;
15
  margin-left: @gutterWidth;
16
  width: @sidebarWidth;
17
}

Stylus

1
siteWidth = 1024px;
2
gutterWidth = 20px;
3
sidebarWidth = 300px;
4
5
body {
6
  margin: 0 auto;
7
  width: siteWidth;
8
}
9
.content {
10
  float: left;
11
  width: siteWidth - (sidebarWidth+gutterWidth);
12
}
13
.sidebar {
14
  float: left;
15
  margin-left: gutterWidth;
16
  width: sidebarWidth;
17
}

CSS yang dikompilasi

1
body {
2
  margin: 0 auto;
3
  width: 1024px;
4
}
5
.content {
6
  float: left;
7
  width: 704px;
8
}
9
.sidebar {
10
  float: left;
11
  margin-left: 20px;
12
  width: 300px;
13
}

Kebiasaan Penting

Ada beberapa permainan kata-kata untuk menggunakan preprocessor CSS. Saya akan membahas beberapa yang menyenangkan, tetapi jika Anda benar-benar tertarik untuk menemukan mereka semua, saya sarankan Anda menjelajahi dokumentasi atau, lebih baik lagi, mulailah menggunakan preprocessor dalam koding harian Anda.

Pelaporan Kesalahan

Jika Anda telah menulis CSS untuk jumlah waktu yang layak, saya yakin Anda telah mencapai titik di mana Anda mengalami kesalahan di suatu tempat dan tidak dapat menemukannya. Jika Anda seperti saya, Anda mungkin menghabiskan sore hari menarik rambut Anda dan mengomentari berbagai hal untuk memburu kesalahan.

Kesalahan laporan prapemrosesan CSS. Hanya sesederhana itu. Jika ada yang salah dengan kode Anda, ini memberi tahu Anda di mana, dan jika Anda beruntung: mengapa. Anda dapat melihat posting blog ini jika Anda tertarik untuk melihat bagaimana kesalahan dilaporkan dalam preprocessors yang berbeda.

Komentar

Saat meng-compile dengan preprocessor CSS, komentar double-slash akan dihapus (mis. // comment) dan komentar slash-asterisk tetap ada (mis. / * Komentar * /). Dikatakan demikian, gunakan double-slash untuk komentar yang Anda inginkan pada sisi non-dikompilasi dan slash-asterisk untuk komentar yang Anda inginkan terlihat setelah kompilasi.

Sekadar catatan: jika Anda mengkompilasi ulang, semua komentar akan dihapus.


Kesimpulan

Setiap pra-prosesor CSS yang kami bahas (Sass, LESS, dan Stylus) memiliki cara uniknya sendiri untuk menyelesaikan tugas yang sama — memberikan kemampuan kepada pengembang untuk menggunakan fitur yang berguna dan tidak didukung sekaligus menjaga kompatibilitas browser dan kebersihan kode.

Meskipun bukan merupakan persyaratan untuk pengembangan, preprosesor dapat menghemat banyak waktu dan memiliki beberapa fitur yang sangat berguna.

Saya mendorong Anda semua untuk mencoba sebanyak mungkin preprocessors sehingga Anda dapat secara efektif memilih favorit dan tahu mengapa itu disukai atas banyak orang lain. Jika Anda belum mencoba menggunakan preprocessor untuk menulis CSS Anda, saya sangat menyarankan Anda mencobanya.

Apakah Anda memiliki fitur preprocessor CSS favorit yang tidak saya sebutkan? Adakah sesuatu yang bisa dilakukan orang lain? Beri tahu kami di komentar di bawah ini!

Terima kasih khusus kepada Karissa Smith, teman saya yang sangat berbakat yang membuat thumbnail pratinjau untuk artikel ini.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.