Berikut ini adalah design yang akan kita konversi ke HTML5:
Sebelum membuat markup-nya, kita bisa menggunakan online tool untuk mempermudah pemakaian @font-face. Tool yang biasa saya gunakan adalah @font-face generator dari
fontsquirrel. Custom fonts yang dipakai dalam website ini adalah: Ballpark, Jura, dan Titillium. Tutorial ini juga menggunakan 960.gs CSS Framework yang bisa didownload
di sini.
Basic Mark Up
Untuk kerangka markup secara sederhana bisa kita mulai dengan kode berikut:
04 | < meta charset = "utf-8" > |
05 | < title >RumahDot Personal Websitetitle > |
06 | < meta name = "description" content = "It's Rumahdot's home sweet home" > |
07 | < link rel = "shortcut icon" href = "favicon.ico" > |
08 | < link rel = "stylesheet" href = "css/general.css" > |
09 | < script src = "js/libs/jquery-1.4.2.min.js" >script > |
10 | < script src = "js/libs/modernizr-1.6.min.js" >script > |
16 | < script src = "js/script.js" >script > |
Doctype yang singkat sebagai ciri khas HTML5:
Pada HTML5 beberapa atribut tidak perlu digunakan dan merupakan kode yang valid seperti:
Meta Charset
Link dan Script Tanpa Atribute Type
1 | < link rel = "stylesheet" href = "css/general.css" > |
2 | < script src = "js/libs/jquery-1.4.2.min.js" >script > |
Library Javascript yang digunakan di antaranya adalah
Modernizr untuk memastikan browser-browser lama bisa menerjemahkan elemen-elemen HTML5 dengan benar. Dan untuk konten sendiri, kita akan menggunakan markup sebagai berikut:
Ada beberapa tag HTML5 yang kita pakai, meliputi:
Header
Elemen ini digunakan sebagai ‘header’ pada sebuah dokumen atau bagian dokumen yang biasanya mengandung heading dan subheading. Tapi selain itu bisa juga digunakan sebagai area untuk menempatkan informasi versi atau tanggal publikasi sebuah post.
Di kode yang saya tulis di atas, bisa dilihat ada atribut role yang kita gunakan sebagai
landmark roles.
Nav
Elemen ini memuat kumpulan link yang menuju pada dokumen lain, atau bagian lain dalam sebuah dokumen.
Section
Merupakan bagian pada sebuah dokumen HTML5 yang memuat kumpulan dari beberapa konten sejenis. Biasanya mengandung elemen header, dan atau sebuah elemen footer. Anda bisa menggunakan
HTML Outliner untuk mengetahui penggunaan section secara tepat, karena elemen ini seharusnya memiliki sebuah heading yang ‘natural’ sebagai identifikasi setiap section pada sebuah dokumen.
Article
Bagian ini hampir sama dengan section, memuat beberapa konten sejenis, tetapi yang membedakan adalah bagian ini bersifat: bisa berdiri sendiri (independen).
Barangkali sering kita jumpai beberapa penjelasan yang membingungkan dan rancu antara elemen
section dan
article. Tapi selama ini saya menitikberatkan pada poin
independen tersebut di atas. Jadi bayangkan bila sebuah bagian dokumen dipisahkan dari bagian-bagian lain dalam dokumen tersebut. Dan bagian ini juga bersifat
reusable dan
distributable, yang ‘masuk akal’ jika dibaca melalui sebuah feed reader.
Footer
Bagian yang merupakan ‘footer’ dokumen atau bagian dokumen, yang biasanya mengandung metadata seperti link terkait, informassi kontak dan sebagainya. Perlu diingat bahwa elemen header maupun footer tidak harus mengacu pada
lokasi/penempatan elemen ini di mana masih banyak yang beranggapan bahwa pada sebuah dokumen hanya memiliki satu header dan satu footer. Kenyataanya adalah setiap section atau article pada dokumenpun bisa juga mengandung elemen header atau footer.
Content Markup
Kita mulai dengan bagian header dan form pencarian:
5 | < form action = "#" role = "search" > |
6 | < input type = "text" name = "search" value = "Type a keyword and hit enter" /> |
Kemudian Navigasi Utama:
3 | < li >< a href = "#" >Homea >li > |
4 | < li >< a href = "#" >Abouta >li > |
5 | < li >< a href = "#" >Gallerya >li > |
6 | < li >< a href = "#" >Media Appearancea >li > |
7 | < li >< a href = "#" >Contacta >li > |
Bagian berikutnya adalah home slider:
05 | < span >< img src = "images/pic_1.jpg" alt = "Picture 1" />span > |
06 | < p >< strong >Lorem Ipsum Do Lor Sit Ametstrong >< br />Contrary to popular believes, lorem ipsum is not simply random text.p > |
09 | < div id = "slider-paging" > div > |
Untuk slider kita menggunakan plugin
jQuery Cycle-nya Pakdhe Malsup.
Bagian About Me:
04 | < span >< img src = "images/ava_1.jpg" alt = "Avatar 1" />span > |
05 | < p >Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock … < a href = "#" >Continue Reading →a >p > |
07 | < div id = "social-links" > |
08 | < h3 >< img src = "images/stay-connected.png" alt = "Stay Connected" />h3 > |
10 | < li >< a href = "#" >Facebooka >li > |
11 | < li >< a href = "#" >Twittera >li > |
12 | < li >< a href = "#" >Myspacea >li > |
13 | < li >< a href = "#" >Flickra >li > |
14 | < li >< a href = "#" >Linkedina >li > |
15 | < li >< a href = "#" >Skypea >li > |
Bagian Recent News:
04 | < div id = "recent-news" > |
09 | < h3 >Songs of Desperation, I Played Them for Youh3 > |
10 | < p >Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical … < a href = "#" >Continue Reading →a >p > |
16 | < h3 >Sweet Disposition, Never Too Soonh3 > |
17 | < p >Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical … < a href = "#" >Continue Reading →a >p > |
21 | < div id = "news-paging" > div > |
Dan kemudian kita mulai untuk membuat markup footer, yang meliputi:
Footer Related Links:
02 | < h2 >< img src = "images/sitemap.png" alt = "Sitemap" />h2 > |
04 | < li >< a href = "#" >Homepagea >li > |
05 | < li >< a href = "#" >Recent Newsa >li > |
06 | < li >< a href = "#" >About Mea >li > |
07 | < li >< a href = "#" >Contacta >li > |
08 | < li >< a href = "#" >Gallerya >li > |
Dan Contact Information:
02 | < h2 >< img src = "images/contact-information.png" alt = "Contact Information" />h2 > |
05 | < p >< span >A Very Long Stspan >, |
06 | < span > Hidden Cityspan >, |
07 | < span > Whatthestatespan > |
10 | < div >Phone: < span >+6221 563 5666span >div > |
11 | < div >Email: < a href = "mailto:you@mine.com" >you@mine.coma >div > |
Bila Anda ingin menggunakan markup sehingga data kontak bisa diekstrak ataupun memiliki makna yang lebih semantic, Anda bisa mencoba
Microformats.
Untuk styling dasar kita membuat satu file bernama general.css yang berisi kode berikut:
1 | @import url ( 'reset.css' ); |
4 | article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { |
Karena menggunakan framework 960.css kita perlu mengimport file-file CSS yang diperlukan seperti reset.css dan 960.css. Kemudian untuk elemen-elemen HTML5 kita perlu menambahkan property: value → display: block agar browser lama bisa membaca tag-tag tersebut sebagai block elements.
Sejauh ini kita telah membuat markup dan style dasar yang hasilnya seperti
ini.
Kemudian kita membuat styling untuk keseluruhan markup:
002 | background : #EEEEEE url ( '../images/body-bg.png' ); |
003 | font-family : Arial , sans-serif ; |
013 | text-decoration : none |
017 | text-decoration : underline |
022 | .site-header, .search { |
027 | font : normal 39px Jura, Georgia, sans-serif ; |
028 | text-shadow : 1px 1px 1px #FFFFFF |
037 | padding : 7px 25px 9px 9px ; |
039 | background : #FFFFFF url ( '../images/icon-search.png' ) no-repeat 97% 50% ; |
044 | -moz-border-radius: 5px ; |
045 | -webkit-border-radius: 5px |
053 | background : url ( '../images/top-nav-bg.png' ) repeat-x left top ; |
067 | display : inline- block ; |
070 | font : normal 13px Titillium, Arial , sans-serif ; |
071 | text-transform : uppercase ; |
076 | text-decoration : none ; |
078 | border-bottom : 1px dotted #333333 |
087 | background : url ( '../images/shadow-1.png' ) no-repeat center bottom ; |
088 | padding-bottom : 20px ; |
109 | font : normal 13px Titillium, Arial , sans-serif |
114 | text-transform : uppercase ; |
123 | padding-bottom : 13px ; |
124 | background : url ( '../images/shadow-2.png' ) no-repeat center bottom ; |
129 | .sub-about, .sub-news { |
135 | .sub-about h 2 , .sub-news h 2 { |
136 | font : bold 29px Ballpark, Georgia, serif ; |
139 | border-bottom : 1px dotted #cccccc ; |
140 | text-shadow : 1px 1px 1px #cccccc |
151 | border : 1px solid #eeeeee ; |
181 | display : inline- block ; |
185 | text-indent : -9999px ; |
190 | background : url ( '../images/icon-socials.png' ) no-repeat 0 0 |
194 | background : url ( '../images/icon-socials.png' ) no-repeat 0 -32px |
198 | background : url ( '../images/icon-socials.png' ) no-repeat 0 -64px |
202 | background : url ( '../images/icon-socials.png' ) no-repeat 0 -96px |
206 | background : url ( '../images/icon-socials.png' ) no-repeat 0 -128px |
210 | background : url ( '../images/icon-socials.png' ) no-repeat 0 -160px |
233 | background : url ( '../images/icon-comment.png' ) no-repeat center ; |
238 | display : inline- block ; |
242 | font : normal 18px Ballpark, Georgia, serif |
253 | font : bold 13px Arial , sans-serif |
265 | .sitemap h 2 , .contact-info h 2 { |
285 | font : normal 13px Titillium, Arial , sans-serif ; |
293 | .contact-info p, .contact-info a { |
294 | font : normal 13px Titillium, Arial , sans-serif ; |
303 | src : url ( 'wfs/jura-webfont.eot' ); |
304 | src : local ( '?' ), url ( 'wfs/jura-webfont.woff' ) format ( 'woff' ), url ( 'wfs/jura-webfont.ttf' ) format ( 'truetype' ), url ( 'wfs/jura-webfont.svg#webfontndntrgZk' ) format ( 'svg' ); |
310 | font-family : 'Ballpark' ; |
311 | src : url ( 'wfs/ball_park_by_oopsfaboulous-webfont.eot' ); |
312 | src : local ( '?' ), url ( 'wfs/ball_park_by_oopsfaboulous-webfont.woff' ) format ( 'woff' ), url ( 'wfs/ball_park_by_oopsfaboulous-webfont.ttf' ) format ( 'truetype' ), url ( 'wfs/ball_park_by_oopsfaboulous-webfont.svg#webfontjWLDzJVm' ) format ( 'svg' ); |
318 | font-family : 'Titillium' ; |
319 | src : url ( 'wfs/titilliumtext250wt-webfont.eot' ); |
320 | src : local ( '?' ), url ( 'wfs/titilliumtext250wt-webfont.woff' ) format ( 'woff' ), url ( 'wfs/titilliumtext250wt-webfont.ttf' ) format ( 'truetype' ), url ( 'wfs/titilliumtext250wt-webfont.svg#webfontlIqANnt2' ) format ( 'svg' ); |
Beberapa property CSS3 kita gunakan, seperti text-shadow, border-radius, dan juga font-face seperti yang saya jelaskan di bagian awal tutorial ini. Hasil sementara bisa dilihat
di sini.
Berikutnya kita mulai masuk ke bagian javascriptnya dengan menggunakan jQuery.
Buat file baru bernama script.js:
1 | $(document).ready( function (){ |
Bagian pertama kita mulai dengan home slider. Karenan menggunakan jQuery cycle, maka kita hanya perlu menuliskan fungsinya sebagai berikut:
02 | $( '#slider ul' ).cycle({ |
05 | pager: '#slider-paging' , |
Kemudian pada CSS nya kita sesuaikan dengan menambah baris sebagai berikut untuk pengaturan slider paging:
16 | background : url ( '../images/slider-links.png' ) no-repeat 0 0 |
19 | #slider-paging a:hover, #slider-paging a.activeSlide { |
20 | background : url ( '../images/slider-links.png' ) no-repeat 0 -13px |
Begitu juga dengan slider untuk Recent News kita gunakan fungsi sama seperti sebelumnya:
02 | $( '#recent-news ul' ).cycle({ |
05 | pager: '#news-paging' , |
Lalu sesuaikan CSSnya sebagai berikut:
15 | background : url ( '../images/recent-nav.png' ) no-repeat 0 0 |
19 | background : url ( '../images/recent-nav.png' ) no-repeat 0 -17px |
Kemudian fungsi berikut adalah untuk efek Clear Input pada form pencarian:
1 | $.fn.clearInput = function (){ |
3 | $.data( this , 'default' , obj.val()) |
4 | var defaultvalue = $.data( this , 'default' ); |
5 | function clear() { if (obj.val()==defaultvalue) obj.val( '' ) } |
6 | function reset() { if (obj.val()== '' ) obj.val(defaultvalue) } |
7 | $( this ).focus(clear).blur(reset); |
Secara singkat konsepnya adalah: menyimpan value yang kita isikan sebelumnya sebagai nilai default menggunakan metode jQuery.data, kemudian membuat dua fungsi baru yaitu clear untuk membersihkan isian input pencarian jika value-nya sama dengan default, dan fungsi reset untuk mengembalikan nilai default jika value tidak tersedia. Kemudian memanggil fungsi clear pada event focus dan fungsi reset pada event blur. Terakhir, kita panggil fungsi di atas dengan cara sebagai berikut:
1 | $( '.search form input' ).clearInput(); |
Selesai! Anda baru saja menyelesaikan konversi dari PSD ke HTML5 dengan hasil seperti
berikut ini.
Semoga bermanfaat,