Showing posts with label Basic. Show all posts
Showing posts with label Basic. Show all posts

Pengantar LESS - Dynamic Preprocessor Stylesheet

Monday, October 15, 2012

Bismillah. Alhamdulillah. Cukup lumayan lama pernulis bermain-main dengan kosakata dalam bahasa CSS sehingga memunculkan berbagai keinginan, baik keinginan dalam mengikuti perkembangan bahasa CSS untuk mengenalinya lebih jauh, maupun keinginan cara penulisan kosakata CSS yang lebih mudah dan cepat. Kemudian penulis melakukan penelusuran untuk mencari alat atau perangkat lunak yang bisa digunakan dalam menulis kosakata bahasa CSS dengan lebih cepat dari pada cara primitif, awal pencarian ditemukanlah bahasa SASS (Syntactically Awesome Stylesheets) yang merupakan cikal bakal dari pengembangan bahasa-bahasa Preprocessor Dynamic Stylesheet, namun SASS ternyata kurang bersahabat bagi mereka-mereka yang belum terbiasa dengan Ruby atau Compass. SASS dikembangkan oleh Hampton Catlin yang terinspirasi dari bahasa Haml (HTML abstraction markup language) yang juga dikembangkan oleh pengembang SASS. Penelusuran dilanjutkan dan bertemulah dengan LESS yang dibuat dan dikembangkan oleh Alexis Sellier atau lebih dikenal dengan cloudhead. Ternyata selain LESS ada juga bahasa Preprocessor CSS lainnya yaitu Stylus.

Apa Preprocessor LESS?

LESS sebenarnya merupakan salah satu pengembangan bahasa CSS, namun bukan pada sisi penambahan fungsi, property maupun value, LESS lebih ke kemudahan dan kecepatan penulisan bahasa CSS yang telah ada. Boleh dikatakan, bahwa LESS hanyalah sebuah cara penulisan CSS pra pengolahan (seperti halnya bahasa side server; php, asp) yang digunakan sebagai jembatan antara CSS dengan browser. Awalnya penulis beranggapan bahwa LESS merupakan saingan bahasa CSS, namun ternyata anggapan tersebut keliru. Kemudian anggapan ini berubah menjadi, bahwa LESS merupakan bahasa penyempurnaan dari beberapa kelemahan bahasa CSS, dan jelas itu juga keliru. Lalu apa LESS?
LESS adalah preprocessor (pra pengolahan) yang merupakan cara lain dalam menuliskan kosakata CSS, penulisan menggunakan bahasa preproccesed (pra olah/mentah) dan kemudian dikonversi (compile) ke dalam bahasa CSS murni baik dengan cara dikonversi langsung kedalam bahasa CSS murni maupun tanpa dikonversi dengan menambahkan mesin side server LESS agar browser mampu mengkonversinya. Jika kita biasanya menulis bahasa CSS secara manual, LESS selangkah lebih maju dan lebih modern dari cara penulisan kosakata bahasa CSS yang primitif. Namun bukan berarti LESS merupakan tool layaknya teks editor, justru LESS dapat dituliskan pada hampir semua teks editor murni (Native Text Editor). LESS merupakan tata cara atau aturan penulisan cepat kosakata bahasa CSS dan kemudian dikonversi serta disusun ulang menjadi bahasa CSS murni sesuai dengan aturan baku bahasa CSS yang bisa dirender oleh browser. LESS lebih fleksibel dan dinamis, karena kita bisa menggunakan bahasa sendiri dalam penulisannya sebagai variabel, interpolasi, nesting, mixin, operasi dan fungsi, namun demikian property dan value harus tetap sesuai aturan bahasa CSS. (Masih bingung?)

Kenapa Menggunakan Preprocessor CSS?

Karena ini bukan CSS, maka tidak terikat dengan aturan baku dan keterbatasan CSS. LESS membuat cara menulis CSS menjadi sangat mudah dan sederhana. CSS sebenarnya sudah bagus dan hebat, tetapi CSS tidak memberikan kita kebebasan berekspresi dalam penulisannya. Misal, banyak para developer dan desainer menginginkan abstraksi lebih bebas dari pada CSS default. Salah satu tujuan dari CSS adalah untuk memberikan kemudahan dan kesederhanaan sehingga siapapun dapat dengan cepat menangkap bahasa yang digunakan dan mempelajarinya. Namun fokus tersebut justru membatasi apa yang lebih dapat dilakukan pengembang CSS, dan pada umumnya kita tidak menyukai keterbatasan. Kita membutuhkan variabel yang lebih luas, dan jika CSS tidak mampu memberikan variabel tersebut, kita akan mencari cara untuk membuat varibel yang lebih mendekati kebutuhan kita. Preprocessor menawarkan lebih dari sekedar variabel yang tersedia, sehingga kita bisa bebas berkarya selama file CSS yang dihasilkan tetap sebagai karya CSS biasa. Anda tidak harus menggunakan preprocessor dalam menuliskan CSS, namun suatu hari akan banyak orang yang kemudian belajar menggunakannya sehingga menjadi terbiasa dengan preprocessor karena mereka menemukan kemudahan dan kesederhanaan dalam menulis CSS dari pada tanpa preprocessor. Dan banyak yang kemudian enggan untuk kembali menulis CSS dengan cara biasa lagi. (Masih bingung?)

Kemungkinan Masalah Preprocessor CSS

Pada artikelnya yang berjudul "January’s 12412: Researching LESS & SASS", Amber Weinberg mengangkat tema mengenai kemungkinan masalah yang muncul dalam penggunaan preprocessor. Dari beberapa komentar yang ditinggalkan sepertinya telah banyak pengguna LESS yang telah jatuh hati dan merasa lebih nyaman menggunakan bahasa preprocessor. Namun kemungkinan masalah penggunaan preprocessor CSS memang perlu untuk diangkat sebagai sebuah perbandingan sebelum anda mengambil kesimpulan untuk menggunakannya.
Masalah yang mungkin timbul dari penggunaan preprocessor CSS menurut Amber antara lain:
  • Apa yang terjadi jika pengembang lain perlu mengedit CSS dan tidak tahu atau menyadari penggunaan preprocessor pada situ yang dikelolanya?
  • Ketika menulis CSS dalam sebuah tim, bagaimana Anda mengontrol struktur dan pengorganisasian dari kode?
  • Apa yang terjadi jika JavaScript dinon-aktifkan?
Isu dari masalah diatas adalah kesulitan mengkomunikasikan antara satu pengembang dengan pengembang lain terutama bagi mereka yang bekerja dalam sebuah tim. Ketika anda menggunakan bahasa fleksibel sesuai keinginan anda sendiri, belum tentu anggota tim lain akan mampu memahaminya dengan cepat, justru hal ini akan menjadi kendala ketika pekerjaan kita merupakan pesanan klien. Sedangkan klien yang membeli karya kita mempekerjakan orang lain dalam pemeliharaannya. Namun, masalah ini hanya muncul apabila kita menggunakan metode side server (menggunakan file JavaScript LESS sebagai compiler) dalam mengkonversi LESS. Toh, ini tidak akan menjadi kendala apabila LESS dikonversi terlebih dahulu secara lokal (pada komputer kita) menjadi file CSS biasa dan baru kita menyerahkan file CSS biasa tersebut kepada klien atau anggota tim lain. Dan atau untuk menghindari kesulitan komunikasi antara anggota tim, dibuat kesepakatan bersama mengenai penggunaan bahasa LESS dalam kerja tim kita. Namun, isu masalah ini akan tetap menjadi kendala ketika kita harus merubah suatu kebiasaan dan ketika anggota tim lain tidak bersedia untuk beralih menggunakan preprocessor LESS.
Jadi, semua ini kembali pada diri kita sendiri. Tetap menuliskan CSS seperti biasa, atau mulai menggunakan preprocessor LESS agar lebih cepat dan sederhana dalam penulisannya?

Compiler Preprocessor LESS

Sebagai permulaan untuk memahami LESS, kita akan belajar menuliskan LESS dan mengkonversinya menjadi file CSS biasa secara lokal saja. Jika anda menelusuri situs resmi LESS, maka akan ditemukan dua metode konversi file LESS, yaitu:
  • Penggunaan Client-Side; Dengan memasang file less.js pada dokumen HTML. Less.js digunakan sebagai compiler agar browser mampu membaca file LESS, kemudian Less.js akan melakukan permintaan fungsi Ajax untuk memanggil file LESS anda. Hal ini sangat tidak efisien dalam hal kinerja dan harus dihindari dalam penggunaan hasil produksi. Apalagi jika JavaScript dinon-aktifkan, maka halaman anda akan hancur berantakan. Tetapi jika anda ingin menggunakan sebagai prototype dengan menggunakan LESS dengan cepat, hal ini syah-syah saja.
  • Penggunaan Server-Side; dengan cara meng-install NPM (Node Package Manager) atau Ruby pada komputer sebagai compiler. Namun jika anda tidak terbiasa dengan penggunaan perintah command-line, maka hindari juga menggunakan cara ini. Walaupun sebernarnya cara ini sangat efisien bagi yang terbiasa dengan perintah command-line.
  • Aplikasi GUI Compiler LESS; Selain dengan dua metode diatas, kita ternyata bisa menulis LESS secara lokal (komputer sendiri) dan kemudian mengkonversinya menjadi CSS standar dengan bantuan aplikasi compiler LESS. Aplikasi-aplikasi Compiler LESS bisa dilihat dan dipilih pada bagian berikutnya.

Aplikasi GUI Compiler LESS

Beberapa aplikasi yang disebutkan, digunakan sebagai Compiler LESS, sehingga kita bisa langsung mengkonversi file LESS menjadi file CSS standar. Bahkan contoh yang disertakan bisa langsung dirender melalui browser, atau bisa di-compile menggunakan aplikasi dibawah ini:
  • Crunch; Merupakan rekomendasi penulis, karena; tampilannya yang sederhana, berjalan disemua sistem operasi, menggunakan framework AdobeAIR, dapat langsung digunakan sebagai teks editor.
  • SimpLESS; Aplikasi GUI ini hampir mirip dengan Crunch hanya saja tidak bisa digunakan sebagai teks editor. SimpLESS hanyalah compiler, namun mampu berjalan pada semua sistem operasi.
  • WinLESS; Aplikasi ini juga hanya compiler saja, tanpa kemampuan Text Editor, hanya berjalan pada Sistem Operasi Microsoft Windows, namun dapat diintegrasikan dengan Teks Editor.
  • Compass; Aplikasi ini banyak digunakan para pengembang profesional, hanya untuk preprocessor SASS, berjalan pada semua sistem operasi, namun tidak gratis alias berbayar.
  • Codekit; aplikasi GUI Compiler Preprocessor khusus untuk pengguna Mac dan rekomendasi para pengembang preprocessor karena kemampuannya dalam menulis dan mengkonversi hampir semua preprocessor (SASS, LESS, Stylus).
  • Scout; aplikasi ini berjalan disemua sistem operasi, open-source, namun saya belum mencobanya (silahkan dicoba).
  • LiveReload; aplikasi GUI Compiler Preprocessor ini banyak diceritakan dan digunakan para pengembang, berjalan pada sistem operasi Mac dan Windows, dan belum tersedia untuk pengguna sistem operasi Linux.

