Website sendiri merupakan teknologi yang sudah ada sejak 30 tahun silam.
Tim Berners-Lee seorang ilmuwan inggris menemukan World Wide
Web (WWW) pada tahun 1989 ketika ia bekerja di CERN (Conseil Européen
pour la Recherche Nucléaire). Web awalnya dibuat dan dikembangkan untuk
memenuhi permintaan dalam berbagi informasi secara otomatis antar
ilmuwan di universitas dan lembaga di seluruh dunia. Web pertama di CERN
didedikasikan sebagai web pertama di dunia dan pada 2013 CERN merilis “a
project to restore this first ever website: info.cern.ch” untuk mengabadikan
website pertama di dunia. Thank you CERN! Thank you Tim Berners-Lee!
Web Server
Seperti yang sudah disebutkan sebelumnya, informasi pada sebuah website
disimpan pada server. Lantas apa itu server? Banyak yang mengira
bahwa server adalah sebuah komputer dengan performa tinggi dan berukuran
besar. Hal tersebut tidak salah karena biasanya komputer yang dijadikan server
memang harus memiliki performa yang tinggi, karena selain untuk menyimpan
data (HTML, CSS dan JS disimpan di sini), server juga harus melakukan
pekerjaan yang cukup berat, yaitu menanggapi, menyediakan dan mengelola data
yang diminta oleh client. Tidak hanya satu client, bisa ratusan bahkan ribuan.
HTTP Server
HTTP Server merupakan sebuah software yang dapat menerima transaksi dari
HyperText Transfer Protocol dalam suatu website atau biasa disebut dengan
“HTTP Server”. Banyak software yang dapat melakukan tugas tersebut. Apache
adalah salah satunya yang cukup friendly, gratis dan tersedia untuk seluruh
komputer dengan basis UNIX (termasuk MacOS) dan juga Windows.
DNS Server
Client
Jika ada penyedia (server) tentu ada pengguna bukan? Perangkat yang meminta
(request) suatu layanan tertentu ke suatu server disebut dengan client. Browser
merupakan salah satu client yang memanfaatkan HTTP Server dalam transaksi
datanya. Jelas, tujuannya adalah untuk mengolah, menampilkan dan melakukan
interaksi dengan dokumen yang disediakan oleh web server. Layaknya sebuah
pelukis, browser mampu menyajikan informasi dalam bentuk visual yang indah,
bersumber dari data mentah yang diperoleh dari server.
Anatomi Website
Kita terbiasa dengan tampilan website yang nampak pada browser, tetapi apakah
kalian tahu bagaimana website dapat tampil demikian? Terdapat 3 (tiga) fondasi
penting dalam membuat website. Yang pertama adalah HTML, yakni salah
satu markup language, yang digunakan untuk membuat struktur dan
menampilkan konten pada World Wide Web (Website). CSS dan JavaScript
merupakan fondasi lainnya yang digunakan untuk mempercantik dan menjadikan
website lebih dinamis dan interaktif.
Main idea: https://www.freecodecamp.org/news/learn-html-in-5-minutes-ccd378d2ab72/
Sama seperti halnya tubuh manusia yang disusun dari kerangka tulang, HTML
pada website berperan sebagai kerangka dasar yang digunakan dalam
menampilkan visual pada website. Tapi jika hanya sebatas kerangka, seorang
manusia akan terlihat menyeramkan dan aneh bukan? Maka dari itu untuk
mempercantik tampilannya kita membutuhkan sebuah kulit. Di sinilah peran CSS.
Setelah memiliki kulit dan nampak cantik, selanjutnya kita membutuhkan sebuah
otak dan otot agar seorang manusia dapat dinamis dan berinteraksi. Dalam
website JavaScript-lah yang berperan dalam membuat website yang dinamis dan
interaktif.
Pada modul 6, kita akan belajar bagaimana cara menyusun layout yang
responsif menggunakan flexbox. Dan kita juga akan praktek membuat sebuah
layout dasar kalkulator pada website.
Dan JavaScript akan dibahas pada modul 7. Di sana kita akan belajar dasar-
dasar dari bahasa pemrograman tersebut, dari pengenalan syntax,
penggunaan variabel, tipe data yang ada, iterator dll. Di sana kita juga akan
belajar bagaimana cara memanipulasi “DOM” dengan menggunakan
JavaScript sehingga dapat membuat website yang interaktif.
Pada modul 8, kita akan mempelajari cara mengelola sebuah data atau objek
pada local storage ataupun session storage dengan memanfaatkan Web
Storage. Sampai modul ini, kita akan membuat sebuah proyek kalkulator
sederhana dengan memanfaatkan Web Storage untuk menyimpan histori
perhitungannya.
Dan pada akhir pembelajaran, untuk lulus dari kelas ini, terdapat submission
alias proyek akhir yang harus Anda kirimkan. Proyek tersebut akan kemudian
kami review guna menentukan kelulusan Anda.
Text Editors
Perlu kita perhatikan bahwa kode yang kita tuliskan merupakan sebuah plain
text. Sehingga pastikan kita gunakan text editor yang tepat. Jangan pernah
kita gunakan Microsoft Word untuk menuliskan sebuah kode, karena
aplikasi tersebut menampilkan teks yang telah diformat atau biasa disebut
dengan rich text.
Selain text editors usungan sistem operasi yang kita gunakan, berikut tiga text
editor lainnya yang bisa kita gunakan untuk membuat sebuah website.
Atom Editor
Browser
Developer Tools atau Dev Tools merupakan suatu alat yang dapat digunakan
untuk melakukan debugging pada sebuah website. Dev Tools ini merupakan
tools yang andal dalam mencari suatu bugs dan memperbaikinya. Bahkan
kita dapat mensimulasikan tampilan website pada sebuah layar smartphone,
sehingga tak perlu repot-repot pakai smartphone untuk melihat
responsibilitas website yang kita kembangkan.
Untuk kalian yang sudah menginstal Google Chrome atau Mozilla Firefox,
artinya kalian siap untuk menuju modul selanjutnya. Jika belum, kalian bisa
mengunduhnya pada website berikut:
Introduction HTML
Seperti yang sudah kita ketahui, HTML berperan sebagai struktur untuk
membangun sebuah halaman website. Dan pada modul ini kita akan mencoba
menuliskan struktur HTML, siap? Pada akhir modul, kita akan membuat halaman
website seperti gambar berikut:
Windows
. Bandung
. Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.
.
.
. Sejarah
. Kata Bandung berasal dari kata bendung atau bendungan karena terbendungnya
sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu membentuk telaga.
Legenda yang diceritakan oleh orang-orang tua di Bandung mengatakan bahwa
nama Bandung diambil dari sebuah kendaraan air yang terdiri dari dua perahu
yang diikat berdampingan yang disebut perahu bandung yang digunakan oleh
Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari Ci Tarum dalam
mencari tempat kedudukan kabupaten yang baru untuk menggantikan ibu kota
yang lama di Dayeuhkolot.
.
.
. Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat Nga-
Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur karena
mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan atau
bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari banda
adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu Pertiwi
tempat Banda berada.
.
.
. Geografis
. Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota ini
terletak di tengah-tengah provinsi Jawa Barat, serta berada pada ketinggian
±768 m di atas permukaan laut, dengan titik tertinggi di berada di sebelah
utara dengan ketinggian 1.050 meter di atas permukaan laut dan sebelah
selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.
.
.
. Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung dan Sungai
Citarum beserta anak-anak sungainya yang pada umumnya mengalir ke arah
selatan dan bertemu di Sungai Citarum. Dengan kondisi yang demikian, Bandung
selatan sangat rentan terhadap masalah banjir terutama pada musim hujan.
.
.
. Wisata
. Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi tujuan
utama dalam menikmati liburan akhir pekan terutama dari masyarakat yang
berasal dari Jakarta sekitarnya. Selain menjadi kota wisata belanja, kota
Bandung juga dikenal dengan sejumlah besar bangunan lama berarsitektur
peninggalan Belanda.
.
.
. Farm House Lembang
. Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata yang
tidak pernah sepi pengunjung. Selain karena letaknya strategis, kawasan ini
juga menghadirkan nuansa wisata khas Eropa. Semua itu diterapkan dalam
bentuk spot swafoto Instagramable.
.
.
. Observatorium Bosscha
. Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop Surya. Refraktor
Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong bintang. Benda
ini diletakkan pada atap kubah sehingga saat teropong digunakan, atap
tersebut harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapa
pun, tanpa tiket. Namun, bagi yang ingin menggunakan teleskop Zeiss, wajib
mendaftarkan diri. Untuk instansi atau lembaga pendidikan, diberikan jadwal
hari Selasa sampai Jumat. Sementara itu, kunjungan individu dibuka setiap
hari Sabtu.
Langkah awal dalam membuat berkas html adalah buka aplikasi TextEdit,
lakukan pencarian dengan menuliskan “TextEdit”.
Lalu setelah aplikasi TextEdit terbuka, masuk ke preference untuk melakukan
pengaturan pada TextEdit melalui panel atas seperti gambar berikut ini:
. Bandung
. Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.
.
.
. Sejarah
. Kata Bandung berasal dari kata bendung atau bendungan karena terbendungnya
sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu membentuk telaga.
Legenda yang diceritakan oleh orang-orang tua di Bandung mengatakan bahwa
nama Bandung diambil dari sebuah kendaraan air yang terdiri dari dua perahu
yang diikat berdampingan yang disebut perahu bandung yang digunakan oleh
Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari Ci Tarum dalam
mencari tempat kedudukan kabupaten yang baru untuk menggantikan ibu kota
yang lama di Dayeuhkolot.
.
.
. Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat Nga-
Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur karena
mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan atau
bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari banda
adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu Pertiwi
tempat Banda berada.
.
.
. Geografis
. Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota ini
terletak di tengah-tengah provinsi Jawa Barat, serta berada pada ketinggian
±768 m di atas permukaan laut, dengan titik tertinggi di berada di sebelah
utara dengan ketinggian 1.050 meter di atas permukaan laut dan sebelah
selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.
.
.
. Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung dan Sungai
Citarum beserta anak-anak sungainya yang pada umumnya mengalir ke arah
selatan dan bertemu di Sungai Citarum. Dengan kondisi yang demikian, Bandung
selatan sangat rentan terhadap masalah banjir terutama pada musim hujan.
.
.
. Wisata
. Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi tujuan
utama dalam menikmati liburan akhir pekan terutama dari masyarakat yang
berasal dari Jakarta sekitarnya. Selain menjadi kota wisata belanja, kota
Bandung juga dikenal dengan sejumlah besar bangunan lama berarsitektur
peninggalan Belanda.
.
.
. Farm House Lembang
. Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata yang
tidak pernah sepi pengunjung. Selain karena letaknya strategis, kawasan ini
juga menghadirkan nuansa wisata khas Eropa. Semua itu diterapkan dalam
bentuk spot swafoto Instagramable.
.
.
. Observatorium Bosscha
. Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop Surya. Refraktor
Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong bintang. Benda
ini diletakkan pada atap kubah sehingga saat teropong digunakan, atap
tersebut harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapa
pun, tanpa tiket. Namun, bagi yang ingin menggunakan teleskop Zeiss, wajib
mendaftarkan diri. Untuk instansi atau lembaga pendidikan, diberikan jadwal
hari Selasa sampai Jumat. Sementara itu, kunjungan individu dibuka setiap
hari Sabtu.
Maka jika kita buka finder, di dalam folder yang kita tentukan akan terdapat
berkas index.html.
Selamat! Dengan begitu kita sudah membuat berkas HTML pertama. Silakan
buka berkas HTML tersebut menggunakan suatu browser (dalam contoh ini,
kita menggunakan Google Chrome), maka hasilnya akan nampak seperti ini:
Linux (Ubuntu)
. Bandung
. Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.
.
.
. Sejarah
. Kata Bandung berasal dari kata bendung atau bendungan karena terbendungnya
sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu membentuk telaga.
Legenda yang diceritakan oleh orang-orang tua di Bandung mengatakan bahwa
nama Bandung diambil dari sebuah kendaraan air yang terdiri dari dua perahu
yang diikat berdampingan yang disebut perahu bandung yang digunakan oleh
Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari Ci Tarum dalam
mencari tempat kedudukan kabupaten yang baru untuk menggantikan ibu kota
yang lama di Dayeuhkolot.
.
.
. Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat Nga-
Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur karena
mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan atau
bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari banda
adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu Pertiwi
tempat Banda berada.
.
.
. Geografis
. Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota ini
terletak di tengah-tengah provinsi Jawa Barat, serta berada pada ketinggian
±768 m di atas permukaan laut, dengan titik tertinggi di berada di sebelah
utara dengan ketinggian 1.050 meter di atas permukaan laut dan sebelah
selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.
.
.
. Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung dan Sungai
Citarum beserta anak-anak sungainya yang pada umumnya mengalir ke arah
selatan dan bertemu di Sungai Citarum. Dengan kondisi yang demikian, Bandung
selatan sangat rentan terhadap masalah banjir terutama pada musim hujan.
.
.
. Wisata
. Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi tujuan
utama dalam menikmati liburan akhir pekan terutama dari masyarakat yang
berasal dari Jakarta sekitarnya. Selain menjadi kota wisata belanja, kota
Bandung juga dikenal dengan sejumlah besar bangunan lama berarsitektur
peninggalan Belanda.
.
.
. Farm House Lembang
. Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata yang
tidak pernah sepi pengunjung. Selain karena letaknya strategis, kawasan ini
juga menghadirkan nuansa wisata khas Eropa. Semua itu diterapkan dalam
bentuk spot swafoto Instagramable.
.
.
. Observatorium Bosscha
. Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop Surya. Refraktor
Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong bintang. Benda
ini diletakkan pada atap kubah sehingga saat teropong digunakan, atap
tersebut harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapa
pun, tanpa tiket. Namun, bagi yang ingin menggunakan teleskop Zeiss, wajib
mendaftarkan diri. Untuk instansi atau lembaga pendidikan, diberikan jadwal
hari Selasa sampai Jumat. Sementara itu, kunjungan individu dibuka setiap
hari Sabtu.
Setelah selesai lakukan save dengan memberikan nama “index.html”.
Pada contoh di bawah ini, lokasi berkas index.html akan disimpan pada
directory home -> dicoding -> WebDasar. Kemudian tekan tombol save.
Selamat! Dengan begitu kita sudah membuat berkas HTML pertama. Silakan
buka berkas HTML tersebut menggunakan suatu browser (dalam contoh ini,
kita menggunakan Google Chrome), maka hasilnya akan nampak seperti ini:
Judul dan subjudul pada sebuah dokumen menggambarkan suatu hierarki dari
informasi. Misalnya, judul dengan ukuran besar merupakan judul utama dalam
sebuah konten. Kemudian diikuti dengan judul kecil di bawahnya yang
menjelaskan informasi dengan lebih mendetail lagi.
. <!DOCTYPE html>
. <html>
. <head>
. <title>Judul Halaman</title>
. </head>
. <body>
. <h1>Heading Utama</h1>
. <p>Sebuah Paragraph.</p>
. </body>
. </html>
Kita dapat melihat bahwa struktur dasar HTML dituliskan dari beberapa elemen.
Pada setiap elemen HTML terdapat dua tag, yaitu pembuka tag <> dan penutup
tag </>. Lihat gambar berikut untuk lebih jelasnya.
Di antara tag pembuka dan penutup sebuah elemen, kita dapat meletakkan
sebuah konten. Konten dapat berupa teks ataupun sebuah elemen HTML lain.
Contohnya, elemen <html> memiliki konten yaitu elemen <head> dan juga
elemen <body>. Lalu, elemen <head> memiliki konten berupa elemen <title> yang
di dalamnya memiliki konten berupa teks dari judul halaman yang ditampilkan.
Begitu pula dengan elemen lainnya, sehingga hirarki elemen HTML nampak
seperti ini.
Elemen <html>
Hirarki elemen teratas pada berkas HTML adalah elemen HTML-nya itu sendiri.
Elemen ini digunakan untuk memberitahu kepada browser bahwa ini merupakan
sebuah berkas HTML sekaligus menjadi root dari sebuah berkasnya itu. Seluruh
elemen lainnya tentunya dituliskan pada konten elemen ini.
Elemen <head>
Elemen <head> pada berkas HTML berfungsi sebagai tempat disimpannya
informasi dari dokumen HTML. Informasi dapat berupa elemen meta, style atau
link. Dan juga pada elemen ini judul dari dokumen HTML didefinisikan dengan
menggunakan elemen <title>. Berikut contoh elemen yang berada pada konten
head:
<title>
<style>
<base>
<link>
<meta>
<script>
<noscript>
Pada HTML versi 4.01, elemen <head> wajib ada dalam sebuah berkas HTML.
Berikut contoh penulisan sebuah elemen <head> beserta contoh konten di
dalamnya:
. <head>
. <meta charset="utf-8">
. <title>Judul halaman</title>
. <style> Style </style>
. </head>
. <!DOCTYPE html>
. <html>
. <meta charset="utf-8">
. <title>Judul halaman</title>
. <style> Style </style>
. <body>
. <h1>Heading Utama</h1>
. <p>Sebuah Paragraph.</p>
. </body>
. </html>
Elemen <body>
Seluruh konten yang terdapat pada elemen ini akan ditampilkan pada halaman
website. Maka dari itu, elemen ini digunakan untuk menampung seluruh konten
atau elemen yang ditampilkan ke dalam jendela browser. Silakan coba tuliskan
kode berikut, simpan dalam format HTML dan jalankan pada browser:
. <html>
. <head>
. <title>Ini merupakan judul dari dokumen HTML</title>
. </head>
. <body>
. <h1>header yang diletakan di dalam elemen body</h1>
. <p>Ini merupakan sebuah paragraph yang juga diletakan pada sebuah konten
body, sehingga konten ini dapat dilihat oleh pengguna pada jendela browser.</p>
. </body>
. </html>
Kecuali jika kita ingin menuliskan sebuah notes pada berkas HTML, kita perlu
gunakan commenting tag (<!-- -->). Semua yang dituliskan di antara tag
komentar tidak akan memberikan pengaruh apa pun, termasuk pada tampilan di
jendela browser. Pada HTML, tag komentar dituliskan seperti ini:
. <!DOCTYPE html>
. <html>
. <head>
. </head>
. <body>
.
. </body>
. </html>
. Bandung
. Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.
.
.
. Sejarah
. Kata Bandung berasal dari kata bendung atau bendungan karena terbendungnya
sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu membentuk telaga.
Legenda yang diceritakan oleh orang-orang tua di Bandung mengatakan bahwa
nama Bandung diambil dari sebuah kendaraan air yang terdiri dari dua perahu
yang diikat berdampingan yang disebut perahu bandung yang digunakan oleh
Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari Ci Tarum dalam
mencari tempat kedudukan kabupaten yang baru untuk menggantikan ibu kota
yang lama di Dayeuhkolot.
.
.
. Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat Nga-
Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur karena
mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan atau
bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari banda
adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu Pertiwi
tempat Banda berada.
.
.
. Geografis
. Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota ini
terletak di tengah-tengah provinsi Jawa Barat, serta berada pada ketinggian
±768 m di atas permukaan laut, dengan titik tertinggi di berada di sebelah
utara dengan ketinggian 1.050 meter di atas permukaan laut dan sebelah
selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.
.
.
. Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung dan Sungai
Citarum beserta anak-anak sungainya yang pada umumnya mengalir ke arah
selatan dan bertemu di Sungai Citarum. Dengan kondisi yang demikian, Bandung
selatan sangat rentan terhadap masalah banjir terutama pada musim hujan.
.
.
. Wisata
. Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi tujuan
utama dalam menikmati liburan akhir pekan terutama dari masyarakat yang
berasal dari Jakarta sekitarnya. Selain menjadi kota wisata belanja, kota
Bandung juga dikenal dengan sejumlah besar bangunan lama berarsitektur
peninggalan Belanda.
.
.
. Farm House Lembang
. Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata yang
tidak pernah sepi pengunjung. Selain karena letaknya strategis, kawasan ini
juga menghadirkan nuansa wisata khas Eropa. Semua itu diterapkan dalam
bentuk spot swafoto Instagramable.
.
.
. Observatorium Bosscha
. Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop Surya. Refraktor
Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong bintang. Benda
ini diletakkan pada atap kubah sehingga saat teropong digunakan, atap
tersebut harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapa
pun, tanpa tiket. Namun, bagi yang ingin menggunakan teleskop Zeiss, wajib
mendaftarkan diri. Untuk instansi atau lembaga pendidikan, diberikan jadwal
hari Selasa sampai Jumat. Sementara itu, kunjungan individu dibuka setiap
hari Sabtu.
Masukkan seluruh konten pada elemen <body> agar nampak pada browser.
. <!DOCTYPE html>
. <html>
. <head>
. </head>
. <body>
. Bandung
. Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.
.
.
. Sejarah
. Kata Bandung berasal dari kata bendung atau bendungan karena terbendungnya
sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu membentuk telaga.
Legenda yang diceritakan oleh orang-orang tua di Bandung mengatakan bahwa
nama Bandung diambil dari sebuah kendaraan air yang terdiri dari dua perahu
yang diikat berdampingan yang disebut perahu bandung yang digunakan oleh
Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari Ci Tarum dalam
mencari tempat kedudukan kabupaten yang baru untuk menggantikan ibu kota
yang lama di Dayeuhkolot.
.
.
. Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat Nga-
Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur karena
mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan atau
bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari banda
adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu Pertiwi
tempat Banda berada.
.
.
. Geografis
. Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota ini
terletak di tengah-tengah provinsi Jawa Barat, serta berada pada ketinggian
±768 m di atas permukaan laut, dengan titik tertinggi di berada di sebelah
utara dengan ketinggian 1.050 meter di atas permukaan laut dan sebelah
selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.
.
.
. Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung dan Sungai
Citarum beserta anak-anak sungainya yang pada umumnya mengalir ke arah
selatan dan bertemu di Sungai Citarum. Dengan kondisi yang demikian, Bandung
selatan sangat rentan terhadap masalah banjir terutama pada musim hujan.
.
.
. Wisata
. Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi tujuan
utama dalam menikmati liburan akhir pekan terutama dari masyarakat yang
berasal dari Jakarta sekitarnya. Selain menjadi kota wisata belanja, kota
Bandung juga dikenal dengan sejumlah besar bangunan lama berarsitektur
peninggalan Belanda.
.
.
. Farm House Lembang
. Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata yang
tidak pernah sepi pengunjung. Selain karena letaknya strategis, kawasan ini
juga menghadirkan nuansa wisata khas Eropa. Semua itu diterapkan dalam
bentuk spot swafoto Instagramable.
.
.
. Observatorium Bosscha
. Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop Surya. Refraktor
Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong bintang. Benda
ini diletakkan pada atap kubah sehingga saat teropong digunakan, atap
tersebut harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapa
pun, tanpa tiket. Namun, bagi yang ingin menggunakan teleskop Zeiss, wajib
mendaftarkan diri. Untuk instansi atau lembaga pendidikan, diberikan jadwal
hari Selasa sampai Jumat. Sementara itu, kunjungan individu dibuka setiap
hari Sabtu.
.
. <body>
. <html>
Setelah itu, kita berikan elemen heading dan elemen paragraf sesuai hasil
identifikasi, sehingga kode nampak seperti ini:
. <!DOCTYPE html>
. <html>
. <head>
. </head>
. <body>
.
. <h1>Bandung</h1>
. <p>Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.</p>
.
. <h2>Sejarah</h2>
. <p>Kata Bandung berasal dari kata bendung atau bendungan karena
terbendungnya sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu
membentuk telaga. Legenda yang diceritakan oleh orang-orang tua di
. Bandung mengatakan bahwa nama Bandung diambil dari sebuah kendaraan air yang
terdiri dari dua perahu yang diikat berdampingan yang disebut perahu bandung
yang digunakan oleh Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari
Ci Tarum dalam mencari tempat kedudukan kabupaten yang baru untuk
. menggantikan ibu kota yang lama di Dayeuhkolot. </p>
.
. <p>Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat Nga-
Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur karena
mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan atau
bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari banda
adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu Pertiwi
tempat Banda berada.</p>
.
. <h2>Geografis</h2>
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota ini
terletak di tengah-tengah provinsi Jawa Barat, serta berada pada
. ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi di berada
di sebelah utara dengan ketinggian 1.050 meter di atas permukaan laut dan
sebelah selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.</p>
.
. <p>Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung dan
Sungai Citarum beserta anak-anak sungainya yang pada umumnya mengalir ke
arah selatan dan bertemu di Sungai Citarum. Dengan kondisi yang
. demikian, Bandung selatan sangat rentan terhadap masalah banjir terutama
pada musim hujan.</p>
.
. <h2>Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi tujuan
utama dalam menikmati liburan akhir pekan terutama dari masyarakat yang
berasal dari Jakarta sekitarnya. Selain menjadi kota wisata belanja,
. kota Bandung juga dikenal dengan sejumlah besar bangunan lama berarsitektur
peninggalan Belanda.</p>
.
. <h3>Farm House Lembang</h3>
. <p>Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata
yang tidak pernah sepi pengunjung. Selain karena letaknya strategis, kawasan
ini juga menghadirkan nuansa wisata khas Eropa. Semua itu diterapkan dalam
bentuk spot swafoto Instagramable.</p>
.
. <h3>Observatorium Bosscha</h3>
. <p>Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop Surya. Refraktor
Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong bintang. Benda
ini diletakkan pada atap kubah sehingga saat teropong digunakan, atap
tersebut harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapapun,
tanpa tiket. Namun, bagi yang ingin
. menggunakan teleskop Zeiss, wajib mendaftarkan diri. Untuk instansi atau
lembaga pendidikan, diberikan jadwal hari Selasa sampai Jumat. Sementara
itu, kunjungan individu dibuka setiap hari Sabtu.</p>
.
. </body>
. </html>
Atribut HTML
Pada modul sebelumnya kita sudah mengenal berbagai macam elemen. Elemen
dituliskan dengan awalan tag pembuka <> dan diakhiri dengan tag penutup </>. Ada
satu hal lagi yang bisa kita tuliskan pada sebuah elemen, lebih tepatnya pada sebuah
tag pembuka, yaitu Attribute. Atribut ini berfungsi memberikan informasi tambahan
pada sebuah elemen. Atribut dituliskan pada tag pembuka sebuah elemen setelah
nama dari elemennya tersebut ditulis. Contohnya:
Pada contoh kode tersebut, kita menetapkan artibut bahasa (dengan penulisan lang)
dengan nilai “id” atau Indonesia (kode bahasa bisa kita eksplore pada link
berikut: https://www.w3schools.com/tags/ref_language_codes.asp) pada sebuah
elemen paragraf.
Untuk menuliskan sebuah atribut, kita memerlukan nama dari atribut itu diikuti
dengan nilai atribut tersebut dalam bentuk string (Dituliskan dalam tanda kutip dua).
Untuk lebih jelasnya, perhatikan gambar berikut:
Atribut pada elemen juga dapat dituliskan lebih dari satu. Kita bisa menuliskan
kembali seluruh struktur atribut di samping dari atribut yang sudah ada. Contohnya
pada elemen paragraf di atas, kita akan memberikan sebuah atribut translate, sehingga
penulisannya menjadi seperti ini:
Lantas atribut apa saja yang dapat digunakan pada elemen HTML? Pada elemen
HTML terdapat dua jenis atribut, yaitu Global Attribute dan atribut yang hanya bisa
digunakan pada elemen tertentu. Untuk atribut yang spesifik pada sebuah elemen, kita
akan mengulasnya pada pembahasan elemen tersebut. Untuk Global Attribute,
berikut daftar atribut yang bisa kita gunakan di seluruh elemen HTML.
Attribute Description
contenteditable Menentukan konten dari elemen merupakan konten yang dapat diubah atau tidak
data-* Digunakan untuk menyimpan sebuah data pribadi khusus ke halaman atau aplikasi.
dropzone Menentukan apakah data yang di-drag adalah data yang disalin, dipindahkan, atau d
saat dijatuhkan.
hidden Menentukan apakah suatu elemen ditampilkan atau tidak pada browser.
spellcheck Menentukan apakah elemen harus diperiksa ejaannya dan tata bahasanya atau tidak.
Paragraf
Paragraf adalah elemen paling mendasar dari sebuah dokumen teks. Pada HTML, kita
bisa menunjukkan sebuah paragraf dengan menggunakan elemen <p>. Contohnya
seperti ini:
Paragraf dapat terdiri dari teks, elemen gambar dan inline element lainnya. Tetapi
hindarilah penggunaan element paragraf untuk konten seperti heading atau list, karena
terdapat elemen lain yang lebih tepat untuk digunakan.
Heading
Pada modul sebelumnya, kita sudah melihat contoh penggunaan header yang
diterapkan pada konten yang kita siapkan. Kita menggunakan <h1> dan <h2> dalam
mengindikasi judul dan sub judul pada kontennya. Pada HTML, terdapat <h1> hingga
<h6> elemen heading yang dapat kita gunakan.
Ketika kita menambahkan heading pada konten, Heading ini merepresentasikan garis
besar halaman pada sebuah browser. Alat bantu baca seperti screen reader membaca
garis besar halaman untuk bantu memetakan dan mengarahkan pengguna selama
menjelajahi halaman. Selain itu, heading juga merupakan elemen yang dicari oleh
mesin pencarian contohnya Google Search.
Berikut ini contoh penerapan heading empat level pada sebuah dokumen. Tiap level
heading dituliskan dengan cara yang sama.
. <h1>Bandung</h1>
.
. <h2>Geografis</h2>
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok raksasa</p>
.
. <h2>Wisata</h2>
. <p>Kota Bandung telah menjadi tujuan utama dalam menikmati liburan akhir
pekan terutama dari masyarakat yang berasal
. dari Jakarta sekitarnya.</p>
.
. <h3>Farm House Lembang</h3>
. <h4>Lokasi</h4>
. <p>Berada di jalur utama Bandung-Lembang, Farm House menjadi objek wisata
yang tidak pernah sepi pengunjung.</p>
.
. <h4>Kondisi</h4>
. <p>Selain karena letaknya strategis, kawasan ini juga menghadirkan nuansa
wisata khas Eropa. Semua itu diterapkan dalam
. bentuk
. spot swafoto Instagramable.</p>
.
. <h3>Observatorium Bosscha</h3>
. <p>Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss, Schmidt
Bimasakti, Refraktor Bamberg,
. Cassegrain GOTO, dan Teleskop Surya.</p>
Dari penggunaan elemen heading pada konten tersebut, maka kita bisa membuat garis
besar dokumen seperti berikut:
4.
Unordered List
. <ul>
. <li>Item 1</li>
. <li>Item 2</li>
. <li>Item 3</li>
. <li>Item 4</li>
. </ul>
Ketika kita membukanya pada browser, maka akan nampak seperti ini:
. <ul>
. <li><h1>Sebuah Heading sebagai item list</h1></li>
. <li><h2>Sebuah Heading level 2 sebagai item list</h2></li>
. <li><p>Sebuah paragraf sebagai item list</p></li>
. </ul>
Seperti yang kita sudah ketahui, maka list item akan menampilkan seperti
format header.
. <ul>
. <li>List item 1</li>
. <li>List item 2</li>
. <li>List item 3
. <ul>
. <li>List item 3.1</li>
. <li>List item 3.2</li>
. <li>List item 3.3</li>
. </ul>
. </li>
. <li>List item 4</li>
. </ul>
Ordered List
. <ol>
. <li>Langkah pertama</li>
. <li>Langkah kedua</li>
. <li>Langkah ketiga</li>
. <li>Langkah selanjutnya</li>
. </ol>
Ketika kita membukanya pada browser, maka akan nampak seperti ini:
Sama seperti pada unordered list, di antara tag elemen <li>, kita dapat
mengisikan konten apapun termasuk elemen HTML lain.
Pada ordered list, tipe urutan angkanya dapat kita atur melalui sebuah
atribut type. Contohnya, selain nomor urutan angka dapat menggunakan
alfabet ataupun angka romawi.
. <ol type="I">
. <li>Langkah pertama</li>
. <li>Langkah kedua</li>
. <li>Langkah ketiga</li>
. <li>Langkah selanjutnya</li>
. </ol>
.
. <ol type="A">
. <li>Langkah pertama</li>
. <li>Langkah kedua</li>
. <li>Langkah ketiga</li>
. <li>Langkah selanjutnya</li>
. </ol>
Nilai Deskripsi
Selain tipe angka pada urutan, kita juga bisa menetapkan nilai awal pada
sebuah ordered list dengan menggunakan atribut start. Contohnya, jika kita
ingin memulai sebuah list dari angka 7, maka kita tetapkan
atribut start dengan nilai 7 pada elemen <ol>.
. <ol start="7">
. <li>Langkah ketujuh</li>
. <li>Langkah kedelapan</li>
. <li>Langkah kesembilan</li>
. <li>Langkah selanjutnya</li>
. </ol>
Setelah mempelajari penerapan list pada HTML, sekarang kita coba terapkan
elemen list yang berperan sebagai navigasi pada halaman profil yang sebelumnya
sudah kita buat.
“Pada langkah ini dan selanjutnya, Sebaiknya gunakanlah teks
editor yang disarankan pada modul text editor agar proses
penulisan dan pengelolaan berkas HTML dapat lebih cepat”.
. …………..
. <body>
. <h1>Bandung</h1>
. <p>Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu kota
provinsi tersebut.</p>
. <ul>
. <li>Sejarah</li>
. <li>Geografis</li>
. <li>Wisata</li>
. </ul>
. <h2>Sejarah</h2>
. ……...
Gambar
Tanpa gambar, sebuah website tentu tidak akan menarik bukan? Ada beberapa
alasan mengapa website perlu gambar. Contohnya kita perlu menampilkan logo
perusahaan, ilustrasi, diagram dan sebagainya.
Selain itu, yang perlu kita perhatikan adalah atribut yang ada pada elemen
tersebut, terdapat dua elemen yang harus kita gunakan ketika menerapkan
elemen <img>.
Yang pertama, atribut src. Atribut ini berfungsi sebagai sumber dari gambar yang
ditampilkan. Atribut ini dapat bernilai url gambar atau path gambar lokal dari
gambar yang digunakan.
Dan yang kedua adalah atribut alt. Atribut ini sebenarnya tidak wajib untuk
diterapkan, hanya saja atribut ini akan sangat berguna ketika gambar tidak
berhasil ditampilkan. Nilai atribut ini merupakan gambaran dari gambar yang
ditampilkan dalam bentuk tulisan. Sehingga ketika gambar gagal ditampilkan
maka akan memunculkan teks alternatif yang dapat mewakili arti dari gambar
tersebut.
Selanjutnya terdapat atribut lain yang bisa Anda gunakan pada elemen ini,
contohnya title. Title berfungsi sebagai informasi tambahan untuk sebuah gambar.
Informasi tersebut akan muncul ketika kita mengarahkan sebuah cursor pada
gambar yang ditampilkan.
Contohnya, jika kita tetap memaksa untuk menentukan ukuran panjang dan lebar
sebuah gambar tanpa menyesuaikan rasionya, maka gambar yang ditampilkan
tidak akan proporsional.
Pindahkan berkas yang sudah diunduh pada folder yang sama dengan
berkas index.html.
Jika berhasil, akan terbentuk folder dengan nama assets. Sampai langkah ini,
berkas assets.zip sudah tidak digunakan. Kita bisa menghapusnya.
Pastikan di dalam folder assets -> image terdapat empat berkas gambar yang akan
kita gunakan pada latihan.
<body>
……
<h2>Sejarah</h2>
<img src="assets/image/history.jpg" alt="sejarah">
…….
<h2>Geografis</h2>
<img src="assets/image/geografis.jpg" alt="geografis">
…….
<h2>Wisata</h2>
…….
<img src="assets/image/farm-house.jpg" alt="farm house">
…….
<h3>Observatorium Bosscha</h3>
<img src="assets/image/bosscha.jpg" alt="bosscha">
…….
</body>
Perhatikan penulisan nilai dari atribut src. Penulisan sedikit berbeda dengan yang
telah kita pelajari. Penulisan alamat gambar tidak dimulai dengan https://www, karena
kita menggunakan gambar lokal yang ada pada project kita. Sehingga untuk penulisan
path-nya mengarah ke lokasi dari berkas gambar tersebut.
Setelah menambahkan elemen gambar, maka halaman akan nampak seperti ini pada
browser.
Teks Terformat
Sejauh ini, kita sudah mengenal paragraf, heading dan juga list pada HTML. Tapi
masih ada beberapa lagi yang merupakan spesial teks format yang dapat kita
gunakan yaitu <blockqoute>, <pre> dan <figure>.
Long quotations
Jika pada konten kita memiliki sebuah kutipan ataupun sebuah testimonial, kita
dapat gunakan format long quotations dengan menggunakan tags <blockquote>.
Konten di dalam elemen <blockquote> ini dapat berupa sebuah
paragraf, heading ataupun list.
. <blockquote>
. <p>Situs web (bahasa Inggris: website) adalah sekumpulan halaman web yang
saling berhubungan yang umumnya berada pada peladen yang sama berisikan
kumpulan informasi yang disediakan secara perorangan, kelompok, atau
organisasi.</p>
. </blockquote>
. <blockquote cite="https://id.wikipedia.org/wiki/Situs_web">
. <p>Situs web (bahasa Inggris: website) adalah sekumpulan halaman web yang
saling berhubungan yang umumnya berada pada peladen yang sama berisikan kumpulan
informasi yang disediakan secara perorangan, kelompok, atau organisasi.</p>
. </blockquote>
Preformatted text
. <pre>
. SAJAK PUTIH
.
. Bersandar pada tari warna pelangi
. Kau depanku bertudung sutra senja
. Di hitam matamu kembang mawar dan melati
. Harum rambutmu mengalun bergelut senda
.
. Sepi menyanyi, malam dalam mendoa tiba
. Meriak muka air kolam jiwa
. Dan dalam dadaku memerdu lagu
. Menarik menari seluruh aku
.
. Hidup dari hidupku, pintu terbuka
. Selama matamu bagiku menengadah
. Selama kau darah mengalir dari luka
. Antara kita Mati datang tidak membelah...
.
. Karya : Chairil Anwar
. </pre>
Sehingga pada browser akan menampilkan hasil yang sama seperti yang kita
tuliskan.
Figure
Elemen ini digunakan untuk merepresentasikan konten tersendiri (self-contained
content) seperti ilustrasi, diagram, foto atau bisa juga sebuah baris kode. Banyak
hal yang dapat digunakan dalam elemen ini.
Contoh lainnya, figure ini dapat kita gunakan untuk me-markup sebuah konten
puisi.
. <figure>
. <pre>
. SAJAK PUTIH
.
. Bersandar pada tari warna pelangi
. Kau depanku bertudung sutra senja
. Di hitam matamu kembang mawar dan melati
. Harum rambutmu mengalun bergelut senda
.
. Sepi menyanyi, malam dalam mendoa tiba
. Meriak muka air kolam jiwa
. Dan dalam dadaku memerdu lagu
. Menarik menari seluruh aku
.
. Hidup dari hidupku, pintu terbuka
. Selama matamu bagiku menengadah
. Selama kau darah mengalir dari luka
. Antara kita Mati datang tidak membelah...
. </pre>
. <figcaption>Sajak Putih oleh Charil Anwar</figcaption>
. </figure>
Standarnya Elemen HTML memiliki dua sifat yaitu block dan inline. Elemen
yang memiliki sifat block selalu membuat baris baru ketika menampilkannya,
contohnya seperti elemen paragraf, list, heading, dan lainnya. Berlawanan
dengan elemen yang memiliki sifat inline, elemen ini tidak menambahkan
baris baru ketika dibuat. Apa saja elemen tersebut? Mari kita bahas satu
persatu.
Anchor
Apa itu anchor? Anchor (jangkar) merupakan elemen yang digunakan untuk
membuat sebuah hyperlink ke halaman atau website lain, file, alamat email
atau URL lainnya. Untuk menggunakan elemen ini kita gunakan
tag <a>...</a> bersama dengan atribut href untuk menetapkan sebuah target
yang akan dituju.
origin,
origin-when-cross-origin,
unsafe-url
alternate,
rel Menetapkan hubungan antara halaman yang ditam
dengan target.
author,
bookmark,
external,
help,
license,
next,
nofollow,
noreferrer,
noopener,
prev,
search,
tag
_blank,
target Menetapkan lokasi ketika membuka target contohn
_parent, sebuah tab, window atau pada tab itu sendiri.
_self,
_top
Emphasized text
Important text
. <p>Kesehatan merupakan hal yang penting, jaga pola makan yang teratur dan
<strong>jangan sampai makan tengah
. malam!</strong></p>
Short quotations
. <p>Sebelum pulang kerja, ia berkata kepadaku: <q>Maaf saya tidak bisa hadir
dalam pertemuan nanti</q></p>
Defining terms
Jika kita lihat pada browser, tampilan akan tampak seperti ini:
Highlighted text
Terkadang kita mungkin perlu menambahkan sebuah baris baru pada sebuah
baris teks (termasuk di dalam paragraf), tetapi kita mengetahui bahwa
browser akan mengabaikan sebuah penulisan spasi ganda ataupun garis
baru, sehingga kita memerlukan sebuah tanda yang dapat digunakan untuk
memberitahu browser untuk “Tambahkan garis baru di sini!”.
. <p>
. Dicoding Space,<br>
. Jln. Batik Kumeli No. 50.<br>
. Bandung.<br>
. 40123
. </p>
Jika kita lihat pada browser, maka tampilan akan tampak seperti ini:
Menerapkan Anchor pada Navigasi Halaman Profil
Sebelumnya, pada halaman profil yang kita buat, sudah ada sebuah list sebagai
navigasi. Namun demikian, karena belum ada elemen anchor, maka navigasi
tersebut belum dapat kita gunakan. Oleh karena itu, mari kita tambahkan elemen
anchor pada tiap item list-nya.
<ul>
<li><a href="#">Sejarah</a></li>
<li><a href="#">Geografis</a></li>
<li><a href="#">Wisata</a></li>
</ul>
Setelah menambahkan elemen anchor pada item list, maka tampilan item list
akan nampak menjadi hyperlink.
Namun ketika salah satu item dipilih, tidak akan terjadi apa apa, karena pada
atribut href kita belum menetapkan sebuah target. Nilai href dapat berupa sebuah
URL untuk mengarahkan ke sebuah halaman yang berbeda, atau bisa berupa
tanda pagar (#) diikuti dengan id elemen untuk mengarahkan tampilan pada
elemen sesuai id yang ditentukan (masih dalam satu halaman).
Maka dari itu, mari kita berikan atribut id pada sebuah elemen yang akan menjadi
target navigasi. Berikan atribut id pada seluruh elemen <h2> dengan id sesuai
dengan kontennya.
<body>
.......
<ul>
<li><a href="#">Sejarah</a></li>
<li><a href="#">Geografis</a></li>
<li><a href="#">Wisata</a></li>
</ul>
<h2 id="sejarah">Sejarah</h2>
.......
<h2 id="geografis">Geografis</h2>
.......
<h2 id="wisata">Wisata</h2>
.......
</body>
Kemudian tuliskan juga id elemen target setelah tanda pagar (#) pada tiap elemen
anchor yang terdapat pada item list.
<body>
.......
<ul>
<li><a href="#sejarah">Sejarah</a></li>
<li><a href="#geografis">Geografis</a></li>
<li><a href="#wisata">Wisata</a></li>
</ul>
<h2 id="sejarah">Sejarah</h2>
.......
<h2 id="geografis">Geografis</h2>
.......
<h2 id="wisata">Wisata</h2>
.......
</body>
. <header>
. <h1>Bandung</h1>
. <p>Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus menjadi ibu
kota provinsi tersebut.</p>
. <nav>
. <ul>
. <li><a href="#sejarah">Sejarah</a></li>
. <li><a href="#geografis">Geografis</a></li>
. <li><a href="#wisata">Wisata</a></li>
. </ul>
. </nav>
. </header>
. <article>
. <header>
. <h1>Judul Artikel</h1>
. <h2>Oleh: Dicoding Indonesia</h2>
. </header>
. <p>....... Konten artikel dimulai dari sini ......</p>
. <footer>
. <p>Bagikan artikel ini melalui</p>
. <ul>
. <li>Twitter</li>
. <li>Facebook</li>
. <li>......</li>
. </ul>
. </footer>
. </article>
Tapi tidak menjamin pada sebuah website hanya ada satu navigasi. Contohnya,
sebuah akhir artikel pada blog terdapat tautan navigasi menuju artikel yang
dianggap relevan dengan artikel yang telah kita baca. Navigasi tersebut tidak
dianggap sebagai navigasi yang penting, sehingga kita tidak perlu menggunakan
elemen <nav> untuk menampilkannya.
. <nav>
. <ul>
. <li><a href="#sejarah">Sejarah</a></li>
. <li><a href="#geografis">Geografis</a></li>
. <li><a href="#wisata">Wisata</a></li>
. </ul>
. </nav>
Articles
Jika sebuah halaman terdapat beberapa artikel, maka tiap artikel tersebut
seharusnya berada pada elemen article-nya masing-masing.
. <article>
. <h2>Sejarah</h2>
. <img src="img/history.jpg">
. <p>Kata Bandung berasal dari kata bendung atau bendungan karena
terbendungnya sungai Citarum oleh lava
. Gunung Tangkuban Parahu yang lalu membentuk telaga...</p>
. </article>
. <article>
. <h2>Geografis</h2>
. <img src="img/geografis.jpg">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk morfologi
wilayahnya bagaikan sebuah mangkok
. raksasa,[9] secara geografis kota ini terletak di tengah-tengah
provinsi Jawa Barat..</p>
. </article>
. <article>
. <h2>Wisata</h2>
. <img src="img/farm-house.jpg">
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi
tujuan utama dalam menikmati liburan
. akhir pekan terutama dari masyarakat yang berasal dari Jakarta
sekitarnya...</p>
. </article>
Aside
Ketika elemen ini ditempatkan di luar dari elemen <article>, pada elemen ini
dapat berisikan informasi yang berhubungan pada keseluruhan halaman.
. <main>
. <article>
. ......
. </article>
. <aside>
. <article>
. <header>
. <h2>Kota Bandung</h2>
. <p>Kota Kembang Paris van Java</p>
. <figure>
. <img src="img/bandung-badge.png">
. <figcaption>Lambang</figcaption>
. </figure>
. </header>
. </article>
. </aside>
. </main>
Section
. <article>
. <section>
. <h2 >Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi
tujuan utama dalam menikmati liburan
. akhir
. pekan terutama dari masyarakat yang berasal dari Jakarta
sekitarnya. Selain menjadi kota wisata belanja,
. kota Bandung juga dikenal dengan sejumlah besar bangunan lama
berarsitektur peninggalan Belanda.</p>
. </section>
. <section>
. <h3>Farm House Lembang</h3>
. <img src="img/farm-house.jpg">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk
morfologi wilayahnya bagaikan sebuah mangkok
. raksasa,[9] secara geografis kota ini terletak di tengah-tengah
provinsi Jawa Barat, serta berada pada
. ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi
di berada di sebelah utara dengan
. ketinggian 1.050 meter di atas permukaan laut dan sebelah selatan
merupakan kawasan rendah dengan
. ketinggian 675 meter di atas permukaan laut.</p>
. </section>
. <section>
. <h3>Observatorium Bosscha</h3>
. <img src="img/bosscha.jpg">
. <p>Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss,
Schmidt Bimasakti, Refraktor Bamberg,
. Cassegrain GOTO, dan Teleskop Surya. Refraktor Ganda Zeiss adalah
jenis teleskop terbesar untuk
. meneropong bintang. Benda ini diletakkan pada atap kubah sehingga
saat teropong digunakan, atap tersebut
. harus dibuka. Observatorium Bosscha boleh dikunjungi oleh siapa
pun, tanpa tiket. Namun, bagi yang ingin
. menggunakan teleskop Zeiss, wajib mendaftarkan diri. Untuk
instansi atau lembaga pendidikan, diberikan
. jadwal hari Selasa sampai Jumat. Sementara itu, kunjungan
individu dibuka setiap hari Sabtu.
. </p>
. </section>
. </article>
Generic Element
Setelah mengenal beberapa elemen yang ada, bagaimana jika tidak terdapat
elemen sesuai yang mampu menggambarkan konten kita? Dalam dunia nyata,
jenis informasi sangat beragam dan mungkin tidak semua semantik elemen yang
kalian ketahui dapat menggambarkan jenis informasinya. Untungnya, HTML
menyediakan dua tipe elemen umum (generic element) yang bisa kita kustomisasi
untuk menggambarkan konten kita dengan tepat.
Div
Nah, jika kita menerapkan styling seperti di atas, maka akan terlihat efek dari
penggunaan div ini.
Span
Mari kita ambil contoh. Tidak ada elemen pada inline element yang memiliki arti
untuk menampung sebuah informasi telepon. Maka dari itu, tiap item pada nomor
telepon bisa ditampung dalam elemen <span> dan diklasifikasikan (menggunakan
atribut class) dengan nilai “phone”.
. <ul>
. <li>Agil: <span class="phone">08123xxx</span></li>
. <li>Widy: <span class="phone">08222xxx</span></li>
. <li>Gilang: <span class="phone">08333xxx</span></li>
. </ul>
. <style>
. .phone {
. font-weight: bold;
. }
. </style>
.
. <ul>
. <li>Agil: <span class="phone">08123xxx</span></li>
. <li>Widy: <span class="phone">08222xxx</span></li>
. <li>Gilang: <span class="phone">08333xxx</span></li>
. </ul>
Jika kita coba lihat pada browser, akan tampak seperti ini:
. <style>
. .bahan {
. color: red;
. }
. </style>
.
. <p>Untuk membuat sebuah bakso kita membutuhkan <span class="bahan">daging
sapi</span>, <span
. class="bahan">tepung tapioka</span>, <span class="bahan">bawang
merah</span> dan <span class="bahan">bawang
. putih</span> kemudian satu sendok makan <span class="bahan">gula</span> dan <span
class="bahan">garam.</span></p>
Jika kita coba lihat pada browser, akan tampak seperti ini:
<body>
.......
<h2>Kota Bandung</h2>
<figure>
<img src="assets/image/bandung-badge.png">
<figcaption>Lambang</figcaption>
</figure>
</body>
<body>
.......
</figure>
</body>
Mari kita buat konten yang berada pada body menjadi tiga bagian besar yaitu
heading, main dan footer. Kelompokkan konten judul besar dan navigasi
menggunakan elemen <header>.
. <body>
. <header>
. <h1>Bandung</h1>
. <p>Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus
menjadi ibu kota provinsi tersebut.</p>
. <ul>
. <li><a href="#sejarah">Sejarah</a></li>
. <li><a href="#geografis">Geografis</a></li>
. <li><a href="#wisata">Wisata</a></li>
. </ul>
. </header>
. .......
. </body>
Sebelumnya, kita mengetahui bahwa elemen list yang dibuat nantinya akan
dijadikan sebuah navigasi, maka di dalam elemen header ini, kita tambahkan
elemen <nav> untuk membungkus elemen list.
. <body>
. <header>
. <h1>Bandung</h1>
. <p>Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus
menjadi ibu kota provinsi tersebut.</p>
. <nav>
. <ul>
. <li><a href="#sejarah">Sejarah</a></li>
. <li><a href="#geografis">Geografis</a></li>
. <li><a href="#wisata">Wisata</a></li>
. </ul>
. </nav>
. </header>
. .....
. </body>
Kemudian pada konten copyright (konten paragraf paling akhir pada sebuah
body) yang kita tambahkan sebelumnya, masukkan konten tersebut ke dalam
elemen <footer>.
. <body>
. ....
.
. <footer>
. <p>Belajar Dasar Pemrograman Web © 2019, Dicoding Academy</p>
. </footer>
. </body>
. <body>
. <header>
. ......
. </header>
. <main>
. <h2 id="sejarah">Sejarah</h2>
. <img src="assets/image/history.jpg" alt="sejarah">
. <p>Kata Bandung berasal dari kata bendung atau bendungan karena
terbendungnya sungai Citarum oleh lava Gunung
. Tangkuban Parahu yang lalu membentuk telaga. Legenda yang
diceritakan oleh orang-orang tua di
. Bandung mengatakan bahwa nama Bandung diambil dari sebuah
kendaraan air yang terdiri dari dua perahu yang
. diikat
. berdampingan yang disebut perahu bandung yang digunakan oleh
Bupati Bandung, R.A. Wiranatakusumah II, untuk
. melayari Ci Tarum dalam mencari tempat kedudukan kabupaten yang
baru untuk
. menggantikan ibu kota yang lama di Dayeuhkolot. </p>
.
. <p>Berdasarkan filosofi Sunda, kata Bandung juga berasal dari kalimat
Nga-Bandung-an Banda Indung, yang
. merupakan
. kalimat sakral dan luhur karena mengandung nilai ajaran Sunda.
Nga-Bandung-an artinya menyaksikan atau
. bersaksi.
. Banda adalah segala sesuatu yang berada di alam hidup yaitu di
bumi dan atmosfer, baik makhluk hidup maupun
. benda mati. Sinonim dari banda adalah harta. Indung berarti Ibu
atau Bumi, disebut juga sebagai Ibu Pertiwi
. tempat Banda berada.</p>
.
. <h2 id="geografis">Geografis</h2>
. <img src="assets/image/geografis.jpg" alt="geografis">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk
morfologi wilayahnya bagaikan sebuah mangkok
. raksasa,[9] secara geografis kota ini terletak di tengah-tengah
provinsi Jawa Barat, serta berada pada
. ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi
di berada di sebelah utara dengan
. ketinggian
. 1.050 meter di atas permukaan laut dan sebelah selatan merupakan
kawasan rendah dengan ketinggian 675 meter
. di
. atas permukaan laut.</p>
.
. <p>Kota Bandung dialiri dua sungai utama, yaitu Sungai Cikapundung
dan Sungai Citarum beserta anak-anak
. sungainya
. yang pada umumnya mengalir ke arah selatan dan bertemu di Sungai
Citarum. Dengan kondisi yang
. demikian, Bandung selatan sangat rentan terhadap masalah banjir
terutama pada musim hujan.</p>
.
. <h2 id="wisata">Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah menjadi
tujuan utama dalam menikmati liburan akhir
. pekan
. terutama dari masyarakat yang berasal dari Jakarta sekitarnya.
Selain menjadi kota wisata belanja,
. kota Bandung juga dikenal dengan sejumlah besar bangunan lama
berarsitektur peninggalan Belanda.</p>
.
. <h3>Farm House Lembang</h3>
. <img src="assets/image/farm-house.jpg" alt="farm house">
. <p>Berada di jalur utama Bandung-Lembang, Farm House menjadi objek
wisata yang tidak pernah sepi pengunjung.
. Selain
. karena letaknya strategis, kawasan ini juga menghadirkan nuansa
wisata khas Eropa. Semua itu diterapkan
. dalam
. bentuk spot swafoto Instagramable.</p>
.
. <h3>Observatorium Bosscha</h3>
. <img src="assets/image/bosscha.jpg" alt="bosscha">
. <p>Memiliki beberapa teleskop, antara lain, Refraktor Ganda Zeiss,
Schmidt Bimasakti, Refraktor Bamberg,
. Cassegrain
. GOTO, dan Teleskop Surya. Refraktor Ganda Zeiss adalah jenis
teleskop terbesar untuk meneropong bintang.
. Benda
. ini diletakkan pada atap kubah sehingga saat teropong digunakan,
atap tersebut harus dibuka. Observatorium
. Bosscha boleh dikunjungi oleh siapapun, tanpa tiket. Namun, bagi
yang ingin
. menggunakan teleskop Zeiss, wajib mendaftarkan diri. Untuk
instansi atau lembaga pendidikan, diberikan
. jadwal
. hari Selasa sampai Jumat. Sementara itu, kunjungan individu
dibuka setiap hari Sabtu.</p>
.
. <h2>Kota Bandung</h2>
. <p>Kota Kembang Paris van Java</p>
. <figure>
. <img src="assets/image/badung-badge.png">
. <figcaption>Lambang</figcaption>
. </figure>
. </main>
. <footer>
. ........
. </footer>
. </body>
. <main>
. <div>
. <h2 id="sejarah">Sejarah</h2>
. <img src="assets/image/history.jpg" alt="sejarah">
. <p>Kata Bandung berasal dari kata bendung atau bendungan karena
terbendungnya sungai Citarum oleh lava Gunung Tangkuban Parahu yang lalu
membentuk telaga. Legenda yang diceritakan oleh orang-orang tua di Bandung
mengatakan bahwa nama Bandung diambil dari sebuah kendaraan air yang terdiri
dari dua perahu yang diikat berdampingan yang disebut perahu bandung yang
digunakan oleh Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari Ci
Tarum dalam mencari tempat kedudukan kabupaten yang baru untuk menggantikan
ibu kota yang lama di Dayeuhkolot. </p>
.
. <p>Berdasarkan filosofi Sunda, kata Bandung juga berasal dari
kalimat Nga-Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur
karena mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan
atau bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu
di bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari
banda adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu
Pertiwi tempat Banda berada.</p>
.
. <h2 id="geografis">Geografis</h2>
. <img src="assets/image/geografis.jpg" alt="geografis">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk
morfologi wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota
ini terletak di tengah-tengah provinsi Jawa Barat, serta berada pada
ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi di berada
di sebelah utara dengan ketinggian 1.050 meter di atas permukaan laut dan
sebelah selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.</p>
.
. <p>Kota Bandung dialiri dua sungai utama, yaitu Sungai
Cikapundung dan Sungai Citarum beserta anak-anak sungainya yang pada umumnya
mengalir ke arah selatan dan bertemu di Sungai Citarum. Dengan kondisi
yangdemikian, Bandung selatan sangat rentan terhadap masalah banjir terutama
pada musim hujan.</p>
.
. <h2 id="wisata">Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah
menjadi tujuan utama dalam menikmati liburan akhir pekan terutama dari
masyarakat yang berasal dari Jakarta sekitarnya. Selain menjadi kota wisata
belanja, kota Bandung juga dikenal dengan sejumlah besar bangunan lama
berarsitektur peninggalan Belanda.
. </p>
.
. <h3>Farm House Lembang</h3>
. <img src="assets/image/farm-house.jpg" alt="farm house">
. <p>Berada di jalur utama Bandung-Lembang, Farm House menjadi
objek wisata yang tidak pernah sepi pengunjung. Selain karena letaknya
strategis, kawasan ini juga menghadirkan nuansa wisata khas Eropa. Semua itu
diterapkan dalam bentuk spot swafoto Instagramable.</p>
.
. <h3>Observatorium Bosscha</h3>
. <img src="assets/image/bosscha.jpg" alt="bosscha">
. <p>Memiliki beberapa teleskop, antara lain, Refraktor Ganda
Zeiss, Schmidt Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop
Surya. Refraktor Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong
bintang. Benda ini diletakkan pada atap kubah sehingga saat teropong
digunakan, atap tersebut harus dibuka. Observatorium Bosscha boleh
dikunjungi oleh siapapun, tanpa tiket. Namun, bagi yang ingin menggunakan
teleskop Zeiss, wajib mendaftarkan diri. Untuk instansi atau lembaga
pendidikan, diberikan jadwal hari Selasa sampai Jumat. Sementara itu,
kunjungan individu dibuka setiap hari Sabtu.</p>
. </div>
.
. <aside>
. <h2>Kota Bandung</h2>
. <p>Kota Kembang Paris van Java</p>
. <figure>
. <img src="assets/image/badung-badge.png">
. <figcaption>Lambang</figcaption>
. </figure>
. </aside>
. </main>
. <div>
. <article>
. <h2 id="sejarah">Sejarah</h2>
. <img src="assets/image/history.jpg" alt="sejarah">
. <p>Kata Bandung berasal dari kata bendung atau bendungan
karena terbendungnya sungai Citarum oleh lava Gunung Tangkuban Parahu yang
lalu membentuk telaga. Legenda yang diceritakan oleh orang-orang tua di
Bandung mengatakan bahwa nama Bandung diambil dari sebuah kendaraan air yang
terdiri dari dua perahu yang diikat berdampingan yang disebut perahu bandung
yang digunakan oleh Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari
Ci Tarum dalam mencari tempat kedudukan kabupaten yang baru untuk
menggantikan ibu kota yang lama di Dayeuhkolot. </p>
.
. <p>Berdasarkan filosofi Sunda, kata Bandung juga berasal dari
kalimat Nga-Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur
karena mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan
atau bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu
di bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari
banda adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu
Pertiwi tempat Banda berada.</p>
. </article>
.
. <article>
. <h2 id="geografis">Geografis</h2>
. <img src="assets/image/geografis.jpg" alt="geografis">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk
morfologi wilayahnya bagaikan sebuah mangkok raksasa,secara geografis kota
ini terletak di tengah-tengah provinsi Jawa Barat, serta berada pada
ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi di berada
di sebelah utara dengan ketinggian 1.050 meter di atas permukaan laut dan
sebelah selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.</p>
.
. <p>Kota Bandung dialiri dua sungai utama, yaitu Sungai
Cikapundung dan Sungai Citarum beserta anak-anak sungainya yang pada umumnya
mengalir ke arah selatan dan bertemu di Sungai Citarum. Dengan kondisi yang
demikian, Bandung selatan sangat rentan terhadap masalah banjir terutama
pada musim hujan.</p>
. </article>
.
. <article>
. <h2 id="wisata">Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah
menjadi tujuan utama dalam menikmati liburan akhir pekan terutama dari
masyarakat yang berasal dari Jakarta sekitarnya. Selain menjadi kota wisata
belanja, kota Bandung juga dikenal dengan sejumlah besar bangunan lama
berarsitektur peninggalan Belanda.</p>
.
. <h3>Farm House Lembang</h3>
. <img src="assets/image/farm-house.jpg" alt="farm house">
. <p>Berada di jalur utama Bandung-Lembang, Farm House menjadi
objek wisata yang tidak pernah sepi pengunjung. Selain karena letaknya
strategis, kawasan ini juga menghadirkan nuansa wisata khas Eropa. Semua itu
diterapkan dalam bentuk spot swafoto Instagramable.</p>
.
. <h3>Observatorium Bosscha</h3>
. <img src="assets/image/bosscha.jpg" alt="bosscha">
. <p>Memiliki beberapa teleskop, antara lain, Refraktor Ganda
Zeiss, Schmidt Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan Teleskop
Surya. Refraktor Ganda Zeiss adalah jenis teleskop terbesar untuk meneropong
bintang. Benda ini diletakkan pada atap kubah sehingga saat teropong
digunakan, atap tersebut harus dibuka. Observatorium Bosscha boleh
dikunjungi oleh siapapun, tanpa tiket. Namun, bagi yang ingin menggunakan
teleskop Zeiss, wajib mendaftarkan diri. Untuk instansi atau lembaga
pendidikan, diberikan jadwal hari Selasa sampai Jumat. Sementara itu,
kunjungan individu dibuka setiap hari Sabtu.</p>
. </article>
. </div>
Coba kita lihat pada elemen <article> terakhir, konten tersebut memiliki
subjudul lainnya yaitu membahas tentang wisata Farm House dan
Observatorium Bosscha. Maka pada konten ini kita dapat mengelompokkan
juga subjudul beserta kontennya dengan menggunakan elemen <section>.
Sehingga seluruh konten yang berada pada elemen <div> memiliki struktur
seperti ini:
. <div>
. <article>
. <h2 id="sejarah">Sejarah</h2>
. <img src="assets/image/history.jpg" alt="sejarah">
. <p>Kata Bandung berasal dari kata bendung atau bendungan
karena terbendungnya sungai Citarum oleh lava Gunung Tangkuban Parahu yang
lalu membentuk telaga. Legenda yang diceritakan oleh orang-orang tua di
. Bandung mengatakan bahwa nama Bandung diambil dari sebuah kendaraan air yang
terdiri dari dua perahu yang diikat berdampingan yang disebut perahu bandung
yang digunakan oleh Bupati Bandung, R.A. Wiranatakusumah II, untuk melayari
Ci Tarum dalam mencari tempat kedudukan kabupaten yang baru untuk
menggantikan ibu kota yang lama di Dayeuhkolot. </p>
.
. <p>Berdasarkan filosofi Sunda, kata Bandung juga berasal dari
kalimat Nga-Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur
karena mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan
atau bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu
di bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari
banda adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu
Pertiwi tempat Banda berada.</p>
. </article>
.
. <article>
. <h2 id="geografis">Geografis</h2>
. <img src="assets/image/geografis.jpg" alt="geografis">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk
morfologi wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota
ini terletak di tengah-tengah provinsi Jawa Barat, serta berada
pada ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi di
berada di sebelah utara dengan ketinggian 1.050 meter di atas permukaan laut
dan sebelah selatan merupakan kawasan rendah dengan ketinggian 675 meter di
atas permukaan laut.</p>
.
. <p>Kota Bandung dialiri dua sungai utama, yaitu Sungai
Cikapundung dan Sungai Citarum beserta anak-anak sungainya yang pada umumnya
mengalir ke arah selatan dan bertemu di Sungai Citarum. Dengan kondisi yang
demikian, Bandung selatan sangat rentan terhadap masalah banjir terutama
pada musim hujan.</p>
. </article>
.
. <article>
. <h2 id="wisata">Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah
menjadi tujuan utama dalam menikmati liburan akhir pekan terutama dari
masyarakat yang berasal dari Jakarta sekitarnya. Selain menjadi kota wisata
belanja, kota Bandung juga dikenal dengan sejumlah besar bangunan lama
berarsitektur peninggalan Belanda.</p>
. <section>
. <h3>Farm House Lembang</h3>
. <img src="assets/image/farm-house.jpg" alt="farm house">
. <p>Berada di jalur utama Bandung-Lembang, Farm House
menjadi objek wisata yang tidak pernah sepi pengunjung. Selain karena
letaknya strategis, kawasan ini juga menghadirkan nuansa wisata khas Eropa.
Semua itu diterapkan dalam bentuk spot swafoto Instagramable.</p>
. </section>
. <section>
. <h3>Observatorium Bosscha</h3>
. <img src="assets/image/bosscha.jpg" alt="bosscha">
. <p>Memiliki beberapa teleskop, antara lain, Refraktor
Ganda Zeiss, Schmidt Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan
Teleskop Surya. Refraktor Ganda Zeiss adalah jenis teleskop terbesar untuk
meneropong bintang. Benda ini diletakkan pada atap kubah sehingga saat
teropong digunakan, atap tersebut harus dibuka. Observatorium Bosscha boleh
dikunjungi oleh siapapun, tanpa tiket. Namun, bagi yang ingin menggunakan
teleskop Zeiss, wajib mendaftarkan diri. Untuk instansi atau lembaga
pendidikan, diberikan jadwal hari Selasa sampai Jumat. Sementara itu,
kunjungan individu dibuka setiap hari Sabtu.</p>
. </section>
. </article>
. </div>
. <div id="content">
. <article id="sejarah">
. <h2>Sejarah</h2>
. <img src="assets/image/history.jpg" alt="sejarah">
. <p>Kata Bandung berasal dari kata bendung atau bendungan
karena terbendungnya sungai Citarum oleh lava Gunung Tangkuban Parahu yang
lalu membentuk telaga. Legenda yang diceritakan oleh orang-orang tua di
Bandung mengatakan bahwa nama Bandung diambil dari sebuah kendaraan air yang
terdiri dari dua perahu yang diikat berdampingan yang disebut perahu bandung
yang digunakan oleh Bupati Bandung, R.A. Wiranatakusumah II,
. untuk melayari Ci Tarum dalam mencari tempat kedudukan kabupaten yang baru
untuk menggantikan ibu kota yang lama di Dayeuhkolot. </p>
.
. <p>Berdasarkan filosofi Sunda, kata Bandung juga berasal dari
kalimat Nga-Bandung-an Banda Indung, yang merupakan kalimat sakral dan luhur
karena mengandung nilai ajaran Sunda. Nga-Bandung-an artinya menyaksikan
atau bersaksi. Banda adalah segala sesuatu yang berada di alam hidup yaitu
di bumi dan atmosfer, baik makhluk hidup maupun benda mati. Sinonim dari
banda adalah harta. Indung berarti Ibu atau Bumi, disebut juga sebagai Ibu
Pertiwi tempat Banda berada.</p>
. </article>
.
. <article id="geografis">
. <h2>Geografis</h2>
. <img src="assets/image/geografis.jpg" alt="geografis">
. <p>Kota Bandung dikelilingi oleh pegunungan, sehingga bentuk
morfologi wilayahnya bagaikan sebuah mangkok raksasa, secara geografis kota
ini terletak di tengah-tengah provinsi Jawa Barat, serta berada pada
ketinggian ±768 m di atas permukaan laut, dengan titik tertinggi di berada
di sebelah utara dengan ketinggian 1.050 meter di atas permukaan laut dan
sebelah selatan merupakan kawasan rendah dengan ketinggian 675 meter di atas
permukaan laut.</p>
.
. <p>Kota Bandung dialiri dua sungai utama, yaitu Sungai
Cikapundung dan Sungai Citarum beserta anak-anak sungainya yang pada umumnya
mengalir ke arah selatan dan bertemu di Sungai Citarum. Dengan kondisi yang
demikian, Bandung selatan sangat rentan terhadap masalah banjir terutama
pada musim hujan.</p>
. </article>
.
. <article id="wisata">
. <h2>Wisata</h2>
. <p>Sejak dibukanya Jalan Tol Cipularang, kota Bandung telah
menjadi tujuan utama dalam menikmati liburan akhir pekan terutama dari
masyarakat yang berasal dari Jakarta sekitarnya. Selain menjadi kota wisata
belanja, kota Bandung juga dikenal dengan sejumlah besar bangunan lama
berarsitektur peninggalan Belanda.</p>
. <section>
. <h3>Farm House Lembang</h3>
. <img src="assets/image/farm-house.jpg" alt="farm house">
. <p>Berada di jalur utama Bandung-Lembang, Farm House
menjadi objek wisata yang tidak pernah sepi pengunjung. Selain karena
letaknya strategis, kawasan ini juga menghadirkan nuansa wisata khas Eropa.
Semua itu diterapkan dalam bentuk spot swafoto Instagramable.</p>
. </section>
. <section>
. <h3>Observatorium Bosscha</h3>
. <img src="assets/image/bosscha.jpg" alt="bosscha">
. <p>Memiliki beberapa teleskop, antara lain, Refraktor
Ganda Zeiss, Schmidt Bimasakti, Refraktor Bamberg, Cassegrain GOTO, dan
Teleskop Surya. Refraktor Ganda Zeiss adalah jenis teleskop terbesar untuk
meneropong bintang. Benda ini diletakkan pada atap kubah sehingga saat
teropong digunakan, atap tersebut harus dibuka. Observatorium Bosscha boleh
dikunjungi oleh siapapun, tanpa tiket. Namun, bagi yang ingin menggunakan
teleskop Zeiss, wajib mendaftarkan diri. Untuk instansi atau lembaga
pendidikan, diberikan jadwal hari Selasa sampai Jumat. Sementara itu,
kunjungan individu dibuka setiap hari Sabtu.</p>
. </section>
. </article>
. </div>
. <aside>
. <article>
. <h2>Kota Bandung</h2>
. <p>Kota Kembang Paris van Java</p>
. <figure>
. <img src="assets/image/badung-badge.png">
. <figcaption>Lambang</figcaption>
. </figure>
. </article>
. </aside>
Good job! Sekarang konten sudah terorganisir dengan baik. Sampai sejauh
ini, struktur pada elemen <main> akan nampak seperti diagram berikut:
Table
Ada beberapa jenis informasi yang perlu ditampilkan dalam bentuk tabel, contohnya
klasmen olahraga atau sebuah jadwal layaknya kalender. Ketika kita membuat sebuah
tabel, pastinya kita akan banyak bermain dengan baris dan kolom. Pada materi ini,
kita akan belajar bagaimana cara membuat dan mengorganisir sebuah tabel pada
HTML.
Tapi sebelum itu, apa sih sebenarnya tabel dalam HTML itu? Elemen <table> pada
HTML merepresentasikan data tabular. Yaitu informasi yang disajikan dalam sebuah
tabel. Tabel sendiri disajikan dalam dua dimensi yang terdiri dari baris dan kolom
(cell) yang berisikan sebuah data. Berikut contoh data sepakbola yang disajikan dalam
bentuk tabel.
wikipedia.org
Elemen <td> yang berarti “table data” selain membuat cell elemen ini juga
merupakan tempat di mana data pada tabel ditampung, dan elemen <th> atau
“table header” digunakan untuk menentukan sebuah header pada kolom
datanya. Untuk lebih jelasnya, perhatikan ilustrasi berikut:
Cukup mudah kan? Sekarang mari kita ubah menjadi penerapan elemen
HTML.
<table>
<tr>
<th>Tahun</th>
<th>Juara 1</th>
<th>Juara 2</th>
<th>Juara 3</th>
</tr>
<tr>
<td>2018</td>
<td>Prancis</td>
<td>Kroasia</td>
<td>Belgium</td>
</tr>
<tr>
<td>2014</td>
<td>Jerman</td>
<td>Argentina</td>
<td>Belanda</td>
</tr>
<tr>
<td>2010</td>
<td>Spanyol</td>
<td>Belanda</td>
<td>Jerman</td>
</tr>
</table>
Spanning Cell
Terkadang kita membutuhkan sebuah sel yang mencakup untuk dua kolom
ataupun dua baris sekaligus. Dalam aplikasi seperti Microsoft Word, hal ini
biasa kita kenal sebagai merging cell atau menggabungkan sebuah sel. Ini
memang menjadi sebuah fitur dasar dalam membuat sebuah tabel, sehingga
pada HTML pun kita dapat melakukan hal tersebut.
Pada HTML hal ini lebih dikenal sebagai Spanning cell, yang artinya
menjangkau atau merentangkan sebuah ukuran sel lebih dari ukuran yang
biasanya. Dengan spanning cell kita dapat membuat sebuah tabel yang lebih
kompleks, tetapi akan membuat markup yang kita tulis menjadi sedikit sulit
dibaca.
Column Spans
<table>
<tr>
<th>18:00</th>
<th>19:00</th>
<th>20:00</th>
</tr>
<tr>
</tr>
<tr>
<td>Gundala</td>
</tr>
<tr>
<td>Gundala</td>
</tr>
</table>
<table border="1">
<tr>
<th>18:00</th>
<th>19:00</th>
<th>20:00</th>
</tr>
<tr>
</tr>
<tr>
<td>Gundala</td>
</tr>
<tr>
<td>Gundala</td>
</tr>
</table>
<table border="1">
<tr>
<th rowspan="3">18:00</th>
</tr>
<tr>
</tr>
<tr>
<td>Gundala</td>
</tr>
</table>
Sejauh ini, Anda sudah mengetahui penerapan dasar untuk sebuah tabel pada
HTML. Sebenarnya masih terdapat beberapa anggota elemen dan atributnya
yang dapat digunakan pada tabel. Karena elemen ini jarang digunakan sehingga
kita akan mengenal secara ringkas dan merangkumnya dalam sebuah tabel
berikut:
Setelah kita mengetahui cara menerapkan tabel pada website, mari kita
perkaya kembali konten pada halaman profil, khususnya konten pada
elemen <aside> yang sudah kita buat. Kita akan menambahkan detail
informasi dari kota Bandung seperti negara luas, bahasa daerah, dan kode
telepon.
Tapi sebelum itu mari kita atur kembali struktur elemen yang di dalam elemen
<aside> tersebut. Saat ini elemen <aside> memiliki struktur seperti ini:
Karena kita akan menambahkan konten lain, maka kita perlu mengelompokan
kembali elemen yang ada di dalam elemen <article>. Kelompokan seluruh
elemen yang ada pada elemen <article> saat ini sebagai header, dan buat
elemen baru yaitu <section> setara dengan elemen <header> tersebut. Pada
elemen <section> ini konten tabel akan ditempatkan. Silakan buka kembali
berkas index.html, dan sesuaikan struktur elemen <aside> seperti berikut:
<aside>
<article>
<header>
<h2>Kota Bandung</h2>
<figure>
<img src="assets/image/bandung-badge.png">
<figcaption>Lambang</figcaption>
</figure>
</header>
<section></section>
</article>
</aside>
Informasi Lainnya
Negara
Indonesia
Hari jadi
25 September 1810
Luas Total
167.67 km2
Bahasa Daerah
Sunda
Kode Telepon
+62 22
<section>
<h3>Informasi Lainnya</h3>
<table>
<tr>
<th>Negara</th>
<td>Indonesia</td>
</tr>
<tr>
<th>Hari jadi</th>
</tr>
<tr>
<th>Luas Total</th>
<td>167.67 km<sup>2</sup></td>
</tr>
<tr>
<th>Bahasa Daerah</th>
<td>Sunda</td>
</tr>
<tr>
<th>Kode Telepon</th>
<td>+62 22</td>
</tr>
</table>
</section>
Special Character
Terdapat beberapa karakter spesial seperti copyright symbol © yang tidak
termasuk ke dalam standar kelompok ASCII characters, di mana ASCII
characters hanya menyediakan karakter seperti huruf, nomor dan beberapa
simbol dasar. Dan karakter lain seperti lebih dari (>) atau kurang dari (<)
walaupun tersedia dalam ASCII character, karakter tersebut tidak dapat
digunakan secara langsung sebagai konten pada HTML, karena karakter
tersebut akan terbaca sebagai sebuah tag.
Untuk menampilkan karakter seperti yang disebutkan tadi, HTML memerlukan
sebuah “escaped” character. Escaping artinya adalah tidak menuliskan
karakter itu sendiri, melainkan menggantinya dengan
nilai numeric atau character reference pada karakternya.
atau “©”.
Introduction to Styling
Pada modul pengenalan sudah disinggung seperti apa peran CSS pada
website. Website nampak begitu membosankan dan mengerikan tanpa
adanya CSS. Cascading Style Sheet atau biasa disingkat CSS merupakan
W3C standar yang digunakan untuk mengatur visualisasi berkas yang ditulis
pada HTML. Pada modul ini kita akan belajar penggunaan dasar dari CSS.
Tepatnya mulai dari pembuatan berkas CSS, pengenalan struktur
sintaksnya, hingga menerapkan dasar styling seperti memberikan warna
pada sebuah teks.
CSS syntax berbeda dengan HTML, begitu pula dengan JavaScript. CSS
bukanlah sebuah bahasa pemrograman karena di dalamnya tidak terdapat
logika, tidak dapat membuat sebuah variabel, tidak adanya proses iterasi,
dsb. CSS hanya sebuah declarative language yang digunakan untuk
mendeklarasikan suatu nilai yang nantinya digunakan untuk mengatur seperti
apa sebuah elemen HTML ditampilkan pada browser.
Sudah jelas bukan? Tiada alasan kita tidak menerapkan CSS. Terkecuali
dukungan pada browser yang terkadang berbeda setiap vendornya
(contohnya vendor prefixes), tapi hal tersebut tidak menjadi masalah ketika
kita tahu di mana letak perbedaan dan cara penerapannya.
1. Dimulai dari sebuah dokumen yang telah ditandai dengan tag elemen
HTML.
2. Menuliskan aturan styling untuk menentukan bagaimana elemen HTML
akan ditampilkan.
3.
4.
Pada modul sebelumnya kita sudah mengenal banyak bagaimana cara untuk
me-markup atau memberikan tag sebuah konten dalam HTML. Mungkin
sebagian dari kita bingung, mengapa kita perlu mengelompokkan sebuah
konten tapi tiada perubahan signifikan pada tampilan browser? Contohnya
seperti elemen <div> yang tidak akan mengubah apapun sebelum kita
menerapkan sebuah styling pada elemennya. Sebenarnya terdapat hubungan
antara struktur dokumen dengan sebuah style sheet. Kita akan memahami ini
seiring kita belajar hingga pembahasan lebih lanjut.
Sebuah style sheet dibuat terdiri dari satu atau lebih aturan styling (biasa
disebut dengan rules atau rule-sets) yang mendeskripsikan bagaimana
sebuah elemen atau sebuah kelompok elemen ditampilkan dalam jendela
browser.
Langkah awal belajar CSS adalah dengan memahami sebuah bagian rule.
Berikut ini dua contoh rules yang dituliskan dalam sebuah CSS. Rule yang
pertama menetapkan sebuah warna hijau pada elemen <h1> dan rule yang
kedua menetapkan ukuran font dan tipe font pada sebuah elemen paragraf.
. h1 { color: green; }
.
. p {
. font-size: small;
. font-family: sans-serif;
. }
Dalam penggunaan CSS, terdapat dua bagian dalam sebuah rule. Yang
pertama adalah identitas elemen atau elemen yang akan menerapkan rule
(singkatnya kita akan sebut selector) dan yang kedua adalah deklarasi atau
instruksi yang akan diterapkan pada sebuah selector.
Selector
Declarations
Bagian deklarasi terdiri dari pasangan properti dengan nilainya. Kita bisa
menetapkan lebih dari satu deklarasi pada satu rule; contohnya seperti pada
selector p di atas, kita menetapkan lebih dari satu deklarasi pada declaration
block. Setiap deklarasinya harus diakhiri dengan semicolon (;) sebagai tanda
diakhirinya sebuah deklarasi.
. p {
. font-size: small;
. font-family: sans-serif;
. /* deklarasikan nilai properti lainnya pada garis baru */
. }
Tapi ingat, walaupun CSS tidak memperhatikan spasi, untuk satuan nilai
seperti px, em dan lainnya harus dituliskan tanpa spasi pada nilainya.
Contohnya:
. h1 {
. margin: 2em;
. }
Jika kita menambahkan spasi di antara satuan dan nilai, maka deklarasi
tersebut tidak akan berfungsi.
. h1 {
. margin: 2 em; /* Deklarasi tidak akan berfungsi karena terdapat spasi
antara nilai dan satuan */
. }
. <head>
. <title>Document Title</title>
. <link rel="stylesheet" href="style.css">
. </head>
Pada contoh di atas kita tahu bahwa berkas css yang digunakan merupakan
berkas lokal (berkas yang berada pada komputer/server kita sendiri). Nilai
atribut href juga dapat berupa berkas .css yang tersedia melalui sebuah URL.
. <head>
. <title>Document Title</title>
.
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.
3.1/css/bootstrap.min.css">
. </head>
. <head>
. <title>Document Title</title>
. <style>
. /*
. * Rules styling dituliskan di sini
. */
. </style>
. </head>
Inline Style
Commenting in Style
Pada contoh kode di atas, kita sudah melihat sebuah teks pada rule yang
dimulai dari /* dan diakhiri dengan */. Teks tersebut merupakan commenting
line di dalam sebuah CSS. Sama seperti commenting pada HTML dan
bahasa pemrograman lainnya, Teks yang dijadikan sebuah komentar tidak
akan diproses oleh browser (sebagai compiler) atau lebih tepatnya
“diabaikan”.
Latihan kali ini akan mencakup tahapan seperti pembuatan berkas CSS,
menuliskan rule pada berkas CSS, hingga menghubungkan berkas CSS
dengan HTML.
Di akhir latihan ini kita akan membuat halaman profil tampak seperti ini:
Silakan buka kembali root folder proyek yang telah kita buat dan buka
folder assets.
Jika kita sudah selesai mengikuti latihan pada modul-modul sebelumnya,
maka di dalam folder assets akan terdapat folder image. Sekarang, kita
tambahkan folder baru dan beri nama styles.
Folder styles ini akan kita gunakan untuk menyimpan berkas CSS. Maka
silakan buka folder tersebut dan buat berkas baru dan beri nama style.css.
Menulis Rules pada Berkas CSS
Untuk latihan awal, kita bisa coba menuliskan sebuah rule styling pada beberapa
elemen HTML yang ada pada latihan sebelumnya.
Yang pertama, tetapkan tipe font ‘sans-serif’ sebagai font yang digunakan pada
seluruh elemen yang ada di dalam <body>. Silakan buka berkas style.css yang
sudah kita buat pada text editor dan tuliskan kode berikut:
. body {
. font-family: sans-serif;
. }
Yang kedua, kita tetapkan juga warna pada setiap elemen <h2> dan <h3> yang
digunakan pada berkas HTML dengan menuliskan kode sebagai berikut:
. h2 {
. color: #00a2c6
. }
.
. h3 {
. color: #00a2c6
. }
Dan yang terakhir, kita coba ubah warna background dan warna teks pada
elemen <footer>, serta beri sebuah padding.
. footer {
. padding: 20px;
. color: white;
. background-color: #00a2c6
. }
Sehingga keseluruhan kode pada berkas style.css akan nampak seperti ini:
. body {
. font-family: sans-serif;
. }
.
. h2 {
. color: #00a2c6
. }
.
. h3 {
. color: #00a2c6
. }
.
. footer {
. padding: 20px;
. color: white;
. background-color: #00a2c6
. }
. <head>
. <title>Kota Bandung</title>
. <link rel="stylesheet" href="assets/styles/style.css">
. </head>
CSS Conception
Sebelum membahas lebih detail mengenai styling, terdapat beberapa konsepsi dalam
CSS yang harus kita pahami.
Inheritance
Styling HTML bersifat inheritance yang artinya dapat mewarisi properti style
“tertentu” pada elemen yang ada di dalamnya. Contohnya pada rules yang kita
tuliskan untuk elemen <body> akan diterapkan pada seluruh elemen yang ada di
dalam elemennya (body). Contoh lainnya, pada rules yang diterapkan pada elemen
<footer> dengan properti color yang bernilai white, akan diterapkan pada seluruh
elemen yang ada di dalam <footer>. Hal ini menjadi alasan mengapa memahami
struktur dokumen itu penting.
Group Selector
Jika kita menerapkan rule yang sama pada beberapa selector yang berbeda, di CSS
kita dapat menggabungkan selector tersebut sehingga dapat meminimalisir penulisan
kode yang berulang.
Contohnya pada styling yang sudah kita buat sebelumnya, terdapat rule yang serupa
antara h2 dan h3.
. h2 {
. color: #00a2c6
. }
.
. h3 {
. color: #00a2c6
. }
Jika terdapat kasus seperti ini, kita dapat menuliskan dua selector sekaligus dalam
satu struktur rule. Gunakan tanda koma (,) untuk memisahkan tiap selector-nya.
Silakan kita buka kembali berkas style.css dan gabungkan rule untuk
elemen <h2> dan <h3> menjadi seperti ini:
. h2, h3 {
. color: #00a2c6
. }
Rule Order
Konflik dapat terjadi karena kita dapat menerapkan beberapa styling pada satu
dokumen HTML. Contohnya, apa yang seharusnya ditampilkan pada browser ketika
eksternal css mengharuskan elemen <p> menampilkan warna merah, tetapi pada
embedded css <p> harus menampilkan warna biru? Kembali pada alur kerja CSS
yang membaca dari atas ke bawah, sehingga warna yang akan diterapkan adalah
warna yang paling akhir didefinisikan.
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Berkas</title>
. <style>
. p {
. color: red;
. }
.
. p {
. color: blue;
. }
. </style>
. </head>
. <body>
. <p>Sesuai dengan namanya cascading yang artinya <q>mengalir</q>, alur kerja
CSS dalam membaca kode pun seperti itu.
. Mengalir dari atas ke bawah sehingga kita harus memperhatikan urutan
dalam penulisan rules <i>styling</i></p>
. </body>
. </html>
Tetapi kita bisa membuat sebuah property styling agar dianggap penting oleh browser
untuk diterapkan dan tidak memperhatikan urutan. Kita bisa menambahkan keyword !
important pada akhir nilai propertinya.
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. p {
. color: red !important;
. }
.
. p {
. color: blue;
. }
. </style>
. </head>
. <body>
. <p>Sesuai dengan namanya cascading yang artinya <q>mengalir</q>, alur kerja
CSS dalam membaca kode pun seperti itu. Mengalir dari atas ke bawah sehingga
kita harus memperhatikan urutan dalam penulisan rules <i>styling</i></p>
. </body>
. </html>
Sehingga warna yang diterapkan pada teks paragraf adalah merah.
Berikut catatan yang sudah kita pelajari sejauh ini tentang styling:
Rule : Sebuah aturan styling yang harus diterapkan pada elemen HTML,
dalam sebuah rule terdapat selector dan deklarasi properti styling.
Selector : Sebuah bagian dari rule, yang mengidentifikasi target elemen untuk
menetapkan sebuah rule.
Declaration : Sebuah bagian dari rule, yang terdiri dari pasangan properti dan
nilainya.
External Style Sheet : Berkas terpisah yang di dalamnya hanya terdapat
sebuah rules yang akan digunakan pada website.
Embedded Style Sheet : Kumpulan rules yang dituliskan dalam berkas HTML
dengan menggunakan elemen <style>.
Pada modul ini kita akan berkenalan lebih dalam lagi dengan CSS, kita akan
mengenal berbagai macam tipe selector, formatting text, bermain dengan warna,
mengenal apa itu box model, positioning, hingga penyusunan layout pada website
menggunakan teknik floating.
Untuk menerapkan materi yang kita pelajar, pada modul ini juga terdapat
beberapa latihan dalam menerapkan styling pada halaman profil, tentunya pada
akhir modul ini kita dapat membuat halaman profil tampak seperti ini:
Selector Basic
Pada modul sebelumnya kita sudah mengetahui apa itu selector, dan
menggunakannya. Yang kita gunakan tersebut merupakan selector basic.
Sebenarnya terdapat beberapa macam dari selector basic, yakni:
Type Selector
Class Selector
ID Selector
Attribute Selector
Universal Selector
Mari kita bahas satu persatu tipe selector basic yang ada.
Type Selector
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. /* Semua elemen span */
. span {
. color: red;
. }
. </style>
. </head>
. <body>
. <span>Ini merupakan sebuah teks yang berada pada elemen span. Seharusnya elemen
ini ditampilkan dengan warna teks merah.</span>
. <p>Ini merupakan sebuah teks yang berada pada elemen paragraf, teks ini tidak
seharusnya tidak akan terpengaruh oleh rule.</p>
. <span>Ini merupakan sebuah teks yang berada pada elemen span lainnya. Seharusnya
elemen ini ditampilkan dengan warna teks merah juga.</span>
. </body>
. </html>
Jika berkas tersebut dibuka pada browser, maka teks yang berada pada setiap
elemen <span> akan berwarna merah.
Class Selector
Class selector menetapkan target elemen berdasarkan nilai dari atribut class yang
diterapkan pada elemennya. Untuk penulisan selector, awali dengan tanda titik (.)
kemudian lanjutkan dengan nama class-nya. Contoh:
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. .red {
. color: red;
. }
.
. .skyblue-bg {
. background-color: skyblue;
. }
.
. .fancy {
. font-weight: bold;
. text-shadow: 4px 4px 3px #77f;
. }
. </style>
. </head>
. <body>
. <p class="red">Paragraf dengan teks berwarna merah</p>
. <p class="skyblue-bg">Paragraf dengan background berwarna biru langit</p>
. <p class="fancy">Paragraf dengan gaya fancy</p>
. <p>Paragraf yang menampilkan teks dengan warna standar tanpa menerapkan
styling</p>
. </body>
. </html>
Jika berkas tersebut dibuka pada browser, maka akan nampak seperti ini:
Tidak hanya itu, sebuah elemen juga mungkin memiliki banyak nilai class,
sehingga kita dapat menerapkan lebih dari satu rule atau gabungan rule pada
elemen target. Untuk menggunakannya, pada atribut class kita cukup tuliskan
nama kelasnya dan pisahkan tiap nilai kelasnya dengan spasi.
. <h1 class="red skyblue-bg">Heading dengan teks berwarna merah dan background biru
langit</h1>
. <p class="red fancy">Paragraf dengan teks berwarna merah dan bergaya fancy</p>
Kita juga bisa menargetkan elemen secara spesifik yang memiliki sebuah class.
Bagaimana jika kita ingin menerapkan gaya yang berbeda ketika menggunakan
kelas bergaya keren alias fancy pada sebuah paragraf? untuk melakukannya,
pada selector kita tuliskan nama elemen target diikuti dengan titik (.) kemudian
nama kelasnya. Perhatikan contoh berikut:
. <!doctype html>
. <html lang="en">kita
. <head>
. <title>Judul Dokumen</title>
. <style>
. .fancy {
. font-weight: bold;
. text-shadow: 4px 4px 3px #77f;
. }
.
. p.fancy {
. text-shadow: 4px 4px 3px #00c8eb;
. }
. </style>
. </head>
. <body>
. <h1 class="fancy">Heading dengan teks bergaya fancy</h1>
. <p class="fancy">Paragraf dengan teks bergaya fancy</p>
. </body>
. </html>
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. #special {
. background-color: skyblue;
. }
. </style>
. </head>
. <body>
. <div id="special">
. <p>Ini merupakan konten di dalam sebuah div yang diberi id special.</p>
. </div>
. <div>
. <p>Ini merupakan konten di dalam sebuah div biasa.</p>
. </div>
. </body>
. </html>
Jika kode di atas dibuka pada browser, maka tampilan akan tampak seperti
ini:
Yang harus kita perhatikan kembali adalah id ini bersifat unik. Jika kita ingin
menerapkan sebuah rule pada banyak elemen, sebaiknya gunakan
atribut class, bukan dengan id.
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. #special {
. background-color: skyblue;
. }
. </style>
. </head>
. <body>
. <div id="special">
. <p>Ini merupakan konten di dalam sebuah div yang diberi id special.</p>
. </div>
. <div id="special"> <!-- ini merupakan contoh yang salah dalam penerapan id
-->
. <p>Ini merupakan konten di dalam sebuah div biasa.</p>
. </div>
. </body>
. </html>
Attribute Selector
Attribute selector merupakan cara menetapkan target elemen berdasarkan
sebuah atribut yang digunakan atau bahkan bisa lebih spesifik dengan
nilainya. Contohnya sebagai berikut:
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
.
. /* <a> element yang menerapkan href attribut */
. a[href] {
. color: blue;
. }
.
. /* <a> element yang menerapkan nilai pada href dengan awalan "#" */
. a[href^="#"] {
. background-color: gold;
. }
.
. /* <a> element yang menerapkan nilai pada href yang mengandung teks
"example" */
. a[href*="example"] {
. background-color: silver;
. }
.
. /* <a> element yang menerapkan nilai pada href yang mengandung teks
"insensitive" tidak mementingkan huruf kapital*/
. a[href*="insensitive" i] {
. color: cyan;
. }
.
. /* <a> element yang menerapkan nilai pada href dengan akhiran ".org"
*/
. a[href$=".org"] {
. color: red;
. }
. </style>
. </head>
. <body>
. <ul>
. <ul>
. <li><a href="#internal">Internal link</a></li>
. <li><a href="http://example.com">Example link</a></li>
. <li><a href="#InSensitive">Insensitive internal link</a></li>
. <li><a href="http://example.org">Example org link</a></li>
. </ul>
. </ul>
. </body>
. </html>
Jika kode di atas dibuka pada browser, maka tampilan akan tampak seperti
ini:
Dari kode di atas terlihat banyak sekali kondisi yang dapat diterapkan pada
atribut selector. Agar dapat lebih mudah memahaminya, mari kita rangkum
dalam sebuah tabel.
Syntax Description
. img + p {
. color: green;
. }
Adjacent Sibling Selector terdiri dari dua buah target elemen, namun hanya
elemen kedua yang menerapkan rule selama elemen tersebut dituliskan
langsung setelah elemen pertama pada berkas HTML. Selain itu kedua
elemen tersebut harus berada di dalam induk elemen yang sama. Pada
contoh di atas rule akan diterapkan pada elemen paragraf yang berada tepat
setelah elemen gambar. Berikut contoh penerapannya:
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. /* Rule akan diterapkan pada elemen paragraf yang berada tepat
setelah elemen img */
. img + p {
. color: green;
. }
. </style>
. </head>
. <body>
. <p>Ini merupakan paragraf pertama. Rule styling tidak akan diterapkan pada
elemen paragraf ini.</p>
. <img src="https://i.imgur.com/cs2BJzw.jpg" alt="Dicoding
logo" width="400px">
. <p>Ini merupakan paragraf kedua dan ditetapkan setelah elemen gambar. Maka
paragraf ini seharusnya menerapkan rule dengan menampilkan teks berwarna
hijau.</p>
. <p>Ini merupakan paragraf ketiga. Letaknya memang setelah elemen gambar,
namun tidak diletakkan persis setelahnya, sehingga rule tidak akan
diterapkan pada elemen ini.</p>
. </body>
. </html>
. img ~ p {
. color: green;
. }
Rule di atas akan diterapkan pada elemen paragraf yang berada setelah
elemen img selama masih di dalam induk yang sama.
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. /* Rule akan diterapkan pada elemen header yang berada tepat setelah
elemen img */
. img ~ p {
. color: green;
. }
. </style>
. </head>
. <body>
. <p>Ini merupakan paragraf pertama. Rule styling tidak akan diterapkan pada
elemen paragraf ini.</p>
. <img src="https://i.imgur.com/cs2BJzw.jpg" alt="Dicoding
logo" width="400px">
. <p>Ini merupakan paragraf kedua dan ditetapkan setelah elemen gambar. Maka
paragraf ini menerapkan rule dengan menampilkan teks berwarna hijau.</p>
. <div>
. <p>Ini merupakan paragraf ketiga, letaknya setelah elemen gambar, namun
paragraf ini dibungkus di dalam div sehingga paragraf ini tidak akan
menerapkan rule styling karena tidak memiliki induk yang sama.</p>
. </div>
. <p>Ini merupakan paragraf empat. Letaknya memang setelah elemen gambar dan
memiliki induk yang sama seperti elemen gambar, sehingga elemen ini akan
menerapkan rule dengan menampilkan teks berwarna hijau.</p>
. </body>
. </html>
. div > p {
. background-color: yellow;
. }
Pada contoh di atas rule akan diterapkan pada seluruh elemen paragraf yang
berada di dalam elemen div secara langsung. Dalam arti lain, elemen
paragraf merupakan child dari elemen div bukan sebuah hanya turunannya.
Untuk lebih jelas, perhatikan contoh penerapannya berikut:
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. /* Rule akan diterapkan pada elemen paragraf yang merupakan child
dari elemen div */
. div > p {
. background-color: yellow;
. }
. </style>
. </head>
. <body>
. <div>
. <p>Paragraf pertama. di dalam div.</p>
. <p>Paragraf kedua. di dalam div.</p>
. <section><p>Paragraf ketiga. di dalam div namun bukan sebagai anak elemen
secara langsung.</p></section>
. <p>Paragraf keempat. di dalam div.</p>
. </div>
. <p>Paragraf kelima. di luar div.</p>
. <p>Paragraf keenam. di luar div.</p>
. </body>
. </html>
. div p {
. background-color: yellow;
. }
Pada contoh di atas rule akan diterapkan pada seluruh elemen paragraf yang
merupakan turunan dari elemen div. Berikut contoh penerapannya:
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. /* Rule akan diterapkan pada elemen paragraf yang merupakan turunan
dari elemen div */
. div p {
. background-color: yellow;
. }
. </style>
. </head>
. <body>
. <div>
. <p>Paragraf pertama. di dalam div.</p>
. <p>Paragraf kedua. di dalam div.</p>
. <section><p>Paragraf ketiga. di dalam div namun bukan sebagai anak elemen
secara langsung.</p></section>
. <p>Paragraf keempat. di dalam div.</p>
. </div>
. <p>Paragraf kelima. di luar div.</p>
. <p>Paragraf keenam. di luar div.</p>
. </body>
. </html>
Pseudo Selector
Selain beberapa selector yang sudah kita pelajari, CSS masih memiliki dua
selector lagi yang dapat kita manfaatkan untuk membantu untuk menyeleksi
elemen untuk menerapkan sebuah rule, yakni Pseudo-class dan Pseudo-
elemen.
Sebelum menjelaskan lebih detail tentang kedua selector tersebut, perlu kita
ketahui pseudo selector berbeda dari selector yang sudah dibahas
sebelumnya, selector ini menargetkan elemen pada bagian yang “tidak
terlihat” seperti sifat pada elemen, sehingga untuk menetapkannya, kita tidak
bisa menggunakan selector biasa. Salah satu contoh yang paling sering kita
terapkan adalah :hover, Pseudo Selector tersebut kita gunakan untuk
menetapkan rule ketika cursor diarahkan ke target elemen.
. a:hover {
. color: blue;
. }
Mari kita bahas lebih detail mengenai pseudo-class selector dan pseudo-
element selector.
Pseudo-class Selector
Untuk menggunakan pseudo-class kita gunakan tanda titik dua (:) pada basic
selector kemudian diikuti dengan pseudo-class nya. Berikut contoh
penerapan beberapa pseudo-class pada sebuah elemen anchor:
. /* rule akan diterapkan pada sebuah tautan yang belum pernah dikunjungi */
. a:link {
. color: red;
. }
.
. /* rule akan diterapkan pada sebuah tautan yang sudah pernah dikunjungi */
. a:visited {
. color: green;
. }
.
. /* rule akan diterapkan pada sebuah tautan ketika diarahkan dengan kursor */
. a:hover {
. color: pink;
. }
.
. /* rule akan diterapkan pada sebuah tautan ketika ditekan */
. a:active {
. color:orange;
. }
Pseudo-elemen Selector
. blockquote::before,
. blockquote::after {
. content: '"';
. font-size: 24px;
. font-style: italic;
. font-weight: bold;
. }
Dengan menuliskan rule tersebut, elemen <blockquote> memiliki tanda kutip
pada awal dan akhir elemennya.
Untuk menggunakan pseudo-elemen kita gunakan dua buah tanda titik dua
(::) kemudian diikuti dengan pseudo-elemen nya. Sebenarnya kita bisa
menggunakan satu buah tanda tanda titik dua (:) namun kita perlu
membedakannya dengan pseudo-class. Karena itulah baiknya ketika
menggunakan pseudo-elemen, gunakanlah dua buah titik dua (::).
. <!doctype html>
. <html lang="en">
. <head>
. <title>Judul Dokumen</title>
. <style>
. /* Rule styling akan diterapkan pada karakter pertama disebuah
paragraf */
. p::first-letter {
. font-size: 32px;
. font-weight: bold;
. color: saddlebrown;
. }
. </style>
. </head>
. <body>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto
deserunt, dicta laudantium quae quam sequi
. soluta vitae! A, architecto beatae, consequuntur et eveniet fuga
laudantium molestias praesentium temporibus, unde
. velit.</p>
. </body>
. </html>
Perlu kita ketahui, CSS memisahkan styling untuk font dan teks. Kita harus
tahu kapan seharusnya menetapkan styling pada font atau menetapkannya
pada teks. Mengapa kedua hal tersebut dipisah? Padahal teks dan font
merupakan satu kesatuan, di mana setiap teks pasti menggunakan font untuk
menampilkannya, bukan? Sebabnya, CSS sendiri mempunyai properti untuk
kedua hal tersebut secara masing-masing
font-family
. body {
. font-family: sans-serif;
. }
Untuk menuliskan lebih dari satu nilai font, berikut aturan yang harus kita
perhatikan:
Seluruh nilai font yang bukan merupakan generic font families, yang
mana harus dituliskan secara kapital. Contohnya “Arial” bukan
dituliskan “arial”.
Gunakan tanda koma (,) untuk memisahkan antara nilai font yang
digunakan.
Selalu tanda kutip (“) untuk membungkus nilai font yang memiliki spasi
pada namanya (Contohnya “Open Sans”).
Mungkin kita bertanya-tanya mengapa perlu memberikan lebih dari satu nilai
pada font-family? Hal tersebut penting karena tidak semua browser
mendukung semua jenis font. Memberikan lebih dari satu nilai font dapat
menawarkan alternatif tampilan font pada browser. Terutama jika font utama
yang diterapkan tidak didukung oleh browser yang digunakan.
Bagaimana urutan prioritasnya? Mulai dari jenis font yang pertama dituliskan.
Jika font pertama didukung oleh browser maka browser akan
menggunakannya, jika tidak lantas browser akan memeriksa nilai font yang
kedua dan menggunakannya (jika didukung), demikian dan seterusnya.
serif : jenis font yang memiliki runcing pada garis akhir karakternya.
Times New Roman merupakan salah satu jenis serif font.
sans-serif : jenis font yang tidak meruncing pada garis akhir
karakternya. Contohnya “Open Sans”, “Fira Sans” dan lainnya.
monospace : jenis font yang memiliki nilai lebar tiap karakternya sama.
Consolas merupakan salah satu jenisnya.
cursive: jenis font yang tampak seperti handwriting atau hasil tulisan
tangan.
fantasy : jenis font yang merepresentasikan karakteristik yang
menyenangkan.
system-ui : jika menerapkan nilai ini maka font yang diterapkan akan
sama seperti font yang digunakan pada sistem operasi kita.
math : jenis font yang digunakan untuk penulisan rumus-rumus
matematika.
emoji : jenis font yang digunakan untuk menampilkan emoji.
fangsong : jenis font yang menampilkan gaya penulisan Chinese.
font-size
Mengubah nilai font pada sebuah dokumen adalah hal yang sangat wajar
terjadi, begitu pula pada website. Untuk menetapkan ukuran font kita kita
perlu menerapkan properti font-size. Kita bisa menetapkan nilai dari properti
ini dengan menuliskan langsung nilai dan satuannya. Contohnya seperti ini:
. h1 {
. font-size: 1.5em;
. }
Pastikan bahwa saat menuliskan nilai dan satuannya, tidak ada jarak (spasi).
. /* Rule tidak akan diterapkan pada target karena kesalahan penulisan nilai
properti */
. h1 {
. font-size: 1.5 em;
. }
Relative unit
ex Font height Satuan relatif terhadap tinggi font saat ini, satuan
ini sangat jarang sekali digunakan
rem Font size Mirip seperti em, tetapi rem merupakan satuan
relatif terhadap ukuran font dari root element.
ch Font width Satuan relatif terhadap lebar dari karakter “0” nol.
Absolute unit
Satuan Fungsi
. body {
. font-size: 16px;
. }
. h1 {
. font-size: 150%; /* 150% dari 16 = 24px */
. }
Dan yang terakhir kita juga bisa menentukan ukuran font dengan menuliskan
kata kunci secara spesifik yang tersedia pada CSS. Kata kunci tersebut
adalah: xx-small, x-small, small, medium, large, x-large, dan xx-large.
Kata kunci tersebut tidak ada kaitannya dengan pengukuran tertentu (bukan
ukuran yang absolute) tetapi nilainya diubah secara konsisten satu sama lain.
Pada gambar di atas kita bisa lihat bahwa standarnya browser menampilkan
teks dengan nilai medium. Properti font-size dapat diaplikasikan ke seluruh
elemen yang ada di HTML dan nilainya dapat diturunkan pada elemen
turunannya.
font-weight
Setelah mengenal font families dan font size, selanjutnya ada juga font-
weight yang digunakan untuk mengatur ketebalan dari font yang ditampilkan.
Nilai dari properti ini dapat ditentukan dengan menggunakan numeric
values (100 sampai 900) atau dengan menggunakan descriptive
terms (normal, bold, bolder, dan lighter).
font-style
font-variant
Kita yang terbiasa dengan aplikasi document editor seperti Microsoft Word
tentu tahu atau sudah mencoba fitur small caps. Fitur ini dapat membuat teks
menjadi kapital tetapi dituliskan secara kecil dan merapat, seperti ini:
Shorthand
Nilai dari properti font merupakan nilai dari seluruh properti dari font yang
sudah kita bahas. Tiap nilai dipisahkan menggunakan spasi. Pada properti ini
urutan nilai merupakan hal yang penting, sehingga jangan sampai salah
urutan dalam menuliskannya. Kesalahan penulisan atau urutan menyebabkan
seluruh struktur rule menjadi tidak valid.
Walaupun begitu kita bisa tidak menuliskan seluruh nilai properti yang ada,
tetapi nilai dari properti font-size dan font-family wajib ada ketika
menggunakan properti ini. Berikut contohnya penulisan minimal ketika kita
menggunakan properti font:
p {
font: 1em sans-serif;
Text Styling
Pembahasan sebelumnya kita terfokus pada formating bagaimana bentuk
karakter ditampilkan dengan menggunakan beberapa properti font yang ada.
Sekarang kita akan mempelajari bagaimana seorang developer bisa memberikan
formatting pada keseluruhan teks yang ada pada baris paragraf, seperti
menetapkan inden, jarak antar baris, kata dan huruf, dan sebagainya. Maka dari
itu, mari kita bahas satu persatu.
Line Height
Properti line-height digunakan untuk mengatur jarak minimal dari garis dasar ke
garis dasar dalam menampilkannya teks pada halaman. Jika kita terbiasa dengan
software dokumen editor seperti Microsoft Word, properti ini mirip dengan fungsi
line height.
Berikut merupakan contoh tiga cara berbeda dalam menerapkan tinggi baris dua
kali lebih tinggi dari ukuran font:
. p {
. line-height: 2;
. }
. p {
. line-height: 200%;
. }
. p {
. line-height: 2em;
. }
Cara pertama merupakan cara yang paling mudah digunakan, karena kita dapat
menentukan nilai hanya dengan satu angka, di mana angka tersebut nantinya
dikalikan dengan nilai font-size sebelum diterapkan pada nilai properti line-height.
Contohnya, ukuran font standar pada paragraf adalah 16 pixel. ,Kita definisikan
properti line-height dengan nilai 2, maka nilai properti line-height seharusnya
adalah 16 pixel * 2 = 32 pixel (dua kali lebih besar dari ukuran font).
Text Indent
. p#first {
. text-indent: 2em;
. }
.
. p#second {
. text-indent: 25%;
. }
.
. p#third {
. text-indent: -35px;
. }
Perlu diingat kembali, properti ini hanya berpengaruh pada awal baris paragraf.
Jika kita ingin menetapkannya untuk seluruh baris kita dapat
gunakan margin atau padding, keduanya akan dibahas pada materi box model.
Text Alignment
Kita bisa mengatur text alignment pada website seperti kita melakukannya pada
aplikasi Microsoft Word dengan menggunakan properti text-align. Untuk
standarnya, properti ini bernilai left atau biasa kita sebut rata kiri. Tetapi jika kita
menerapkan atribut language dengan nilai bahasa yang arah bacanya
berlawanan, maka standarnya akan menggunakan right atau rata kanan.
. p#first {
. text-align: left;
. }
.
. p#second {
. text-align: right;
. }
.
. p#third {
. text-align: center;
. }
.
. p#fourth {
. text-align: justify;
. }
Properti ini paling populer digunakan ketika kita ingin membuat garis bawah
atau underline pada teks. Tapi tak hanya itu, ada beberapa nilai lain yang
dapat kita gunakan untuk properti ini. Detailnya sebagai berikut:
Text Transform
Pasti kita pernah mencoba fitur pada document editor yang dapat mengubah
kapitalisasi pada teks, bukan? Fitur ini sangat membantu di kala kita ingin
mengubah kapitalisasi tanpa harus menuliskan kembali teksnya. Pada CSS
juga terdapat fitur serupa, yaitu dengan menggunakan properti text-transform.
Ketika kita menerapkan properti text-transform pada elemen teks, maka
kapitalisasi akan berubah ketika halaman di-render tanpa harus
mengubahnya pada dokumen HTML.
. p#letter {
. letter-spacing: 4px;
. }
. p#word {
. word-spacing: 1.5em;
. }
Kedua elemen ini dapat diaplikasikan ke seluruh elemen yang ada pada
HTML dan nilainya dapat diturunkan pada elemen turunannya.
Text Shadow
Memberikan bayangan pada teks telah menjadi hal yang umum digunakan
meskipun tidak memiliki dukungan di semua browser. Pada CSS untuk
membuat bayangan pada teks (atau biasa disebut drop shadow) kita dapat
gunakan properti text-shadow.
Nilai dari properti ini cukup rumit karena membutuhkan tiga buat nilai dan satu
buah nilai warna sehingga membutuhkan empat nilai dalam satu properti
untuk menentukan bayangannya.
. p#one {
. text-shadow: 1px 1px 0px #000000;
. background-color: #eeeeee;
. color: #666666;
. }
.
. p#two {
. text-shadow: 1px 1px 3px #666666;
. background-color: #dddddd;
. color: #666666;
. }
.
. p#three {
. text-shadow: 2px 2px 7px #111111;
. background-color: #cccccc;
. color: #ffffff;
. }
.
. p#four {
. text-shadow: -1px -1px #666666;
. background-color: #cccccc;
. color: #bbbbbb;
. }
Kita sudah mengetahui bagaimana cara mengubah font pada website dan
juga mengetahui tipe font standar yang tersedia pada browser. Berbicara
tentang tipe font, ketika kita menjelajah beberapa website yang ada di internet
tidak jarang kita menemukan website yang menggunakan font yang unik atau
font yang tidak dimiliki pada komputer kita. Lantas bagaimana cara font
tersebut dapat ditampilkan?
Untuk hal ini, CSS memiliki fitur yang digunakan untuk memasukan font
external ke dalam CSS, yakni menggunakan @font-face. Berikut contoh
penulisan @font-face pada CSS:
. @font-face {
. font-family: "Dicoding Font";
. src: url('FILE-FONT.TTF');
. }
. p {
. font-family: "Dicoding Font";
. }
Pada kelas ini kita tidak akan membahas secara detail mengenai @font-face.
Jika ingin mempelajarinya, Anda bisa mengunjungi dokumentasi Mozilla pada
tautan berikut: https://developer.mozilla.org/en-US/docs/Web/CSS/@font-
face. Mengapa kita tak mempelajari hal ini secara detail? Karena sekarang
terdapat cara yang lebih mudah dan sering digunakan oleh web developer,
yakni menggunakan font dari Google Font.
Google Font, layanan Google untuk memudahkan kita mendesain font pada
website. Google Font banyak menyediakan tipe font gratis yang dapat kita
manfaatkan. Saat materi ini ditulis, Google Font memiliki lebih dari 960 jenis
font.
Untuk menggunakan font yang disediakan Google Font, langkah awal yaitu
mengunjungi website google font pada tautan
berikut: https://fonts.google.com/
Saat ini kita akan mencari font dengan nama “Quicksand.” Lakukan
pencarian font tersebut pada search bar yang tersedia pada website tersebut.
Jika sudah menemukan font yang dicari, tekan tombol “+” untuk memilih font
tersebut. Ketika menekan tombol tersebut, Google Font akan menyimpannya
sebagai collection (layaknya fitur cart pada online shop).
Kita juga bisa memilih ketebalan fontnya. Yuk pilih juga versi tebalnya (bold)
dan masukan kembali ke dalam collection.
Setelah selesai memilih font yang dicari, klik pada bar “1 Family Selected”
yang berada di bawah. Setelah itu tampilan akan menjadi seperti ini:
. @import url('https://fonts.googleapis.com/css?
family=Quicksand:400,700&display=swap');
.
.
. body {
. font-family: sans-serif;
. }
.
.
. h2, h3 {
. color: #00a2c6
. }
.
.
. footer {
. padding: 20px;
. color: white;
. background-color: #00a2c6
. }
Untuk menerapkan font-nya, kita ubah nilai properti font-family pada body
dengan menambahkan nilai ‘Quicksand’ sebelum generic font sans-serif.
. body {
. font-family: 'Quicksand', sans-serif;
. }
Setelah menentukan tipe font baru dalam menampilkan teks, selanjutnya kita
percantik lagi teksnya dengan mengatur ukuran, ketebalan,
dan alignment pada teks. Jika Anda sudah menutup berkas style.css pada
text editor, silakan buka kembali dan ikuti langkah - langkah berikut.
Langkah pertama kita atur ukuran font menjadi 18px pada teks yang berada
di elemen <a> yang merupakan turunan dari elemen <nav>.
. nav a {
. font-size: 18px;
. }
. nav a {
. font-size: 18px;
. font-weight: 400;
. text-decoration: none;
. }
Sehingga jika kita preview pada browser, maka ukuran teks pada navigasi
akan tampak lebih besar dan tidak memiliki garis bawah.
Kita bisa memberikan efek tebal pada teks ketika salah satu item navigasi
diarahkan menggunakan kursor. Tambahkan rule baru dengan
memanfaatkan pseudo-class :hover pada elemen <a>.
. nav a:hover {
. font-weight: bold;
. }
. <aside>
. <article class="profile">
. <header>
. .....
. </header>
. <section>
. .....
. </section>
. </article>
. </aside>
. .profile header {
. text-align: center;
. }
Terakhir, kita buat juga teks pada footer menjadi rata tengah dan tebal
dengan menambahkan properti text-align: center; dan font-weight: bold; pada
footer selector:
. footer {
. padding: 20px;
. color: white;
. background-color: #00a2c6;
. text-align: center;
. font-weight: bold;
. }
Color
Warna memberikan kesan hidup pada sebuah website, Jika kita kembali pada
tahun 1993 saat website hanya menampilkan background abu dengan teks hitam,
tentu membosankan sekali, bukan?
Yahoo Search Engine pada tahun 1994, Sumber: https://www.webdesignmuseum.org/
Pada saat itu memang belum tersedia sebuah browser yang dapat mengontrol
warna. Sampai akhirnya Netscape Navigator hadir dan memungkinkan hal
tersebut, walaupun belum sempurna layaknya saat ini. Syukurlah pada saat ini
kita bisa menggunakan properti - properti yang ada pada CSS untuk mengatur
warna pada teks dan background. Terlebih, seluruh browser saat ini sudah
mendukung styling menggunakan CSS sehingga kita tidak perlu lagi memikirkan
kompatibilitasnya.
Pembahasan kali ini kita akan fokus pada warna pada CSS. Anda akan
dikenalkan pada properti yang digunakan untuk mengatur warna teks dan
background. Tapi sebelum itu, mari kita pelajari dahulu bagaimana cara
menetapkan sebuah warna pada CSS.
Ketika ingin menetapkan warna, kita tidak perlu menghafal kombinasi dari ketiga
warna tersebut. Banyak pemilih warna yang dapat membantu kita dalam
menetapkan warna yang diinginkan. Contohnya seperti color picker yang ada
pada Photoshop, GIMP atau Gravit Designer.
Kita bisa melihat nilai RGB yang melalui color picker. Lantas bagaimana jika kita
tidak memiliki aplikasi design seperti yang telah disebutkan tadi? Tenang,
sekarang color picker banyak tersedia online, bahkan ketika kita menuliskan
“color picker” pada Google Search, tools tersebut tersedia pada hasil
pencariannya.
Untuk menetapkan nilai warna pada CSS kita dapat menggunakan Numeric
Value dan Predefined Color Name. Apa sih maksud kedua hal tersebut? Mari kita
bahas satu persatu yah.
Numeric Value
Cara yang paling banyak digunakan dalam menetapkan warna adalah dengan
menggunakan numeric value. Apa pasal? Dengan menggunakannya kita dapat
menentukan warna yang kita inginkan dengan tepat. Terlebih dengan
bantuan color picker maka kita tak perlu repot memahami dan mencari nilai kode
warna secara manual.
Berikut contoh penulisan nilai warna pada CSS dengan numeric value:
Kode tersebut merupakan nilai warna hijau yang dituliskan dalam beberapa
format. Dari kode tersebut kita tahu tidak hanya format RGB yang dapat
digunakan dalam menetapkan warna. Selain RGB ada juga format Hex dan HSL
(Hue, Saturation, Light).
. color: black;
. color: white;
. color: blue;
Dengan menggunakan kata tentu kita dapat lebih mudah dan cepat dalam
menentukan warna, tetapi mungkin hanya warna dasar yang sudah kita hafal.
Faktanya, varian warna ada banyak jumlahnya! Saat ini hampir seluruh browser
saat ini mendukung 140 nama warna, wow! Kita dapat melihat apa saja warna
yang tersedia pada tautan
berikut: https://www.w3schools.com/colors/colors_names.asp.
Opacity
. div#opacity {
. background-color: red;
. opacity: 0.5;
. }
Jika elemen div menerapkan rule tersebut, maka akan tampak seperti ini:
Selain pada elemen, menetapkan opacity juga dapat kita lakukan pada warna.
Untuk melakukannya, gunakan format rgba dan hsla, dimana format ini
merupakan format rgb ditambahkan nilai alpha.
. p {
. color: rgba(78,231,23, 0.5);
. color: hsla(104, 82%, 50%, 0.5);
. }
. p { color: gray; }
. p { color: #666666; }
. p { color: #666; }
. p { color: rgb(102,102,102); }
Properti color dapat diaplikasikan ke seluruh elemen yang ada pada HTML dan
nilainya dapat diturunkan pada elemen turunannya. Jadi kita bisa mengubah
warna teks pada seluruh dokumen HTML dengan menerapkan properti color pada
elemen <body>, seperti ini:
body {
color: steelblue;
<!doctype html>
<html lang="en">
<head>
<style>
body {
font-family: sans-serif;
div#content {
#content > h2 {
background-color: #4c5450;
padding: 15px;
color: white;
#content > h3 {
background-color: #60d0a8;
padding: 15px;
color: white;
#content > p {
padding: 20px;
</style>
</head>
<body>
<div id="content">
<h2>Lorem Ipsum</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus officiis
perspiciatis quidem ratione? Distinctio eos ex expedita iusto necessitatibus velit,
veritatis. Aliquid, debitis dignissimos in iusto magnam nulla sed tempora.</p>
</div>
</body>
</html>
Jika berkas di atas dijalankan pada browser, maka hasilnya akan tampak seperti
ini:
Box Model
Pada pembahasan background-color disinggung bahwa setiap elemen
ditampilkan seperti sebuah boxes atau kotak. Box model merupakan salah
satu konsep dari CSS. Setiap elemen yang dibuat pada HTML akan
menciptakan sebuah kotak untuk menampung kontennya. Layaknya bentuk
kotak pada umumnya, pasti terdapat nilai seperti lebar, tinggi, padding (tebal
lapisan), border (batas), dan juga jarak. Pada CSS nilai - nilai tersebut dapat
kita atur.
Kita mungkin sudah sedikit paham bagaimana konsep box model ini bekerja
dengan mengikuti latihan sebelumnya. Di sini kita akan membahas lebih
lanjut mengenai properti apa saja yang dapat memanipulasi boxes tersebut.
Tapi sebelum itu, kita pahami lebih tentang konsep box pada elemen HTML
agar kita dapat gambaran lebih tentang hal tersebut.
Box Element
Website dicoding.com dengan menerapkan rule * {border: 1px solid red}
Seperti yang kita lihat pada gambar di atas, setiap elemen pada HTML baik
itu block-level atau inline elemen, akan menghasilkan sebuah kotak elemen.
Perhatikan ilustrasi berikut agar lebih jelasnya:
Box Dimensions
Secara standar sebuah box yang dihasilkan tiap elemen selalu cukup untuk
menampung konten. Tetapi kita dapat mengatur nilai dimensi dari box tersebut
dengan properti width dan height.
Cara yang paling banyak digunakan dalam menentukan dimensi kotak adalah
dengan menggunakan pixel, persentase, atau ems. Secara tradisional, pixel
merupakan cara yang paling populer karena kita dapat merancang dan
mengontrol ukuran secara akurat.
Pada saat ini banyak developer mulai merancang menggunakan persentase dan
ems untuk menetapkan ukuran box agar dapat menyesuaikan dengan berbagai
macam ukuran layar.
<!doctype html>
<html lang="en">
<head>
<style>
.box {
height: 300px;
width: 300px;
background-color: #11C5C6;
}
p {
height: 75%;
width: 75%;
background-color: #FBDD1C;
}
</style>
</head>
<body>
<div class="box">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus officiis
perspiciatis quidem ratione? Distinctio eos ex expedita iusto necessitatibus velit,
veritatis. Aliquid, debitis dignissimos in iusto magnam nulla sed tempora.</p>
</div>
</body>
</html>
Berkas di atas jika kita buka melalui browser akan tampak seperti ini:
<!doctype html>
<html lang="en">
<head>
<style>
.content {
max-width: 800px;
height: 400px;
margin: 0 auto;
background-color: deeppink;
}
p {
font-size: 1.5em;
font-weight: bold;
}
</style>
</head>
<body>
<div class="content">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate eius
explicabo fuga iusto magni minus odit praesentium, quasi quisquam quos repellat suscipit
tempora tenetur? Assumenda cum laborum officiis quos ratione.</p>
</div>
</body>
</html>
Berkas di atas jika kita buka pada browser akan tampak seperti ini:
Dengan cara yang sama, mungkin kita juga perlu membatasi ukuran panjang. Kita
bisa gunakan min-height dan max-height.
Overflowing Content
Dimensi box yang dihasilkan elemen selalu cukup untuk menampung konten
tetapi hal ini tidak berlaku jika kita tetapkan secara manual panjang dan lebarnya.
Tak jarang terjadi overflow ketika kita menerapkan ukuran pada elemen tetapi
konten di dalamnya begitu banyak. Contohnya seperti berikut:
<!doctype html>
<html lang="en">
<head>
<style>
div {
height: 200px;
width: 200px;
background-color: lightgreen;
}
</style>
</head>
<body>
<div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusantium amet
corporis cupiditate dignissimos error expedita explicabo facere facilis, ipsam itaque
libero modi officiis optio perspiciatis provident quam sequi voluptatem.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. At aut corporis facere
harum inventore iure, quisquam recusandae reprehenderit veritatis voluptatum. Ducimus
exercitationem illo nam sapiente suscipit, tenetur ullam ut voluptas!</p>
</div>
</body>
</html>
Berkas di atas jika kita buka pada browser akan tampak seperti ini:
Untuk menangani kasus seperti ini kita bisa gunakan properti overflow. Properti ini
dapat bernilai:
visible : Merupakan nilai default pada properti ini. Konten yang tidak
tertampung (overflow) akan tetap ditampilkan seperti pada standarnya.
hidden : Jika terjadi overflow, maka konten yang tidak tertampung akan
disembunyikan.
scroll : Memunculkan scroll bar pada pinggir elemen, sehingga konten yang
tidak tertampung akan ditampilkan dengan scroll bar. Jika menggunakan
nilai ini, scroll bar akan tetap muncul walaupun konten tidak terjadi
overflow.
auto : Sama seperti scroll, bedanya jika tidak terjadi overflow, maka nilai
visible yang akan diterapkan.
Box-sizing
Sebelum CSS3 ukuran lebar dan panjang elemen mengacu pada konten elemen
(content-box). Itu berarti ukuran elemen seluruhnya merupakan nilai panjang dan
lebar yang kita spesifikasikan ditambah dengan nilai padding dan border yang
diterapkan pada elemen. Hal tersebut membuat sebagian developer menjadi sulit
menetapkan ukuran dimensi.
Pada CSS3 kita dapat memilih tipe pengukuran lain dalam menentukan dimensi
elemen. Dengan menggunakan properti box-sizing kita dapat menentukannya
berdasarkan border box, di mana ukuran elemen sudah termasuk content,
padding dan border. Dengan metode ini, hasil elemen yang ditampilkan
(termasuk padding dan border) akan memiliki dimensi yang sama persis seperti
yang kita tentukan.
<!doctype html>
<html lang="en">
<head>
<style>
div {
height: 200px;
width: 200px;
background-color: lightgreen;
border: 10px solid cornflowerblue;
padding: 20px;
}
.content {
box-sizing: content-box;
}
.box {
box-sizing: border-box;
}
</style>
</head>
<body>
<div class="content">
</div>
<br>
<div class="box">
</div>
</body>
</html>
Berkas di atas jika kita buka pada browser akan tampak seperti ini:
Border
Border merupakan sebuah garis yang mengelilingi area konten
dan padding (opsional). Kita bisa mengatur tipe, ketebalan, serta warna garis
yang ditampilkan sesuai dengan yang kita inginkan. Kita juga bisa mengatur
dalam menampilkan sebagian atau keseluruhan garis pada elemen. Mari kita
eksplorasi apa saja properties yang dapat mengatur border.
Border Width
. .box {
. border-top-width: 2px;
. border-right-width: 1px;
. border-bottom-width: 1px;
. border-left-width: 2px;
. }
Tetapi kita juga dapat menetapkan nilai keempatnya sekaligus dalam satu properti
seperti ini
. .box {
. border-width: 2px 1px 1px 2px; /*top right bottom left*/
. }
Ketika satu nilai ditentukan, maka nilai berlaku untuk empat sisi.
Ketika dua nilai ditentukan, nilai pertama berlaku untuk sisi atas dan
bawah, nilai kedua untuk sisi kiri dan kanan.
Ketika tiga nilai ditentukan, nilai pertama berlaku untuk sisi atas, nilai yang
kedua untuk sisi kiri dan kanan, nilai ketiga untuk sisi bawah.
Ketika empat nilai ditentukan, nilai pertama berlaku untuk sisi atas, nilai
yang kedua untuk sisi kanan, nilai yang ketiga untuk sisi bawah, dan nilai
yang keempat untuk sisi kiri. Urutan tersebut berdasarkan arah jarum jam
(clockwise).
Border Style
. .box {
. border-top-style: solid;
. border-right-style: dotted;
. border-bottom-style: groove;
. border-left-style: double;
.
. border-width: 4px;
. border-color: red;
. width: 200px;
. height: 50px;
. }
Jika kita menerapkan rule seperti di atas, maka hasilnya akan tampak seperti ini:
Border Color
. border-top-color: #919191;
. border-right-color: #111111;
. border-bottom-color: #4ee717;
. border-left-color: #00c8eb;
Tetapi kita juga dapat menetapkan nilai keempatnya sekaligus dalam satu properti
seperti ini:
Shorthand
Dengan begitu tentu untuk menetapkan border pada elemen, kita perlu
menuliskan properti yang banyak bukan? Ya memang, tetapi CSS menyediakan
jalan pintas (shorthand) untuk membuat border dengan satu properti saja.
Properti border memiliki tiga buah nilai yang digunakan untuk menentukan
ketebalan, tipe dan warna pada border. Berikut contoh penerapannya:
. .box {
. border: 4px dashed #00a2c6;
. width: 200px;
. }
Padding
Padding merupakan jarak antara area konten dan border. Padding banyak
diterapkan pada elemen jika elemen tersebut menerapkan warna latar atau pun
border. Padding memberikan sedikit ruang sehingga konten di dalam elemen
dapat lebih nyaman untuk ditampilkan. Contohnya:
<!doctype html>
<html lang="en">
<head>
<style>
p {
border: 4px solid #00a2c6;
width: 275px;
}
p.example {
padding: 10px;
}
</style>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur beatae commodi
dignissimos eaque fugiat inventore maiores neque nisi sint. A dolore eaque fuga, iste
minus porro provident sit tempore ullam.</p>
<p class="example">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet
assumenda blanditiis cum dignissimos enim esse excepturi illum inventore maiores minima,
nemo nisi obcaecati officia pariatur qui quibusdam sed. Ab, dolorum?</p>
</body>
</html>
Jika berkas di atas dijalankan pada browser, maka akan tampak seperti ini:
Seperti yang kita lihat, paragraf kedua jauh lebih nyaman dibaca karena terdapat
jarak antara teks dan border dari kotak. Kotak pun menjadi sedikit lebar karena
adanya padding.
Pixel merupakan satuan yang sering digunakan dalam menetapkan nilai properti
ini (meskipun kita bisa juga menggunakan persentase atau ems). Jika
menetapkan menggunakan persentase, maka nilai akan menjadi relatif pada
elemen induk atau jendela browser (jika tidak memiliki induk elemen).
padding-top: 10px;
padding-right: 15px;
padding-bottom: 10px;
padding-left: 15px;
Margin
Seperti halnya padding, margin merupakan ruang atau jarak pada sebuah
elemen. Namun jarak tersebut terletak di luar dari konten dan border elemen.
Margin digunakan untuk menjaga elemen agar tidak bertabrakan satu sama lain
atau dari tepi jendela browser.
Setelah menerapkan margin 20px.
Margin ini bersifat collapsed, yang artinya dapat menumpuk jika terdapat dua
margin yang saling bertumpukan. Anda bisa melihat pada margin bawah dan
margin atas pada kedua elemen tersebut. Hal itu menjelaskan mengapa jarak
vertikal antar elemen tersebut tidak 40px melainkan 20px. Jika terjadi
pertumpukan margin, maka nilai yang paling besar yang akan diterapkan.
Tapi kita juga dapat menggunakan shorthand untuk menetapkan keempat nilai
tersebut dalam satu properti
Kita juga bisa menggunakan dua nilai saja untuk menentukan nilai margin vertikal
dan horizontal.
. margin: 10px 15px; /* top dan bottom bernilai 10px, left dan right bernilai 15px
*/
Centering Content
Bagaimana meletakkan sebuah kotak tepat pada tengah sebuah halaman atau di
dalam elemen induknya? Aturlah margin kanan dan kiri dengan nilai auto. Lebih
lanjut, kita juga harus menentukan lebar dari kotak tersebut (menggunakan
properti width). Jika tidak, kotak akan mengambil lebar penuh pada halaman atau
induk elemen.
Setelah kita menentukan lebar kotak dan mengatur margin kiri dan kanan
menjadi auto, maka secara otomatis browser akan memberi jarak yang sama di
setiap sisi horizontal kotak, sehingga membuat kotak berada di tengah halaman.
Berikut contohnya:
. <!DOCTYPE html>
. <html lang="en">
. <head>
. <meta charset="UTF-8">
. <title>Margin</title>
. <style>
. .center {
. margin: 0 auto;
. }
. .box {
. width: 50%;
. border: 4px solid darkblue;
. padding: 20px;
. margin-bottom: 20px;
. }
. </style>
. </head>
. <body>
. <div class="box">
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur autem
commodi dignissimos dolores ea, eaque,
. earum esse harum illo in incidunt molestias nam non qui recusandae sunt
ullam veniam vero!</p>
. </div>
. <div class="box center">
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi ea, id.
Aliquid consectetur dolorum
. exercitationem ipsam, necessitatibus nostrum pariatur sunt! Accusantium
architecto at dolorem itaque quisquam
. quod soluta sunt voluptatum.</p>
. </div>
. </body>
. </html>
Jika berkas tersebut kita buka pada browser, maka akan tampak seperti berikut:
Display Roles
Kita pernah membahas mengenai inline dan block pada modul HTML
sebelumnya. Kita telah paham bahwa standarnya, tiap elemen HTML memiliki
dua tipe yaitu block dan inline. Untuk lebih jelasnya berikut sifat - sifat yang
ada pada elemen block dan juga inline:
inline element:
block element:
Dengan menggunakan properti display, kita dapat mengubah sebuah elemen
inline menjadi block, begitupun sebaliknya. Dalam hal ini, properti ini juga
dapat digunakan untuk menyembunyikan elemen yang ditampilkan.
Properti ini banyak sekali digunakan dalam kasus dalam pembuatan navigasi.
Biasanya navigasi dibuat menggunakan elemen list yang memiliki sifat block,
sehingga item list selalu ditampilkan dalam baris baru. Dengan menggunakan
properti display, kita dapat mengubah perilaku elemen list tersebut dengan
menerapkan inline, sehingga item list dapat ditampilkan secara horizontal.
. <!DOCTYPE html>
. <html lang="en">
. <head>
. <meta charset="UTF-8">
. <title>Display</title>
. <style>
. li {
. display: inline;
.
. margin-left: 5px;
. }
. </style>
. </head>
. <body>
. <ul>
. <li>Home</li>
. <li>Product</li>
. <li>About</li>
. <li>Contact</li>
. </ul>
. </body>
. </html>
Jika berkas tersebut dibuka pada browser, maka akan tampak seperti berikut:
Box Shadow
Pada materi formatting text kita sudah belajar cara menambahkan drop
shadow pada teks. Pada CSS3 kita juga dapat menambahkan drop shadow di
sekitar kotak elemen (tidak termasuk margin) dengan menggunakan
properti box-shadow.
Jika rules tersebut diterapkan pada box, maka akan tampak seperti ini:
Rounded Corner
CSS3 memperkenalkan kemampuan untuk membuat rounded corner atau sudut
bundar pada box dengan menggunakan properti border-radius. Nilai dari properti
ini merupakan tingkat lengkungan border dalam pixel.
. .rounded {
. border-radius: 10px;
. }
Kita bisa menetapkan nilai pada individu siku kotak dengan menggunakan
properti yang terpisah, seperti ini:
. .rounded {
. border-top-right-radius: 5px;
. border-bottom-right-radius: 10px;
. border-bottom-left-radius: 5px;
. border-top-left-radius: 10px;
. }
. .rounded {
. border-radius: 10px 5px 10px 5px;
. }
Maka tiap sisi dari border memiliki ketajaman yang berbeda seperti ini.
Menerapkan Box Model pada Halaman Profil
Pada latihan sebelumnya, kita sudah menerapkan font yang didapatkan dari
Google Font dengan properti font-family dan mengubah warna font dengan
menggunakan properti color. Nah setelah mempelajari komponen box
seperti padding, border, dan margin saatnya kita terapkan pada proyek yang
sudah kita buat sebelumnya. Mulai dari menetapkan ukuran gambar,
membuat efek gaya kartu, dan membuat jumbotron.
Hingga pada akhir latihan ini kita dapat mempercantik tampilan website profil
tampak seperti ini:
. .featured-image {
. width: 100%;
. max-height: 300px;
. }
. .featured-image {
. width: 100%;
. max-height: 300px;
. object-fit: cover;
. object-position: center;
. }
Selanjutnya kita atur juga ukuran gambar logo kota Bandung pada
elemen <aside>. Agar logo tampak tidak terlalu besar kita atur properti width
dengan nilai 200px. Silakan buat rules baru dengan selector .profile img,
kemudian tuliskan properti width dengan nilainya.
. .profile img {
. width: 200px;
. }
Selanjutnya kita atur tampilan pada tiap elemen <article>, buat elemen tersebut
bergaya card effect dengan menerapkan properti box-shadow dan border-
radius sehingga hasilnya akan tampak seperti ini:
Pertama kita buat rule baru dengan selector .card, kemudian terapkan properti
dan nilainya sebagai berikut:
. .card {
. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
. border-radius: 5px;
. }
Jika dirasa drop shadow tak terlalu jelas, kita bisa mengubah nilainya. Agar
mudah dalam menentukan nilai drop shadow yang kita inginkan, kita bisa
gunakan tools yang tersedia secara online pada tautan
berikut: https://www.cssmatic.com/box-shadow.
Selanjutnya kita perbaiki tepian konten pada card karena tampak terlalu sempit
dari sisi cardnya. Alhasil, konten agak sulit dibaca. Kita bisa mengaturnya dengan
properti margin dan padding. Silakan tambahkan properti dan nilai berikut pada
rule .card:
. .card {
. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
. border-radius: 5px;
. padding: 20px;
. margin-top: 20px;
. }
Sekarang konten di dalam card lebih proporsional dan mudah dibaca, bukan?
Sebagai angkah awal, yuk kita buat rule baru dengan selector .jumbotron lalu
terapkan properti dan nilainya seperti ini:
. .jumbotron {
. font-size: 20px;
. padding: 60px;
. background-color: #00c8eb;
. text-align: center;
. color: white;
. }
. <header>
. <div class="jumbotron">
. <h1>Bandung</h1>
. <p>Kota metropolitan terbesar di Provinsi Jawa Barat, sekaligus
menjadi ibu kota provinsi tersebut.</p>
. </div>
. <nav>
. <ul>
. <li><a href="#sejarah">Sejarah</a></li>
. <li><a href="#geografis">Geografis</a></li>
. <li><a href="#wisata">Wisata</a></li>
. </ul>
. </nav>
. </header>
Lanjut, kita akan memperbaiki tampilan navigasi agar terlihat cocok dengan
header yang ditampilkan. Seperti biasa, buatlah rule baru dengan
selector nav li. Selector tersebut akan mengatur elemen <li> yang menjadi
turunan dari elemen <nav>, berikan properti dan nilai berikut pada selector
tersebut:
. nav li {
. display: inline;
. list-style-type: none;
. margin-right: 20px;
. }
. nav {
. background-color: #00a2c6;
. padding: 5px;
. }
Kemudian untuk mengatur warna teks pada navigasi, kita tambahkan properti
color pada selector nav a yang sudah kita buat pada latihan sebelumnya.
. nav a {
. font-size: 18px;
. font-weight: 400;
. text-decoration: none;
. color: white;
. }
Pada langkah ini, website yang kita bangun sudah mulai tampak menarik
bukan?
Terakhir kita akan menyesuaikan margin dan padding yang ditampilkan pada
body dan elemen <main>. Sehingga akan tampak seperti ini:
. body {
. font-family: 'Quicksand', sans-serif;
. margin: 0;
. padding: 0;
. }
Dengan begitu layout yang ditampilkan akan memenuhi seluruh lebar dan
tinggi dari jendela browser.
. main {
. padding: 20px;
. }
Positioning
Kita sudah mengetahui cara mengubah posisi dari sebuah elemen dengan
menggunakan margin. Namun ketika melakukannya, posisi elemen lain di
sekitarnya akan terpengaruh. Lantas bagaimana jika kita ingin memindahkan
tanpa mengganggu posisi elemen lainnya? Solusinya kita perlu mengubah
positioning schema dengan menggunakan properti position dalam mengontrol
letak elemen tersebut. Berikut nilai dari properti position yang ada pada CSS:
Fixed Positioning : Merupakan absolute position namun posisinya
selalu relatif pada jendela browser. Bahkan ketika
pengguna scrolling pun, posisinya di layar akan tetap tak berubah.
Sebelum kita membahas satu persatu skema tersebut, mungkin kita perlu
memahami lebih detail lagi apa sebenarnya normal flow atau biasa disebut
“static flow” itu, dan mengapa untuk memindahkan posisi elemen kita perlu
mengeluarkannya dari static flow.
Bayangkan kita memiliki tiga buat elemen div berukuran 200px x 200px yang
masing-masing memiliki warna yang berbeda.
. .box {
. width: 200px;
. height: 200px;
. }
.
. .first {
. background-color: #60d0a8;
. }
.
. .second {
. background-color: #6495ed;
. }
.
. .third {
. background-color: #ffa500;
. }
Karena kita tidak mengatur properti position dari ketiga elemen tersebut,
maka tiap elemen akan ditampilkan dengan static flow seperti ini:
Ketika kita ingin mengubah letak kotak biru (kotak kedua) dengan
menggunakan margin-top: 20px; tentu akan berpengaruh pada posisi elemen
di bawahnya.
. .second {
. background-color: #6495ed;
. margin-top: 20px;
. }
Pada ilustrasi di atas kita bisa lihat bahwa kotak yang berwarna oranye ikut
bergeser ke bawah. Berbeda ketika kita menerapkan properti position yang
dapat membuat elemen keluar dari static flow. Contohnya kita menerapkan
properti position dengan nilai relatif.
. .second {
. background-color: #6495ed;
. position: relative;
. }
. .second {
. background-color: #6495ed;
. position: relative;
. top: 30px;
. left: 10px;
. }
Perlu kita ingat ya, bahwa properti top, left, right dan bottom pada CSS hanya
akan berpengaruh pada elemen yang menerapkan non-static flow (elemen
yang menerapkan nilai relative, absolute, dan fixed pada properti position).
Normal Flow
Dalam flow normal, setiap elemen block ditempatkan di bawah elemen
sebelumnya. Karena ini merupakan cara standar browser memperlakukan
elemen HTML, kita tidak perlu menetapkan nilai properti position ketika ingin
membuat perilaku seperti ini tetapi secara sintaks perilaku ini ditetapkan
dengan nilai static.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. h1 {
. background-color: #aaaaaa;
. padding: 30px;
. }
.
. p {
. width: 450px;
. }
. </style>
. </head>
. <body>
. <h1>Lorem ipsum dolor sit amet.</h1>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
iusto non optio vel voluptas? Assumenda
. blanditiis consequatur doloribus porro quasi similique vero voluptatibus.
Adipisci, tenetur.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
commodi consectetur dolore eligendi, esse fuga
. hic laboriosam nobis nostrum, nulla omnis optio pariatur repellendus
reprehenderit saepe, sit soluta vel vero!</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aut
corporis deleniti doloremque et excepturi
. expedita labore libero, placeat, quaerat rerum ullam vitae voluptate.
Accusantium et explicabo qui tenetur unde.
. Amet aperiam doloremque enim, expedita id illo minima porro quod.</p>
. </body>
. </html>
Berkas di atas jika kita buka pada browser akan tampak seperti ini:
Pada contoh di atas kita tidak menetapkan nilai lebar pada elemen heading,
tapi bisa kita lihat bahwa elemen heading tersebut mencakup seluruh lebar
ruang yang ada pada jendela browser.
Sedangkan elemen paragraf kita atur lebarnya dengan nilai 450px sehingga
elemen tersebut tidak mencakup seluruh lebar ruang yang ada. Elemen
paragraf selanjutnya tetap ditampilkan di bawahnya meskipun masih terdapat
ruang yang cukup disampingnya.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. h1 {
. background-color: #aaaaaa;
. padding: 30px;
. }
.
. p {
. width: 450px;
. }
.
. .relative {
. position: relative;
. top: 10px;
. left: 100px;
. }
. </style>
. </head>
. <body>
. <h1>Lorem ipsum dolor sit amet.</h1>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
iusto non optio vel voluptas? Assumenda
. blanditiis consequatur doloribus porro quasi similique vero voluptatibus.
Adipisci, tenetur.</p>
. <p class="relative">Lorem ipsum dolor sit amet, consectetur adipisicing
elit. Accusamus commodi consectetur dolore eligendi, esse fuga hic
laboriosam nobis nostrum, nulla omnis optio pariatur repellendus
reprehenderit saepe, sit soluta vel vero!</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aut
corporis deleniti doloremque et excepturi expedita labore libero, placeat,
quaerat rerum ullam vitae voluptate. Accusantium et explicabo qui tenetur
unde. Amet aperiam doloremque enim, expedita id illo minima porro quod.</p>
. </body>
. </html>
Berkas di atas jika kita buka melalui browser akan tampak seperti:
Pada contoh di atas, setelah menetapkan nilai position pada paragraf kedua,
kita mengubah posisinya menjadi 10 pixel lebih bawah dan 100px lebih ke
kanan dari posisi yang seharusnya. Perlu kita ingat bahwa perpindahan posisi
mengacu pada posisi elemen seharusnya berada.
Absolute Positioning
Ketika properti position diberikan nilai absolute, akan berperilaku sama
dengan relative. Elemen akan dikeluarkan dari normal flow sehingga jika
elemen dipindahkan posisinya tidak akan berpengaruh pada elemen lain di
sekitarnya.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. h1 {
. width: 250px;
. }
.
. p {
. width: 450px;
. }
.
. .absolute {
. position: absolute;
. top: 0;
. left: 500px;
. }
. </style>
. </head>
. <body>
. <h1 class="absolute">Lorem ipsum dolor sit amet.</h1>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
iusto non optio vel voluptas? Assumenda
. blanditiis consequatur doloribus porro quasi similique vero voluptatibus.
Adipisci, tenetur.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
commodi consectetur dolore eligendi, esse fuga
. hic laboriosam nobis nostrum, nulla omnis optio pariatur repellendus
reprehenderit saepe, sit soluta vel vero!</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aut
corporis deleniti doloremque et excepturi
. expedita labore libero, placeat, quaerat rerum ullam vitae voluptate.
Accusantium et explicabo qui tenetur unde.
. Amet aperiam doloremque enim, expedita id illo minima porro quod.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
aliquid asperiores blanditiis cumque eos ex
. expedita facilis laborum maiores necessitatibus neque, officiis pariatur
porro temporibus unde veritatis vitae?
. Beatae dolores error ex fugiat molestias neque placeat quod ratione
repellat veritatis! A culpa cumque, delectus
. distinctio ducimus earum et ex quas quia quis tempore temporibus
veritatis voluptates. Delectus doloremque mollitia
. nobis?</p>
. </body>
. </html>
Jika berkas di atas dibuka pada browser, maka akan tampak seperti ini:
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .parent {
. width: 500px;
. margin: 0 auto;
. border: 4px solid black;
. padding: 20px;
. }
. h1 {
. width: 250px;
. }
. .absolute {
. position: absolute;
. top: 0;
. left: 50px;
. }
. </style>
. </head>
. <body>
. <div class="parent">
. <h1 class="absolute">Lorem ipsum dolor sit amet.</h1>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
iusto non optio vel voluptas? Assumenda blanditiis consequatur doloribus
porro quasi similique vero voluptatibus. Adipisci, tenetur.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
commodi consectetur dolore eligendi, esse fuga hic laboriosam nobis nostrum,
nulla omnis optio pariatur repellendus reprehenderit saepe, sit soluta vel
vero!</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aut
corporis deleniti doloremque et excepturi expedita labore libero, placeat,
quaerat rerum ullam vitae voluptate. Accusantium et explicabo qui tenetur
unde. Amet aperiam doloremque enim, expedita id illo minima porro quod.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus
aliquid asperiores blanditiis cumque eos ex expedita facilis laborum maiores
necessitatibus neque, officiis pariatur porro temporibus unde veritatis
vitae? Beatae dolores error ex fugiat molestias neque placeat quod ratione
repellat veritatis! A culpa cumque, delectus distinctio ducimus earum et ex
quas quia quis tempore temporibus veritatis voluptates. Delectus doloremque
mollitianobis?</p>
. </div>
. </body>
. </html>
Jika kita buka berkas di atas pada browser maka akan tampak seperti ini:
Pada contoh kode di atas kita bisa lihat pada .parent kita tidak menetapkan
properti position, sehingga elemen yang menerapkannya berada pada flow
normal. Sehingga elemen heading akan menghiraukan elemen induknya.
. position: relative;
Fixed Positioning
Fixed positioning merupakan absolute position namun posisinya selalu relatif
pada jendela browser (meskipun diletakan di dalam induk elemen diluar dari flow
normal), bahkan ketika pengguna melakukan scrolling posisinya akan tetap
nampak pada posisinya di layar.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. h3 {
. padding: 10px;
. background-color: #aaaaaa;
. margin: 0;
. width: 100%;
. }
.
. .fixed {
. position: fixed;
. top: 0;
. left: 0;
. }
. </style>
. </head>
. <body>
. <h3 class="fixed">Lorem ipsum dolor sit amet.</h3>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium iusto no
n optio vel voluptas? Assumenda
blanditiis consequatur doloribus porro quasi similique vero voluptatibus. Adipisc
i, tenetur.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus commodi co
nsectetur dolore eligendi, esse fuga
hic laboriosam nobis nostrum, nulla omnis optio pariatur repellendus reprehenderi
t saepe, sit soluta vel vero!</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aut corpori
s deleniti doloremque et excepturi
expedita labore libero, placeat, quaerat rerum ullam vitae voluptate. Accusantium
et explicabo qui tenetur unde.
Amet aperiam doloremque enim, expedita id illo minima porro quod.</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus aliquid as
periores blanditiis cumque eos ex
expedita facilis laborum maiores necessitatibus neque, officiis pariatur porro te
mporibus unde veritatis vitae?
Beatae dolores error ex fugiat molestias neque placeat quod ratione repellat veri
tatis! A culpa cumque, delectus
distinctio ducimus earum et ex quas quia quis tempore temporibus veritatis volupt
ates. Delectus doloremque mollitia nobis?</p>
. </body>
. </html>
Berkas di atas jika kita buka pada browser maka akan tampak seperti ini:
Pada contoh di atas elemen heading diposisikan di sudut kiri atas jendela browser
dengan properti:
. top: 0;
. left: 0;
Floating
Sederhananya properti float dapat membuat elemen berada pada sebelah
kanan atau kiri. Saat diterapkan pada elemen inline, properti float juga
memungkinkan elemen di sekitarnya mengelilingi elemen tersebut (wrap).
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. width: 800px;
. border: 4px solid black;
. padding: 10px;
. }
.
. img {
. float: left;
. margin: 10px;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <img src="https://i.imgur.com/cs2BJzw.jpg" width="200px" alt="dicoding">
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet
asperiores commodi corporis doloribus eum ipsum obcaecati pariatur quam quo,
voluptatum? A, assumenda atque delectus dolore nam natus neque quisquam
repudiandae?</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. At deserunt
illum inventore numquam officia recusandae, sit! Ab asperiores delectus
dolor, eius est explicabo impedit ipsa ipsum itaque mollitia neque nihil
nisi officia praesentium sint! Accusantium libero obcaecati provident qui?
Error!</p>
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam
debitis dolorem eaque eius eos error eum ex facilis fuga ipsa iste iusto
mollitia nam natus necessitatibus praesentium quam qui quod, rerum sed sequi
sint voluptates? Atque enim, ex facere fugiat ipsum mollitia quos sunt. At,
autem commodi dolorum eos, est expedita, incidunt molestias nobis nostrum
officia porro reiciendis saepe voluptatum.</p>
. </div>
. </body>
. </html>
Berkas di atas, jika kita buka melalui browser akan tampak seperti gambar ini:
Selain dalam membuat text wrapping. Float juga merupakan salah satu teknik
dalam membuat layout website. Teknik ini masih banyak digunakan oleh
developer karena sangat mudah dipahami dan tergolong mudah
untuk multiple column seperti gambar berikut
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. * {
. /* digunakan untuk menghapus seluruh padding dan margin standar
yang diberikan browser pada elemen */
. margin: 0;
. padding: 0;
.
. /* Menggunakan border-box dalam perhitungan dimensi box-nya */
. box-sizing: border-box;
. }
.
. .container {
. width: 800px;
. height: 400px;
. border: 1px solid black;
. margin: 0 auto;
. }
.
. .left-content {
. text-align: center;
. line-height: 400px;
. width: 30%;
. height: 100%;
. background-color: #00c7ed;
.
. /* digunakan untuk memindahkan posisi elemen ke sisi kiri
container */
. float: left;
. }
.
. .right-content {
. text-align: center;
. line-height: 400px;
. width: 70%;
. height: 100%;
. background-color: #60d0a8;
.
. /* digunakan untuk memindahkan posisi elemen ke sisi kanan
container */
. float: right;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="left-content">
. <h3>Left Content</h3>
. </div>
. <div class="right-content">
. <h3>Right Content</h3>
. </div>
. </div>
. </body>
. </html>
Berkas di atas jika kita buka pada browser akan tampak seperti berikut:
Dari contoh di atas, kita bisa melihat pada selector .left-content dan .right-
content ditetapkan properti float dengan nilai left dan right, sehingga elemen
tersebut dapat diposisikan secara bersebelahan.
Lantas jika nilainya hanya left dan right, bagaimana jika ada lebih dari dua
kolom dalam menyusun layout? Hal tersebut sangat mudah dilakukan. Kita
hanya perlu menetapkan nilai left pada ketiga kolomnya, lantas kolom akan
tampil bersebelahan sesuai urutan penulisan elemen.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. * {
. /* digunakan untuk menghapus seluruh padding dan margin standar
yang diberikan browser pada elemen */
. margin: 0;
. padding: 0;
.
. /* Menggunakan border-box dalam perhitungan dimensi box-nya */
. box-sizing: border-box;
. }
.
. .container {
. width: 800px;
. height: 400px;
. border: 1px solid black;
. margin: 0 auto;
. }
.
. .left-content {
. text-align: center;
. line-height: 400px;
. width: 33.3%;
. height: 100%;
. background-color: #00c7ed;
. float: left;
. }
.
. .center-content {
. text-align: center;
. line-height: 400px;
. width: 33.3%;
. height: 100%;
. background-color: #d0b541;
. float: left;
. }
.
. .right-content {
. text-align: center;
. line-height: 400px;
. width: 33.3%;
. height: 100%;
. background-color: #60d0a8;
. float: left;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="left-content">
. <h3>Left Content</h3>
. </div>
. <div class="center-content">
. <h3>Center Content</h3>
. </div>
. <div class="right-content">
. <h3>Right Content</h3>
. </div>
. </div>
. </body>
. </html>
Jika sebuah elemen induk hanya memiliki satu elemen dengan menerapkan
properti float, ia akan memiliki nilai tinggi 0px. Contohnya seperti berikut:
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. width: 800px;
. border: 4px solid black;
. }
.
. img {
. float: left;
. margin: 10px;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <img src="https://i.imgur.com/cs2BJzw.jpg" width="200px" alt="dicoding">
. </div>
. </body>
. </html>
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. width: 800px;
. border: 4px solid black;
. }
.
. img {
. float: left;
. margin: 10px;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <img src="https://i.imgur.com/cs2BJzw.jpg" width="200px" alt="dicoding">
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
adipisci architecto aspernatur dolorem
. doloremque eum excepturi fuga hic, molestias obcaecati officia
perferendis perspiciatis qui saepe ut velit
. veniam vitae voluptatum.</p>
. </div>
. </body>
. </html>
Hasilnya:
Hal ini menunjukkan bahwa elemen yang menerapkan float “tidak dianggap
ada” oleh induk elemen yang menaunginya karena jika menggunakan float,
elemen akan dikeluarkan dari normal flow.
Terdapat dua cara yang akan kita bahas, yakni dengan pertama,
menggunakan properti clear dan kedua, menetapkan nilai overflow: auto pada
container.
Clear Property
Nilai dari properti clear merupakan nilai yang digunakan pada properti float
karena properti clear akan menghapus sifat float sesuai dengan nilai yang
ditetapkan. Contohnya seperti ini:
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. width: 800px;
. border: 4px solid black;
. }
.
. img {
. float: left;
. margin: 10px;
. }
. .clear {
. clear: left;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <img src="https://i.imgur.com/cs2BJzw.jpg" width="200px" alt="dicoding">
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
adipisci architecto aspernatur dolorem
. doloremque eum excepturi fuga hic, molestias obcaecati officia
perferendis perspiciatis qui saepe ut velit
. veniam vitae voluptatum.</p>
. <div class="clear"></div>
. </div>
. </body>
. </html>
Lalu bagaimana jika terdapat dua elemen yang menerapkan nilai float
berbeda (left dan right)? Terdapat satu nilai lagi yang dapat menghilangkan
keuda sifat float tersebut, yakni nilai both. Gunakanlah nilai tersebut jika kita
ingin sepenuhnya menghilangkan sifat float pada elemen.
overflow: auto;
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. width: 800px;
. border: 4px solid black;
. overflow: auto;
. }
.
. img {
. float: left;
. margin: 10px;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <img src="https://i.imgur.com/cs2BJzw.jpg" width="200px" alt="dicoding">
. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium
adipisci architecto aspernatur dolorem
. doloremque eum excepturi fuga hic, molestias obcaecati officia
perferendis perspiciatis qui saepe ut velit
. veniam vitae voluptatum.</p>
. </div>
. </body>
. </html>
Maka hasilnya akan sama seperti yang dilakukan pada cara pertama..
Namun tidak hanya sampai disitu, latihan kali ini akan sedikit lebih panjang,
karena kita akan menerapkan responsibilitas tampilan pada halaman profil
dengan menggunakan teknik media query. Seperti apa tekniknya? Mari kita
ketahui bersama.
Yang pasti pada akhirnya kita dapat membuat halaman aplikasi tampak
seperti berikut:
Untuk langkah awal, mari kita buat rule baru dengan selector #content dan
tuliskan nilai left pada properti float.
. #content {
. float: left;
. }
Jangan lupa untuk menetapkan nilai lebar juga. Pada kasus kali ini kita
gunakan nilai 75% untuk menetapkan lebar #content.
. #content {
. float: left;
. width: 75%;
. }
Ketika kita buka hasilnya pada browser, tampilan akan jadi berantakan seperti
ini:
Tenang, ini normal. Karena kita belum menetapkan nilai float pada
elemen <aside>, elemen <aside> dan <footer> akan berpindah menempati
ruang yang sebelumnya digunakan oleh #content. Karena kita sudah
mengetahui bahwa elemen yang diberikan nilai float akan dikeluarkan
dari normal flow.
. aside {
. float: right;
. }
. aside {
. float: right;
. width: 25%;
. }
Jika kita coba membuka berkas HTML dengan apa yang sudah kita terapkan,
maka tampilan akan jadi lebih mengerikan seperti ini:
. main {
. padding: 20px;
. overflow: auto;
. }
. aside {
. float: right;
. width: 25%;
. padding-left: 20px;
. }
Untuk mengatasinya kita bisa ubah tipe pengukuran untuk dimensi kotaknya.
Masih ingat kan materi tentang box-sizing? Dengan menerapkan nilai border-
box pada properti box-sizing, kita dapat menentukan dimensi kotak dengan
tepat, tanpa dipengaruhi oleh padding dan border.
. * {
. box-sizing: border-box;
. }
Setelah menetapkan rule tersebut, maka tampilan website akan kembali
normal.
Pada browser Google Chrome dan Mozilla Firefox terdapat fitur inspection.
Fitur ini sangat bermanfaat bagi developer web dalam membantu
pengembangan website. Jika ingin mempelajari lebih lanjut mengenai fitur ini,
Anda bisa melihat detailnya pada dokumentasi yang tersedia pada tautan
berikut:
Yang jelas pada inspector tersebut terdapat fitur di mana kita dapat
mensimulasikan halaman website dalam tampilan mobile device atau tablet.
Untuk membuka fitur inspector kita bisa gunakan shortcut ctrl + shift + i pada
browser, atau dengan melakukan klik kanan -> inspect / inspect page.
Fitur Inspection pada Google Chrome
Kedua gambar di atas menunjukan fitur dari inspection pada Google Chrome
dan Mozilla Firefox. Untuk mensimulasikan tampilan pada mobile device, kita
dapat menekan icon yang dilingkari pada gambar di atas.
Dengan begitu inilah tampilan seperti ini akan muncul:
Di sini kita bisa memilih peranti apa yang akan digunakan untuk
mensimulasikan halaman, untuk melihat tampilan dalam mobile devices, kita
bisa memilih salah satu opsi handphone yang tersedia. Contohnya Pixel 2 XL.
Lalu setelah memilih tampilan pada mobile devices, apakah tampilan website
sekarang sudah nampak baik? Tentu tidak, karena tampilan pada simulasi
device di browser Google Chrome masih berantakan tampak seperti ini.
Untuk mengatasinya, kita perlu menetapkan tag viewport agar dapat responsif
pada peranti mobile.
Viewport merupakan area yang dapat dilihat oleh pengguna kita pada
halaman website. Ukuran viewport bervariasi berdasarkan device-nya.
Ukuran viewport pada sebuah peranti mobile, lebih kecil dibandingkan
dengan layar komputer.
. /* Rule yang dituliskan dalam block @media di bawah akan diterapkan pada
device yang memiliki ukuran viewport di bawah 992px */
. @media screen and (max-width: 992px) {
. ........
. }
. /* Rule yang dituliskan dalam block @media di bawah akan diterapkan pada
device yang memiliki ukuran viewport di bawah 600px */
. @media screen and (max-width: 600px) {
. ........
. }
Selamat! Sampai dengan materi ini kita sudah dapat membuat sebuah
website dengan tampilan yang menarik, Ingin paham lebih jauh tentang
konsep responsive pada website? Anda bisa membaca artikel yang ada pada
blog kami atau bisa membaca dokumentasi yang diberikan oleh Google
mengenai ini.
Ada satu fitur yang mungkin perlu diterapkan lagi pada halaman profil yang
kita buat. Pada halaman profil sudah terdapat sebuah navigasi yang berfungsi
untuk mengarahkan pengguna langsung pada informasi yang dipilih. Tetapi
navigasi tersebut agak sulit diakses ketika pengguna melakukan scrolling
pada halaman website. Pasalnya, navigasi tersebut selalu berada di bawah
jumbotron website. Akibatnya, untuk mengakses navigasi yang dimaksud,
pengguna perlu kembali melakukan scrolling ke atas hingga navigasi kembali
terlihat.
nav {
background-color: #00a2c6;
padding: 5px;
position: sticky;
top: 0;
header {
display: inline;
Lalu kita juga sudah memahami bagaimana cara kerja CSS dalam mendekorasi
elemen HTML, menetapkan sebuah selector, membangun layout dengan
menggunakan float, dan mengetahui prinsip pendekatan layout yang responsif
dengan teknik media query.
Menarik bukan? Tentunya sebelum kita membahas JavaScript lebih jauh, kita
akan belajar bagaimana cara membuat layout kalkulator.
Dalam proses pembuatanya, kita akan mencoba teknik baru dalam penyusunan
layout, yakni menggunakan Flexbox. Teknik ini hadir pada CSS3 dan menjadi
salah satu pendekatan populer dalam penyusunan layout yang responsif.
Nantinya kalkulator yang kita kembangkan ini dapat digunakan dengan baik pada
mobile device.
Dengan Flexbox kita dapat mengatur ukuran secara otomatis dan mampu
beradaptasi dengan ukuran container-nya. Dengan kemampuan flexibelnya,
tampilan layout yang disusun menggunakan flexbox menjadi mobile-friendly.
Selain itu, flexbox dapat dikombinasikan dengan media query, sehingga ia dapat
lebih optimal lagi digunakan pada peranti mobile.
Flex Container
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. display: flex;
.
. /* Properti lainnya */
. width: 800px;
. height: 250px;
. background-color: #11C5C6;
. border: 2px solid black;
. padding: 20px;
. border-radius: 10px;
. margin: 0 auto;
. }
. .box {
. flex-grow: 1;
.
. /* properti lainnya */
. background-color: #FBDD1C;
. margin: 5px;
. border: 2px solid black;
. border-radius: 10px;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="box"></div>
. <div class="box"></div>
. <div class="box"></div>
. </div>
. </body>
. </html>
Flex Grow
Bisa kita lihat seluruh box di dalam container dapat menyesuaikan ukurannya
sesuai ruang kosong yang ada pada container. Pada box, kita tidak
menetapkan nilai dimensi seperti width dan height. Kita cukup menggunakan
satu properti yakni flex-grow: 1;.
Jika kita menetapkan nilai yang sama pada seluruh flex item, maka dimensi
dari tiap flex item akan sama rata dan memenuhi ruang kosong yang ada
pada container. Namun jika kita memberikan nilai yang berbeda dari salah
satu itemnya, contohnya nilai yang lebih besar, maka flex item tersebut akan
mencakup ukuran yang lebih besar. Flex item yang lain akan menyusut
menyesuaikan agar tetap masuk pada ruang flex container. Contohnya
seperti berikut:
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. display: flex;
.
. /* Properti lainnya */
. width: 800px;
. height: 250px;
. background-color: #11C5C6;
. border: 2px solid black;
. padding: 20px;
. border-radius: 10px;
. margin: 0 auto;
. }
. .box {
. /* properti lainnya */
. background-color: #FBDD1C;
. margin: 5px;
. border: 2px solid black;
. border-radius: 10px;
. }
.
. .first {
. flex-grow: 1;
. }
. .second {
. flex-grow: 2;
. }
.
. .third {
. flex-grow: 1;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="box first"></div>
. <div class="box second"></div>
. <div class="box third"></div>
. </div>
. </body>
. </html>
Cara kerja flex-grow mirip seperti potongan kue. Ruang kosong pada elemen
akan dibagi-bagi sesuai besaran nilainya. Contoh di atas memberi kita
gambaran seperti sebuah kue dengan luas total 4, kemudian kue tersebut
dipotong menjadi 3 potong. Potongan yang tengah mendapatkan 2 bagian
dan potongan yang lainnya masing - masing mendapatkan 1 bagian. Maka
potongan yang tengah akan lebih besar dari potongan yang lain.
Betapa fleksibelnya bukan? Yang harus kita ingat, ketika kita mengubah
ukuran dari suatu flex item, maka flex item yang lain pun akan terpengaruh.
Flex Direction
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .container {
. display: flex;
. flex-direction: column;
.
. /* Properti lainnya */
. width: 800px;
. height: 250px;
. background-color: #11C5C6;
. border: 2px solid black;
. padding: 20px;
. border-radius: 10px;
. margin: 0 auto;
. }
. .box {
. /* properti lainnya */
. background-color: #FBDD1C;
. margin: 5px;
. border: 2px solid black;
. border-radius: 10px;
. }
.
. .first {
. flex-grow: 3;
. }
. .second {
. flex-grow: 2;
. }
.
. .third {
. flex-grow: 1;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="box first"></div>
. <div class="box second"></div>
. <div class="box third"></div>
. </div>
. </body>
. </html>
Ada empat nilai yang bisa digunakan untuk properti flex-direction, antara lain:
Karena properti flex-direction ini, kita dapat membuat dua dimensional layout
dengan menempatkan flex container di dalam flex container, dalam arti lain
sebuah flex container dapat memiliki child berupa flex container lain.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. .flex-column {
. display: flex;
. flex-direction: column;
.
. /* properti lainnya */
. width: 800px;
. height: 300px;
. padding: 20px;
. margin: 0 auto;
. border: 2px solid black;
. border-radius: 10px;
. background-color: #11C5C6;
. }
.
. .flex-row {
. display: flex;
. flex-direction: row;
. flex-grow: 1;
.
. /* properti lainnya */
. padding: 20px;
. margin: 5px;
. background-color: #FBDD1C;
. border: 2px solid black;
. border-radius: 10px;
. }
.
. .box {
. flex-grow: 1;
.
. /* properti lainnya */
. margin: 5px;
. border: 2px solid black;
. border-radius: 10px;
. background-color: #fe899a;
. }
. </style>
. </head>
. <body>
. <div class="flex-column">
. <div class="flex-row">
. <div class="box"></div>
. <div class="box"></div>
. <div class="box"></div>
. </div>
. <div class="flex-row">
. <div class="box"></div>
. <div class="box"></div>
. <div class="box"></div>
. </div>
. </div>
. </body>
. </html>
Flex Basis
Selain menggunakan flex-grow, untuk menentukan ukuran flex item, kita bisa
gunakan properti flex-basis. Properti ini mirip seperti width dalam menentukan
dimensi box. Kita bisa menggunakan nilai satuan tetap seperti px, pt, pc, cm dll,
atau kita juga bisa menggunakan satuan persentase %.
Flex-grow ini digunakan ketika kita ingin menetapkan ukuran awal pada sebuah
flex-item. Alhasil, kita dapat mengatur ukuran dengan lebih leluasa. Flex-grow
biasa digunakan ketika kita menerapkan nested flex-container dan terdapat
perbedaan jumlah child pada container-nya. Untuk lebih mudah
menggambarkannya, perhatikan contoh berikut:
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. * {
. box-sizing: border-box;
. }
. .container {
. width: 800px;
. border: 2px solid black;
. margin: 0 auto;
. }
.
. .flex-column {
. display: flex;
. flex-direction: column;
. }
.
. .flex-row {
. display: flex;
. flex-direction: row;
. flex-grow: 1;
. }
.
. .box {
. flex-grow: 1;
. background-color: cornflowerblue;
. border: 2px solid black;
. padding: 40px;
. text-align: center;
. color: white;
. font-size: 1.5em;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="flex-column">
. <div class="flex-row">
. <div class="box">1</div>
. <div class="box">2</div>
. <div class="box">3</div>
. <div class="box">4</div>
. </div>
. <div class="flex-row">
. <div class="box">5</div>
. <div class="box">6</div>
. <div class="box">7</div>
. </div>
. </div>
. </div>
. </body>
. </html>
. .....
. .double {
. flex-grow: 2;
. }
Sebenarnya bisa saja kita menggunakan flex-grow untuk mendapatkan hasil yang
diinginkan namun kita harus mencari nilai yang pas secara manual. Ini tentunya
akan memakan waktu lebih.
. <!doctype html>
. <html lang="en">
. <head>
. <style>
. * {
. box-sizing: border-box;
. }
.
. .container {
. width: 800px;
. border: 2px solid black;
. margin: 0 auto;
. }
.
. .flex-column {
. display: flex;
. flex-direction: column;
. }
.
. .flex-row {
. display: flex;
. flex-direction: row;
. flex-grow: 1;
. }
.
. .box {
. flex-basis: 25%;
. background-color: cornflowerblue;
. border: 2px solid black;
. padding: 40px;
. text-align: center;
. color: white;
. font-size: 1.5em;
. }
. </style>
. </head>
. <body>
. <div class="container">
. <div class="flex-column">
. <div class="flex-row">
. <div class="box">1</div>
. <div class="box">2</div>
. <div class="box">3</div>
. <div class="box">4</div>
. </div>
. <div class="flex-row">
. <div class="box">5</div>
. <div class="box">6</div>
. <div class="box">7</div>
. </div>
. </div>
. </div>
. </body>
. </html>
. ....
. <div class="box double">7</div>
. ...
. .....
. .double {
. flex-basis: 50%;
. }
Membuat Layout Kalkulator
Setelah mengenal dasar penggunaan flexbox, mari sekarang kita terapkan
apa yang sudah kita pelajari dengan membuat dasar layout kalkulator.
Mari kita membuat sebuah project baru dengan membuat folder baru dan beri
nama folder sesuai keinginan atau pada contoh kali ini kita beri nama
“WebCalculator”. Lalu buka folder tersebut menggunakan teks editor yang
Anda miliki dan buat berkas HTML baru dengan nama “index.html”.
Tampilan project yang dibuka menggunakan Visual Studio Code
Setelah itu, buka berkas index.html dan tuliskan struktur dasar HTML, mulai
dari elemen <html>, <head>, dan <body>.
. <!DOCTYPE html>
. <html>
. <head></head>
. <body></body>
. </html>
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Web Calculator</title>
. </head>
.
. <body></body>
.
. </html>
Sesuai yang sudah kita pelajari untuk menggunakan flexbox, kita
membutuhkan sebuah container, jadi pada elemen <body> buatlah sebuah
column container. Di dalamnya terdapat empat buah row container dan di
dalam masing masing row container terdapat empat buah item-flex. Maka
tuliskan kode berikut di dalam elemen <body>:
. <div class="flex-container-column">
. <div class="flex-container-row">
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. </div>
. <div class="flex-container-row">
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. </div>
. <div class="flex-container-row">
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. </div>
. <div class="flex-container-row">
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. <div class="button"></div>
. </div>
. </div>
Pada kode di atas, elemen column container kita berikan nilai class “flex-
container-column”, tiap elemen row container kita berikan nilai class “flex-
container-row” dan tiap flex item pada row container kita berikan nilai class
“button”.
. <div class="flex-container-column">
. <div class="flex-container-row">
. <div class="button">7</div>
. <div class="button">8</div>
. <div class="button">9</div>
. <div class="button">+/-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">4</div>
. <div class="button">5</div>
. <div class="button">6</div>
. <div class="button">-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">1</div>
. <div class="button">2</div>
. <div class="button">3</div>
. <div class="button">+</div>
. </div>
. <div class="flex-container-row">
. <div class="button">CE</div>
. <div class="button">0</div>
. <div class="button">=</div>
. <div class="button"></div>
. </div>
. </div>
Jika kita perhatikan dari beberapa tombol di atas, ada yang berupa tombol
angka, operator dan fungsi. Untuk tombol operator seperti tambah (+) dan
kurang (-) berikan class tambahan dengan nilai “operator”.
. .....
. <div class="button operator">-</div>
. .....
. <div class="button operator">+</div>
Kemudian untuk tombol fungsi seperti negative (+/-), clear (CE), dan equals
(=) berikan class tambahan dengan nilai sesuai dengan fungsinya tersebut.
. ....
. <div class="button negative">+/-</div>
. ....
. <div class="button clear">CE</div>
. ....
. <div class="button equals">=</div>
Penamaan class yang spesifik seperti ini dibutuhkan untuk memudahkan kita
mengambil nilai elemen nanti ketika menggunakan JavaScript, hal ini juga
membantu kita untuk memudahkan penentuan selector untuk styling
menggunakan CSS.
Sebuah kalkulator tentu tidak hanya terdiri dari tombol saja bukan? Tiap
kalkulator pasti memiliki layar untuk menampilkan apa yang pengguna input
dan menampilkan hasil kalkulasinya. Dengan begitu kita membutuhkan
elemen lain yang berfungsi sebagai layar. Tambahkan elemen div baru tepat
di bawah tag pembuka .flex-container-column dan beri atribut class dengan
nilai “display”.
. <div class="flex-container-column">
. <div class="display"></div>
. <div class="flex-container-row">
. ...........
. <div class="display">
. <h1 id="displayNumber">0</h1>
. </div>
Sejauh ini struktur kode yang ada pada berkas index.html akan tampak
seperti ini:
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Web Calculator</title>
. <link rel="stylesheet" href="assets/style.css">
. </head>
.
. <body>
. <div class="flex-container-column">
. <div class="display">
. <h1 id="displayNumber">0</h1>
. </div>
. <div class="flex-container-row">
. <div class="button">7</div>
. <div class="button">8</div>
. <div class="button">9</div>
. <div class="button negative">+/-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">4</div>
. <div class="button">5</div>
. <div class="button">6</div>
. <div class="button operator">-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">1</div>
. <div class="button">2</div>
. <div class="button">3</div>
. <div class="button operator">+</div>
. </div>
. <div class="flex-container-row">
. <div class="button clear">CE</div>
. <div class="button">0</div>
. <div class="button equals">=</div>
. </div>
. </div>
. </body>
.
. </html>
Jika kita buka melalui browser, tampilan saat ini masih terlihat aneh.
Yups, hal tersebut wajar karena <div> tidak akan berpengaruh apa apa
hingga kita memberikan styling pada elemen tersebut.
Setelah kita selesai membuat struktur HTML selanjutnya kita percantik elemen -
elemen tersebut dengan styling.
Sebelum memulai menuliskan styling pada CSS, jangan lupa untuk hubungkan
berkas style.css sebagai stylesheet pada index.html. Tuliskan tag <link> berikut
ini di dalam elemen <head>:
. <link rel="stylesheet" href="assets/style.css">
Untuk memulai menuliskan styling, kita buka berkas style.css. Kita mulai dengan
membuat seluruh elemen menerapkan nilai border-box pada properti box-sizing.
Tuliskan rule berikut pada berkas style.css.
. * {
. box-sizing: border-box;
. }
Lalu kita tetapkan font family pada seluruh teks yang ada di dalam body dengan
menggunakan sans-serif.
. body {
. font-family: sans-serif;
. }
. .flex-container-column {
. display: flex;
. flex-direction: column;
.
. /* properti pendukung */
. max-width: 800px;
. margin: 0 auto;
. text-align: right;
. }
Terapkan juga properti display: flex pada .flex-container-row. Namun kita tidak
harus menerapkan flex-direction pada elemen ini, karena nilai row sudah menjadi
default pada flex-container. Sehingga penulisan styling untuk .flex-container-row
cukup dituliskan seperti berikut:
. .flex-container-row {
. display: flex;
. }
Mari kita lanjut atur styling untuk tombol kalkulatornya. Pada tiap .button kita akan
beri nilai flex-basis sebesar 25% beserta properti pendukung lainnya sehingga
tombol kalkulator akan memenuhi seluruh ruang kosong pada container. Tuliskan
styling berikut untuk .button:
. .button {
. flex-basis: 25%;
.
. /* properti pendukung */
. font-size: 1.5em;
. text-align: center;
. padding: 40px;
. border: 1px solid black;
. background: -webkit-linear-gradient(top, #d2d2d2, #ddd);
. cursor: pointer;
. }
Simpan berkas style.css dan coba buka index.html pada browser. Tampilan akan
nampak seperti ini:
. .double {
. flex-basis: 50%;
. }
Sehingga sekarang tampilan button pada browser akan tampak seperti ini:
Sejauh ini kode yang terdapat pada style.css dan index.html akan tampak seperti
berikut:
. * {
. box-sizing: border-box;
. }
.
. body {
. font-family: sans-serif;
. }
.
. .flex-container-column {
. display: flex;
. /* properti pendukung */
. flex-direction: column;
. max-width: 800px;
. margin: 0 auto;
. text-align: right;
. }
.
. .flex-container-row {
. display: flex;
. }
.
. .button {
. flex-basis: 25%;
. /* properti pendukung */
. font-size: 1.5em;
. text-align: center;
. padding: 40px;
. border: 1px solid black;
. background: -webkit-linear-gradient(top, #d2d2d2, #ddd);
. cursor: pointer;
. }
.
. .double {
. flex-basis: 50%;
. }
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Web Calculator</title>
. <link rel="stylesheet" href="assets/style.css">
. </head>
.
. <body>
. <div class="flex-container-column">
. <div class="display">
. <h1 id="displayNumber">0</h1>
. </div>
. <div class="flex-container-row">
. <div class="button">7</div>
. <div class="button">8</div>
. <div class="button">9</div>
. <div class="button negative">+/-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">4</div>
. <div class="button">5</div>
. <div class="button">6</div>
. <div class="button operator">-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">1</div>
. <div class="button">2</div>
. <div class="button">3</div>
. <div class="button operator">+</div>
. </div>
. <div class="flex-container-row">
. <div class="button clear">CE</div>
. <div class="button">0</div>
. <div class="button equals double">=</div>
. </div>
. </div>
. </body>
.
. </html>
Tapi jika Anda ingin membuat tampilan kalkulator tampak seperti yang sudah
dicontohkan ini:
Anda bisa mengikuti langkah - langkah materi kali ini:
Yang pertama kita akan mempercantik display yang ada pada kalkulator dengan
menambahkan background-color, padding, border, dan lain sebagainya. Untuk itu
mari kita tetapkan styling pada .display dengan nilai - nilai properti sebagai
berikut:
. .display {
. color: white;
. width: 100%;
. padding: 10px 20px;
. background-color: #333333;
. border: 1px solid black;
. font-size: 2em;
. }
. .operator,
. .negative,
. .equals {
. background: orange;
. }
Lalu kita akan membuat efek card pada calculator agar kalkulator tampak seperti
berada pada sebuah kartu yang terdapat bayangan pada tepiannya. Hal ini sudah
pernah kita lakukan pada latihan project halaman profile, masih ingat kan?
Buatlah rule styling baru dengan selector .card, dan beri nilai properti seperti di
bawah ini:
. .card {
. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
. border-radius: 5px;
. padding: 30px;
. margin-top: 20px;
. }
Sehingga sekarang kalkulator akan tampak seolah - olah berada di dalam kartu.
Terakhir, kita juga bisa tambahkan sebuah efek lain pada tombol dengan
memanfaatkan pseudo-class :hover. Kita buat efek teks menjadi lebih tebal ketika
kursor diarahkan pada salah satu tombol. Tambahkan rule dengan selector
.botton:hover dengan nilai properties berikut.
. .button:hover {
. font-weight: bold;
. }
Sekarang teks pada tombol akan menjadi tebal ketika terdapat kursor yang
diarahkan.
Sejauh ini berikut kode yang ada pada index.html dan style.css:
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Web Calculator</title>
. <link rel="stylesheet" href="assets/style.css">
. </head>
.
. <body>
. <div class="flex-container-column card">
. <div class="display">
. <h1 id="displayNumber">0</h1>
. </div>
. <div class="flex-container-row">
. <div class="button">7</div>
. <div class="button">8</div>
. <div class="button">9</div>
. <div class="button negative">+/-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">4</div>
. <div class="button">5</div>
. <div class="button">6</div>
. <div class="button operator">-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">1</div>
. <div class="button">2</div>
. <div class="button">3</div>
. <div class="button operator">+</div>
. </div>
. <div class="flex-container-row">
. <div class="button clear">CE</div>
. <div class="button">0</div>
. <div class="button equals double">=</div>
. </div>
. </div>
. </body>
.
. </html>
. * {
. box-sizing: border-box;
. }
.
. body {
. font-family: sans-serif;
. }
.
. .flex-container-column {
. display: flex;
. /* properti pendukung */
. flex-direction: column;
. max-width: 800px;
. margin: 0 auto;
. text-align: right;
. }
.
. .flex-container-row {
. display: flex;
. }
.
. .button {
. flex-basis: 25%;
. /* properti pendukung */
. font-size: 1.5em;
. text-align: center;
. padding: 40px;
. border: 1px solid black;
. background: -webkit-linear-gradient(top, #d2d2d2, #ddd);
. cursor: pointer;
. }
.
. .double {
. flex-basis: 50%;
. }
.
. .display {
. color: white;
. width: 100%;
. padding: 10px 20px;
. background-color: #333333;
. border: 1px solid black;
. font-size: 2em;
. }
.
. .operator,
. .negative,
. .equals {
. background: orange;
. }
.
. .card {
. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
. border-radius: 5px;
. padding: 30px;
. margin-top: 20px;
. }
.
. .button:hover {
. font-weight: bold;
. }
Sejauh ini layout kalkulator yang kita buat sudah cukup baik, namun apakah
sudah cukup baik juga ketika tampil pada device mobile? Untuk melihatnya, kita
bisa coba dengan menggunakan Dev Tools pada browser kita.
Gambar di atas merupakan kalkulator yang kita buat di akses melalui device
Google Pixel 2 XL. Tampilan kalkulator sudah responsif namun, teks tombol
masih terlalu kecil tampilannya. Aspek aksesibilitas penggunanya, kurang.
Agar tampilan lebih optimal pada viewport mobile devices, pertama kita
tambahkan meta tag viewport pada index.html agar tampilan dapat
menyesuaikan dengan beberapa layar yang berbeda.
. <head>
. <title>Web Calculator</title>
. <link rel="stylesheet" href="assets/style.css">
. <meta name="viewport" content="width=device-width, initial-scale=1.0">
. </head>
Dengan begitu ukuran teks dan box dimension akan disesuaikan pada mobile
devices. Namun tampilan tombol akan overflow karena padding pada tiap tombol
yang kita tentukan terlalu besar.
Pada situasi ini kita dapat menggunakan @media query untuk menetapkan nilai
padding yang pas ketika di akses pada mobile device. Tuliskan rule berikut pada
styles.css:
Sekarang tampilan tombol akan menerapkan nilai padding yang lebih kecil ketika
diakses menggunakan ukuran layar dengan lebar di bawah 513px.
JavaScript And DOM
Pada modul ini kita akan banyak berkenalan dengan JavaScript. Berbeda
dengan HTML dan CSS, sekarang kita berada di wilayah pemrograman yang
benar-benar memanfaatkan logic dalam penulisan kodenya. Pengembangan
website tidak hanya mengandalkan seni untuk membangun tampilan yang
cantik, melainkan juga memerlukan bahasa pemrograman agar meningkatkan
fungsionalitas dan membuat website lebih interaktif.
Pada akhir modul in kita akan menerapkan apa yang sudah kita pelajari pada
project Web Kalkulator sehingga kalkulator dapat berfungsi sebagai sesuai
yang kita harapkan.
Lalu pada tahun 2015 ECMAScript 6 rilis dengan membawa perubahan yang
cukup besar termasuk ide - ide yang sudah direncanakan untuk versi 4. Mulai
dari itu tiap tahun JavaScript melakukan update bersifat minor.
Atribut HTML
Ada banyak sekali atribut event yang dapat digunakan untuk menuliskan script di
dalamnya. Kita bisa lihat apa saja atributnya pada tautan
berikut: https://www.w3schools.com/tags/ref_eventattributes.asp.
Embedded Script
External Script
. <script src="berkas-javascript.js"></script>
Teknik inilah yang akan kita gunakan dalam penerapan JavaScript pada project
kalkulator.
Buka project kalkulator yang sudah kita buat. Di dalam folder assets, buat
berkas baru dengan memberikan nama “kalkulator.js”. Ingat berkas ini harus
diakhiri dengan ekstensi .js. Ekstensi tersebut menandakan bahwa berkas ini
merupakan berkas JavaScript.
Setelah membuat berkas tersebut maka struktur dari proyek kalkulator akan
tampak seperti berikut:
Buka berkas kalkulator.js dan tuliskan kode JavaScript berikut:
Jangan khawatir jika Anda belum memahami maksud dari kode tersebut,
nanti akan dijelaskan apa yang sudah kita tuliskan.
. ...........
. <script src="assets/kalkulator.js"></script>
. </body>
Mungkin ini akan membuat Anda bingung jika tidak memiliki dasar
pemrograman. Tak apa, yang terpenting ketika pesan ini muncul
pada console, itu menandakan kita sudah berhasil menerapkan JavaScript
pada website kita.
Dasar JavaScript
Wajar jika kita menemukan banyak buku JavaScript dengan halaman super
tebal karena memang banyak sekali bahasan seputar JavaScript ini. Tetapi
pada materi ini kita rangkum menjadi beberapa pembahasan penting yang
Anda perlu ketahui. Tujuannya agar Anda familier dengan dasar - dasar
JavaScript. Dengan memahami dasar-dasar JavaScript, nantinya diharapkan
kita dapat terus berlatih sehingga terbiasa dengan penggunaan sintaksnya.
Maka dari itu hindari belajar dengan cara menghafal seluruh struktur kode
yang dituliskan, tapi belajarlah dengan memahami tujuan dari kode yang
dituliskan. Dengan memahami kode-kode yang ada dan dipadukan logika
maka kita akan mudah dalam menghadapi suatu masalah - masalah yang
ada ketika mengembangkan suatu aplikasi/web.
Pada akhir materi ini, kita akan mengenal tentang variabel, array, operator
komparasi, if else statement dan masih banyak lagi. Sudah siap belajar?
Statement
. alert("Terimakasih.");
Pada akhir kode terdapat tanda titik koma (;) yang digunakan untuk menandai
akhir dari sebuah statement. Meskipun sebenarnya pada JavaScript kita
dapat menghiraukan penulisan titik koma (;) pada akhir statement, tetapi
dalam best practice nya kita biasakan akhiri statement dengan titik koma (;).
Comment
Pada JavaScript juga terdapat fitur komentar. Seluruh teks yang dituliskan
pada tanda komentar akan diabaikan (tidak dianggap ada) atau tidak akan
dieksekusi. Dalam komentar ini kita bisa menuliskan teks untuk mengingatkan
atau menjelaskan kode yang kita tuliskan. Hal ini bisa saja berguna jika kode
yang kita tuliskan akan diubah oleh orang lain. Tapi ingat, jangan terlalu
berupaya dalam menuliskan komentar yang sebenarnya tidak perlu dituliskan.
Sedangkan untuk menggunakan komentar lebih dari satu baris (multiple lines
comment) kita bisa gunakan tanda /* sebagai pembuka komentar dan tanda */
sebagai penutup komentar. Teks apapun yang berada di antara tanda
tersebut akan dijadikan komentar dan tidak akan dieksekusi.
Variabel
Kita bisa menggunakan apapun yang kita mau untuk menamai sebuah
variabel, tetapi pastikan penamaannya masih masuk akal dengan konteksnya
agar berikutnya kode mudah di-maintenance.
. x = 100;
. var x;
. console.log(x);
.
. /* output: 100 */
. var x;
. x = 100;
. console.log(x);
.
. /* output: 100 */
. const z = 100;
. console.log(z);
.
. z = 200;
. console.log(z)
.
. /* TypeError: Assignment to constant variable. */
https://glot.io/snippets/fhzffeo6bn
Tipe Data
Nilai yang kita tetapkan pada variabel pasti memiliki tipe data. Tipe data
merupakan pengklasifikasian data berdasarkan jenis data tersebut. Pada
JavaScript terdapat beberapa tipe data sebagai berikut:
Undefined
Tipe data ini terbentuk ketika sebuah variabel tidak memiliki nilai, dalam arti
lain ketika kita mendeklarasikan variabel tanpa menginisialisasikan nilainya,
maka variabel tersebut menjadi undefined. Contoh:
. let x;
. console.log(typeof(x));
.
. /* output: undefined */
Pada contoh kode di atas, kita mendeklarasikan variabel x, tetapi kita tidak
menginisialisasikan dengan nilai apapun. Ketika kita memastikan tipe data
dengan menggunakan fungsi typeof() maka menghasilkan output undefined.
Fungsi typeof() digunakan untuk memastikan tipe data pada
variabel dengan mengembalikan tipe data tersebut dalam
bentuk teks
Numbers
Nilai dari tipe data number adalah angka. JavaScript variabel bertipe data
number dituliskan seperti ini:
. let x = 10;
Jika angka tersebut merupakan sebuah bilangan desimal, maka kita bisa
gunakan tanda titik pada pecahan bilangannya.
. let x = 10;
. console.log(typeof(x))
.
. /* output: number */
.
. let y = 17.25;
. console.log(typeof(y))
.
. /* output: number */
Pada tipe data number kita juga dapat melakukan perhitungan aritmatika
seperti penambahan, pengurangan, perkalian, dll. Berikut operator yang
dapat kita gunakan dalam melakukan perhitungan aritmatika pada tipe
data number:
+ Penambahan 10 + 10 = 20
- Pengurangan 15 - 7 = 8
/ Pembagian 21 / 7 = 3
* Perkalian 9 * 9 = 81
. let a = 12;
. let b = 9;
.
. console.log(a + b)
. console.log(a - b)
. console.log(a * b)
. console.log(a / b)
. console.log(a % b)
.
. /* output:
. 21
. 3
. 108
. 1.3333333333333333
. 3
Operator ini dapat dituliskan sebelum atau sesudah variabel, tetapi hal
tersebut bukan berarti sama. Berikut ketentuannya:
Strings
Tipe data selanjutnya adalah strings, String ini dasarnya adalah sebuah teks.
Pada JavaScript untuk menetapkan nilai string pada variabel, gunakan
tanda single (‘) atau double quote (“) di antara teksnya. Contohnya:
Boolean
Boolean hanya dapat memiliki dua nilai, yakni true atau false. Tipe data ini
menjadi kunci utama dalam penentuan logika, kita akan memahaminya nanti
ketika pembahasan if/else statement. Untuk menetapkan nilai boolean pada
variabel kita bisa menggunakan keyword true atau false.
. let x = true;
. let y = false;
.
. console.log(typeof(x))
. console.log(typeof(y))
.
. /* output:
. boolean
. boolean
. */
Atau kita bisa gunakan operator komparasi seperti lebih dari (>) atau kurang
dari (<). Contohnya:
. const a = 10;
. const b = 12;
.
. let isGreater = a > b;
. let isLess = a < b;
.
. console.log(isGreater);
. console.log(isLess);
.
. /* output:
. false
. true
. */
Null
. let someLaterData = null;
. console.log(someLaterData);
.
. /* output:
. null
. */
Meskipun terdapat beberapa tipe data dalam JavaScript, tetapi variabel pada
JavaScript memiliki sifat tipe data yang dinamis. Artinya, kita dapat
memberikan tipe data yang berubah-ubah pada satu variabel yang sama.
Contohnya:
Berikut snippet code dari contoh kode yang digunakan pada materi di atas,
Anda bisa mencobanya sendiri dengan berbagai macam tipe data pada
JavaScript dan menampilkannya pada console.
https://glot.io/snippets/fhzkayhcom
Kita sudah mengenal tipe data dasar yang ada pada JavaScript. Kali ini kita
akan membahas mengenai array dan objek pada JavaScript. Keduanya dapat
menampung lebih dari satu tipe data dasar yang digunakan untuk mengelola
sebuah data.
Arrays
Array merupakan tipe data yang dapat mengelompokkan lebih dari satu nilai
dari tipe data lain dengan menempatkannya pada satu variabel. Contoh:
. let myArray = ["Coklat", 42.5, 22, true, "Programming"];
. console.log(myArray);
.
. /* output:
. [ 'Coklat', 42.5, 22, true, 'Programming' ]
. */
Nilai - nilai yang berada pada array disusun dan diakses secara indexing.
Untuk mengakses nilai di dalam array kita gunakan tanda kurung siku [] yang
di dalamnya berupa angka yang merupakan posisi nilai yang ingin diakses.
. let myArray = ["Coklat", 42.5, 22, true, "Programming"];
. console.log(myArray[1]);
.
. /* output:
. 42.5
. */
Yang perlu kita ketahui adalah nilai index dimulai dari angka 0. Terlihat pada
contoh kode di atas, kita mengakses index ke-1 pada myArray. Nilai yang
muncul adalah nilai ke-2 dari array tersebut, yakni 42.5. Jika kita tidak
mengakses nilai array lebih dari index-nya maka hasilnya akan undefined.
Index terakhir array selalu jumlah nilai array - 1.
. let myArray = ["Coklat", 42.5, 22, true, "Programming"];
. console.log(myArray[0]);
. console.log(myArray[1]);
. console.log(myArray[2]);
. console.log(myArray[3]);
. console.log(myArray[4]);
. console.log(myArray[5]);
. console.log("Panjang nilai myArray adalah " + myArray.length + ".");
.
. /* output:
. Coklat
. 42.5
. 22
. true
. Programming
. undefined
. Panjang nilai myArray adalah 5.
. */
Objek
Objek serupa dengan array yang dapat menampung banyak nilai dengan tipe
data yang beragam. Untuk mengelola data menggunakan objek, bedanya
objek diakses tidak melalui indexing, melainkan menggunakan
pendekatan key-value. Untuk mengakses nilainya kita gunakan key. Key juga
biasa disebut dengan properti.
Dalam menuliskan objek, baris baru tidaklah penting dan tidak akan
berpengaruh apa pun. Sehingga lebih baik setiap kita menetapkan key-
value buatlah baris baru untuk memisahkan antar nilainya, hal ini akan
memudahkan kita dalam memahami struktur data yang berada pada objek.
. let user = {
. firstName: “Harry”,
. lastName: “Potter”,
. age: 20,
. isMuggle: false,
. stuff: ["Magic Wind", "Flying Car", "Owl"]
. };
Kemudian untuk mengakses nilai dari properti objek kita dapat gunakan tanda
titik diikuti dengan nama properti-nya. Contoh:
. let user = {
. name: {
. first: "Harry",
. last: "Potter"
. },
. age: 20,
. isMuggle: false,
. stuff: ["Magic Wind", "Flying Car", "Owl"]
. }
Berikut snippet code dari contoh kode yang digunakan pada materi di atas,
Anda bisa mencobanya sendiri dengan mengubah struktur objek atau array
dan menampilkannya pada console.
https://glot.io/snippets/fi5zpzsh6w
Banyak hal sebenarnya yang dapat diceritakan tentang dua hal ini, terutama
untuk objek. Jika Anda ingin tahu lebih dalam, Anda bisa baca
dokumentasinya pada tautan yang disediakan oleh MDN:
Array : https://developer.mozilla.org/id/docs/Web/JavaScript/Reference
/Global_Objects/Array
Objek : https://developer.mozilla.org/id/docs/Web/JavaScript/Reference
/Global_Objects/Object
Assignment Operator
Dari contoh kode yang kita gunakan sebelumnya sebenarnya kita sudah
menggunakan assignment operator. Operator ini digunakan untuk
memberikan nilai pada variabel.
Pada dasarnya operator ini adalah tanda sama dengan (=), di mana tanda ini
digunakan untuk menginisialisasi nilai pada variabel. Variabel yang akan
diberikan nilai ditempatkan pada sebelah kiri dan nilainya ditempatkan pada
sebelah kanan (nilai dapat berupa variabel lain atau nilai primitif, array, atau
objek). Di antara keduanya terdapat operator assignment.
. x = y;
. let x = 10;
. let y = 5
.
. x += y;
.
. console.log(x)
. let x = 10;
. let y = 5
.
. x += y; // artinya -> x = x + y;
. x -= y; // artinya -> x = x - y;
. x *= y; // artinya -> x = x * y;
. x /= y; // artinya -> x = x / y;
. x %= y; // artinya -> x = x % y;
.
. console.log(x);
Operator Komparasi
Sekarang kita sudah mengetahui bagaimana cara menyimpan nilai pada sebuah
variabel, array, ataupun objek. Nah, selanjutnya kita akan belajar mengenai
operator komparasi sebagai logika dasar dalam membandingkan nilai pada
JavaScript.
Terdapat serangkaian karakter khusus yang disebut dengan operator
pembanding/komparasi yang dapat mengevaluasi dan membandingkan dua nilai.
Berikut daftar operator dan fungsinya:
Operator Fungsi
> Membandingkan dua nilai apakah nilai pertama lebih besar dari nilai
kedua.
>= Membandingkan dua nilai apakah nilai pertama lebih besar atau sama
dengan dari nilai kedua.
< Membandingkan dua nilai apakah nilai pertama lebih kecil dari nilai
kedua.
<= Membandingkan dua nilai apakah nilai kedua lebih kecil dari atau sama
dengan nilai pertama.
Ketika kita melakukan perbandingan antara dua nilai, JavaScript akan
mengevaluasi kedua nilai tersebut dan akan mengembalikan boolean dengan nilai
hasil perbandingan tersebut, baik false, atau true. Berikut contohnya:
. let a = 10;
. let b = 12;
.
. console.log(a < b);
. console.log(a > b);
.
. /* output
. true
. false
. */
Dalam operator komparasi di JavaScript, hal yang menjadi sedikit “tricky” adalah
membedakan antara “sama” (==) dan “identik” (===).
Kita sudah mengetahui bahwa setiap nilai pasti memiliki tipe data baik itu number,
string atau boolean. Contohnya sebuah string “10” dan number 10 merupakan hal
yang serupa, tetapi keduanya tidak benar-benar sama.
Hal inilah yang membedakan antara sama dan identik pada JavaScript. Jika kita
ingin membandingkan hanya dari kesamaan nilainya kita bisa gunakan == tapi
jika kita ingin membandingkan dengan memperhatikan tipe datanya kita
gunakan ===.
Logical Operators
Terdapat beberapa operator lain yang dapat kita gunakan untuk menetapkan
logika yang lebih kompleks, yakni dengan logical operators. Dengan logical
operator kita dapat menggunakan kombinasi dari dua nilai boolean atau bahkan
lebih dalam menetapkan logika.
Operator Deskripsi
. let a = 10;
. let b = 12;
.
. /* AND operator */
. console.log(a < 15 && b > 10); // (true && true) -> true
. console.log(a > 15 && b > 10); // (false && true) -> false
.
. /* OR operator */
. console.log(a < 15 || b > 10); // (true || true) -> true
. console.log(a > 15 || b > 10); // (false || true) -> true
.
. /* NOT operator */
. console.log(!(a < 15)); // !(true) -> false
. console.log(!(a < 15 && b > 10)); // !(true && true) -> !(true) -> false
.
. /* output
. true
. false
. true
. true
. false
. false
. */
Mungkin sebagian dari kita bertanya, sebenarnya apa kegunaan dari nilai boolean
selain hanya menampilkan nilai true dan false saja? Pada pembahasan tipe data
sudah pernah disebutkan bahwa boolean merupakan salah satu kunci dari logika
pemrograman, karena boolean dapat mengontrol aliran pada program.
Lantas bagaimana cara boolean mengontrol sebuah aliran program? Pada bab
selanjutnya, kita akan membahas mengenai if/else statement yang dapat
mengontrol flow pada program, tentunya pada penggunaan statement ini boolean
sangat berperan.
https://glot.io/snippets/fi6b6h58lz
If/Else Statement
Skenario tersebut dapat dituliskan pada dalam bentuk kode pada JavaScript
seperti berikut:
. let x = 50;
.
. if(x > 70) {
. console.log(x);
. } else {
. console.log("Nilai kurang dari 70");
. }
.
. /* output
. Nilai kurang dari 70
. */
. let language = "French";
. let greeting = "Selamat Pagi"
.
. if(language === "English") {
. greeting = "Good Morning!";
. } else if(language === "French") {
. greeting = "Bonjour!"
. } else if(language === "Japanese") {
. greeting = "Ohayogozaimasu!"
. }
.
. console.log(greeting);
.
. /* output
. Bonjour!
. */
https://glot.io/snippets/fi7an0nsxb
Loop
Sejauh ini kita sudah mengenal array sebagai tempat untuk menyimpan
banyak data. Ada beberapa kasus dimana kita ingin memeriksa setiap item
dalam sebuah array dan melakukan sesuatu dengannya, tetapi kita tidak ingin
menuliskan seluruh daftar nilai pada array secara manual, dan menyibukkan
diri untuk melakukan hal yang berulang. Maka dari itu kita perlu mempelajari
teknik yang dapat mengatasi permasalahan tersebut, teknik ini disebut
dengan loops.
For loop
Mungkin kode tersebut sulit dipahami jadi mari kita bahas sedikit demi sedikit.
Huft, cukup panjang untuk memahami for loops, mari kita kembali ke tujuan
awal, lantas bagaimana cara memeriksa item dalam array dengan
menggunakan for loop? Kita dapat melakukannya dengan seperti ini:
. const myArray = ["Harry", "Ron", "Hermione", "Tom"];
.
. for(let i = 0; i < myArray.length; i++) {
. console.log(myArray[i]);
. }
.
. /* output
. Harry
. Ron
. Hermione
. Tom
. */
For of loop
. for(arrayItem of myArray) {
. // do something
. }
Berikut snippet code dari contoh kode yang digunakan pada materi di atas,
Anda bisa mencobanya sendiri, dan pahami cara penggunaan dari for loop
dan for of loop.
https://glot.io/snippets/fi7iwiumv8
Function
Tanpa kita sadari sebenarnya kita sudah menggunakan sebuah fungsi pada
contoh kode yang ada sebelumnya. console.log() (lebih tepatnya pada log())
merupakan sebuah function yang berfungsi untuk menampilkan data pada
console browser. Tapi sebenarnya apa itu function? Bagaimana ia bisa
bekerja?
Function atau fungsi merupakan potongan kecil kode yang tidak akan
dieksekusi sebelum dipanggil. Contoh lain fungsi JavaScript yang sudah ada
pada browser adalah alert(). Ia bertujuan untuk menampilkan pesan dalam
bentuk pop up dialog. Fungsi tersebut sudah ada pada browser dan akan
muncul hanya ketika kita menggunakan/memanggilnya dengan alert().
Semua fungsi memiliki struktur yang sama. Nama fungsi selalu diikuti dengan
tanda kurung (parentheses) tanpa spasi, lalu terdapat sepasang kurung
kurawal yang berisi logika dari fungsi tersebut.
Native function merupakan fungsi yang sudah terdapat pada JavaScript atau
Browser sehingga kita tidak perlu membuat hanya tinggal menggunakan saja.
Contohnya alert(), confirm(), Date(), parseInt() dll. Sebenarnya terdapat
ratusan native function yang tersedia.
. function greeting() {
. console.log("Good Morning!")
. }
. function greeting() {
. console.log("Good Morning!")
. }
.
. greeting();
.
. /* output
. Good Morning!
. */
Tetapi jika sebuah fungsi hanya menjalankan baris kode secara sama dirasa
kurang fungsional bukan? Kita dapat membuat fungsi tersebut untuk
menerima argumen dan memanfaatkan argumen untuk mengubah perilaku
dari fungsinya.
. function greeting(name, language) {
. if(language === "English") {
. console.log("Good Morning " + name + "!");
. } else if (language === "French") {
. console.log("Bonjour " + name + "!");
. } else {
. console.log("Selamat Pagi " + name + "!");
. }
. }
Sehingga dalam memanggilnya pun kita perlu mengirimkan dua buah nilai
pada fungsinya seperti berikut:
. function multiply(a, b) {
. return a * b;
. }
.
. let result = multiply(10, 2)
. console.log(result)
.
. /* output
. 20
. */
Yang perlu kita perhatikan lagi, ketika statement return tereksekusi, maka
fungsi akan langsung terhenti dan mengembalikan nilai.
Berikut snippet code dari contoh kode yang digunakan pada materi di atas,
Anda bisa mencobanya sendiri, dan pahami struktur cara penggunaan dari
function.
https://glot.io/snippets/fi85m61lkm
Variable Scope
Sejauh ini kita sudah mengenal function. Ada satu hal lagi yang harus kita tahu
mengenai dasar JavaScript, yakni scoping variable. Ada banyak keadaan di mana
kita membutuhkan variabel untuk diakses di seluruh script yang kita buat. Tetapi
ada juga keadaan di mana kita ingin variabel tersebut hanya dapat diakses pada
cakupan fungsi dan fungsi turunannya saja.
Variabel yang dapat di akses dari seluruh script disebut dengan “globally scoped,”
sementara variabel yang hanya dapat diakses hanya pada function tertentu
disebut dengan “locally scoped.”
Untuk lebih jelasnya, berikut variabel yang dapat diakses dalam sebuah fungsi:
. function multiply(num) {
. total = num * num;
. return total;
. }
.
. let total = 9;
. let number = multiply(20);
.
. console.log(total)
.
. /* output
. 400
. */
Mungkin kita berharap nilai total akan tetap 9. Mengingat variabel total pada
fungsi multiply, seharusnya tidak akan berpengaruh untuk kode di luar dari fungsi
tersebut. Hal ini bisa terjadi karena pada fungsi multiply() kita tidak menetapkan
variabel total sebagai cakupan lokal, kita tidak menggunakan keyword const, let,
atau var ketika mendeklarasikan variabel total pada fungsi multiply() sehingga
variabel total menjadi global.
Berikut snippet code dari contoh kode yang digunakan pada materi di atas. Anda
bisa mencobanya sendiri agar paham aturan scoping pada JavaScript.
https://glot.io/snippets/fi89p21vnw
Browser Object
Seperti yang kita tahu, dengan menggunakan JavaScript, website kita dapat
lebih fungsional dan interaktif. Untuk membuat website menjadi interaktif,
tentu JavaScript harus dapat mengontrol elemen yang ada pada website.
Dalam mengontrol browser, JavaScript menggunakan object yang sudah
tersedia dalam browser yakni window.
Kita bisa melihat secara lengkap apa saja properti, method serta event yang
ada pada objek window melalui console browser dengan
mengetikkan window pada console.
Property/Method Description
history Sebagai navigasi (go back atau go forward) histori URL browser.
confirm() Menampilkan dialog dengan pesan dan tombol “ok” dan “cancel”.
Method ini akan mengembalikan nilai boolean sesuai response
dari pengguna.
prompt() Menampilkan dialog dengan pesan dan teks input. Method ini
akan mengembalikan nilai string sesuai response dari pengguna.
Dalam mengakses properti dan method pada objek window, kita bisa
menuliskannya secara langsung tanpa harus memanggil objek window-nya
terlebih dahulu. Karena properti dan method pada window bersifat global.
window.alert("Hello Browser!")
alert("Hello Browser!")
const user = {
name: {
first: firstName,
last: lastName,
},
language: language
};
if (user.language === "English") {
} else if (user.language === "French") {
} else if (user.language === "Japanese") {
} else {
Manipulasi DOM
Sekarang kita sudah memahami bahasa JavaScript dan mengerti peran
penggunaannya dalam browser melalui objek window. Tetapi ada satu hal
lagi yang belum kita ketahui, yakni cara mengakses elemen pada dokumen
HTML.
Pada materi kali ini kita akan eksplorasi tentang DOM Scripting, di mana
nantinya kita dapat memanipulasi elemen, atribut elemen, dan teks yang
tampak pada halaman.
. <!DOCTYPE html>
. <html>
. <head>
. <title>DOM Structure</title>
. </head>
. <body>
. <h1>Hallo Developer!</h1>
. <p>Belajar Dasar Pemrograman Web</p>
. </body>
. </html>
Berdasarkan HTML di atas, maka objek DOM memiliki struktur seperti ini:
Pada contoh yang diberikan di atas DOM terlihat seperti pemetaan dari
sumber berkas HTML. Walaupun sama berkas HTML dan DOM adalah hal
yang berbeda.
. <!DOCTYPE html>
. <html>
. Hello, World!
. </html>
Pada berkas HTML di atas tidak terdapat elemen <head> dan <body>.
Artinya berkas HTML tersebut tidak valid. Berbeda dengan DOM, walaupun
struktur pada HTML tidak valid, pada DOM object structure akan diperbaiki.
Caranya dengan menambahkan elemen <head> dan <body> secara otomatis
kemudian menempatkan teks di dalam elemen <body>.
Mendapatkan Elemen
Untuk mengakses elemen melalui DOM, kita gunakan properti dari objek
window yang dinamakan dengan document. Objek document
merepresentasikan dokumen dari HTML atau keseluruhan halaman yang
terlihat pada jendela browser. Jika kita lihat nilai dari objek document pada
browser console akan tampak seperti ini:
Pada gambar di atas kita bisa lihat bahwa nilai dari document merupakan
struktur HTML dari halaman yang ditampilkan, di mana terdapat root
element <html> yang di dalamnya ada elemen <head> dan <body>.
Namun bila kita ingin mengakses elemen secara spesifik, kita harus
menggunakan method yang disediakan pada objek document seperti:
querySelectorAll() document.querySelectorAll(“.button”);
Mengembalikan banyak
(HTMLCollection) yang
menerapkan class “butto
Pada method di atas ada yang mengembalikan nilai HTML elemen secara
tunggal, ada juga yang mengembalikan banyak nilai HTML elemen yang
biasa disebut HTMLCollections.
for(let item of buttons) {
console.log(item)
}
Memanipulasi Element
Memanipulasi Atribut
Untuk mengubah atau menambah nilai atribut pada elemen, apa method
yang kita gunakan? setAttribute() jawabannya. Method ini membutuhkan dua
buah argumen string yang merupakan nama dan nilai dari atributnya.
. someElement.setAttribute("attributName", "attributeValue");
. <!DOCTYPE html>
. <html>
. <head>
. <title>Manipulating Attribute</title>
. </head>
. <body>
. <figure>
. <img id="catImage" src="https://i.ibb.co/9WT6LG6/two-
three.jpg" alt="three-cats" width="600px"/>
. <figcaption id="caption">Tiga Anak Kucing</figcaption>
. </figure>
. </body>
. </html>
Kita buka berkas HTML tersebut pada browser, maka akan muncul tampilan
seperti ini:
Ada yang janggal pada informasi yang ditampilkan di website.
Berdasarkan caption, gambar seharusnya menampilkan 3 ekor kucing. Kita
akan coba memperbaikinya dengan mengubah nilai atribut src pada
elemen <img id=”catImage”> melalui JavaScript. Kita bisa melakukannya
dengan menuliskan kode seperti berikut:
. let catImage = document.querySelector("#catImage");
. catImage.setAttribute("src", "https://i.ibb.co/55VG7vL/three-cat.jpg");
. catImage.getAttribute("src");
Memanipulasi Konten Elemen
Dengan JavaScript juga kita dapat mengubah konten yang ada di dalam
HTML. Konten pada elemen disimpan di dalam properti innerHTML (konten
dalam bentuk HTML) atau innerText (konten dalam bentuk Teks). Hasilnya,
dalam memanipulasi konten kita dapat melakukannya dengan mengubah nilai
dari properti tersebut.
Jadi pastikan kita tidak salah menggunakan properti ketika ingin mengubah
konten dari elemen.
Agar elemen baru tampil pada jendela browser, kita perlu memasukkan
elemen tersebut pada body dengan menggunakan fungsi appendChild();
. document.body.appendChild(newElement);
Sekarang elemen baru yang kita buat sudah tampil pada jendela browser.
. catImage.addEventListener('click', function(event) {
. document.querySelector('#count').innerText++;
. });
. const calculator = {
. displayNumber: '0',
. operator: null,
. firstNumber: null,
. waitingForSecondNumber: false
. };
Kita gunakan objek ini sebagai tempat menyimpan data dan kondisi pada
calculator, di mana angka yang muncul pada layar kalkulator selalu diambil
dari data calculator.displayNumber.
. function updateDisplay() {
. document.querySelector("#displayNumber").innerText =
calculator.displayNumber;
. }
.
. function clearCalculator() {
. calculator.displayNumber = '0';
. calculator.operator = null;
. calculator.firstNumber = null;
. calculator.waitingForSecondNumber = false;
. }
. function inputDigit(digit) {
. calculator.displayNumber += digit;
. }
. const buttons = document.querySelectorAll(".button");
. for (let button of buttons) {
. button.addEventListener('click', function(event) {
.
. // mendapatkan objek elemen yang diklik
. const target = event.target;
.
. inputDigit(target.innerText);
. updateDisplay()
. });
. }
. const calculator = {
. displayNumber: '0',
. operator: null,
. firstNumber: null,
. waitingForSecondNumber: false
. };
.
. function updateDisplay() {
. document.querySelector("#displayNumber").innerText =
calculator.displayNumber;
. }
.
. function clearCalculator() {
. calculator.displayNumber = '0';
. calculator.operator = null;
. calculator.firstNumber = null;
. calculator.waitingForSecondNumber = false;
. }
.
. function inputDigit(digit) {
. calculator.displayNumber += digit;
. }
.
.
. const buttons = document.querySelectorAll(".button");
. for (let button of buttons) {
. button.addEventListener('click', function(event) {
.
. // mendapatkan objek elemen yang diklik
. const target = event.target;
.
. inputDigit(target.innerText);
. updateDisplay()
. });
. }
Uh sangat aneh bukan? Siapa yang ingin gunakan kalkulator seperti itu?
Untuk saat ini tak apa. Setidanya kode yang kita tuliskan sudah berhasil
berjalan dengan baik. Selanjutnya kita akan memperbaiki keanehan-
keanehan yang ada satu per satu.
Saat ini kalkulator masih dapat menampilkan angka 0 di awal bilangan, hal itu
tentu aneh dan tidak pernah terjadi pada kalkulator manapun terkecuali dalam
menampilkan bilangan desimal. Untuk memperbaikinya, pada
fungsi inputDigit(), tambahkan sebuah kondisi dimana
jika displayNumber bernilai ‘0’, maka angka yang pertama dimasukkan
pengguna akan menggantikan keseluruhan nilai displayNumber selain itu,
lakukan seperti biasanya. Untuk melakukannya kita gunakan if-else
statement.
. function inputDigit(digit) {
. if(calculator.displayNumber === '0') {
. calculator.displayNumber = digit;
. } else {
. calculator.displayNumber += digit;
. }
. }
. button.addEventListener('click', function(event) {
.
. // mendapatkan objek elemen yang diklik
. const target = event.target;
.
. if(target.classList.contains('clear')) {
. clearCalculator();
. updateDisplay();
. return;
. }
.
. inputDigit(target.innerText);
. updateDisplay()
. });
Kita bisa memanfaatkan event.classList untuk melihat nilai class apa saja
dalam bentuk array yang ada pada element target, kemudian
menggunakan contains() yang merupakan method dari array yang berguna
untuk memastikan nilai yang terkandung di dalam array tersebut.
. const calculator = {
. displayNumber: '0',
. operator: null,
. firstNumber: null,
. waitingForSecondNumber: false
. };
.
. function updateDisplay() {
. document.querySelector("#displayNumber").innerText =
calculator.displayNumber;
. }
.
. function clearCalculator() {
. calculator.displayNumber = '0';
. calculator.operator = null;
. calculator.firstNumber = null;
. calculator.waitingForSecondNumber = false;
. }
.
. function inputDigit(digit) {
. if (calculator.displayNumber === '0') {
. calculator.displayNumber = digit;
. } else {
. calculator.displayNumber += digit;
. }
. }
.
.
. const buttons = document.querySelectorAll(".button");
. for (let button of buttons) {
. button.addEventListener('click', function(event) {
.
. // mendapatkan objek elemen yang diklik
. const target = event.target;
.
. if (target.classList.contains('clear')) {
. clearCalculator();
. updateDisplay();
. return;
. }
.
. inputDigit(target.innerText);
. updateDisplay()
. });
. }
Selanjutnya kita akan melengkapi beberapa fungsi lainnya yang ada pada
kalkulator, yakni fungsi negative, operator, dan equals. Untuk itu, buat kondisi
lainnya pada event handler, sehingga kode tampak seperti berikut:
. button.addEventListener('click', function(event) {
.
. // mendapatkan objek elemen yang diklik
. const target = event.target;
.
. if (target.classList.contains('clear')) {
. clearCalculator();
. updateDisplay();
. return;
. }
.
. if(target.classList.contains('negative')) {
. inverseNumber();
. updateDisplay();
. return;
. }
.
. if(target.classList.contains('equals')) {
. performCalculation();
. updateDisplay();
. return;
. }
.
. if(target.classList.contains('operator')) {
. handleOperator(target.innerText)
. updateDisplay();
. return;
. }
.
. inputDigit(target.innerText);
. updateDisplay()
. });
Jika kita membukanya sekarang, maka eror akan muncul ketika tombol -
tombol fungsi dan operatornya ditekan.
Hal tersebut wajar karena kita belum mendefinisikan seluruh fungsi - fungsi
yang kita dituliskan di atas. Dengan begitu mari kita buat fungsinya mulai
dari inverseNumber()
. function inverseNumber() {
. if (calculator.displayNumber === '0') {
. return;
. }
. calculator.displayNumber = calculator.displayNumber * -1;
. }
Fungsi inverseNumber() cukuplah simple karena kita hanya perlu melakukan
perkalian displayNumber dengan -1, terkecuali jika displayNumber masih
bernilai ‘0’ maka perkalian tidak akan dilakukan.
. function handleOperator(operator) {
. if (!calculator.waitingForSecondNumber) {
. calculator.operator = operator;
. calculator.waitingForSecondNumber = true;
. calculator.firstNumber = calculator.displayNumber;
. } else {
. alert('Operator sudah ditetapkan')
. }
. }
Selain itu, kita ubah juga logika yang terdapat pada fungsi inputDigit() dengan
menambahkan kondisi pengecekkan terhadap nilai operator,
dan displayNumber. Sehingga fungsi inputDigit() akan tampak seperti berikut:
. function inputDigit(digit) {
. if (calculator.waitingForSecondNumber && calculator.firstNumber ===
calculator.displayNumber) {
. calculator.displayNumber = digit;
. } else {
. if (calculator.displayNumber === '0') {
. calculator.displayNumber = digit;
. } else {
. calculator.displayNumber += digit;
. }
. }
. }
. function performCalculation() {
. if (calculator.firstNumber == null || calculator.operator == null) {
. alert("Anda belum menetapkan operator");
. return;
. }
.
. let result = 0;
. if (calculator.operator === "+") {
. result = parseInt(calculator.firstNumber)
+ parseInt(calculator.displayNumber);
. } else {
. result = parseInt(calculator.firstNumber)
- parseInt(calculator.displayNumber)
. }
.
. calculator.displayNumber = result;
. }
Dalam melakukan kalkulasi terdapat pengecekan tipe operator apa yang akan
dilakukan. Kita juga menggunakan parseInt() untuk mengubah
nilai string menjadi number. Mengapa konversi tipe data dibutuhkan?
Sejatinya kita menggunakan string dalam menampilkan nilai pada jendela
browser, namun untuk proses kalkulasi kita membutuhkan number.
. const calculator = {
. displayNumber: '0',
. operator: null,
. firstNumber: null,
. waitingForSecondNumber: false
. };
.
. function updateDisplay() {
. document.querySelector("#displayNumber").innerText =
calculator.displayNumber;
. }
.
. function clearCalculator() {
. calculator.displayNumber = '0';
. calculator.operator = null;
. calculator.firstNumber = null;
. calculator.waitingForSecondNumber = false;
. }
.
. function inputDigit(digit) {
. if (calculator.waitingForSecondNumber && calculator.firstNumber ===
calculator.displayNumber) {
. calculator.displayNumber = digit;
. } else {
. if (calculator.displayNumber === '0') {
. calculator.displayNumber = digit;
. } else {
. calculator.displayNumber += digit;
. }
. }
. }
.
. function inverseNumber() {
. if (calculator.displayNumber === '0') {
. return;
. }
. calculator.displayNumber = calculator.displayNumber * -1;
. }
.
. function handleOperator(operator) {
. if (!calculator.waitingForSecondNumber) {
. calculator.operator = operator;
. calculator.waitingForSecondNumber = true;
. calculator.firstNumber = calculator.displayNumber;
. } else {
. alert('Operator sudah ditetapkan')
. }
. }
.
. function performCalculation() {
. if (calculator.firstNumber == null || calculator.operator == null) {
. alert("Anda belum menetapkan operator");
. return;
. }
.
. let result = 0;
. if (calculator.operator === "+") {
. result = parseInt(calculator.firstNumber)
+ parseInt(calculator.displayNumber);
. } else {
. result = parseInt(calculator.firstNumber)
- parseInt(calculator.displayNumber)
. }
.
. calculator.displayNumber = result;
. }
.
.
. const buttons = document.querySelectorAll(".button");
. for (let button of buttons) {
. button.addEventListener('click', function(event) {
.
. // mendapatkan objek elemen yang diklik
. const target = event.target;
.
. if (target.classList.contains('clear')) {
. clearCalculator();
. updateDisplay();
. return;
. }
.
. if (target.classList.contains('negative')) {
. inverseNumber();
. updateDisplay();
. return;
. }
.
. if (target.classList.contains('equals')) {
. performCalculation();
. updateDisplay();
. return;
. }
.
. if (target.classList.contains('operator')) {
. handleOperator(target.innerText)
. updateDisplay();
. return;
. }
.
. inputDigit(target.innerText);
. updateDisplay()
. });
. }
Jika kita buka index.html sekarang, seharusnya kalkulator sudah dapat
melakukan kalkulasi.
Selamat! Sejauh ini kita sudah bisa membuat aplikasi web dengan
memanfaatkan pengetahuan yang sudah kita pelajari. Selanjutnya kita akan
mengenal salah satu Web API yang menarik untuk diterapkan pada project
kalkulator kita
Kita sudah sampai di penghujung materi dari kelas ini. Selamat bagi Anda
yang sudah menguasai dasar dari tiga pilar pembentuk website. Pada materi
kali ini kita akan berkenalan mengenai salah satu web API yang menarik
untuk diterapkan pada proyek kalkulator, yakni Web Storage.
Data yang disimpan web storage tersedia berdasarkan domain. Artinya, data
pada suatu domain web hanya dapat diakses oleh domainnya itu sendiri. Web
storage dapat menampung sebesar 10MB untuk satu domain.
. if (typeof(Storage) !== "undefined") {
. // Browser mendukung sessionStorage/localStorage.
. } else {
. // Browser tidak mendukung sessionStorage/LocalStorage
. }
Seharusnya browser yang ada pada saat ini sudah mendukung kedua fitur
tersebut. Google Chrome dan Mozilla Firefox tentu memilikinya.
Session Storage
Tipe storage yang pertama adalah Session Storage yang mana digunakan
untuk menyimpan data sementara pada browser. Data akan hilang ketika
browser atau tab browser ditutup.
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Session Storage</title>
. </head>
.
. <body>
. <p>Anda sudah menekan tombol sebanyak <span id="count"></span> kali</p>
. <button id="button">Click Disini!</button>
.
. <script>
. const cacheKey = "NUMBER";
. if (typeof(Storage) !== "undefined") {
.
. // pengecekkan apakah data sessionStorage dengan key NUMBER
tersedia atau belum
. if (sessionStorage.getItem(cacheKey) === "undefined") {
. // Jika belum maka akan atur dengan nilai awal yakni 0
. sessionStorage.setItem(cacheKey, 0);
. }
.
. const button = document.querySelector("#button");
. const count = document.querySelector("#count");
. button.addEventListener('click', function(event) {
. let number = sessionStorage.getItem(cacheKey);
. number++;
. sessionStorage.setItem(cacheKey, number);
. count.innerText = sessionStorage.getItem(cacheKey);
. })
. } else {
. alert("Browser tidak mendukung Web Storage")
. }
. </script>
. </body>
.
. </html>
Bisa kita lihat bahwa data yang disimpan pada sessionStorage akan bertahan
jika terjadi reload pada browser, namun data tersebut akan hilang apabila tab
browser atau browser itu sendiri ditutup.
Local Storage
Tipe storage yang kedua adalah Local Storage yang serupa dengan session
storage, namun data yang disimpan tidak akan hilang bila browser atau tabs
browser ditutup. Kita bisa menghapus data pada local storage dengan
method removeItem().
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Local Storage</title>
. </head>
.
. <body>
. <p>Anda sudah menekan tombol sebanyak <span id="count"></span> kali</p>
. <button id="button">Click Disini!</button>
. <button id="clear">Hapus Storage</button>
.
. <script>
. const cacheKey = "NUMBER";
. if (typeof(Storage) !== "undefined") {
.
. // pengecekkan apakah data sessionStorage dengan key NUMBER
tersedia atau belum
. if (localStorage.getItem(cacheKey) === "undefined") {
. // Jika belum maka akan atur dengan nilai awal yakni 0
. localStorage.setItem(cacheKey, 0);
. }
.
. const button = document.querySelector("#button");
. const clearButton = document.querySelector("#clear")
. const count = document.querySelector("#count");
. button.addEventListener('click', function(event) {
. let number = localStorage.getItem(cacheKey);
. number++;
. localStorage.setItem(cacheKey, number);
. count.innerText = localStorage.getItem(cacheKey);
. });
.
. clearButton.addEventListener('click', function(event) {
. localStorage.removeItem(cacheKey);
. });
. } else {
. alert("Browser tidak mendukung Web Storage")
. }
. </script>
. </body>
.
. </html>
Pada gif di atas kita bisa mengetahui bahwa data yang disimpan
pada localStorage akan bertahan walaupun jendela browser atau tab browser
ditutup, untuk menghapus datanya bisa dengan tombol “Hapus Storage”
dimana tombol tersebut akan memanggil method localStorage.removeItem().
Bagaimana? Cukup mudah kan untuk menggunakan Web Storage?
Selanjutnya kita akan coba terapkan localStorage pada Web Kalkulator yang
kita buat untuk menampung riwayat kalkulasi yang pengguna lakukan.
Kita akan memisahkan berkas JavaScript yang akan kita buat kali ini dengan
yang sudah kita buat sebelumnya. Jadi untuk langkah awal silakan buka
kembali proyek kalkulator yang sudah kita buat, buat berkas JavaSript baru di
dalam folder assets kemudian beri nama “storage.js”.
. .......
. <div class="history card">
.
. </div>
.
. <script src="assets/kalkulator.js"></script>
. </body>
. <div class="history card">
. <h2>Riwayat Perhitungan</h2>
. <table>
. <thead>
. <tr>
. <th>Angka Pertama</th>
. <th>Operator</th>
. <th>Angka Kedua</th>
. <th>Hasil</th>
. </tr>
. </thead>
. <tbody id="historyList"></tbody>
. </table>
. </div>
. <!DOCTYPE html>
. <html>
.
. <head>
. <title>Web Calculator</title>
. <link rel="stylesheet" href="assets/style.css">
. <meta name="viewport" content="width=device-width, initial-scale=1.0">
. </head>
.
. <body>
. <div class="flex-container-column card">
. <div class="display">
. <h1 id="displayNumber">0</h1>
. </div>
. <div class="flex-container-row">
. <div class="button">7</div>
. <div class="button">8</div>
. <div class="button">9</div>
. <div class="button negative">+/-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">4</div>
. <div class="button">5</div>
. <div class="button">6</div>
. <div class="button operator">-</div>
. </div>
. <div class="flex-container-row">
. <div class="button">1</div>
. <div class="button">2</div>
. <div class="button">3</div>
. <div class="button operator">+</div>
. </div>
. <div class="flex-container-row">
. <div class="button clear">CE</div>
. <div class="button">0</div>
. <div class="button equals double">=</div>
. </div>
. </div>
. <div class="history card">
. <h2>Riwayat Perhitungan</h2>
. <table>
. <thead>
. <tr>
. <th>Angka Pertama</th>
. <th>Operator</th>
. <th>Angka Kedua</th>
. <th>Hasil</th>
. </tr>
. </thead>
. <tbody id="historyList"></tbody>
. </table>
. </div>
.
. <script src="assets/kalkulator.js"></script>
. </body>
.
. </html>
Sebelumnya kita sudah membuat elemen tabel yang nantinya akan menjadi
tempat informasi riwayat kalkulasi, namun tampilannya masih kurang baik.
Kita akan merombaknya dengan menerapkan CSS pada elemen tersebut.
. .history {
. width: 80%;
. margin: 30px auto 0 auto;
. overflow: scroll;
. }
. table {
. border-collapse: collapse;
. border-spacing: 0;
. width: 100%;
. border: 1px solid #ddd;
. }
. th,
. td {
. text-align: center;
. padding: 16px;
. }
Lalu kita tambahkan rule berikut untuk menerapkan backgroud-color pada
element <th> dan <tr>, sementara untuk elemen <tr> kita
manfaatkan pseudo-class dalam selectornya.
. th {
. background-color: orange;
. color: white;
. }
.
. tr:nth-child(even) {
. background-color: #d2d2d2;
. }
. * {
. box-sizing: border-box;
. }
.
. body {
. font-family: sans-serif;
. }
.
. .flex-container-column {
. display: flex;
. /* properti pendukung */
. flex-direction: column;
. max-width: 800px;
. margin: 0 auto;
. text-align: right;
. }
.
. .flex-container-row {
. display: flex;
. }
.
. .button {
. flex-basis: 25%;
. /* properti pendukung */
. font-size: 1.5em;
. text-align: center;
. padding: 40px;
. border: 1px solid black;
. background: -webkit-linear-gradient(top, #d2d2d2, #ddd);
. cursor: pointer;
. }
.
. .double {
. flex-basis: 50%;
. }
.
. .display {
. color: white;
. width: 100%;
. padding: 10px 20px;
. background-color: #333333;
. border: 1px solid black;
. font-size: 2em;
. }
.
. .operator,
. .negative,
. .equals {
. background: orange;
. }
.
. .card {
. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
. border-radius: 5px;
. padding: 30px;
. margin-top: 20px;
. }
.
. .button:hover {
. font-weight: bold;
. }
.
. .history {
. width: 80%;
. margin: 30px auto 0 auto;
. overflow: scroll;
. }
.
. table {
. border-collapse: collapse;
. border-spacing: 0;
. width: 100%;
. border: 1px solid #ddd;
. }
.
. th,
. td {
. text-align: center;
. padding: 16px;
. }
.
. th {
. background-color: orange;
. color: white;
. }
.
. tr:nth-child(even) {
. background-color: #d2d2d2;
. }
.
. @media screen and (max-width: 513px) {
. .button {
. padding: 10px;
. }
. .history {
. width: 100%;
. }
. }
. ....
. <script src="assets/storage.js"></script>
. <script src="assets/kalkulator.js"></script>
. </body>
. const CACHE_KEY = "calculation_history";
Variabel ini digunakan sebagai key untuk mengakses dan menyimpan data
pada localStorage.
. function checkForStorage() {
. return typeof(Storage) !== "undefined"
. }
Lalu kita buat juga fungsi untuk menyimpan data riwayat kalkulasi
pada localStorage. Fungsi tersebut memiliki satu argumen yang merupakan
data dari hasil kalkulasi yang nantinya akan dimasukkan ke
dalam localStorage.
. function putHistory(data) {
. if (checkForStorage()) {
. let historyData = null;
. if (localStorage.getItem(CACHE_KEY) === null) {
. historyData = [];
. } else {
. historyData = JSON.parse(localStorage.getItem(CACHE_KEY));
. }
.
. historyData.unshift(data);
.
. if (historyData.length > 5) {
. historyData.pop();
. }
.
. localStorage.setItem(CACHE_KEY, JSON.stringify(historyData));
. }
. }
Banyak istilah kode yang asing pada kode di atas. Mari kita lihat satu per
satu.
. [
. {
. "firstNumber": "23",
. "secondNumber": "15",
. "operator": "-",
. "result": 8
. },
. {
. "firstNumber": "23",
. "secondNumber": "6",
. "operator": "-",
. "result": 17
. }
. ]
Selanjutnya kita buat fungsi untuk mendapatkan data dari localStorage. Kita
namakan fungsi tersebut “showHistory().”
. function showHistory() {
. if (checkForStorage()) {
. return JSON.parse(localStorage.getItem(CACHE_KEY)) || [];
. } else {
. return [];
. }
. }
. function renderHistory() {
. const historyData = showHistory();
. let historyList = document.querySelector("#historyList");
.
.
. // selalu hapus konten HTML pada elemen historyList agar tidak
menampilkan data ganda
. historyList.innerHTML = "";
.
.
. for (let history of historyData) {
. let row = document.createElement('tr');
. row.innerHTML = "<td>" + history.firstNumber + "</td>";
. row.innerHTML += "<td>" + history.operator + "</td>";
. row.innerHTML += "<td>" + history.secondNumber + "</td>";
. row.innerHTML += "<td>" + history.result + "</td>";
.
.
. historyList.appendChild(row);
. }
. }
. renderHistory();
. const history = {
. firstNumber: calculator.firstNumber,
. secondNumber: calculator.displayNumber,
. operator: calculator.operator,
. result: result
. }
. function performCalculation() {
. if (calculator.firstNumber == null || calculator.operator == null) {
. alert("Anda belum menetapkan operator");
. return;
. }
.
. let result = 0;
. if (calculator.operator === "+") {
. result = parseInt(calculator.firstNumber)
+ parseInt(calculator.displayNumber);
. } else {
. result = parseInt(calculator.firstNumber)
- parseInt(calculator.displayNumber)
. }
.
. // objek yang akan dikirimkan sebagai argumen fungsi putHistory()
. const history = {
. firstNumber: calculator.firstNumber,
. secondNumber: calculator.displayNumber,
. operator: calculator.operator,
. result: result
. }
. putHistory(history);
. calculator.displayNumber = result;
. renderHistory();
. }
Pada tahap ini seharusnya kalkulator kita sudah dapat menampilkan riwayat
kalkulasi yang dilakukan pengguna.
Submission
Selamat, akhirnya Anda telah sampai di penghujung pembelajaran. Anda
telah mempelajari dasar HTML, penerapan semantic elemen,
menerapkan styling menggunakan CSS, dan layouting menggunakan float
ataupun flexbox. Anda juga sudah mengerjakan semua latihan yang diberikan
pada kelas ini.
Untuk bisa lulus dan mendapatkan sertifikat dari akademi ini, Anda harus
mengerjakan tugas Halaman Website yang menerapkan semantic
meaning. Tim reviewer akan memeriksa pekerjaan Anda dan
memberikan review pada proyek yang Anda buat.
Kriteria Submission
Berikut kriteria submission yang harus Anda penuhi:
Berikut sketsa dari struktur website yang bisa dijadikan referensi untuk
mengerjakan submission:
Bintang 4: Semua ketentuan terpenuhi dan memiliki tampilan yang
menarik.
Ketentuan:
Di dalam folder proyek tersebut terdiri dari HTML, CSS, JS atau
aset yang Anda gunakan dalam halaman web yang Anda buat.
Mengirimkan submission dalam bentuk folder Proyek, yang
diarsipkan dalam format ZIP.
Tim reviewer akan mengulas submission Anda dalam waktu
selambatnya 3 (tiga) hari kerja (tidak termasuk Sabtu, Minggu, dan hari
libur nasional).
Tidak disarankan untuk melakukan submit berkali-kali karena akan
memperlama proses penilaian.
Perhatian!
Sesuai dengan terms of use di Dicoding, submission kelas Dicoding
Academy haruslah hasil karya Anda sendiri.
Kode yang didapatkan dari sumber lain (website, buku, forum, GitHub, dan
lain-lain) hanya digunakan sebagai referensi. Tingkat kesamaannya tidak
boleh lebih dari 70%.