LKSN Web Technologies 2021: Pembahasan Speedtest B1 iOS Toggle

Alhamdullilah, di Tahun 2021 ini saya berkesempatan untuk mewakili Provinsi Kepulauan Riau dalam Lomba Kompetensi Siswa Nasional ke-29 bidang lomba Web Technologies atau Pengembangan Web. Untuk LKS Nasional 2021 ini dibagi menjadi 3 hari, dari hari Selasa tanggal 26 Oktober 2021 hingga 28 Oktober 2021.

Untuk pembagian modulnya sebagai berikut:

  • Selasa, 26 Oktober 2021: Modul Speedtest dan modul CMS (Wordpress)
    • Rabu, 27 Oktober 2021: Modul Server Side (Framework Laravel dan JavaScript)
      • Kamis, 28 Oktober 2021: Modul Client Side (Game dengan Canvas JavaScript)

        Pelaksanaan LKS Nasional berbeda dengan lomba-lomba yang lain. Dalam lomba ini, kita dituntut untuk mengoptimalkan waktu yang ada untuk menyelesaikan requirement soal. Saya berencana untuk membahas beberapa soal dalam LKS Nasional Web Technologies ini. Untuk artikel pertama ini saya akan Membahas Modul Speedtest bagian B1.

        Modul Speedtest Bagian B1

        Jika anda ingin mengunduh soal dan media dari Modul speedtest silahkan kunjungi repository github saya

        Di bagian B1 ini, kita dituntut untuk bisa membuat sebuah toggle button seperti iPhone hanya dengan HTML dan CSS (tanpa JavaScript). Untuk lebih jelasnya silahkan lihat preview dibawah ini:

        Preview IOS Toggle

        Dalam video diatas terlihat sebuah button toggle switch, dimana di masing-masing kedua sisinya memiliki sebuah dots yang beranimasi ketika togglenya diklik.

        Membuat Struktur HTML

        Hal pertama yang harus dilakukan adalah membuat sebuah file html (index.html) yang berisikan layout dari toggle itu, berikut ini kodenya:

        <!DOCTYPE html>
        <html>
        <head>
        	<meta charset="utf-8">
        	<title>iOS Toggle</title>
        	<link rel="stylesheet" type="text/css" href="styles.css">
        </head>
        <body>
        	<div class="ios-toggle">
        		<input type="checkbox" name="checkbox">
        		<span class="background"></span>
        		<span class="checkmark2"></span>
        		<span class="checkmark"></span>
        	</div>
        </body>
        </html>
        

        Di dalam tag head kita akan menggunakan css dari file styles.css. Di dalam body kita membuat sebuah container untuk toggle switchnya dengan class .ios-toggle. Di dalam container tersebut kita membuat sebuah input berjenis checkbox yang akan kita manipulasi inputannya.

        Di dalam container tersebut juga terdapat 3 buah span dengan masing masing class .background , .checkmark dan checkmark2. Untuk class .background akan kita gunakan sebagai animasi warna background ketika checkboxnya berubah. Sedangkan class .checkmark dan .checkmark2 akan kita gunakan sebagai dots (titik kecil) yang dianimasikan.

        Membuat Styling CSS

        Seperti yang saya sebutkan dibagian sebelumnya, file css akan kita letakan di dalam file styles.css, silahkan buat filenya.

        Selanjutnya, kita harus mengatur posisi dari container dan isi didalamnya. Untuk containernya (class .ios-toggle) kita harus posisikan sebagai relative agar children didalamnya (background dan dots) dapat kita posisikan absolute dari containernya (.ios-toggle).

        Kita juga harus mengatur overflownya menjadi hidden agar background yang akan kita animasikan tidak terlihat jika melebihi containernya. Kita juga mengatur ukuran dari toggle tersebut dengan width dan height. Agar togglenya rounded di kanan dan kirinya, kita menggunakan properti border-radius. Berikut ini adalah source codenya:

        .ios-toggle {
        	display: inline-block;
        	width: 130px;
        	height: 50px;
        	overflow: hidden;
        	border-radius: 100px;
        	position: relative;
        }
        

        Setelah mengatur posisi dan ukuran containernya, selanjutnya kita akan mengatur posisi dari checkbox input dan backgroundnya. Kita posisikan absolute dengan top, left, right dan bottom 0px sehingga ukurannya akan sama seperti container kita (berjarak 0 dari atas, bawah, kiri dan kanan container):

        .ios-toggle input, .ios-toggle .background {
        	position: absolute;
        	top: 0;
        	left: 0;
        	right: 0;
        	bottom: 0;
        }
        

        Kita juga harus menyembunyikan input checkboxnya (opacity), tetapi kita harus memposisikan z-index (layernya) ke posisi paling atas agar dapat diklik.

        .ios-toggle input {
        	opacity: 0;
        	z-index: 100;
        }
        

        Agar background kita dapat dianimasikan warnanya dari kanan ke kiri dan sebaliknya, kita akan menggunakan linear-gradient css tetapi posisi stop colornya kita samakan ditengah 50% sehingga tidak akan ada feather nya. background-size kita atur width menjadi 200% agar dapat memenuhi container setiap warnanya (biru tua dan biru muda). background-position kita atur 0% pada axis x dan 0% pada axis y agar secara default backgroundnya berwarna biru tua (linear gradient stop pertama). Atur juga waktu transisi atau perpindahan warna dari kanan ke kiri atau kiri ke kanan dengan properti transition. Kita tambah delay 0.1 detik atau 100 milidetik menunggu dots di kiri atau kanan beranimasi membesar terlebih dahulu ketika diklik.

        .ios-toggle .background {
        	background: linear-gradient(to right, #0313fc 50%, #039dfc 50%);
        	background-size: 200% 100%;
        	background-position: 0% 0%;
        	transition: .2s linear;
        	transition-delay: .1s;
        }
        

        Selanjutnya kita akan mengatur posisi, warna dan waktu transisi dots nya (.checkmark dan .checkmark2). Untuk posisinya juga absolute, untuk dot pertama (.checkmark) posisi left nya 20px dari kiri container. Sedangkan untuk dot kedua (.checkmark2) posisi right nya 20px dari kanan container:

        .ios-toggle .checkmark, .ios-toggle .checkmark2 {
        	background-color: #039dfc;
        	position: absolute;
        	left: 20px;
        	top: 50%;
        	transform: translateY(-50%);
        	transform-origin: center;
        	height: 20px;
        	width: 20px;
        	border-radius: 20px;
        	transition: .2s linear;
        }
        .ios-toggle .checkmark2 {
        	background-color: #0313fc;
        	left: unset;
        	right: 20px;
        }
        

        Animasi dan Transisi

        Setelah selesai bermain-main dengan HTML dan CSS dasar dari toggle switch ini, kita harus membuat animasi berdasarkan value dari checkboxnya. Pertama tama kita gerakan backgroundya (class .background) agar bergerak dari kiri ke kanan ketika di check checkboxnya, dan bergerak dari kanan ke kiri ketika di uncheck checkboxnya. Kita menggunakan pseudo class :checked untuk mengecek apakah checkboxnya dicheck atau tidak dan menggunakan simbol tilde atau gelombang (simbol ~) agar children yang lain tetapi berada dalam satu container dengan input checkbox ini posisi backgroudnya berubah. Posisi sumbu x backgroundya kita gerakan ke kiri negatif 100% sehingga warnanya gradient kedua yang kita atur diawal akan bergerak ke kiri.

        .ios-toggle input:checked ~ .background {
        	background-position: -100% 0%;
        }
        

        Selanjutnya, kita atur animasi agar dotnya berubah ketika value checkboxnya berubah. Untuk checkbox pertama (class .checkmark) yang berada di kiri akan dianimasikan membesar jika checkboxnya di check (karena jika dicheck backgroundya akan bergerak ke kana):

        .ios-toggle input:checked ~ .checkmark {
        	left: 0px;
        	height: 100%;
        	border-radius: 0px;
        	width: 60px;
        }
        

        Kita juga menambah style untuk class .checkmark2 yang berada di kanan toggle switch tetapi dot ini akan membesar jika checkboxnya di uncheck:

        .ios-toggle input:not(:checked) ~ .checkmark2 {
        	right: 0px;
        	height: 100%;
        	border-radius: 0px;
        	width: 60px;
        }
        

        Langkah terakhir, kita menambahkan animasi skala dotnya dari kecil ke besar ketika value checkboxnya berubah. Kita tambahkan delay dari 0% ke 70% agar memberi waktu animasi background selesai:

        @keyframes dot {
        	0% {
        		transform: translateY(-50%) scale(0);
        	}
        	70% {
        		transform: translateY(-50%) scale(0);
        	}
        	100% {
        		transform: translateY(-50%) scale(1);
        	}
        }
        

        Untuk menggunakannya, logika checkboxnya berarti terbalik dari checkmark sebelumnya:

        .ios-toggle input:checked ~ .checkmark2, .ios-toggle input:not(:checked) ~ .checkmark {
        	animation: dot .5s linear;
        }
        

        Hasil Kode Akhir

        Di hasil akhir tutorial ini, kita akan mendapatkan dua buah file, index.html dan style.css. Jika anda ingin melihat source codenya silahkan kunjungi repository github saya

        Konten index.html:

        <!DOCTYPE html>
        <html>
        <head>
        	<meta charset="utf-8">
        	<title>iOS Toggle</title>
        	<link rel="stylesheet" type="text/css" href="styles.css">
        </head>
        <body>
        	<div class="ios-toggle">
        		<input type="checkbox" name="checkbox">
        		<span class="background"></span>
        		<span class="checkmark2"></span>
        		<span class="checkmark"></span>
        	</div>
        </body>
        </html>
        

        Konten style.css:

        .ios-toggle {
        	display: inline-block;
        	width: 130px;
        	height: 50px;
        	overflow: hidden;
        	border-radius: 100px;
        	position: relative;
        }
        .ios-toggle input, .ios-toggle .background {
        	position: absolute;
        	top: 0;
        	left: 0;
        	right: 0;
        	bottom: 0;
        }
        .ios-toggle input {
        	opacity: 0;
        	z-index: 100;
        }
        .ios-toggle .background {
        	background: linear-gradient(to right, #0313fc 50%, #039dfc 50%);
        	background-size: 200% 100%;
        	background-position: 0% 0%;
        	transition: .2s linear;
        	transition-delay: .1s;
        }
        .ios-toggle .checkmark, .ios-toggle .checkmark2 {
        	background-color: #039dfc;
        	position: absolute;
        	left: 20px;
        	top: 50%;
        	transform: translateY(-50%);
        	transform-origin: center;
        	height: 20px;
        	width: 20px;
        	border-radius: 20px;
        	transition: .2s linear;
        }
        .ios-toggle .checkmark2 {
        	background-color: #0313fc;
        	left: unset;
        	right: 20px;
        }
        .ios-toggle input:checked ~ .background {
        	background-position: -100% 0%;
        }
        .ios-toggle input:checked ~ .checkmark {
        	left: 0px;
        	height: 100%;
        	border-radius: 0px;
        	width: 60px;
        }
        .ios-toggle input:not(:checked) ~ .checkmark2 {
        	right: 0px;
        	height: 100%;
        	border-radius: 0px;
        	width: 60px;
        }
        @keyframes dot {
        	0% {
        		transform: translateY(-50%) scale(0);
        	}
        	70% {
        		transform: translateY(-50%) scale(0);
        	}
        	100% {
        		transform: translateY(-50%) scale(1);
        	}
        }
        .ios-toggle input:checked ~ .checkmark2, .ios-toggle input:not(:checked) ~ .checkmark {
        	animation: dot .5s linear;
        }
        

        Silahkan coba jalankan file index.html nya, maka anda akan mendapatkan toggle switch iOS seperti soal LKS Nasional 2021.

        Kesimpulan

        Pembuatan animasi toggle iOS ini memang sedikit tricky dan memerlukan logika agar dapat membuatnya. Mungkin juga terdapat cara orang lain yang lebih mudah daripada cara saya ini.

        Terima kasih telah membaca seri pertama pembahasan LKSN 2021 Web Technologies!