Dasar Penulisan Preprocessor LESS

Bagaimana dengan persiapan awal sebelum belajar menulis LESS? Jika sudah siap, dibawah ini tidak akan diberikan contoh yang panjang lebar hingga memusingkan, namun kita akan mencoba memahami dasar-dasar dari LESS. Contoh dibawah ini lebih baik anda coba tulis sendiri sehingga terlihat hasilnya. Kemudian pahami dengan baik, agar kita mampu merasakan manfaat dan perbedaannya antara menulis CSS biasa dengan menulis LESS.

Integrasi Compiler Side-Client

Contoh penggunaan LESS akan dibahas secara terstruktur hingga menghasilkan suatu objek tertentu dan contoh yang akan dibahas menggunakan metode kompilasi Side-Client (Unduh file contoh terlebih dahulu sebagai pembanding). Ini berarti file LESS tidak perlu di-compile menggunakan aplikasi yang disebutkan diatas, karena kita akan menggunakan less.js sebagai compiler dengan proses konversi secara langsung pada browser (gunakan browser Firefox untuk melihat hasilnya, karena browser lain kurang bahkan tidak mendukung metode side-client untuk LESS).
Sisipkan link file .less pada dokumen HTML anda dengan setting rel dengan stylesheet/less
<link rel="stylesheet/less" type="text/css" href="style.less">
Unduh file less.js dan masukan pada dokumen HTML anda
<script src="less-1.3.0.min.js" type="text/javascript"></script>
Pastikan bahwa file stylesheet ditempatkan sebelum script, sehingga persiapan awal dokumen kurang lebih menjadi seperti dibawah ini:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet/less" type="text/css" href="style.less">
<script src="less-1.3.0.min.js" type="text/javascript"></script>
</head>
<body>

</body>
</html>
style.less merupakan file yang akan kita kembangkan sebagai contoh pada langkah berikutnya. Ini berarti anda harus mempersiapkan Text Editor untuk menulis file HTML dan LESS.

Skenario HTML

Jika compiler side-client sudah tersedia pada tag <head>, mari kita lanjutkan untuk mempersiapkan elemen objek HTML, seperti dibawah ini:
<div id="WadahObjek">
<div class="objek" id="objekSatu"></div>
<div class="objek" id="objekDua"></div>
<div class="objek" id="objekTiga"></div>
</div>

Skenario LESS

Setelah dokumen HTML dibuat seperti diatas, sekarang bukalah text editor anda dan buatlah file style.less. Kemudian berikan sentuhan style untuk objek yang telah dibuat pada HTML. Kita tuliskan CSS Standar dulu seperti dibawah ini:
body {
background:#262626;
}
#WadahObjek {
margin:0 auto;
width:650px;
}
.objek {
display:inline-block;
width:150px;
height:150px;
background:#191919;
margin:25px;
}
Browser akan menampilkan objek dengan bentuk kurang lebih seperti dibawah ini:
Hmmm... Tidak ada yang spesial dari contoh kode CSS diatas, karena itu masih CSS standar walau sudah ditulis sebagai file LESS. Coba anda bayangkan, jika kita suka dengan warna #191919 untuk digunakan pada beberapa tempat yang tersebar disepanjang stylesheet dengan jumlah baris hampir 1000? Melelahkan sekali bukan? Lalu, setelah semua baris itu beres ditulis secara manual, tiba-tiba kita ingin mengubah warna tersebut dengan warna lain atau mengganti warna dengan sebuah perpaduan warna. Sungguh sangat melelahkan!

Variable

Variabel memungkinkan anda untuk menentukan suatu nilai yang dituliskan dalam satu tempat, dan kemudian menggunakannya disepanjang stylesheet, membuat perubahan global semudah mengubah satu baris kode.
Perhatikan kode LESS dibawah ini:
@WarnaDasar: #262626;
@WarnaSatu: #191919;
@TinggiLebar: 150px;

body {
background: @WarnaDasar;
}
#WadahObjek {
margin: 0 auto;
width: 650px;
}
.objek {
display: inline-block;
width: @TinggiLebar;
height: @TinggiLebar;
background: @WarnaSatu;
margin: 25px;
}
Perhatikan bahwa kita hanya perlu sekali menuliskan variable @WarnaDasar dengan nilai #262626. Ketika kita ingin melakukan perubahan warna maka hanya cukup merubah nilai pada variable @WarnaDasar saja. Lebih mudah dan cepat bukan?
Variabel LESS biasa dideklarasikan dengan simbol "@". Kita bisa memberikan nama variabel sesuai dengan keinginan kita dan atau dengan alasan kemudahan untuk mengingat, kemudian kita berikan nilainya. Setelah itu kita dapat merujuk nama variabel yang telah dibuat untuk ditempatkan dimana saja. Keren bukan?!

Ketika anda compile menggunakan Aplikasi GUI Compiler LESS (misal; Crunch) maka akan dihasilkan kode CSS standar seperti dibawah ini:
body{
background:#262626;
}
#WadahObjek{
margin:0 auto;
width:650px;
}
.objek{
display:inline-block;
width:150px;
height:150px;
background:#191919;
margin:25px;
}
Jika anda ganteng pasti anda paham...

Mixin

Mixin memungkinkan kita untuk menanamkan sifat-sifat kelas ke dalam kelas lain dengan hanya memasukan salah satu nama kelas. Hampir sama seperti halnya variabel, tetapi keseluruhan sifat kelas akan mempengaruhi kelas lainnya. Mixin juga dapat berperilaku seperti fungsi, dan mengambil argumen. Masih bingung? Lanjut...!
Anda tahu bagaimana cara membuat lingkaran untuk objekSatu? Cukup dengan mengeset radius border sebesar-besarnya seperti contoh dibawah ini:
#objekSatu{
border-radius:9999px;
}
Maka browser akan menampilkan objek dengan bentuk kurang lebih seperti dibawah ini:
Namun harus diingat sejak penggunaan CSS3, jika ingin objek tersebut dapat ditampilkan sempurna pada semua browser maka kita harus menambahkan vendor prefix -webkit- dan -moz- sebagai cara terbaik. Maka kurang lebih kita bisa menuliskannya seperti dibawah ini:
#objekSatu{
-webkit-border-radius:9999px;
-moz-border-radius:9999px;
border-radius:9999px;
}
Hmmm... Bagaimana jika ada objek lingkaran lain yang jumlahnya banyak dan harus diberi sifat serta vendor prefix sama seperti itu? Misal 20 objek lingkaran... Huh!!! Sangat melelahkan...
Tenang... LESS membuat pendefinisian mixin menjadi lebih sederhana dan mudah. Pendefinisian mixin pada LESS sebenarnya hampir sama dengan bahasa pemrograman lainnya. Penulisan mixin LESS hampir sama dengan CSS standar terutama dalam penggunaan grup CSS. Hampir sama dengan penulisan variabel, hanya saja kita menggunakan simbol "." (titik) untuk mendeklarasikan mixin, seperti contoh dibawah ini:
@bulatan: 9999px;

.SudutBulat {
-webkit-border-radius: @bulatan;
-moz-border-radius: @bulatan;
border-radius: @bulatan;
}

#objekSatu {
.SudutBulat;
}
Dan sekarang, kita hanya cukup memasangkan .SudutBulat pada semua objek yang akan dibuat lingkaran tanpa perlu menambahkan sifat-sifatnya (border-radius dan vendor prefix) lagi. Jika suatu hari kita ingin mengubah nilai bulatan, cukup ganti nilai pada variabel @bulatan maka semua objek yang memiliki sifat sama akan ikut berubah tanpa harus diubah satu persatu. Kereeeeennn!!! Namun hati-hati jangan sampai terjadi bentrok dengan class milik CSS. Memang cukup sulit untuk membedakannya, namun saya yakin anda paham maksud penggunaan mixin pada LESS.

Parametric Mixin

Penambahan parametric mixin membuat penulisan sifat-sifat kelas menjadi lebih fleksibel. Parametric mixin merupakan cara penyisipan dan atau penambahan sifat baru dari sifat mixin yang telah ada tanpa mempengaruhi mixin asal. Bingung lagi ya???
Ayo kita lanjutkan lagi... objekSatu telah diberi sifat lingkaran, dan kita ingin membuat sudut rounded dengan radius baru pada objekDua, namun dengan tetap memanfaatkan sifat-sifat yang sudah tersedia pada mixin objekSatu, sehingga kita tidak perlu membuat mixin baru. Bagaimanakah caranya? Perhatikan deklarasi parameter dibawah ini:
@bulatan: 9999px;

.SudutBulat (@radius: @bulatan){
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
Pendeklarasian parametrik mixin yaitu dengan menambahkan tanda kurung "( )" setelah nama mixin. Didalam tanda kurung tersebut kemudian ditambahkan variabel. Variabel pada contoh diatas menggunakan nama variabel @radius yang memiliki nilai sama dengan variabel @bulatan yaitu 9999px. Kemudian nilai-nilai pada mixin diubah dengan variabel @radius, ini berarti nilai default dari variabel @radius adalah 9999px, namun ini bersifat default yang bisa saja nilai variabel @radius tersebut diganti sesuai kebutuhan. Tambah bingung ya? Perhatikan penggunaan mixin dibawah ini:
#objekSatu {
.SudutBulat;
}

#objekDua {
.SudutBulat(30px);
}
Perhatikan dengan seksama, bahwa objekSatu menggunakan variabel @radius dengan nilai default yaitu 9999px. Hal ini karena nilainya tidak diubah. Sedangkan pada objekDua nilai untuk variabel @radius diubah menjadi 30px. Sehingga nilai default untuk variabel @radius akan diubah menjadi 30px dan diberlakukan hanya untuk objekDua. Sehingga objekDua jika ditampilkan pada browser akan tampak seperti dibawah ini:
Mudah-mudahan paham maksud dari Parametric Mixin, jika anda paham maka tambah ganteng...

Operasi

Salah satu fitur hebat LESS lainnya adalah kemampuan untuk menggunakan operasi matematika didalam stylesheet. Mungkin kedengarannya sangat membosankan jika sudah berhubungan dengan matematika, namun hal ini sangatlah bagus untuk LESS. Operasi memberikan keleluasaan menambah, mengurangi, membagi dan mengalikan nilai properti dan warna, memberikan Anda kekuatan untuk menciptakan hubungan yang kompleks antar sifat. Bagaimana operasi matematika digunakan pada LESS?
Pada contoh terdapat 3 objek yang sudah kita berikan gaya tertentu, namun belum ditambahkan garis bingkai (border) dan warna garis bingkai (border color) pada objek tersebut. Misal;

  • Kita ingin menentukan tebal garis bingkai sebesar 5% dari tinggi atau lebar objek,
  • Kita ingin menentukan warna garis bingkai

