CSS
Fungsi CSS adalah sebagai 'baju' atau 'dekorator' dari sebuah website.
Apabila di dokumen HTML itu terdapat konten CSS maka browser akan memproses CSS tersebut dan
menampilkan design sesuai dengan apa yang telah ditentukan.
Selain HTML dan CSS, ada juga bahasa JavaScript yang akan kita pelajari untuk membuat sebuah
tampilan website yang interaktif. Secara fungsi, ketiga bahasa tersebut bisa dianalogikan seperti ini:
HTML CSS JS
Fungsi HTML adalah sebagai 'kerangka', yang memberi struktur pada website.
Fungsi CSS sebagai 'baju' , yang memberi warna dan layout pada website.
Inline CSS
Ada 3 cara untuk menyisipkan CSS ke dalam HTML, yaitu:
Inline CSS, yaitu menggunakan attribute style untuk menyisipkan kode CSS langsung di dalam HTML
element.
Internal CSS, yaitu menggunakan element <style> untuk menyisipkan kode CSS. Element <style>
tersebut diletakkan di dalam element .
External CSS, yaitu sebuah file CSS terpisah yang disambungkan dengan file HTML dengan
menggunakan element <link>.
Inline CSS
Inline CSS adalah cara kita memberikan attribute style kepada sebuah element dengan menyisipkannya
langsung di dalam element HTML tersebut.
Contoh:
<!DOCTYPE html>
<html>
<head>
<title>
Website Pertamaku
</title>
</head>
<body>
<h1 style="color:blue;">Selamat Datang</h1>
</body>
</html>
Contoh di atas akan menghasilkan teks Selamat Datang di dalam element <h1> berwarna biru.
Internal CSS
Internal CSS menggunakan element <style> untuk menyisipkan kode CSS. Element <style> diletakkan di
dalam element <head>.
Contoh:
<!DOCTYPE html>
<html>
<head>
<title>Website Pertamaku</title>
<style>
body {
background-color: yellow;
}
h1 {
color: blue;
}
p{
color: red;
}
</style>
</head>
<body>
<h1>Website Pertamaku</h1>
<p>Selamat Datang</p>
</body>
</html>
Contoh di atas akan menghasilkan <body> dengan latar belakang berwarna kuning, tulisan di dalam <h1>
berwarna biru, dan tulisan di dalam <p> berwarna merah.
External CSS
External CSS adalah cara menyisipkan kode CSS dengan cara membuat file CSS terpisah, dan lalu
menyambungkannya dengan file HTML dengan menggunakan element <link>. Element <link> tersebut
diletakkan di dalam element <head>.
Contoh:
Kita memiliki dua file: index.html untuk file HTML-nya dan styles.css untuk file CSS-nya.
Kelebihan lain dari menyisipkan kode CSS dengan cara external CSS adalah kita bisa menyisipkan
beberapa external CSS file di halaman website kita.
Contoh:
Misalnya kita mempunyai 2 CSS file style1.css dan style2.css dan kita ingin menyisipkan kedua file ini
ke dalam index.html.
File CSS tersebut juga bisa kita gunakan di lebih dari satu file HTML. Jadi kalau kita punya dua atau tiga
halaman yang mirip, kita cukup menambahkan element <link> pada setiap halaman tersebut.
Satu kelemahan dari menggunakan cara ini adalah jika kita memiliki beberapa file CSS yang cukup besar,
browser perlu mendownload semua file itu terlebih dahulu. Jadi untuk sesaat di awal mungkin tampilan
website kita akan terlihat aneh sampai semua file CSS-nya selesai dibaca oleh browser.
CSS Syntax
CSS Syntax adalah syntax yang digunakan untuk menunjuk atau memilih HTML element mana yang
ingin diberi style (dihias). CSS syntax terdiri dari selector, property, dan value.
Selector adalah vas bunga, yaitu benda (HTML element, misal paragraf) mana yang akan dihias.
Property adalah bagian mana dari vas bunga (dalam HTML misal, setiap huruf dari paragraf) yang akan
dihias, dalam kasus ini berarti warna dari vas tersebut.
Value adalah warna merah, yaitu nilai atau hiasan 'berupa apa' yang akan diberikan ke vas bunga.
Contoh:
Misalnya kita memiliki element paragraf <p> yang ingin kita ubah menjadi warna biru. Caranya mirip
dengan yang seperti di gambar:
Contoh:
<div>
<p>Namaku Sarah</p>
<p>Saya tinggal di Indonesia</p>
</div>
Kita juga bisa kita menunjuk semua element yang ada di dalam suatu element.
Contoh:
<div>
<p>Namaku</p>
<p>
<span>Sarah</span>
</p>
</div>
Kenapa element <span> yang itu juga berlatar belakang kuning? Karena itu juga berada di dalam element
<div> yang pertama. Jadi selector CSS div * itu menunjuk ke semua element yang berada di dalam
sebuah <div>.
Contoh:
<div>
<p>Namaku Sarah</p>
<p>Saya tinggal di Indonesia</p>
</div>
📝 Catatan:
Satu element hanya bisa mempunyai satu buah id. Dan sebuah id sebaiknya tidak digunakan dalam lebih
dari satu element pada tiap halaman.
Contoh:
<div class="highlight">
<p id="firstParagraph">Namaku Sarah</p>
<p id="secondParagraph">Saya tinggal di Indonesia</p>
</div>
#secondParagraph {
border: solid pink;
}
Element dengan id firstParagraph sekarang akan memiliki kotak berwarna kuning di sekitarnya.
Sedangkan element dengan id secondParagraph memiliki kotak yang berwarna merah muda.
📝 Catatan:
class bisa digunakan dalam lebih dari satu element. Serta sebuah element bisa memiliki lebih dari satu
class.
Contoh:
<div class="highlight">
<p>Saya tinggal di benua Asia</p>
<p>Persisnya di Indonesia</p>
</div>
Contoh:
Selain itu, kita juga bisa memberikan style pada element yang memiliki nilai tertentu pada attributenya.
Contoh:
Contoh:
#container yang menunjuk kepada element <div> yang memiliki id bernilai container.
p yang menunjuk kepada element <p>.
Karena dua selector tersebut dipisah oleh sebuah spasi, maka artinya adalah semua element <p> yang ada
di dalam <div> dengan id bernilai container akan diberi latar belakang berwarna kuning.
Jadi bedakan kedua hal tersebut ya: kalau dipisah dengan spasi, berarti artinya semua element di dalam;
kalau dipisah dengan tanda ">" artinya semua element yang merupakan child.
Dan masih banyak lagi kombinasi lainnya untuk memberikan style kepada child element. Kita akan
mempelajarinya di topik-topik selanjutnya.
Contoh:
<h2>Cara Reservasi</h2>
<p>Reservasi bisa dilakukan dengan menghubungi nomor 08122282xxx</p>
</body>
/* Pada File CSS */
h1,
h2 {
color: red;
}
Pada kode CSS tersebut, teks di dalam element <h1> dan <h2> akan diberi warna merah. Jadi kalau nanti
kalian menambahkan property lain, hal tersebut akan berefek ke kedua element tersebut.
Pseudo-class
Perhatikan animasi di bawah ini:
Dari contoh animasi di atas, kita bisa melihat ketika kursor mouse kita melewati (hover) link-link
tersebut, maka akan muncul kotak berwarna merah. Ketika kursor mouse tidak lagi ada di link-link
tersebut, maka kotak merah akan hilang. Efek tersebut dihasilkan oleh sebuah pseudo-class.
pseudo-class digunakan untuk mendefinisikan keadaan khusus pada suatu element. Contoh:
selector:pseudo-class {
property: nilai;
}
Perhatikan syntax di atas, setelah selector, kita menggunakan titik dua (:) sebagai pertanda bahwa
selanjutnya kita akan menggunakan pseudo-class.
Ada banyak sekali pseudo-class. Kali ini, kita akan membahas beberapa di antaranya yang sering
digunakan.
:hover
:hover digunakan untuk memberikan style pada element ketika kursor kalian melewati suatu element.
Contoh:
:nth-child(number)
:nth-child(number) digunakan untuk memberikan style pada element yang merupakan child kesekian dari
parent elementnya.
Contoh:
<div>
<p>Kalau mudik ke Jawa Barat</p>
<div>
</body>
/* Pada File CSS */
p:nth-child(2) {
background-color: pink;
}
Pada contoh di atas, p:nth-child(2) menunjuk kepada element <p> yang merupakan child kedua dari
parentnya -- dalam contoh di atas adalah teks "Saya warga negara Indonesia" karena ia merupakan child
kedua dari element <body>.
📝 Catatan:
Penghitungan child selalu dimulai dari 1 untuk child pertama, 2 untuk child kedua, dan seterusnya.
Pseudo-element
pseudo-element CSS digunakan untuk memberikan style pada bagian tertentu dari suatu element.
Contoh:
selector::pseudo-element {
property: nilai;
}
Perhatikan syntax di atas, setelah selector, kita menggunakan titik dua ganda (::) sebagai penanda bahwa
selanjutnya kita akan menggunakan pseudo-element.
Pseudo-element Deskripsi
::before Menyisipkan suatu konten sebelum element dari selector
::after Menyisipkan suatu konten setelah element dari selector
::selection Memberikan style pada bagian element yang diselect oleh pengguna
::first-letter Memberikan style pada huruf pertama pada element dari selector
::first-line Memberikan style pada baris pertama pada element dari selector
Mari kita bahas satu-persatu.
::before
::before digunakan untuk menyisipkan suatu konten sebelum element yang dipilih.
Contoh:
Kita akan menyisipkan sepotong kata berupa link pada sebelum tiap-tiap element <a>.
<!DOCTYPE html>
<html>
<head>
<style>
a::before {
content: "Link - ";
}
</style>
</head>
<body>
<ul>
<li><a href="#">Download part 1</a></li>
<li><a href="#">Download part 2</a></li>
<li><a href="#">Download part 3</a></li>
</ul>
</body>
</html>
Hasilnya bukan lagi seperti ini
Download part 1
Download part 2
Download part 3
::after
Mirip dengan ::before, ::after digunakan untuk menyisipkan suatu konten setelah element tertentu.
::selection
::selection digunakan untuk memberikan style pada bagian element yang diselect oleh pengguna.
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
h1::selection {
color: white;
background: black;
}
p::selection {
color: red;
background: yellow;
}
</style>
</head>
<body>
<h1>Cerita Hari ini</h1>
<p>
Aku senang sekali hari ini karena mendapatkan nilai sempurna pada
pelajaran programming.
</p>
</body>
</html>
Cobalah untuk meng-highlight teks dengan kursor mouse anda, maka bagian teks yang dihighlight akan
memiliki warna background sesuai kode CSS kita.
::first-letter
::first-letter digunakan untuk memberikan style pada huruf pertama dari selector yang terpilih.
Tidak semua properti CSS dapat digunakan dengan ::first-letter. Beberapa yang bisa digunakan adalah:
font
color
background
margin
padding
border
text-decoration
line-height
float
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
p::first-letter {
font-size: 50px;
color: red;
}
</style>
</head>
<body>
<h1>Cerita Hari ini</h1>
<p>
Aku senang sekali hari ini karena mendapatkan nilai sempurna pada
pelajaran programming.
</p>
</body>
</html>
Kode di atas akan memperbesar huruf A pada "Aku" menjadi 50px dan memberinya warna merah.
::first-line
::first-line digunakan untuk memberikan style pada baris pertama dari selector terpilih.
Properti CSS yang bisa dan sering digunakan dengan ::first-line adalah:
font
background
word-spacing
letter-spacing
text-transform
line-height
color
📝 Catatan:
Kalau kita berpikir "Kan ukuran tiap layar komputer dan smartphone itu beda-beda, nanti baris pertama
juga beda-beda dong?" Benar sekali, baris pertama untuk tiap ukuran layar itu berbeda-beda. Coba simak
contoh berikut ini.
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
p::first-line {
color: red;
}
</style>
</head>
<body>
<h1>Cerita Hari ini</h1>
<p>
Aku senang sekali hari ini karena mendapatkan nilai sempurna pada
pelajaran programming. Ternyata jerih payahku belajar dari seminggu yang lalu terbayarkan hari ini.
Tapi pada saat yang bersamaan aku juga merasa sedih karena teman dekatku sedang sakit. Dia tidak
masuk sekolah hari ini.
</p>
</body>
</html>
Berapapun ukuran layar kita, browser akan otomatis memberi warna merah kepada hanya baris pertama
saja.
Definisi Box Model
Apa Itu Box Model?
Jadi, semua HTML element itu dianggap sebagai sebuah kotak (box). Karena hal inilah istilah box model
muncul.
Box model sendiri bisa kalian anggap sebagai kotak yang membungkus setiap HTML element.
margin yaitu area terluar yang kosong setelah border. Margin bersifat transparan.
border yaitu garis tepi yang membungkus padding dan konten.
padding yaitu area kosong di antara konten dan border. Padding bersifat transparan.
content yaitu konten (value/nilai) dari HTML element. Bisa berupa teks, gambar, video, ataupun suara.
Jika digambarkan, box model berbentuk seperti ini:
Mari kita coba tulis kode HTML dan CSSnya, agar terlihat lebih nyata.
<!DOCTYPE html>
<html>
<head>
<style>
p{
background-color: lightgrey;
width: 300px;
height: 100px;
border: 15px solid black;
padding: 50px;
margin: 20px;
}
</style>
</head>
<body>
<h2>Contoh Box Model</h2>
<p>
Tulisan ini adalah konten dari box. Konten sendiri memiliki lebar
(width) sebesar 300px dan tinggi (height) sebesar 100px. Pada box, kita
menambahkan padding sebesar 50px, border berwarna hitam sebesar 15px,
dan margin sebesar 20px.
</p>
</body>
</html>
Hasilnya akan seperti di bawah.
Kalau kalian lihat ada kotak berwarna hitam tebal, itu adalah border dari element <p> kita yang sudah
kita atur ketebalannya menjadi 15px.
Ada juga sedikit jarak di antara border dan teks "Contoh Box Model". Jarak itu adalah margin dari
element <p> kita.
Nah jarak di antara border dan content kita itulah padding dari element <p> kita.
<!DOCTYPE html>
<html>
<head>
<style>
p{
background-color: lightgrey;
width: 300px;
height: 100px;
border: 15px solid black;
padding: 50px;
margin: 20px;
}
</style>
</head>
<body>
<h2>Contoh Box Model</h2>
<p>
Tulisan ini adalah konten dari box. Konten sendiri memiliki lebar
(width) sebesar 300px dan tinggi (height) sebesar 100px. Pada box, kita
menambahkan padding sebesar 50px, border berwarna hitam sebesar 15px,
dan margin sebesar 20px.
</p>
</body>
</html>
Jika kita perhatikan kode di atas, properti width dan height yang kita tulis berfungsi untuk mengatur lebar
dan tinggi dari konten dalam element <p>, bukan lebar dan tinggi dari seluruh element <p> itu sendiri.
Dari kode di atas, total lebar box yang mengelilingi element <p> sebenarnya adalah:
Lebar box = lebar konten (width) + padding kiri (left padding) + padding kanan (right padding) + border
kiri (left border) + border kanan (right border) + margin kiri (left margin) + margin kanan (right margin)
Lebar box = 300px + 50px + 50px + 15px + 15px + 20px + 20px = 470px
Tinggi box = 100px + 50px + 50px + 15px + 15px + 20px + 20px = 270px
box-sizing: border-box
Kita sudah mempelajari bagaimana cara menghitung lebar dan tinggi box.
Biar kita ingat apa itu border dan padding, mari kita perhatikan struktur box model di HTML sekali lagi:
Kenapa margin tidak ikut diperhitungkan ketika menentukan lebar dan tinggi dari sebuah element?
Margin itu hanyalah ruang di luar element untuk menentukan jaraknya dengan element lain. Meskipun ia
adalah bagian dari box sebuah element, ia bukan bagian dari element itu sendiri.
Misalnya kita mempunyai sebuah <div> dengan lebar 600px. Lalu di dalamnya kita isi dengan empat
<img> yang masing-masing memiliki lebar 150px.
<!DOCTYPE html>
<html>
<head>
<title>Inline CSS</title>
</head>
<style>
div {
width: 600px;
background: lightblue;
}
img {
width: 150px;
background: lightgreen;
}
</style>
<body>
<div>
<img src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/cat.jpg"
/><img src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/cat.jpg"
/><img src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/cat.jpg"
/><img src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/cat.jpg"
/>
</div>
</body>
</html>
Tanpa tambahan border dan padding tentu ke-empat gambar tersebut akan ditempatkan berderet dalam
satu baris seperti ini.
Tetapi ketika salah satu (atau semua) dari element tersebut memiliki border atau padding (katakanlah
padding: 10px dan border: 2px solid black)
<style>
img {
width: 150px;
background: lightgreen;
padding: 10px;
border: 2px solid black;
}
</style>
mereka tidak lagi bisa ditempatkan seperti di atas. Melainkan seperti di bawah ini sekarang.
Mengapa begitu?
Sebab sekarang lebar dari satu buah element <img> pada contoh di atas bukan lagi 150px. Melainkan
100px ditambah lebar padding dan border di kiri dan kanan. Jadi lebar element sekarang adalah 150px +
(2 x 10px) + (2 x 2px) atau sama dengan 174px.
Tentu empat buah element dengan lebar 174px tidak akan muat di dalam <div> dengan lebar 600px.
Makanya pada ilustrasi di atas ada satu gambar yang harurs ditempatkan di baris berikutnya.
"Lalu bagaimana solusinya kalau kita ingin semua gambar kucing tersebut tetap ditempatkan dalam satu
baris?"
Cara manual tentu adalah mengurangi nilai dari properti width pada <img> menjadi 126px sehingga jika
ditambahkan dengan lebar padding dan border kiri dan kanan, totalnya akan menjadi 150px.
Tapi kan repot kalau harus menghitung seperti itu. Apalagi kalau kita ingin mengubah besar padding dan
bordernya; kan berarti kita harus menghitung ulang semuanya.
Nah daripada capek-capek begitu, ada satu properti CSS yang dapat membantu kita untuk
menyederhanakan perhitungan tadi.
box-sizing
Sebenarnya nama "box-sizing" itu kurang tepat, sebab ia tidak mengatur ukuran dari box, melainkan
ukuran dari element. Properti box-sizing itu menentukan bagaimana cara menghitung tinggi dan lebar dari
sebuah element.
Secara default, semua element HTML memiliki properti box-sizing: content-box. Seperti yang dijelaskan
di awal tadi, pemberian properti width dan height itu hanya mempengaruhi lebar dan tinggi dari konten
suatu element.
Tapi kan kita lihat mulai ada kesulitan saat adanya border dan padding pada suatu element. Apa
alternatifnya? Ada nilai lain yang mungkin, yaitu border-box.
Saat kita memberi properti box-sizing: border-box pada sebuah element, pemberian properti width dan
height tidak lagi menentukan lebar dan tinggi dari konten, melainkan lebar dan tinggi dari element.
<!DOCTYPE html>
<html>
<head>
<title>Inline CSS</title>
</head>
<style>
div {
width: 600px;
background: lightblue;
}
img {
width: 150px;
background: lightgreen;
padding: 10px;
border: 2px solid black;
Sekarang setiap element <img> memiliki lebar 150px dengan border setebal 2px dan padding sebesar
10px.
Benar sekali. Saat kita memberi properti box-sizing: border-box pada sebuah element, ukuran dari konten
di dalamnya akan menyesuaikan dengan tinggi dan lebar element.
Dalam kasus di atas, lebar element kan 150px. Besar padding dari kedua sisi kanan dan kiri adalah 2 x
10px atau 20px. Besar border dari kedua sisi kanan dan kiri adalah 2 x 2px atau 4px. Sekarang lebar dari
konten adalah "sisa" lebarnya. Dengan kata lain 150px - 20px - 4px atau sama dengan 126px.
Misalkan kita ingin memperbesar padding dari element <img> menjadi 30px seperti ini
<style>
img {
width: 150px;
background: lightgreen;
/* perbesar paddingnya */
padding: 30px;
border: 2px solid black;
box-sizing: border-box;
}
</style>
Sekarang ukuran dari konten akan mengecil untuk menjaga lebar dari element tetap 150px.
Bayangkan ada sebuah menu yang akan ditampilkan jika kita menekan sebuah tombol seperti ini
display: none
Dengan mengganti-ganti nilai dari properti display, kita bisa mengatur untuk ditampilkan atau tidaknya
element menu itu.
Tapi kalian tahu tidak? Kalau kita menggunakan properti display: none, tampilan dari element di
sekitarnya juga ikut berubah. Kenapa? Saat kita menggunakan properti itu, halaman web kita akan
ditampilkan seolah-olah element tersebut tidak ada. Coba simak ilustrasi berikut ini.
Ada sebuah tombol yang jika ditekan akan menyembunyikan dan menampilkan gambar di samping
paragraf.
Kelihatan kan kalau paragraf tersebut tampilannya berubah jika gambarnya hilang? Ketika gambarnya
ditampilkan lagi, element paragraf kembali seperti di awal. Hal ini tidak hanya terlihat buruk, tapi
pengunjung web kita akan merasa tidak nyaman karena paragrafnya berubah-ubah dan sulit membacanya.
visibility: hidden
Untuk mengatasi masalah ini, ada properti CSS lain yang fungsinya mirip dengan display, yaitu visibility.
Properti visibility mengatur ditampilkan atau tidaknya sebuah element.
Coba lihat ilustrasi berikut ini. Tiap kali kita menekan tombol, properti visibility dari gambar akan
berganti antara hidden (tidak ditampilkan) dan visible (ditampilkan).
Perbedaannya dengan display: none terletak di bagaimana ia mempengaruhi posisi element di sekitarnya.
Saat kita memberi nilai hidden pada properti visibility si gambar, ia akan tidak ditampilkan, namun ruang
yang tadinya ia tempati tetap akan ada di situ. Karena ruang yang ia tempati masih ada, element paragraf
di sebelahnya tidak akan berubah posisi. Hal ini akan membuat pengunjung web merasa lebih nyaman
saat membaca paragrafnya.
display: inline
Setelah belajar display: block, kalian mungkin bertanya-tanya:
"Bagaimana kalau saya ingin menempatkan beberapa element dalam satu baris yang sama?"
Inline-Level Element
Setelah block-level element seperti <div> dan <p>, ada juga element seperti <span> dan <img> yang
merupakan inline-level element. Apa lagi tuh? Inline-level element merupakan element yang secara
default memiliki properti display: inline.
Keberadaan properti display: inline pada sebuah element akan membuat ukuran box dari element tersebut
tidak lagi sebaris penuh seperti dalam kasus display: block, melainkan hanya sebesar konten di dalamnya
saja. Hal ini memungkinkan adanya element lain untuk ditempatkan di sebelah element dengan display:
inline ini.
Salah satu contoh inline-level element yang kalian mungkin masih ingat dari kelas HTML adalah <span>.
Mirip seperti <p>, element <span> menampilkan sebuah teks. Bedanya, box dari element <span> hanya
sebesar konten dari element itu saja; tidak sebaris penuh seperti <p>.
<!DOCTYPE html>
<html>
<head>
<style>
.green-text {
background: lightgreen;
}
.blue-text {
background: lightblue;
}
</style>
</head>
<body>
<p class="green-text">Teks dengan latar belakang hijau</p>
<p class="blue-text">Teks dengan latar belakang biru</p>
<span class="green-text">Teks dengan latar belakang hijau</span>
<span class="blue-text">Teks dengan latar belakang biru</span>
</body>
</html>
Hasilnya akan seperti ini:
Untuk kedua element <p>, meskipun panjang teksnya hanya sekitar 2/3 dari panjang baris, box mereka
tetap memenuhi satu baris penuh. Sebab <p> adalah block-level element.
Sementara untuk <span> dengan latar belakang hijau, ukuran box hanya selebar teks "Teks dengan latar
belakang hijau" saja. Oleh karena itu ada ruang sedikit di sebelah kanannya yang bisa diisi oleh element
<span> dengan latar belakang warna biru.
<a>
<img>
<label> dan <input>
<select>
Lebar dan Tinggi Element dengan display: inline
Oh iya, ada satu hal yang perlu kalian ingat saat menggunakan properti display: inline. Element yang kita
beri properti itu tidak bisa diatur lebar maupun tingginya.
Kalau kita ambil kode di atas dan menambahkan properti height pada class blue-text dan green-text
seperti ini:
<style>
.green-text {
background: lightgreen;
height: 30px;
}
.blue-text {
background: lightblue;
height: 30px;
}
</style>
Element <p> tentu akan berubah tingginya. Namun tinggi dari element <span> tidak berubah karena
secara default ia memang memiliki properti display: inline. Jadi kalaupun kita menambahkan properti
tinggi padanya, tingginya tidak akan terpengaruh.
display: inline-block
Setelah mempelajari display: inline dan display: block, kalian mungkin berpikir?
"Kalau saya ingin mengatur tinggi lebar element kan pakai display: block, tapi jadi tidak bisa
bersebelahan dengan element lain.
Untuk bisa bersebelahan, saya cukup pakai display: inline, tapi sekarang saya tidak bisa mengatur tinggi
lebarnya dong. Jadi pilih yang mana dong?"
Selain inline dan block, properti display memiliki nilai lain yang bisa menyelesaikan permasalahan di
atas.
display: inline-block
Berbeda dengan element yang memiliki properti display: inline di mana lebar dan tinggi element tidak
dapat kita atur, element dengan display: inline-block bisa kita atur lebar dan tingginya.
Berbeda juga dengan element dengan properti display: block yang selalu mengambil penuh ruang dalam
satu baris, element dengan display: inline-block secara default hanya akan mengambil ruang sebesar
konten di dalamnya. Dengan adanya sisa ruang di sebelah kiri atau kanannya, element dengan display:
inline-block bisa ditempatkan bersebelahan dengan yang lainnya.
<!DOCTYPE html>
<html>
<head>
<title>Inline CSS</title>
<style>
h1 {
display: inline-block;
background: lightblue;
}
</style>
</head>
<body>
<h1 id="demo1">Saya bahagia</h1>
<h1 id="demo2">karena besok libur</h1>
</body>
</html>
Sekilas element <h1> terlihat seperti saat menggunakan display: inline: yaitu bersebelahan dengan
element lainnya.
Namun perbedaannya akan terlihat apabila kita mulai menambahkan tinggi dan lebar pada element
tersebut. Misalnya kita menambahkan properti width dan height seperti di bawah ini.
<style>
h1 {
display: inline-block;
background: lightblue;
}
#demo1 {
width: 150px;
height: 100px;
}
#demo2 {
width: 200px;
height: 150px;
}
</style>
Tinggi dan lebar dari element <h1> akan berubah mengikuti nilai yang kita berikan. Element dengan
display: inline tidak melakukan hal seperti ini.
Jadi dari penjelasan dan contoh di atas, kita bisa simpulkan bahwa properti inline-block itu seperti
persilangan antara inline dan block.
Ada beberapa karakteristik dari inline dan beberapa dari block yang diikuti saat kita menggunakan inline-
block, antara lain:
lebar box sebanding lebar dari konten di dalamnya; tidak sebaris penuh.
element dengan display: inline atau display: inline-block bisa ditempatkan di sebelah kiri atau kanannya.
jika kita memberikan nilai untuk properti height dan width, ia akan mengikutinya.
position: static
Secara default, seluruh properti position dari HTML element memiliki nilai static. Element dengan
properti tersebut tidak akan terpengaruh oleh properti top, bottom, left, dan right. Element tersebut akan
selalu berada sesuai dengan alur normal penempatan element dalam halaman web.
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
.container {
background: lightgreen;
width: 600px;
height: 150px;
}
.yellow-boxes {
display: inline-block;
margin: 10px;
background: yellow;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="container">
<div class="yellow-boxes" style="top: 20px;"></div>
<div class="yellow-boxes" style="right: 20px;"></div>
<div class="yellow-boxes" style="bottom: 20px;"></div>
<div class="yellow-boxes" style="left: 20px;"></div>
</div>
</body>
</html>
Keempat kotak kuning akan ditempatkan sebagaimana mestinya tanpa ada perubahan posisi.
Mungkin untuk sekarang kalian belum lihat perbedaannya. Pada topik selanjutnya kalian akan belajar
position: relative
position: relative
Element dengan posisi relative akan diposisikan relatif dari posisi normalnya. Kita bisa memberikan
properti top, right, bottom, dan left pada element dengan posisi relative. Element lain di sekitar element
dengan posisi relative tidak akan disesuaikan dengan ruang yang ditinggalkan oleh element.
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
.inline-block {
background: blue;
width: 100px;
height: 100px;
margin: 4px;
display: inline-block;
}
</style>
</head>
<body>
<div>
<div class="inline-block"></div>
<div class="inline-block"></div>
<div class="inline-block"></div>
</div>
</body>
</html>
Kode di atas akan menampilkan tiga buah kotak berukuran 100px x 100px berwarna biru dalam satu
baris.
position: absolute
Element dengan posisi absolute akan diposisikan relative dengan posisi ancestor terdekat yang posisinya
bukan static.
<div id="C">
<div id="B">
dan <div id="A">
Ketiga itu merupakan ancestor dari element <div id="D">. Sebab kalau kalian gambar diagram
pohonnya, ketiga element tersebut memiliki posisi yang lebih di atas dan terhubung langsung element
<div id="D">.
position: absolute
Sekarang coba perhatikan kode di bawah ini:
<!DOCTYPE html>
<html>
<head>
<style>
.small-square {
position: absolute;
right: 0;
height: 80px;
width: 80px;
background: yellow;
}
.medium-square {
height: 200px;
width: 300px;
background: red;
}
.big-square {
position: relative;
height: 400px;
width: 400px;
background: deepskyblue;
}
</style>
</head>
<body>
<div class="big-square">
<div class="medium-square">
<div class="small-square"></div>
</div>
</div>
</body>
</html>
Element <div class="small-square"> memiliki properti position:absolute dan right:0.
Sementara kalau kita analisa, yang manakah ancestor terdekatnya yang memiliki properti bukan position:
static?
Element <div class="medium-square"> merupakan parentnya. Tapi kita tidak memberinya properti
position. Dari topik sebelumnya, kalian tahu kalau secara default, sebuah element itu memiliki properti
position: static. Jadi ancestor yang kita inginkan bukan element ini.
Lalu ada <div class="big-square">. Nah kali ini ia memiliki properti position: relative. Berarti element
<div class="small-square"> akan diposisikan relatif terhadap element ini. Sehingga hasilnya menjadi
seperti di bawah ini:
Kotak yang kecil (kuning) memiliki properti right:0. Tapi itu relatif terhadap kotak yang besar (biru),
bukan yang berukuran sedang (merah).
position: fixed
Element dengan posisi fixed akan diposisikan relatif terhadap viewport browser, di mana akan selalu
berada di tempat yang sama jika walaupun halaman website di-scroll.
Ini biasa dipakai untuk element-element yang memang posisinya selalu konstan seperti navigation bar
dari sebuah halaman web yang selalu berada di bagian atas halaman. Atau chatbox yang selalu ada di
pojok layar agar mudah diakses seperti animasi di bawah ini.
position-fixed chatbox
Kita bisa memberikan properti top, bottom, right, dan left pada element yang memiliki style position:
fixed. Posisinya relatif pada viewport browser, jadi kalau diberi properti left:0px maka ia akan terus
berada di bagian kiri jendela browser.
Element dengan posisi fixed tidak akan menempati ruang pada halaman seperti element dengan attribute
position yang lainnya.
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
div.fixed {
position: fixed;
top: 100px;
width: 300px;
padding: 10px 20px;
background: #73ad21;
}
</style>
</head>
<body>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
est laborum.
</p>
<div class="fixed">
This div element has position: fixed;
</div>
</body>
</html>
Pada kode di atas, element <div class="fixed"> akan berada 100px dari bagian atas viewport browser
(karena diberi properti top: 100px) meskipun halaman webnya di-scroll.
position-fixed chatbox
position: sticky
Setelah mempelajari position: fixed, mungkin kalian ingin membuat sebuah element yang tetap berada di
layar saat user men-scroll halaman webnya. Namun kalian ingin element itu juga menempati ruang pada
halaman seperti element lainnya.
Untuk itu, ada satu lagi nilai dari position yang kalian perlu tahu.
position: sticky
Element dengan posisi sticky akan diposisikan berdasarkan scroll halaman dari user.position:sticky pada
dasarnya adalah seperti gabungan dari position:relative dan position: fixed.
Awalnya, element dengan properti ini akan memiliki posisi seperti dia memiliki properti position:
relative. Namun ketika user melakukan scroll halaman web hingga element berada di sebuah lokasi
relative terhadap viewport, maka posisi element tersebut akan berubah seperti layaknya dia memiliki
properti position: fixed. Dengan kata lain ia akan diam di lokasi relatif terhadap viewport tadi.
📝 Catatan:
Viewport merupakan area di layar, di mana halaman web ditampilkan. Ukuran viewport di laptop tentu
berbeda dengan ukuran viewport di smartphone.
Untuk melihat hasil dari position:sticky, kita setidaknya butuh mengatur salah satu nilai dari properti top,
right, bottom, left.
Contoh:
<!DOCTYPE html>
<html>
<head>
<style>
.sticky {
position: sticky;
top: 30px;
padding: 5px;
background-color: yellow;
border: 2px solid blue;
}
p.content {
height: 100vh
}
</style>
</head>
<body>
<p>Cobalah scroll halaman website ini</p>
<p class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
est laborum.
</p>
</div>
</body>
</html>
Contoh di atas akan kelihatan seperti ini:
position-fixed chatbox
Element kuning bertuliskan I am sticky! akan berperilaku seperti ia memiliki position: relative pada
awalnya. Namun saat halaman web di-scroll dan element tersebut posisinya naik, ia akan berperilaku
seperti ia memiliki position: fixed saat jaraknya dengan batas atas viewport adalah 30px — sama dengan
properti top: 30px yang kita berikan.
Mengatur Viewport
Dulu banyak situs web yang didesain menggunakan pengukuran (seperti lebar element, besar huruf) yang
tetap. Saat tablet dan smartphone belum ada tentu hal itu tidak menjadi masalah sebab ukuran layar
komputer tidak jauh berbeda. Tapi jika halaman web tersebut sekarang kita coba buka di smartphone,
tentu kontennya akan terlalu besar jika dibandingkan viewport browser pada smartphone kita.
Perlu kalian ingat bahwa ukuran viewport tidak selalu sama dengan resolusi layar perangkat.
Viewport
Gambar di kiri merupakan tangkapan layar pada komputer; gambar di kanan pada smartphone.
Kotak berwarna hijau mewakili keseluruhan layar perangkat. Namun area yang kita sebut viewport tadi
itu digambarkan oleh kotak berwarna biru.
Kembali ke permasalahan di awal: Bagaimana kita membuat halaman web kita menjadi responsif?
Bagaimana kita memastikan halaman web yang kita buat nanti itu tidak terlihat buruk atau terlalu besar
pada perangkat mobile?
Untuk membuat halaman website menjadi responsif, maka kita perlu menambahkan meta data berikut ini
di dalam element <head> di file HTML.
📝 Catatan:
Tag <meta> digunakan untuk menulis info tentang suatu dokumen HTML seperti deskripsi, nama
pengarang, keywords, dan tanggal terakhir dokumen diperbaharui. Tag <meta> tidak akan tampil di
halaman HTML.
Jika dituliskan di dalam file HTML, maka akan seperti ini:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Website Pertamaku</title>
</head>
<body>
<h1>Halo Dunia</h1>
<p>
Ini adalah contoh untuk mengatur file HTML agar bisa menjadi responsif.
</p>
</body>
</html>
Penjelasan kode di atas:
width=device-widthmemberitahu browser untuk mengikuti lebar layar dari perangkatnya. Sebab lebar
layar tiap perangkat berbeda-beda.
initial-scale=1.0 memberitahu browser tingkat pembesaran (zoom level) dari halaman itu.
Contoh:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Website Pertamaku</title>
<style>
div{
width: 100%;
background-color: yellow;
}
img {
width: 60%;
}
</style>
</head>
<body>
<div>
<img
src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/responsive-
design-percentage-cat.jpeg"
alt="kucing"
/>
<div>
</body>
</html>
Sekarang lebar foto kucing itu akan selalu sebesar 60% dari lebar <div> dengan latar belakang kuning;
berapapun lebar layarnya.
position-fixed chatbox
Contoh: Kita mengambil gambar kucing dari internet yang memiliki lebar sebesar 640px. Maka, jika kita
menggunakan max-width: 100%, lebar gambar tidak akan melebihi 640px. Walaupun begitu, jika kita
membuka website kita di handphone, lebar gambar kucing akan mengikuti lebar layar handphone.
Jadi properti max-width itu menentukan batas atas dari lebar suatu element.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Website Pertamaku</title>
<style>
img {
max-width: 100%;
height: auto;
}
</style>
</head>
<body>
<img
src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/responsive-
design-percentage-cat.jpeg"
alt="kucing"
/>
</body>
</html>
📝 Catatan:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Website Pertamaku</title>
<style>
h1 {
font-size: 5vw;
}
</style>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
Contoh di atas akan kelihatan seperti ini:
viewport-width
Media Query
Jaman sekarang, perangkat itu ada bermacam-macam: mulai dari perangkat mobile sampai laptop.
Semuanya dengan resolusi layarnya masing-masing. Bagaimana cara kita memastikan website kita
terlihat bagus di semua layar tersebut?
Media Query
Dengan menggunakan media query, kita bisa mengatur lebar suatu element dan/atau memberikan style
lain yang berbeda-beda sesuai dengan ukuran dari browser.
<!DOCTYPE html>
<html>
<head>
<style>
body {
max-width: 800px;
}
.button-group {
display: flex;
}
button {
font-size: 25px;
width: 100%;
}
</style>
</head>
<body>
<h1>Cat Ltd.</h1>
<img
src="https://skilvul-assets-01.s3-ap-southeast-1.amazonaws.com/lesson/intro-to-css/responsive-
design-percentage-cat.jpeg"
width="100%"
/>
<div class="button-group">
<button>Talk to Us</button>
<button>Download Syllabus</button>
<button>Be a Partner</button>
<button>Join Class</button>
</div>
</body>
</html>
Kode HTML di atas akan menghasilkan halaman web seperti ini
Sekilas terlihat bagus memang. Tapi saat dibuka di layar yang lebih kecil, tombolnya menjadi semakin
berdempet dan teks di dalamnya terkesan terlalu besar.
@media (max-width: 600px) merujuk kepada jendela browser yang lebarnya maksimal 600px. Dengan
kata lain, semua rule/kode CSS di dalam @media ini akan diterapkan jika layarnya memiliki lebar 600px
atau kurang.
Sesuai kode di atas, saat lebar layar itu 600px atau kurang, element dengan class button-group akan
memiliki properti display:flex dan flex-direction:column.
Sehingga halaman profil kucing kita tadi akan menjadi seperti di bawah saat dilihat di layar yang kecil.