
Pernah nggak sih, pas lagi asyik-asyiknya ngoding aplikasi web sederhana, eh, hasilnya malah bikin kening berkerut? Saya ingat banget, dulu pas awal-awal belajar JavaScript, niatnya mau bikin fungsi penjumlahan di kalkulator. Tapi entah kenapa, `1 + 1` hasilnya jadi `'11'` bukan `2`. Rasanya kayak mau merakit meja IKEA yang instruksinya sudah jelas, tapi malah salah pasang kaki, jadinya doyong nggak karuan. Ternyata sepele, cuma masalah tipe data yang belum di-konversi dengan benar dari string menjadi angka. Nah, dari pengalaman "doyong" itu, saya jadi makin paham betapa pentingnya detail kecil di dunia frontend, dan betapa powerful-nya tiga serangkai ajaib: HTML, CSS, dan JavaScript, bahkan untuk membangun sesuatu yang kelihatannya kompleks seperti kalkulator dan page builder!
Kita sering mendengar tentang framework dan library canggih yang bisa memudahkan hidup developer. Tapi, percaya atau tidak, fondasi dari semua kemewahan itu tetaplah trio klasik kita. Di artikel ini, kita akan membongkar rahasia di balik pembuatan dua aplikasi interaktif yang sangat berguna: sebuah kalkulator web fungsional dan sebuah page builder sederhana yang memungkinkan kita mendrag-and-drop elemen. Semua ini murni menggunakan HTML, CSS, dan JavaScript vanilla. Siap-siap, karena kita akan merasakan sensasi menjadi arsitek dan insinyur digital sekaligus!
Membuat Kalkulator Web: Si Asisten Hitung Setia di Browser
Membangun kalkulator itu seperti meracik kopi yang sempurna. HTML adalah cangkir dan alat-alat dasar seperti sendok. CSS adalah sentuhan estetika, seperti seni latte atau desain cangkir yang menarik. Dan JavaScript? Itu adalah barista ahli yang tahu persis bagaimana menggiling biji kopi, memanaskan air, dan mengombinasikan semuanya menjadi minuman yang nikmat. Tanpa barista, cangkir dan biji kopi hanyalah benda mati.
Struktur Dasar HTML untuk Kalkulator
Untuk kalkulator kita, kita butuh sebuah area untuk menampilkan angka (layar) dan tombol-tombol operasi. Ini fondasi yang kokoh:
<div class="calculator">
<input type="text" class="calculator-screen" value="0" disabled />
<div class="calculator-keys">
<button type="button" class="operator" value="+">+</button>
<button type="button" class="operator" value="-">-</button>
<button type="button" class="operator" value="*">×</button>
<button type="button" class="operator" value="/">÷</button>
<button type="button" value="7">7</button>
<button type="button" value="8">8</button>
<button type="button" value="9">9</button>
<button type="button" value="4">4</button>
<button type="button" value="5">5</button>
<button type="button" value="6"<6</button>
<button type="button" value="1">1</button>
<button type="button" value="2">2</button>
<button type="button" value="3">3</button>
<button type="button" value="0">0</button>
<button type="button" class="decimal" value=".">.</button>
<button type="button" class="all-clear" value="clear">AC</button>
<button type="button" class="equal-sign operator" value="=">=</button>
</div>
</div>
Mempercantik dengan CSS
CSS ibarat sentuhan akhir yang membuat kalkulator kita nyaman dipandang dan mudah digunakan. Kita bisa membuat tombolnya tampak interaktif, layarnya jelas, dan tata letaknya rapi. Misalnya, menggunakan Flexbox atau Grid untuk mengatur tombol-tombol agar tidak berantakan. Sentuhan :active pada tombol akan memberikan umpan balik visual yang bagus saat ditekan.
Otak di Balik Angka: JavaScript
Ini dia bagian paling seru! JavaScript akan menghidupkan kalkulator kita. Kita perlu:
- Mendeteksi tombol apa yang ditekan (event listener).
- Menyimpan angka yang sedang diinput dan operasi yang dipilih.
- Menghitung hasilnya saat tombol '=' ditekan.
Salah satu trik cepat untuk perhitungan adalah menggunakan fungsi `eval()` bawaan JavaScript, tapi hati-hati karena ini punya risiko keamanan kalau inputnya tidak divalidasi dengan baik. Untuk proyek pribadi, ini bisa jadi jalan pintas yang efektif. Namun, cara yang lebih aman adalah dengan membangun logika perhitungan kita sendiri, mem-parsing ekspresi matematis secara manual.
const calculator = document.querySelector('.calculator');
const keys = calculator.querySelector('.calculator-keys');
const display = document.querySelector('.calculator-screen');
let firstValue = null;
let operator = null;
let waitingForSecondValue = false;
keys.addEventListener('click', e => {
if (e.target.matches('button')) {
const key = e.target;
const action = key.dataset.action;
const keyContent = key.textContent;
const displayedNum = display.value;
if (!action) {
if (displayedNum === '0' || waitingForSecondValue) {
display.value = keyContent;
waitingForSecondValue = false;
} else {
display.value = displayedNum + keyContent;
}
}
if (action === 'add' || action === 'subtract' || action === 'multiply' || action === 'divide') {
firstValue = parseFloat(displayedNum);
operator = action;
waitingForSecondValue = true;
}
if (action === 'decimal') {
if (!displayedNum.includes('.')) {
display.value = displayedNum + '.';
}
}
if (action === 'clear') {
display.value = '0';
firstValue = null;
operator = null;
waitingForSecondValue = false;
}
if (action === 'calculate') {
const secondValue = parseFloat(displayedNum);
let result = '';
if (operator === 'add') {
result = firstValue + secondValue;
} else if (operator === 'subtract') {
result = firstValue - secondValue;
} // ...dan seterusnya untuk operasi lainnya
display.value = result;
firstValue = result; // Untuk rantai perhitungan
operator = null;
waitingForSecondValue = true;
}
}
});
Kode di atas adalah contoh sederhana. Anda bisa mengembangkannya untuk menangani lebih banyak kasus, seperti persentase, akar kuadrat, atau bahkan riwayat perhitungan. Kuncinya ada pada manajemen state (nilai `firstValue`, `operator`, `waitingForSecondValue`).
Membangun Page Builder Sederhana: Merakit Halaman Sesuai Keinginan
Sekarang, mari kita loncat ke proyek yang sedikit lebih ambisius namun sangat mendidik: page builder. Membayangkan membangun page builder dari nol mungkin terdengar seperti mencoba merakit mobil balap F1 sendirian. Tapi sebenarnya, dengan HTML, CSS, dan JavaScript, kita bisa memulai dengan model "kit mobil" sederhana yang bisa dirakit dengan tangan. HTML adalah berbagai komponen dasar mobil (roda, kursi, mesin mini). CSS adalah cat, stiker, dan jok kulit. Dan JavaScript? Dia adalah tangan kita yang merakit, mengelas, mengencangkan baut, bahkan menciptakan komponen baru sesuai kebutuhan, serta menggerakkan mobil itu!
Konsep Inti: Drag-and-Drop
Kunci utama dari page builder adalah kemampuan untuk "menyeret" (drag) elemen dari toolbox dan "menjatuhkannya" (drop) ke area kanvas. Ini dimungkinkan berkat Drag and Drop API di JavaScript, yang langsung tersedia di browser modern.
Struktur HTML untuk Page Builder
Kita memerlukan dua area utama: Toolbox (tempat elemen yang bisa di-drag) dan Canvas/Editor Area (tempat elemen akan di-drop dan dirakit).
<div class="page-builder-container">
<div class="toolbox">
<div class="draggable-element" draggable="true" data-type="heading">Heading</div>
<div class="draggable-element" draggable="true" data-type="paragraph">Paragraph</div>
<div class="draggable-element" draggable="true" data-type="button">Button</div>
<!-- Tambahkan elemen lain sesuai kebutuhan -->
</div>
<div class="editor-canvas">
<p>Drop elements here!</p>
</div>
</div>
CSS untuk Visual dan Umpan Balik
CSS akan membuat elemen yang bisa di-drag terlihat berbeda, memberikan indikator visual saat kita menyeretnya, dan area drop juga akan punya batas yang jelas. Ini penting untuk pengalaman pengguna yang baik.
.draggable-element {
background-color: #f0f0f0;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 5px;
cursor: grab;
}
.editor-canvas {
border: 2px dashed #007bff;
min-height: 300px;
padding: 20px;
margin-top: 20px;
}
.editor-canvas.drag-over {
background-color: #e6f7ff;
border-color: #0056b3;
}
Keajaiban JavaScript: Menghidupkan Drag-and-Drop
Ini adalah inti dari page builder kita. Kita akan menggunakan beberapa event JavaScript:
dragstart: Terjadi saat elemen mulai diseret. Kita simpan informasi elemen yang diseret.dragover: Terjadi saat elemen diseret di atas area drop. Penting untuk mencegah perilaku default browser agar elemen bisa di-drop.dragleave: Terjadi saat elemen meninggalkan area drop.drop: Terjadi saat elemen dijatuhkan di area drop. Di sini kita membuat elemen baru di DOM.
const toolbox = document.querySelector('.toolbox');
const editorCanvas = document.querySelector('.editor-canvas');
let draggedElementType = null;
toolbox.addEventListener('dragstart', e => {
if (e.target.classList.contains('draggable-element')) {
draggedElementType = e.target.dataset.type;
e.dataTransfer.setData('text/plain', draggedElementType); // Penting untuk Firefox
}
});
editorCanvas.addEventListener('dragover', e => {
e.preventDefault(); // Memungkinkan drop
editorCanvas.classList.add('drag-over');
});
editorCanvas.addEventListener('dragleave', e => {
editorCanvas.classList.remove('drag-over');
});
editorCanvas.addEventListener('drop', e => {
e.preventDefault();
editorCanvas.classList.remove('drag-over');
if (draggedElementType) {
let newElement;
switch (draggedElementType) {
case 'heading':
newElement = document.createElement('h2');
newElement.textContent = 'New Heading';
break;
case 'paragraph':
newElement = document.createElement('p');
newElement.textContent = 'This is a new paragraph.';
break;
case 'button':
newElement = document.createElement('button');
newElement.textContent = 'Click Me!';
break;
default:
break;
}
if (newElement) {
editorCanvas.appendChild(newElement);
}
draggedElementType = null; // Reset
}
});
Dengan kode di atas, Anda sudah punya fondasi page builder. Anda bisa menambahkan fitur seperti:
- Mengedit teks elemen yang sudah di-drop (dengan `contenteditable`).
- Mengubah gaya (warna, ukuran font) melalui panel pengaturan.
- Menyimpan dan memuat layout menggunakan `localStorage` atau API backend.
- Menyeret ulang elemen yang sudah ada di kanvas.
Mengapa "Vanilla" Itu Penting?
Membangun aplikasi seperti kalkulator dan page builder menggunakan HTML, CSS, dan JavaScript vanilla mungkin terasa lebih "manual" daripada menggunakan React, Vue, atau Angular. Tapi ini adalah proses pembelajaran yang luar biasa! Ibaratnya, kita belajar bagaimana mesin mobil bekerja dari awal, bukan hanya tahu bagaimana menyetir. Kita jadi paham tentang:
- Manipulasi DOM: Bagaimana JavaScript berinteraksi langsung dengan struktur HTML.
- Event Handling: Bagaimana merespons interaksi pengguna.
- State Management: Bagaimana menyimpan dan mengelola data aplikasi.
- Dasar-dasar UX: Bagaimana feedback visual dan interaksi yang halus menciptakan pengalaman yang baik.
Penutup: Petualangan Tanpa Batas di Dunia Frontend
Dari pengalaman "salah pasang kaki meja IKEA" hingga membangun kalkulator yang berfungsi dan page builder sederhana, kita melihat bagaimana HTML memberikan struktur, CSS memberikan keindahan, dan JavaScript memberikan kecerdasan dan interaktivitas pada aplikasi web. Ini adalah trio yang tak lekang oleh waktu, fondasi dari hampir setiap pengalaman web yang kita nikmati setiap hari.
Jadi, jangan takut untuk bereksperimen, mencoba hal-hal baru, dan kadang-kadang membuat kesalahan. Setiap "error" adalah guru terbaik Anda. Teruslah "merakit" ide-ide Anda dengan tiga alat sakti ini, dan lihatlah bagaimana aplikasi web impian Anda perlahan-lahan terwujud di layar browser. Selamat berkoding, para arsitek digital!