Maka kita tuliskan operasi matematiknya kedalam stylesheet, seperti dibawah ini:
@TebalGaris: @GarisTepi * 0.05;
Kemudian warna garis diambil dari perkalian variabel @WarnaTiga dengan 3, seperti dibawah ini:
@WarnaTiga: #111;
@WarnaGaris: @WarnaTiga * 3;
atau
@WarnaGaris: @WarnaTiga * #222;
Awalnya memang cukup membingungkan, namun saya yakin anda akan memahami setelah melakukan beberapa kali uji coba. Harus diingat bahwa; menambahkan atau mengurangi dengan #000 tidak akan memberikan efek, dan penggunaan #fff merupakan efek masimal.
Setelah kita menentukan variabel untuk garis bingkai maka kita bisa menerapkannya pada garis bingkai seperti dibawah ini:
border: @TebalGaris solid @WarnaGaris;
Sehingga objek akan menjadi seperti gambar dibawah ini:
Mudah bukan? Khusus untuk warna, kita bisa menggunakan fungsi saturasi yang lumayan cukup rumit dan kompleks.

Fungsi Warna

LESS menyediakan beberapa fungsi warna berikut ini:

  1. darken() dan lighten(), digunakan untuk menambahkan warna hitam dan putih (lebih gelap dan lebih terang)
  2. saturate() dan desaturate(), untuk menentukan sebuah warna lebih "berwarna" atau "grayscale"
  3. fadein() dan fadeout(), untuk menambah atau mengurangi transparansi
  4. spin(), digunakan untuk memodifikasi rona (hue) warna

Jika, misal, kita ingin membuat warna garis pinggir (border color) menjadi desaturasi untuk mendapatkan warna yang mendekati grayscale, maka kita bisa menggunakan desaturate seperti dibawah ini:
@WarnaGaris: desaturate(@WarnaTiga, 100%);
Bahkan kita bisa memanfaatkan output dari hasil operasi suatu warna kedalam operasi warna lainnya, seperti dibawah ini:
@WarnaGaris: darken(desaturate(@WarnaTiga, 100%),20%;
Semua operasi warna bisa menggunakan warna (Hex) atau persentase sebagai parameternya, kecuali spin. spin menggunakan bilangan bulat (integer) antara 0 sampai dengan 255 dan tidak menggunakan persentase untuk memodifikasi rona (hue) warna, misal:
@WarnaGaris: spin(@WarnaTiga, 100);

Nested Rule

Ketika kita merancang suatu halaman web yang kompleks menggunakan CSS, kadang kita akan dihadapkan pada seleksi berantai (atau ada yang menyebutnya parent child, ada yang menyebutnya pewarisan) untuk elemen tertentu dalam DOM. Nested Rule didalam LESS digunakan untuk menyederhanakan penulisan nama selektor yang panjang menjadi lebih sederhana dan mudah. Didalam LESS kita bisa menempatkan suatu selektor didalam selektor lainnya. Hal ini membuat pewarisan (nest) menjadi lebih jelas dan lebih pendek. Dibawah ini contoh pewarisan atau pengelompokan CSS standar:
#header {
border-width: 1px
}
#header h1 {
font-size: 20px;
font-weight: bold;
color: #ddd
}
#header h1 a {
text-decoration: none;
}
#header h1 a:hover {
color: #dfe
border-width: 2px
}
Perhatikan contoh kode penulisan CSS standar diatas. Sebenarnya ketika kita menuliskan turunan selektor yang hanya satu atau dua turunan, hal ini masih dipahami dan mengerti dengan baik. Namun ketika jumlah selektor turunan dari selektor utama sudah mencapai 4 sampai 5 selektor, masalah sudah mulai bermunculan, dari mulai penulisan yang lebih panjang, dan visualisasi penyusunan hirarki yang tidak nyaman dilihat alias berantakan. Dengan LESS kita dengan mudah menuliskan pengelompokan utama dan kemudian menuliskan turunannya didalam kelompok utama. Misal, kode contoh diatas kita modifikasi menjadi aturan pewarisan LESS dengan meniru struktur DOM, sehingga menjadi seperti dibawah ini;
#header {
border-width: 1px;
h1 {
font-size: 20px;
font-weight: bold;
color: #ddd;
a {
text-decoration: none;
&:hover {
color: #dfe;
}
}
}
}
Jika kita perhatikan contoh kode aturan pengelompokan LESS diatas, ada satu bagian yang berbeda dalam penulisan pseudo-class. Untuk penulisan pseudo-class kita menggunakan simbol "&" yang bisa berarti "ini" atau "dan".
Namun, Nested Rule untuk preprocessor LESS berefek pada kenyamanan penulisan sintak didalam teks editor. Ketika saya mulai menuliskan sintak-sintak CSS dengan prepocessor LESS, hampir semua teks editor yang digunakan tidak mampu menampilkan visualisasi syntax-highlighter yang nyaman untuk diperhatikan, terutama dari sisi pewarnaan sintak, saya bahkan merasa pewarna sintak LESS sangat kacau ketika menggunakan pseudo-class. Ini menjadi perkerjaan rumah para pengembang plugin teks editor untuk menciptakan syntax-highlighter khusus preprocessor LESS.
Crunch sepertinya memang diciptakan khusus untuk Teks Editor LESS dan Compiler LESS, dan untuk hari ini bagi anda yang ingin belajar menulis preprocessor LESS, saya merekomendasikan aplikasi GUI LESS yang satu ini. Nyaman, ringan, mengenal syntax LESS dengan baik, compiler terintegrasi, dan terintegrasi debug untuk mengetahui kesalahan penulisan.

Mengimpor File LESS

Akhirnya, ini biasanya dilakukan sebagai langkah terakhir yaitu dengan mengimpor file LESS. Membagi file-file LESS sesuai dengan penggolongan tertentu adalah cara terbaik dari pada Anda harus menuliskannya hingga 5000 baris dalam satu file.
Mengimpor satu file ke file lainnya didalam LESS sangatlah sederhana, yaitu:
@import "warna.less";
Bahkan kita dapat menghilangkan ekstensi LESS dengan hanya menuliskan:
@import "warna";
Kita dapat membagi-bagi file LESS sesuai relevansinya menjadi beberapa file terpisah. Mungkin kita bisa saja menggolongkan file-file LESS itu menjadi seperti dibawah ini:
  • CSS Reset atau Normalize
  • Warna
  • Huruf dan tipografi
  • Elemen-elemen UI
  • Style utama halaman
  • ...dan pengelompokan lain secara relevan sesuai aturan yang tergantung pada proyek Anda
Sebagai contoh, anda dapat melihat bagaimana developer Twitter Bootstrap membagi-bagi file LESS kedalam beberapa file sesuai kelompoknya. Hal seperti ini akan terlihat lebih profesional dan lebih mudah dalam pengelolaan.
Anda mungkin berfikir bahwa menggunakan metode impor justru akan meningkatkan HTTP Request yang tidak perlu sehingga akan memperlambat waktu load halaman anda, dan itu betul! Namun kita harus ingat bahwa yang akan kita gunakan adalah file LESS sebagai bahan mentah yang kemudian dikonversi sehingga menjadi file CSS biasa. Jika kita memahami dengan baik, maka tidak peduli lagi, akan seberapa banyak file-file LESS itu digolongkan dan dipisahkan, karena pada akhirnya, semua bagian-bagian file LESS tersebut akan digabungkan menjadi satu file CSS baru melalui impor. Jadi, jangan takut melakukan impor. Karena hal ini akan sangat membantu kita dalam penyusunan struktur kode pada proyek yang sedang kita kerjakan.

Kesimpulan

Begitulah kurang lebih tentang Preprocessor LESS dan penulis secara pribadi berharap bahwa setelah menulis dan atau membaca artikel yang panjang lebar ini, kemudian berkembang minat para pengembang CSS di Indonesia untuk mulai menggunakan bahasa LESS. Saya merasa bahwa LESS telah melakukan perubahan cukup besar dalam tata cara penulisan bahasa Stylesheet.
Jika anda merasa tidak puas dengan artikel diatas, silahkan kunjungi dokumen resmi LESS untuk memeriksa kemungkinan terjadi perubahan yang lebih menarik. Selain itu, karena LESS dikembangkan sebagai Open Source anda bisa bergabung dan terlibat didalamnya. Anda bisa melaporkan masalah yang ditemukan (bug), pencabangan (fork), atau sekedar memantau (watch) perkembangan terbarunya melalui GitHub.
Terima kasih atas waktu dan kesempatannya untuk membaca artikel ini (yang ditulis hampir 1 minggu), semoga ada manfaat yang bisa diambil. Selamat belajar dan Happy Blogging :)

Kreatifitas Blogger yang Kebablasan

Monday, June 18, 2012

Bismillah. Sungguh sangat disayangkan dengan tingkah laku Blogger Cloning jika kemudian hasil cloning-nya tersebut diperjualbelikan. Saya secara pribadi sebagai seorang penulis tutorial blog juga tidak bisa memungkirinya, kadang atau bahkan sering melakukan CTRL-U untuk melihat source code yang digunakan, dipelajari bagaimana cara kerjanya dan kemudian direkayasa sesuai imajinasi yang kita miliki. Namun "TIDAK PERNAH MENJUALNYA" karena hal itu merugikan pelaku cloning.
Cloning sama dengan Plagiat

Kerugian Pelaku Cloning

[1] Hilang Kehormatan
Berapa yang sudah anda peroleh dari jual beli hasil cloning? Itu tidak sebanding dengan hilangnya rasa hormat blogger lain. Bukankah blogger yang hebat itu adalah blogger yang dihormati sepanjang hari, bulan, tahun, bahkan bertahun-tahun? Apa yang kamu lakukan hari ini bisa saja mengakhiri semua mimpimu dimasa datang.

[2] Mematikan Kreatifitas
Bukankah dengan cloning anda tidak perlu bersusah payah mengumpulkan ide dan kemudian mengaplikasikannya? Hal termahal dari seorang blogger adalah "IDE". Dan ide itu bukanlah hal yang tiba-tiba datang menghampiri, perlu ilmu pengetahuan yang cukup, perlu sejumlah sahabat, perlu kemampuan dan masih banyak faktor lain untuk menumbuhkan ide dalam diri. Cukupkah semuanya hanya sampai ke ide? Tidak... Ide harus direalisasikan kedalam bentuk real agar orang lain bisa menikmati bahkan mengagumi hasil ide kita. Untuk merealisasikan ide maka kita membutuhkan disiplin ilmu tertentu dan itu berarti menuntut kita untuk belajar tentang ilmu yang bersangkutan dengan ide yang akan direalisasikan. Ketika ide mampu terealisasikan maka itulah kreatifitas.

[3] Terjebak
Seorang blogger yang sudah menikmati tindakan cloning akan terjebak didalamnya. Ia akan sulit keluar dari lingkaran cloning dan itu sama dengan mematikan kreatifitas dalam diri. Seorang blogger yang terkungkung dalam jebakan cloning akan diam menunggu mangsa atau justru haus untuk mencari target, ketika menemukan target ia tidak akan peduli lagi dengan sekitarnya. Seperti itulah yang kemudian terjadi dalam dirinya, terulang dan berulang-ulang. Bukankah yang demikian sama dengan terjebak? Diam, mencari namun tetap tidak bisa keluar.

[4] Stagnan
Blogger cloning akan merasakan stagnan dalam dirinya disaat ia sudah merasa lelah untuk melakukan cloning. Stagnan atau tidak ada perubahan justru akan membentuk blogger paling ego dan paling sombong karena tidak bisa merasakan orang lain atau bahkan tidak mampu menghargai kreatifitas orang lain. Harus diingat bahwa banyak blogger selain diri kita bisa melakukan cloning namun mereka tidak mengambil keuntungan dari cloning tersebut, karena mereka sadar, cloning tidak akan membuat dirinya berkembang dan dihormati.

[5] Keras Hati
Bukankah Cloning itu tidak ada Undang-Undangnya? Itulah yang akan sering digunakan sebagai alasan. Blogger syarat dengan blogosphere yaitu semangat untuk saling menghargai satu sama lain. Jangankan total mencuri (cloning) satu bagian saja kita mesti meminta ijin sang pemilik, karena blogger sebenarnya tahu bahwa mengambil secara keseluruhan sama dengan merampoknya. Satu bagian saja itu terkadang sang pemilik dengan berat hati memberikan ijin walau pemilik tahu mereka sudah mengambilnya. Disinilah terjadi interaksi yang membentuk peraturan-peraturan tidak tertulis, dan interaksi inilah yang akan memperat tali persahabatan antar blogger. Saling mempercayai dan menghormati merupakan kekuatan blogosphere yang tak ternilai harganya. Berlaku sebaliknya untuk para pelaku cloning, mereka sudah tidak peduli lagi apa yang terjadi yang penting diri sendiri sudah berhasil melakukan cloning, bukankah yang demikian adalah sebaliknya? Itu sama dengan menciptakan permusuhan. Dan permusuhan adalah hal yang tidak akan pernah selesai sampai kapanpun. Pepatah menyebutkan "Musuh satu terlalu banyak namun kawan seribu terlalu sedikit"

Benarkan Harga Desain Blogku Rp. 20.000?

Heran... Itulah yang terpikirkan olehku. Ada apa dengan Blogger Indonesia? Jika memang mampu melakukan cloning maka hindari blog lokal karena itu jelas sangat merugikan keberadaan blogger lokal. Itu sama dengan saling menjatuhkan sesama teman. Kapan kita akan dihormati dan disegani blogger Internasional kalau ternyata didalamnya kita saling menjatuhkan? Blogger Tune-Up terbuka dan memperbolehkan untuk diambil source codenya, baik itu berupa tutorial atau plugin dan diperbolehkan untuk diperjual belikan dengan atau tanpa backlink seperti tertuang dalam halaman Perizinan & Syarat Penggunaan. Namun bukan berarti diperbolehkan diambil secara total dengan brangkas-brangkasnya. Kalau misal bermunculan tampilan seperti Blogger Tune-Up itu justru akan membingungkan para pengunjung. Kejadian yang lalu bisa terulang lagi ketika seorang pembeli template marah-marah di email saya dengan tuduhan saya melakukan cloning atas blognya. Dilain kejadian ada blogger meminta pertanggungjawaban karena blognya tidak berjalan dengan baik. Saya belum pernah menjual template tapi kenapa saya yang kena getahnya? Rugi 2 kali, rugi karena di cloning, dan rugi dimarahi orang lain. Saya hanya berharap pengertiannya dari para blogger Indonesia, sampai hari ini saya tidak melakukan tindakan apa-apa karena saya masih berfikir jauh dan masih merasa kita sama-sama dari Indonesia, entahlah jika cloning dilakukan oleh blogger negara lain, mungkin saya juga tidak akan berdiam diri.

Peralatan Desain Web Responsif

Thursday, April 12, 2012

Sekarang kita sudah memahami tentang Unsur Dasar Desain Web Responsif, dengan harapan memahami konsep dasar yang harus dilakukan ketika akan memulai belajar lebih jauh mengenai desain web yang responsif. Berkembangnya perangkat keras untuk mengakses situs membuat para desainer harus mencari solusi terbaik agar halaman-halaman situs mampu dinikmati oleh para pengunjung tanpa kendala yang berarti. Joshua Johnson mengatakan bahwa "Apple mendorong industri teknologi maju dengan meningkatkan pixel density (kepadatan pixel) pada layar iPhone dan iPad. Hal ini bagus dari sudut pandang pengguna, tetapi sebagai web designer atau web developer secara harfiah hal ini merupakan ancaman dan pemaksaan agar mengubah cara Anda membangun website." Pernyataan Joshua tersebut menggambarkan bahwa para web desainer cukup kerepotan dalam menciptakan website yang mampu beradaptasi dengan perangkat keras yang ada dipasaran. Namun ternyata hal tersebut bukanlah rintangan berarti, ini justru membuat para web desainer menjadi lebih kreatif lagi menciptakan peralatan (tools) untuk membangun desain web yang lebih mudah dan lebih responsif.
Untuk memudahkah pemahaman tentang peralatan yang akan digunakan, maka dibawah ini peralatan desain web akan disederhanakan dengan pengkategorian yang lebih sempit. Selain itu daftar peralatan desain web responsif yang akan dibahas, baru sebatas peralatan yang populer digunakan. Dibawah ini daftar peralatan yang kemudian dikategorikan menjadi:

Responsif Tipografi (Responsive Typography)

Ini merupakan bagian yang harus diperhatikan untuk mendesain web yang responsif. Responsif Tipografi adalah cara untuk mengatur penampilan huruf, dari mulai warna, posisi, ukuran, dan hal-hal lain yang berhubungan dengan huruf agar bisa menyesuaikan dengan lebar layar secara otomatis.

1. Lettering.js
Plugin jQuery ini sangat populer di kalangan web desainer karena kemudahan dalam penggunaan dan fungsi yang beragam. Lettering.js seakan menjadi plugin wajib bagi siapa saja yang berencana membuat desain web responsif karena kemampuannya yang komplek dalam mengatur posisi huruf. Beberapa kemampuan Lettering.js diantaranya; mengatur spasi antar huruf (kerning), mengatur spasi dan ukuran huruf yang komplek, kemudahan pengelolaan kode, dan kompleksitas posisi huruf (down-to-the-letter) sehingga mampu menghasilkan pengalaman membaca yang optimal dalam ruang visual yang beragam. Lettering.js di gunakan karena CSS belum mampu melakukan kompleksitas pengaturan huruf. Seorang Paul Irish saja sampai berkomentar "Hebat. Dunia sangat membutuhkannya - sebuah plugin jQuery yang berbeda dari yang lainnya".

2. FitText.js
Ini Plugin jQuery berikutnya yang juga sangat populer. Jika Lettering.js berhubungan dengan kompleksitas posisi huruf, maka FitText.js berhubungan dengan kemampuan pengaturan ukuran huruf secara otomatis pada berbagai ukuran layar. FitText.js mampu membuat huruf menjadi sangat fleksibel dalam berbagai visualisasi viewport, namun dengan penerapan yang sangat sederhana. FitText.js menciptakan visualisasi huruf yang benar-benar fluid dan responsif. Plugin yang tidak boleh anda lewatkan.

3. Font.js
Plugin jQuery yang satu ini termasuk masih baru sehingga kurang begitu populer. Font.js digunakan untuk memilih bentuk huruf yang akan digunakan pada sebuah situs. Ini salah satu plugin yang mungkin lebih cocok disebut sebagai perpustakaan huruf untuk pemilihan jenis huruf yang dibutuhkan. Font.js dapat digunakan sebagai remote untuk mengambil jenis huruf dari system atau dari URL yang telah ditentukan.

Gambar Fleksibel (Flexible Images)

Christopher Schmitt pada artikelnya "Adaptive Images in Responsive Web Design" menuliskan, gambar yang dikirimkan ke perangkat dan tersajikan pada halaman web harus memperhatikan beberapa faktor berikut:
  1. Resolusi Layar
  2. Bandwidth
  3. Lebar Jendela Browser
Masalahnya adalah cara menentukan gambar yang terbaik untuk dikirimkan ke browser, hal ini membuat faktor menjadi independen satu sama lain. Ketika sebuah halaman situs mengandung elemen gambar maka gambar tersebut harus bisa menyesuaikan dengan lebar browser, jika ukuran file gambar tersebut dipaksakan dengan rasio skala penampilan saja maka ini akan memperlambat pemanggilan halaman. Tentunya juga akan menurunkan kecepatan koneksi internet, sedangkan perangkat jenis mobile phone cenderung memiliki kecepatan koneksi yang lebih lambat dari pada komputer biasa, hal ini menambah beban load halaman yang menjadi semakin lambat. Jika demikian adanya, yang harus kita pikirkan bersama, Apakah anda akan memberikan resolusi rendah demi kemudahan versi mobile? Atau apakah anda membiarkan saja browser memanggilnya dengan versi sebenarnya, tetapi dengan waktu download yang lebih lama? Terlepas dari permasalah diatas, sampai dengan artikel ini dibuat, para web desainer memberikan jalan keluar dengan metode:
  1. Memaksakan gambar dalam ukurannya sebenarnya namun dengan penampilan responsive yang mampu menyesuaikan dengan lebar browser. Cara ini berarti bermain pada skala rasio penampilan gambar sesuai ukuran browser.
  2. Dengan teknik DOM, yaitu penyediaan gambar dengan berbagai ukuran untuk berbagai perangkat pada server situs yang kemudian gambar akan ditampilkan sesuai dengan viewport (ukuran browser).

1. Adaptive Images
Plugin yang ditulis dengan bahasa PHP ini akan secara otomatis membuat berbagai ukuran gambar dan cache dan kemudian menampilkannya sesuai dengan ukuran browser. Tidak diperlukan perubahan mark-up. Hal ini dimaksudkan untuk kemudahan pada penggunaan situs dengan desain yang responsif dan untuk digabungkan dengan teknik gambar fluid.

2. imgSizer.js
Sebelum menggunakan imgSizer.js lebih baik anda membaca dulu rincian yang di sampaikan pembuatnya, Ethan Marcotte tentang peran script ini dalam penerapannya pada desain web responsif. Pada dasarnya, script ini dirancang untuk memastikan bahwa gambar mampu di render dengan baik pada Microsoft Windows. Langkah Marcotte ini cukup berhasil untuk me-render gambar agar ukurannya turun secara otomatis sesuai dengan browser yang digunakan.

3. Spacer PNG
Ini adalah cara sederhana untuk menampilkan gambar yang responsive. Menggunakan teknik media query dalam mendeteksi ukuran browser dan mengganti ukuran gambar yang sesuai dengan browser. Gambar yang akan ditampilkan justru diganti dengan blank PNG atau blank GIF transparan yang ukurannya sesuai dengan ukuran gambar yang akan ditampilkan. Sedangkan gambar yang ditampilkan justru dijadikan background dengan penyajian background-size: contain.

Responsif Web Layout (Responsive Web Page Layouts)

Inilah bagian inti yang menjadi pembahasan hangat sekarang ini. Inti dari desain web responsif adalah kemampuan tata letak yang fluid dan fleksibel serta mampu menyesuaikan diri dengan ukuran layar dan fitur dari browser pengguna. Dibawah ini adalah beberapa sumber daya yang terkait dengan tata letak dan populer digunakan dalam mendesain web responsif.

1. Fluid 960 Grid System
Fluid 960 Grid System pada dasarnya adalah pengembangan dari 960 Grid System yang dibuat oleh Nathan Smith. Perubahan besar dilakukan pada kemampuan fluid pada berbagai ukuran layar. Berbeda dengan 960 Grid Sytem yang bersifat tetap (fixed), sedangkan Fluid 960 Grid System bersifat fleksibel terhadap ukuran browser. Grid System ini merupakan yang paling banyak digunakan oleh para web desainer saat ini. Jika anda terbiasa dengan 960 Grid System maka begitu pula penggunaannya pada Fluid 960 Grid System. Mengenai bagaimana cara menggunakan Fluid 960 Grid System, Deny E. Wicahyo memaparkan dengan jelas dalam salah satu artikelnya "Responsive Layout dengan Grid System"

2. Gridless
Jika anda menggunakan Fluid 960 Grid System kemudian merasa bahwa tata letak halaman terlalu sempit maka Gridless adalah solusi untuk mengatasi area yang terlalu sempit. Gridless dibuat lebih ramping dibangdingkan dengan sistem grid yang lainnya dan dibangun dengan dasar desain responsife. Kode Gridless didasarkan pada filosofi yang telah banyak dibahas pada diskusi-diskusi "metode mobile utama (mobile first)" untuk pembuatan website yang mampu digunakan pada berbagai perangkat.

3. Skeleton
Sistem Grid yang satu ini juga sedang hangat-hangatnya dibahas. Silahkan anda eksplorasi pada sistem grid yang satu ini dan temukan kehebatannya dibandingkan sistem grid yang lainnya.

4. Semantic Grid System
Sistem Grid yang satu ini menitik beratkan pada semantic dan terintegrasi dengan beberapa bahasa pemrograman CSS seperti LESS, SCSS atau Stylus. Mereka mengklaim dirinya mampu memberiksa cita rasa baru pada saat mendesain web responsif.

Pengujian Web Layout (Testing and Cross-Browser)

Setelah anda memahami dan mampu membuat desain web responsive maka waktunya untuk memeriksa, apakah desain yang sudah anda buat benar-benar dapat bekerja pada berbagai ukuran browser dan perangkat, atau justru gagal. Silahkan gunakan beberapa peralatan tester dan cross-browser dibawah ini untuk meyakinkan diri bahwa kita telah berhasil membuat desain web yang responsif.
  1. Matt Kersley Responsive Tester
  2. Web Developer
  3. iPadPeek
  4. iPhone Web Simulator
  5. Opera Mini Simulator
  6. Adobe Device Central CS5.5

Kesimpulan

Akhirnya, tidak setiap proyek desain web harus melibatkan semua peralatan dan sumber daya yang telah disebutkan diatas. Namun kembali lagi dengan menganalisa proyek desain web yang sedang anda hadapi. Artikel ini disusun hanya untuk memberikan gambaran dan kemudahan dalam mencapai tujuan desain web yang responsif dan sesuai dengan apa yang diinginkan. Dalam prakteknya, kadang kita membutuhkan fitur lain untuk mempercantik dan memperbaiki tampilan akhir dari desain web yang sedang kita buat dan yang sesuai dengan keinginan orang yang membutuhkan desain kita. Semua ini kembali pada kemampuan anda dalam memahami resource yang tersedia, imajinasi dalam membuat desain, dan ide yang merupakan dasar dari rancang bangun desain web yang responsif. Selamat bekerja...

Jika Anda mengetahui perlengkapan atau resource yang dapat membantu dalam membangun desain web responsif, silahkan berbagi dengan kami pada komentar!

Integrasi Google Analytics Pada Blogger

Saturday, April 7, 2012

Sejak Blogger memperkenalkan tampilan Dinamis semakin hari BlogSpot semakin mendekati platform blog yang sesuai dengan keinginan penggunanya. Semakin menarik, semakin lengkap dan semakin mudah, mungkin itulah yang ingin diberikan developer Blogger kepada penggunanya. Walau kadang perubahan tersebut cukup merepotkan penggunanya dalam melakukan update kode. Salah satu kemudahan yang sekarang diberikan adalah integrasi Google Analytics pada Blogger. Sebelumnya para pengguna BlogSpot harus memasukan kode Web Analytics secara manual kedalam template, namun sekerang Blogger menyediakan form khusus yang lebih sederhana. Bagi sebagian Blogger hal tersebut tidaklah jadi masalah, apalagi pengguna baru platform BlogSpot mungkin tidak menyadari perubahan tersebut. Bagi anda yang termasuk pengguna lama template Blogger, walaupun Dasbor Blogger menyediakan form untuk memasukan ID Properti Web Google Analytics namun jika pada templatenya tidak tersedia kode (X)HTML integrasi dengan Google Analystics maka hal tersebut menjadi percuma.
Google Analytics

Kode JavaScript Google Analytics

Saat Blogger belum mengintegrasikan antara Google Analytics dengan Blogger maka pengguna harus memasukan kode secara manual pada template blog seperti dibawah ini:
Versi Lama
<script type='text/javascript'>
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type='text/javascript'>

try {
var pageTracker = _gat._getTracker("UA-XXXXXXX-XX");
pageTracker._trackPageview();
} catch(err) {}

</script>
Versi Baru
<script type="text/javascript">

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXX-XX']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

</script>
Namun sejak Blogger melakukan beberapa perbaikan terutama setelah rilis resmi tampilan dinamis maka memasukan kode Google Analytics sudah tidak perlu dilakukan secara manual. Kode JavaScript diatas sudah tidak perlu lagi dimasukan secara manual ke dalam template.

Kode (X)HTML Google Analytics

Setelah Blogger merilis tampilan dinamis, maka beberapa kode baru ditambahkan kedalam template blogger, dari mulai threaded comments, HTML5 dan lain sebagainya. Dan salah satu penambahan kode yang hampir tidak terperhatikan adalah Google Analytics. Dibawah ini adalah kode (X)HTML Google Analytics yang terdapat pada template terbaru:
<b:include data='blog' name='google-analytics'/>
Untuk itu bagi para pengguna blogger lama, pastikan bahwa kode diatas tersedia pada template blog anda. Posisinya biasanya ditempatkan tepat di atas tag </body>. Jika kode diatas sudah tersedia, maka untuk mengintegrasikan antara Blogger dengan Google Analitycs silahkan lanjutkan membaca pada langkah selanjutnya.

Memasukan ID Property Web Google Analytics

Setelah memastikan kode (X)HTML Google Analytics tersedia pada template Blogger, selanjutnya kita hanya cukup memasukan ID Properti Web Google Analytics yang dapat kita peroleh pada situs Google Analitycs. Biasanya format ID-nya seperti dibawah ini (nomor ID dibawah hanya contoh):
Nomor Properti: UA-9989123-6
Google Analytics
Setelah ID Properti Web Google Analytics kita peroleh, maka cukup masukan ID tersebut pada Blogger.
Langkah 1
Login ke Blogger
Langkah 2
Pilih Blog anda dan pilih menu "Setelan" pada sidebar kiri (dasbor versi baru rilis bulan April 2012)
Langkah 3
Pilih menu "Lainnya" dan cari "Google Analytics - ID Properti Web Analytics" (perhatikan gambar di bawah ini):
Google Analytics
Langkah 4
Masukan ID Property Web Google Analytics pada kotak di sampingnya, kemudian klik tombol "Simpan Setelan"
Langkah 5
Preview Blog anda

Memeriksa Google Analytics

Untuk memastikan bahwa Google Analytics sudah terintegrasi pada blog, buka blog, kemudian gunakan kombinasi tombol CTRL + U untuk melihat source code halaman blog, dan telusuri (scroll - gulung layar) kebawah hingga di temukan kode dibawah ini:
<script type='text/javascript'>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXX-XX']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = (document.location.protocol == 'https:' ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
</script>
Jika kode diatas ditemukan berarti blog anda sudah terintegrasi dengan Google Analitycs. Happy Blogging :)

Unsur Dasar Desain Web Responsif

Saturday, March 31, 2012

Para desainer web dunia sedang hangat membahas tentang desain web responsif. Pada tingkatan tertentu, popularitas konsep desain web yang responsif menjadi agenda utama, hal ini karena semakin banyaknya pengguna di tambah beragamnya perangkat keras akses internet yang digunakan pengguna untuk mengakses halaman web. iPad, iPhone, perangkat mobile Android, desktop, netbook dan lain-lain. Ini memaksa kita masuk ke dalam sebuah masa di mana desain web harus berfungsi dalam banyak cara dan banyak perangkat. Mari kita sama-sama telusuri pengertian dan prinsip di balik desain web responsif.

Fitur Inti Desain Web Responsif

Agar desain web kita dianggap "responsif," maka perlu untuk memahami tiga fitur kunci dalam merancang web responsif. Desainer dan pengembang web, Ethan Marcotte menuliskan bahwa konsep desain web responsif memiliki tiga fitur kunci, yaitu:
  1. Situs yang akan dibangun harus memiliki kerangka dasar fleksibel (flexible grid).
  2. Gambar yang dimasukkan ke dalam desain harus mampu fleksibel sendiri.
  3. Pandangan yang berbeda (different view) harus diaktifkan pada konteks yang berbeda melalui media query.
Tiga kunci dasar desain web responsif diatas harus diperhatikan dengan seksama agar hasil akhir web benar-benar responsif. Jika kemudian kita mendesain web tanpa tiga kunci dasar tadi maka hasil akhir web bukanlah web responsif. Berarti desain cacat...

Grid Fleksibel

Istilah grid ini berkaitan dengan desain web yang cukup tumit. Mengharuskan situs web yang anda desain menggunakan grid fleksibel bukan berarti bahwa itu membatasi anda untuk memilih berbagai bentuk dan ukuran dalam penyesuaian dengan sistem jaringan yang kompleks di luar sana. Namun sebaliknya grid fleksibel membantu kita untuk mendesain web yang lebih mudah dan fleksibel dengan berbagai pandangan.
Mendefinisikan parameter sendiri untuk kolom (column), jarak (spacing) dan kontainer (container) merupakan solusi terbaik untuk desain web yang akan menghasilkan halaman web fleksibel dan mampu menyesuaikan dengan sistem di luar sana. Bahkan, sistem grid yang ada sebagian besar, terbatas hanya menggunakan CSS class untuk menentukan ukuran (size), ruang (space) dan keselarasan (alignment). Ketika anda mencoba untuk menempatkan objek di batas-batas ini ke dalam desain web responsif yang anda buat, itu justru akan membuat proses menjadi lebih rumit dan akan memakan banyak waktu dibandingkan dengan koding grid buatan anda sendiri.
Apakah anda menggunakan sistem grid premade (bahan mentah sebagai acuan) atau membuat kustom grid sendiri, hal ini merupakan aspek penting dari sebuah sistem grid fleksibel dalam menyusun mekanisme ukuran, tata letak dan jarak. Bagi seorang desainer web, ini berarti meninggalkan satuan ukuran pixel yang telah lama menemani hari-hari kita dalam mendesain web dan menggantinya dengan layout web yang menggunakan satuan ukuran presentase dan em, yang merupakan satuan unit ukuran relatif.
Namun, hal ini bukan berarti kita meninggalkan satuan pixel dalam pembuatan layout web dengan perangkat lunak editing gambar (misal; Photoshop, Fireworks dan lain-lain). Sebaliknya, ini merupakan tantangan kepada para desainer web untuk kembali belajar dasar-dasar perhitungan matematika. Perhitungan matematika merupakan bagian dari proses desain web responsif yang digunakan sebagai proses konversi dari satuan pixel ke dalam layout web dengan menggunakan satuan unit pengukuran relatif (persen dan em).

Gambar Fleksibel

Gambar yang bergerak dan berskala dengan grid fleksibel adalah kunci berikutnya dalam mendesain web responsif. Maksudnya, ukuran gambar dan posisi gambar akan berubah sesuai dengan pandangan browser. Hal ini merupakan kisah klasik yang membuat para desainer web cukup mengerutkan dahi pertanda pusing tingkat kelurahan. Kenapa? Karena gambar yang diload oleh browser adalah gambar dengan ukuran maksimal, ini membuat loading page (pemuatan halaman) cenderung menjadi lebih berat, sedangkan desainer web hanya bisa mengubah ukuran skala gambarnya saja dari atribut HTML width dan height tanpa mampu menurunkan ukuran gambar yang sebenarnya. Perubahan skala gambar mengikuti pandangan dari perangkat browser di tujukan untuk penyesuaian dan memberikan ruang teks artikel pada halaman tersebut. Dan perubahan skala gambar bukanlah cara terbaik untuk mempercepat loading page web responsif. Mungkin inilah saatnya bagi para desainer web untuk mengkaji ulang penggunaan gambar-gambar yang terlalu berlebihan pada desain web-nya.
Sebuah alternatif lain dalam masalah gambar adalah dengan menggunakan CSS. Properti CSS overflow (misal; overflow: hidden) memberikan kemampuan cropping gambar dinamis yang mampu menyesuaikan gambar dengan wadah (frame) ketika terjadi perubahan pandangan. Selain itu ada juga yang menggunakan metode penyediaan berbagai ukuran gambar pada servernya, sehingga mampu melayani berbagai ukuran gambar yang tepat sesuai dengan permintaan dari agen perangkat browser dengan memanfaatkan fitur deteksi side-server atau side-client seiring dengan berkembangnya metode DOM.
Dan cara terakhir untuk mengakali beratnya loading page akibat ukuran gambar adalah dengan metode menyembunyikan gambar. Hal ini diterapkan pada halaman situs yang memfokuskan web pada konten non-gambar, menggunakan metode stylesheet media query yang menetapkan property display: none pada gambar. Atau menerapkan sebuah subset pada opsi penggantian gambar dengan menggunakan class seperti optional-img sebagai sebuah cara pemilihan gambar melalui selektor CSS yang spesifik didalam stylesheet. Sederhananya, menggunakan opsi pengganti gambar asli dengan gambar yang lebih kecil melalui CSS.

Media Query

Media Query adalah fitur yang paling menarik untuk di bahas (namun paling menakutkan untuk desainer web yang belum terbiasa) dalam proses desain web responsif. Terkadang, para desainer web terbawa arus dengan berkonsentrasi hanya pada media query, tanpa memikirkan komponen inti dari sebuah desain web responsif, bahkan meninggalkan komponen opsional halaman fleksibel. Hal ini justru membuat media query hampir tak berpengaruh terhadap situs web jika meninggalkan prinsip dasar HTML dan CSS yang meliputi grid fleksibel dan gambar fleksibel. Media Query memungkinkan para desainer untuk membuat beberapa layout menggunakan dokumen HTML yang sama secara selektif melalui stylesheet berdasarkan fitur agen pengguna (user agent), seperti misalnya ukuran jendela browser, orientasi layar (landscape atau portrait), resolusi layar, warna (kemampuan menampilkan sejumlah warna pada layar), dan lain sebagainya.
Berikut adalah contoh media query yang melayani stylesheet tergantung pada lebar viewport (pandangan):
<link rel="stylesheet" media="(max-device-width: 320px)" href="mobile.css" />
<link rel="stylesheet" media="(min-width: 1600px)" href="widescreen.css" />
Media Query tidak dikhususkan untuk memberikan solusi untuk mobile atau solusi untuk tablet (kadang para desainer web pemula berfikir demikian). Sebaliknya, media query dan desain responsif mengajak kita untuk berfikir keluar dari batasan ukuran atau resolusi layar dan mulai membangun website fleksibel yang mampu menyesuaikan diri (secara teoritis) dengan semua media yang beragam.

Apakah Bisa Desain Web Responsif

Seperti telah ditulis diatas mengenai tiga fitur kunci dari desain web responsif, itu hanyalah hal kecil jika dibandingkan dengan semangat anda. Dari 90% desain web responsif yang terbaik adalah dengan memulainya untuk belajar mendesainnya. Well-formed HTML dan tata letak fleksibel harus menjadi bagian penting yang harus diperhatikan dari web desainer modern. Apa yang telah disampaikan oleh Marcotte mengenai aturan desain web responsif hanyalah untuk menunjukan kepada kita cara baru dalam penerapan praktek-praktek mendesain yang terbaik yang harus kita kerjakan. Dalam konteks modern, mengingat bahwa kebutuhan akan layout fleksibel, hal penting yang harus dilakukan sekarang adalah kemampuan dalam mengakomodasi susunan terbaik yang lebih luas sesuai dengan situasi saat ini, kita memerlukan desain yang fleksibel dan fluid. Desain web responsif memaksa kita meluangkan banyak waktu untuk melakukan hal yang benar, bukan hanya bagaimana kita menulis kode, namun bagaimana kita memahami ide-ide baru dan menciptakannya menjadi desain yang segar.

Kami Masih Belum Mengerti

Siapapun yang telah meluangkan banyak waktu dalam mengerjakan konten fleksibel dan merealisasikannya melalui media query maka ia akan menyadari bahwa ini belum mampu memberikan solusi terbaik dalam membangun website yang siap melayani setiap user agent. Pengguna menjelajah web dengan niat berbeda yang terkadang mempunyai keinginan dan kebutuhan yang berbeda-beda, tergantung dari perangkat yang digunakan. Seorang pengguna dengan mobile web browser kemungkinan besar akan tertarik untuk mengakses informasi utama secepat mungkin. Misal; untuk restoran, pengguna mungkin hanya ingin menelusuri menu, nomor telephone untuk pemesanan, alamat, dan sebagainya. Dalam kondisi seperti ini, memuat seluruh halaman situs dan kemudian menyembunyikannya sebanyak 90% bagian halaman, jelas bukan solusi ideal.

Arah Yang Baik

Apa yang membuat desain itu harus responsif, kemudian, apakah langkahnya sudah benar. Banyak situs dibuat untuk memperoleh desain responsif yang terbaik, dan setiap desainer tentunya harus mampu menemukan solusi dan mencari cara untuk mengoptimalkan desain mereka. Desainer akan terus membuat kemajuan untuk menemukan solusi dan menemukan desain yang mampu bekerja dengan baik pada berbagai perangkat dan situasi, sehingga mampu menampilkan web dengan cara yang paling ideal dan intuitif. Hal ini karena kedua belah pihak (desainer dan pengguna) mengarahkan ke arah yang terbaik, ini memberi banyak kesempatan untuk membangun web yang lebih dinamis, menarik dan indah.

Dan itu adalah sesuatu yang sangat berharga... Selamat berkarya...

Pranala Luar :
[1] Kumpulan Situs Responsif
[2] 960 Grid System
[3] 978 Grid System
[4] Fluid Baseline Grid System
[5] Tiny Fluid Grid System

Perkiraan Konversi Point ke Pixel (Em dan %)

Sunday, March 4, 2012

Bagi para web desainer menentukan ukuran-ukuran didalam desain web adalah hal penting, apalagi kalau sudah berhubungan dengan media query dan media print. Namun terkadang kita bingung dengan konversi dari suatu satuan ke satuan lainnya. Berikut ini adalah tabel yang mengkonversikan point ke pixel (em dan %). Tabel dibawah ini adalah sebuah pendekatan saja, yang tergantung pada jenis font, browser dan sistem operasi yang digunakan, tapi mudah-mudahan ini merupakan titik awal yang baik dan semoga bisa membantu desain anda.
Perkiraan Konversi Point ke Pixel Em dan Persen

Tabel Konversi Point ke Pixel (Em dan %)

PointPixelEmPersen
6pt8px0.5em50%
7pt9px0.55em55%
7.5pt10px0.625em62.5%
8pt11px0.7em70%
9pt12px0.75em75%
10pt13px0.8em80%
10.5pt14px0.875em87.5%
11pt15px0.95em95%
12pt16px1em100%
13pt17px1.05em105%
13.5pt18px1.125em112.5%
14pt19px1.2em120%
14.5pt20px1.25em125%
15pt21px1.3em130%
16pt22px1.4em140%
17pt23px1.45em145%
18pt24px1.5em150%
20pt26px1.6em160%
22pt29px1.8em180%
24pt32px2em200%
26pt35px2.2em220%
27pt36px2.25em225%
28pt37px2.3em230%
29pt38px2.35em235%
30pt40px2.45em245%
32pt42px2.55em255%
34pt45px2.75em275%
36pt48px3em300%

Membuat Plugin OpenSeach Untuk Blogger

Wednesday, February 29, 2012

OpenSearch adalah kumpulan format sederhana untuk berbagi hasil pencarian. OpenSearch digunakan untuk membuat sebuah mesin pencari yang dapat digunakan oleh aplikasi client pencarian (browser). Masih bingung juga dengan pengertian tersebut? Wajarlah, karena jika mengikuti pengertian yang diberikan oleh situs resminya memang agak sulit dimengerti. Pengertian OpenSearch tersebut memang diambil dan diterjemahkan dari situs resminya OpenSearch.org. Maksudnya, pada browser yang kita gunakan biasanya ada baris mesin pencari pada sebelah kanan atas terutama pada Firefox dan IE 7.
Pada baris mesin pencari ini kita bisa memilih dan menentukan mesin pencari apa yang akan kita gunakan. Baris mesin pencari sangat berguna bagi mereka yang ingin melakukan pencarian cepat tanpa harus membuka halaman mesin pencari yang dimaksud, misal kita ingin melakukan pencarian menggunakan Google maka kita tidak perlu membuka terlebih dahulu halaman Google, cukup pilih mesin pencari yang akan digunakan dan ketikan kata kunci pada area yang disediakan. Maka halaman Google akan terbuka dengan hasil pencarian yang sesuai dengan kata kunci yang telah dimasukan. Nah, pada artikel ini Blogger Tune-Up akan membahas cara membuat plugin browser mesin pencari untuk blog kita sendiri.
Membuat Plugin OpenSeach Untuk Blogger

Skenario Plugin OpenSeach

Ketika pengunjung membuka halaman blog maka pada bagian "Daftar Mesin Pencari" akan keluar sebuah baris informasi penambahan mesin pencari, (misal; Tambahkan "Blogger tune-Up"). Dan ketika baris informasi penambahan tersebut di klik maka sebuah mesin pencari akan terpasang. Jika kita berencana mencari-cari informasi dari blog yang menyediakan mesin pencari tersebut maka cukup memilih mesin pencari untuk blog yang kita tuju dan masukan kata kunci. Halaman blog yang dituju akan terbuka bersama dengan artikel yang sesuai dengan kata kunci. Untuk memposisikan mesin pencari dan atau menghapusnya cukup masuk ke menu "Kelola Mesin Pencari..."

Deskripsi Berkas OpenSearch

Berkas Plugin OpenSearch untuk Blogger ditulis menggunakan bahasa XML, jadi bisa ditulis dengan perangkat lunak Notepad atau yang sejenisnya. Berkas file XML yang digunakan sebagai mesin pencari sebenarnya cukup sederhana, cukup mengikuti aturan template dasar di bawah ini. Kita cukup menyesuaikannya berdasarkan kebutuhan dari plugin mesin pencari tertentu yang ingin Anda tulis. Dibawah ini template Plugin OpenSearch yang diambil dari situs Developer Mozilla dan situs OpenSearch.

Template Plugin OpenSearch dari Mozilla Developer Network
Dibawah ini adalah template yang di ambil dari situs Mozilla Developer Network, silahkan kunjungi situs resminya jika ingin memahami lebih lanjut tentang penggunaan dan penerapannya.
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>engineName</ShortName>
<Description>engineDescription</Description>
<InputEncoding>inputEncoding</InputEncoding>
<Image width="16" height="16" type="image/x-icon">data:image/x-icon;base64,imageData</Image>
<Url type="text/html" method="method" template="searchURL">
<Param name="paramName1" value="paramValue1"/>
...
<Param name="paramNameN" value="paramValueN"/>
</Url>
<Url type="application/x-suggestions+json" template="suggestionURL"/>
<moz:SearchForm>searchFormURL</moz:SearchForm>
</OpenSearchDescription>
Template Plugin OpenSearch dari OpenSearch Draft
Dibawah ini adalah template yang di ambil dari situs OpenSearch Draft sebagai pencetus ide OpenSearch, silahkan kunjungi situs resminya jika ingin memahami lebih lanjut tentang penggunaan dan penerapannya.
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Web Search</ShortName>
<Description>Use Example.com to search the Web.</Description>
<Tags>example web</Tags>
<Contact>admin@example.com</Contact>
<Url type="application/rss+xml" template="http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=rss"/>
</OpenSearchDescription>

Contoh Berkas Plugin OpenSearch Blogger

Dibawah ini adalah template yang Plugin OpenSearch yang Blogger Tune-Up gunakan. Silahkan klik link ini untuk melihat source code Plugin OpenSearch yang Blogger Tune-Up buat untuk browser Firefox.
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>Blogger Tune-Up</ShortName>
<Description>Pencarian Blogger Tune-Up Web Design Tutorial Sumber Daya dan Inspirasi</Description>
<Url type="text/html" method="get" template="http://modification-blog.blogspot.com/search">
<Param name="q" value="{searchTerms}" />
</Url>
<Image width="16" height="16" type="image/x-icon">http://modification-blog.blogspot.com/favicon.ico</Image>
<Developer>Dede Hendriono</Developer>
<InputEncoding>UTF-8</InputEncoding>
<Url type="application/opensearchdescription+xml" rel="self" template="http://modification-blog.blogspot.com/cari.xml" />
<moz:SearchForm>http://modification-blog.blogspot.com/search</moz:SearchForm>
</OpenSearchDescription>
Gunakan Notepad atau perangkat lunak sejenisnya untuk membuat atau melakukan perubahan data dan jangan lupa simpanlah file ini dengan filetype .xml, jangan lupa beri nama file tersebut (misal; cari.xml).
<ShortName>NAMA_BLOG</ShortName>
Ubah NAMA_BLOG sesuai dengan nama Blog anda
<Description>DESKRIPSI_BLOG</Description>
Ubah DESKRIPSI_BLOG sesuai dengan deskripsi blog anda
<Url type="text/html" method="get" template="http://ALAMAT_BLOG/search">
<Image width="16" height="16" type="image/x-icon">http://ALAMAT_BLOG/favicon.ico</Image>
<moz:SearchForm>http://ALAMAT_BLOG/search</moz:SearchForm>
Ubah ALAMAT_BLOG sesuai dengan alamat blog anda
<Developer>NAMA_ADMIN</Developer>
Ubah NAMA_ADMIN sesuai dengan nama pengelola Blog
<Url type="application/opensearchdescription+xml" rel="self" template="http://URL_HOSTING/nama_file.xml" />
Ubahlah link http://URL_HOSTING/nama_file.xml sesuai dengan alamat tempat anda menyimpan file ini. (berarti 2 kali pengeditan, upload, ambil alamat link, edit lagi dan masukan alamat link pada file ini). Unggahlah file ini pada hosting milik anda.

Integrasi Plugin OpenSearch Blogger

Setelah berkas plugin OpenSearch Blogger sudah di unggah pada hosting anda, ikuti langkah dibawah ini.
Langkah 1
Login ke Blogger
Langkah 2
Masuk ke Rancangan - Edit HTML
Langkah 3
Cari kode dibawah ini:
<head>
atau
</head>
Langkah 4
Masukan (copy paste) kode dibawah ini diantara tag <head>...</head>:
<link href='http://URL_HOSTING/nama_file.xml' rel='search' title='Blogger Tune-Up' type='application/opensearchdescription+xml'/>
Jangan lupa ubah dulu link sesuai dengan link yang diberikan hosting.
Langkah 5
Simpan Template dan Preview Blog. Jika benar maka akan ada sebuah baris penambahan mesin pencari.

Selamat mencoba dan semoga berhasil... Happy Blogging :)

Memahami Threaded Comments Blogger

Tuesday, February 28, 2012

Sejak Blogger meluncurkan Threaded Comments, banyak sekali para pengguna BlogSpot berbondong-bondong beralih ke komentar versi "Balas" ini. Namun tidak sedikit yang berakhir kecewa karena ternyata Threaded Comments tidak bisa bekerja dengan baik, bahkan ada yang sampai akhirnya beralih ke pihak ketiga penyedia layanan komentar karena sulitnya integrasi Threaded Comments pada template Blogger. Apa dan bagaimana sebenarnya Threaded Comments? Kita akan bahas (tuntas) untuk bisa memahami tentang fasilitas Threaded Comments pada Blogger dengan harapan mempermudah para blogger untuk melakukan modifikasi kode pada templatenya.
Fix Problem Reply Threaded Comments
Sebelum membahas tentang kode-kode yang memusingkan, mari kita pahami dulu perbedaan mendasar antar template yang telah dikeluarkan oleh Blogger. Blogger telah mengeluarkan beberapa versi template. Untuk mempermudahnya maka kita definiskan; versi kesatu kita sebut sebagai template Tata Letak yang menggunakan HTML4; dan versi kedua kita sebut sebagai template Perancang yang sudah menggunakan HTML5. Sedangkan versi Classic, versi Dynamic View dan versi Mobile tidak akan dibahas agar materi tidak terlalu melebar.

Dibawah ini akan diulas sekelumit tentang perbedaan mendasar namun penting untuk diketahui, antara template blogger versi Tata Letak (HTML4) dengan template versi Perancang (HTML5).

Header Document

Inilah perbedaan awal template blogger, jika kita menggunakan template versi Tata Letak berarti kita menggunakan HTML4. Jika kita menggunakan template versi Perancang berarti kita menggunakan HTML5. Silahkan perhatikan Header Document dibawah ini:
Versi Tata Letak - HTML4
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
Versi Perancang - HTML5
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html b:version='2' class='v2' expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
Catatan : Mengenai detail tag yang digunakan pada HTML5 akan dibahas pada artikel terpisah

CSS Widget Default

Perbedaan selanjutnya adalah stylesheet default yang disertakan (tanpa penawaran) pada template.
Versi Tata Letak
Stylesheet versi Tata Letak yang disertakan pada template tidak mengandung kode css untuk Threaded Comments.
<link type='text/css' rel='stylesheet' href='http://www.blogger.com/static/v1/widgets/2002994779-widget_css_bundle.css' />
Versi Perancang
Stylesheet versi Perancang yang disertakan pada template sudah terintegrasi kode css untuk Threaded Comments.
<link type='text/css' rel='stylesheet' href='http://www.blogger.com/static/v1/widgets/4132898751-widget_css_2_bundle.css' />

Kode Internal Template Threaded Comments

Sebenarnya antara template versi HTML4 dengan versi HTML5 tidak terlalu banyak perubahan dari sisi code (X)HTML-nya untuk fasilitas Threaded Comments. Perhatikan kode Threaded Comments dibawah ini dan bandingkan.

Versi Tata Letak - HTML4
<b:includable id='threaded_comment_js' var='post'>
<b:includable id='comment-form' var='post'>
<b:includable id='threaded_comments' var='post'>
<b:includable id='threaded-comment-form' var='post'>
<b:includable id='threaded_comment_css'>
<b:includable id='comments' var='post'>
Versi Perancang - HTML5
<b:includable id='threaded_comment_js' var='post'>
<b:includable id='comment-form' var='post'>
<b:includable id='threaded_comments' var='post'>
<b:includable id='threaded-comment-form' var='post'>
<b:includable id='comments' var='post'>
Dari perbandingan diatas maka akan ditemukan satu includable saja yang berbeda. Pada versi HTML4 terdapat <b:includable id='threaded_comment_css'> sedangkan pada versi HTML5 tidak ada karena stylesheet-nya sudah terintegrasi pada stylesheet default bawaan template (lihat penjelasan CSS Widget Default). Sedangkan ketika kita buka satu-satu bagian includable tersebut diatas maka ada perbedaan mendasar hanya pada bagian dalam kode dari <b:includable id='threaded_comment_js' var='post'> seperti dijelaskan selanjutnya.

Lokasi Penempatan Threaded Comments

Dimana lokasi penempatan Threaded Comments? Sebelum beralih ke Threaded Comments kita telusuri lebih dulu lokasi penempatan comments sebelum keluar versi Threaded Comments.
Lokasi Kode Sebelum Versi Threaded Comments
<b:if cond='data:blog.pageType == &quot;static_page&quot;'>
<b:include data='post' name='comments'/>
</b:if>

<b:if cond='data:blog.pageType == &quot;item&quot;'>
<b:include data='post' name='comments'/>
</b:if>
Perhatikan kode <b:include data='post' name='comments'/> itu adalah lokasi penempatan komentar dan form komentar. Pada template, kode tersebut terdapat pada 4 (empat) lokasi, jadi bukan hanya 2 (dua).

Lokasi Kode Sesudah Versi Threaded Comments
<b:if cond='data:blog.pageType == &quot;static_page&quot;'>
<b:if cond='data:post.showThreadedComments'>
<b:include data='post' name='threaded_comments'/>
<b:else/>
<b:include data='post' name='comments'/>
</b:if>
</b:if>

<b:if cond='data:blog.pageType == &quot;item&quot;'>
<b:if cond='data:post.showThreadedComments'>
<b:include data='post' name='threaded_comments'/>
<b:else/>
<b:include data='post' name='comments'/>
</b:if>
</b:if>
Perhatikan kode diatas lalu bandingkan dengan versi sebelum Threaded Comments, ada penambahan beberapa kode. Jika kita telusuri pada template, maka akan ditemukan 2 (dua) lokasi penempatan komentar.
Jika kode komentar template anda masih menggunakan versi awal (sebelum threaded comments) maka kode tersebut harus diganti dengan kode versi Threaded Comments. Namun ingat, bahwa kode tersebut terdapat pada 2 (dua) lokasi, gantilah kedua-duanya. Seperti dijelaskan pada artikel sebelumnya.

JavaScript Threaded Comments

Bagian inilah yang memiliki perbedaan sangat menonjol setelah dibuka dan dibandingkan. Namun tidak akan dibahas mendetail (lain waktu jika tidak malas). Dan ini merupakan salah satu solusi yang ditemukan Blogger Tune-Up ketika mendapati masalah Reply Threaded Comment tidak bekerja dengan baik, yaitu menukar JavaScript versi HTML4 dengan JavaScript versi HTML5.
Versi Tata Letak - HTML4
<b:includable id='threaded_comment_js' var='post'>
<script defer='defer' expr:src='data:post.commentSrc' type='text/javascript'/>
<script type='text/javascript'>
(function() {
var items = <data:post.commentJso/>;
var msgs = <data:post.commentMsgs/>;
var postId = &#39;<data:post.id/>&#39;;
var feed = &#39;<data:post.commentFeed/>&#39;;
var authorName = &#39;<data:post.author/>&#39;;
var authorUrl = &#39;<data:post.authorUrl/>&#39;;
var blogId = &#39;<data:top.id/>&#39;;
var baseUri = &#39;<data:post.commentBase/>&#39;;

// <![CDATA[
feed += '?alt=json&v=2&orderby=published&reverse=false&max-results=50';
var cursor = null;
if (items && items.length > 0) {
cursor = parseInt(items[items.length - 1].timestamp) + 1;
}

var bodyFromEntry = function(entry) {
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.contentRemoved') {
return '<span class="deleted-comment">' + entry.content.$t + '</span>';
}
}
}
return entry.content.$t;
}

var parse = function(data) {
cursor = null;
var comments = [];
if (data && data.feed && data.feed.entry) {
for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
var comment = {};
// comment ID, parsed out of the original id format
var id = /blog-(\d+).post-(\d+)/.exec(entry.id.$t);
comment.id = id ? id[2] : null;
comment.body = bodyFromEntry(entry);
comment.timestamp = Date.parse(entry.published.$t) + '';
if (entry.author && entry.author.constructor === Array) {
var auth = entry.author[0];
if (auth) {
comment.author = {
name: (auth.name ? auth.name.$t : undefined),
profileUrl: (auth.uri ? auth.uri.$t : undefined),
avatarUrl: (auth.gd$image ? auth.gd$image.src : undefined)
};
}
}
if (entry.link) {
if (entry.link[2]) {
comment.link = comment.permalink = entry.link[2].href;
}
if (entry.link[3]) {
var pid = /.*comments\/default\/(\d+)\?.*/.exec(entry.link[3].href);
if (pid && pid[1]) {
comment.parentId = pid[1];
}
}
}
comment.deleteclass = 'item-control blog-admin';
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
console.log(entry.gd$extendedProperty[k].name + ' - ' + entry.gd$extendedProperty[k].value);
if (entry.gd$extendedProperty[k].name == 'blogger.itemClass') {
comment.deleteclass += ' ' + entry.gd$extendedProperty[k].value;
}
}
}
comments.push(comment);
}
}
return comments;
};

var paginator = function(callback) {
if (hasMore()) {
var url = feed;
if (cursor) {
url += '&published-min=' + new Date(cursor).toISOString();
}
window.bloggercomments = function(data) {
var parsed = parse(data);
cursor = parsed.length < 50 ? null
: parseInt(parsed[parsed.length - 1].timestamp) + 1
callback(parsed);
window.bloggercomments = null;
}
url += '&callback=bloggercomments';
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
};
var hasMore = function() {
return !!cursor;
};
var getMeta = function(key, comment) {
if ('iswriter' == key) {
var matches = !!comment.author
&& comment.author.name == authorName
&& comment.author.profileUrl == authorUrl;
return matches ? 'true' : '';
} else if ('deletelink' == key) {
return baseUri + '/delete-comment.g?blogID=' + blogId + '&postID=' + comment.id;
} else if ('deleteclass' == key) {
return comment.deleteclass;
}
return '';
};

var replybox = null;
var replyUrlParts = null;
var replyParent = undefined;

var onReply = function(commentId, domId) {
if (replybox == null) {
// lazily cache replybox, and adjust to suit this style:
replybox = document.getElementById('comment-editor');
if (replybox != null) {
replybox.height = '250px';
replybox.style.display = 'block';
replyUrlParts = replybox.src.split('#');
}
}
if (replybox && (commentId !== replyParent)) {
document.getElementById(domId).insertBefore(replybox, null);
replybox.src = replyUrlParts[0]
+ (commentId ? '&parentID=' + commentId : '')
+ '#' + replyUrlParts[1];
replyParent = commentId;
}
};

var tok = 'comment-form_';
var hash = window.location.hash || '';
var startThread = hash.indexOf(tok) == 1 ? hash.substring(tok.length + 1) : undefined;

// Configure commenting API:
var configJso = {
'maxDepth': 2
};
var provider = {
'id': postId,
'data': items,
'loadNext': paginator,
'hasMore': hasMore,
'getMeta': getMeta,
'onReply': onReply,
'rendered': true,
'initReplyThread': startThread,
'config': configJso,
'messages': msgs
};

var render = function() {
if (window.goog && window.goog.comments) {
var holder = document.getElementById('comment-holder');
window.goog.comments.render(holder, provider);
}
};

// render now, or queue to render when library loads:
if (window.goog && window.goog.comments) {
render();
} else {
window.goog = window.goog || {};
window.goog.comments = window.goog.comments || {};
window.goog.comments.loadQueue = window.goog.comments.loadQueue || [];
window.goog.comments.loadQueue.push(render);
}
})();
// ]]>
</script>
</b:includable>
Versi Perancang - HTML5
<b:includable id='threaded_comment_js' var='post'>
<script async='async' expr:src='data:post.commentSrc' type='text/javascript'/>
<script type='text/javascript'>
(function() {
var items = <data:post.commentJso/>;
var msgs = <data:post.commentMsgs/>;
var config = <data:post.commentConfig/>;

// <![CDATA[
var cursor = null;
if (items && items.length > 0) {
cursor = parseInt(items[items.length - 1].timestamp) + 1;
}

var bodyFromEntry = function(entry) {
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.contentRemoved') {
return '<span class="deleted-comment">' + entry.content.$t + '</span>';
}
}
}
return entry.content.$t;
}

var parse = function(data) {
cursor = null;
var comments = [];
if (data && data.feed && data.feed.entry) {
for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
var comment = {};
// comment ID, parsed out of the original id format
var id = /blog-(\d+).post-(\d+)/.exec(entry.id.$t);
comment.id = id ? id[2] : null;
comment.body = bodyFromEntry(entry);
comment.timestamp = Date.parse(entry.published.$t) + '';
if (entry.author && entry.author.constructor === Array) {
var auth = entry.author[0];
if (auth) {
comment.author = {
name: (auth.name ? auth.name.$t : undefined),
profileUrl: (auth.uri ? auth.uri.$t : undefined),
avatarUrl: (auth.gd$image ? auth.gd$image.src : undefined)
};
}
}
if (entry.link) {
if (entry.link[2]) {
comment.link = comment.permalink = entry.link[2].href;
}
if (entry.link[3]) {
var pid = /.*comments\/default\/(\d+)\?.*/.exec(entry.link[3].href);
if (pid && pid[1]) {
comment.parentId = pid[1];
}
}
}
comment.deleteclass = 'item-control blog-admin';
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.itemClass') {
comment.deleteclass += ' ' + entry.gd$extendedProperty[k].value;
}
}
}
comments.push(comment);
}
}
return comments;
};

var paginator = function(callback) {
if (hasMore()) {
var url = config.feed + '?alt=json&v=2&orderby=published&reverse=false&max-results=50';
if (cursor) {
url += '&published-min=' + new Date(cursor).toISOString();
}
window.bloggercomments = function(data) {
var parsed = parse(data);
cursor = parsed.length < 50 ? null
: parseInt(parsed[parsed.length - 1].timestamp) + 1
callback(parsed);
window.bloggercomments = null;
}
url += '&callback=bloggercomments';
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
};
var hasMore = function() {
return !!cursor;
};
var getMeta = function(key, comment) {
if ('iswriter' == key) {
var matches = !!comment.author
&& comment.author.name == config.authorName
&& comment.author.profileUrl == config.authorUrl;
return matches ? 'true' : '';
} else if ('deletelink' == key) {
return config.baseUri + '/delete-comment.g?blogID='
+ config.blogId + '&postID=' + comment.id;
} else if ('deleteclass' == key) {
return comment.deleteclass;
}
return '';
};

var replybox = null;
var replyUrlParts = null;
var replyParent = undefined;

var onReply = function(commentId, domId) {
if (replybox == null) {
// lazily cache replybox, and adjust to suit this style:
replybox = document.getElementById('comment-editor');
if (replybox != null) {
replybox.height = '250px';
replybox.style.display = 'block';
replyUrlParts = replybox.src.split('#');
}
}
if (replybox && (commentId !== replyParent)) {
document.getElementById(domId).insertBefore(replybox, null);
replybox.src = replyUrlParts[0]
+ (commentId ? '&parentID=' + commentId : '')
+ '#' + replyUrlParts[1];
replyParent = commentId;
}
};

var hash = (window.location.hash || '#').substring(1);
var startThread, targetComment;
if (/^comment-form_/.test(hash)) {
startThread = hash.substring('comment-form_'.length);
} else if (/^c[0-9]+$/.test(hash)) {
targetComment = hash.substring(1);
}

// Configure commenting API:
var configJso = {
'maxDepth': config.maxThreadDepth
};
var provider = {
'id': config.postId,
'data': items,
'loadNext': paginator,
'hasMore': hasMore,
'getMeta': getMeta,
'onReply': onReply,
'rendered': true,
'initComment': targetComment,
'initReplyThread': startThread,
'config': configJso,
'messages': msgs
};

var render = function() {
if (window.goog && window.goog.comments) {
var holder = document.getElementById('comment-holder');
window.goog.comments.render(holder, provider);
}
};

// render now, or queue to render when library loads:
if (window.goog && window.goog.comments) {
render();
} else {
window.goog = window.goog || {};
window.goog.comments = window.goog.comments || {};
window.goog.comments.loadQueue = window.goog.comments.loadQueue || [];
window.goog.comments.loadQueue.push(render);
}
})();
// ]]>
</script>
</b:includable>
Demikianlah saya coba memahami apa yang ingin disampaikan oleh kode-kode (X)HTML Blogger. Mohon koreksinya jika ada kesalahan pemahaman. Selamat berpusing ria dan Happy Blogging :)
 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2011. Tutorial Blogger - All Rights Reserved
Template Created by Creating Website Inspired by Sportapolis Shape5.com
Proudly powered by Blogger