Membangun Dunia Interaktif: Kalkulator dan Page Builder Sendiri dengan HTML, CSS, dan JavaScript

PintarApp Juli 03, 2026
Membangun Dunia Interaktif: Kalkulator dan Page Builder Sendiri dengan HTML, CSS, dan JavaScript

Dulu, saat pertama kali terjun ke dunia koding, ada satu momen yang bikin saya garuk-garuk kepala seharian. Saya mencoba membuat sebuah tombol yang, ketika diklik, akan mengubah warna latar belakang halaman. Sounds simple, right? Tapi entah kenapa, JS saya malah error ‘undefined is not a function’. Paniklah saya. Ternyata, setelah berjam-jam mencoba mencari kesalahan (yang ternyata hanya salah penulisan nama ID di HTML), saya sadar satu hal: fondasi itu penting. Kita sering tergoda untuk langsung melompat ke hal-hal canggih, padahal memahami dasar-dasar HTML, CSS, dan JavaScript dengan kokoh adalah kunci untuk membangun apa pun, sekecil apapun itu, tanpa frustrasi berkepanjangan. Hari ini, mari kita buktikan betapa dahsyatnya trio fundamental ini dengan membangun dua aplikasi web yang cukup kompleks: kalkulator dan page builder sederhana!

Mengintip Dapur Web: HTML, CSS, dan JavaScript Adalah Koki Hebatmu

Bayangkan kamu ingin membuat sebuah hidangan lezat.

  • HTML (HyperText Markup Language) adalah daftar bahan-bahanmu. Ini mendefinisikan apa saja yang ada di hidanganmu: tepung, gula, telur, oven. Dalam konteks web, HTML adalah struktur utama halamanmu: judul, paragraf, tombol, gambar.
  • CSS (Cascading Style Sheets) adalah cara kamu menyajikan hidangan itu. Apakah kuenya dihias cantik? Warna krimnya apa? Piringnya elegan atau sederhana? CSS inilah yang membuat elemen HTML-mu terlihat menarik, mengatur warna, ukuran, tata letak, dan gaya visual lainnya.
  • JavaScript (JS) adalah proses memasaknya itu sendiri, bahkan resep rahasia yang membuat hidanganmu istimewa. JS adalah otak di balik interaktivitas. Ia yang mengaduk adonan, mengatur suhu oven, memastikan semua bahan bereaksi sesuai fungsinya. Di web, JS menghidupkan elemen, menangani klik, mengirim data, dan mengubah konten secara dinamis.
Ketiganya bekerja sama membentuk pengalaman web yang kita kenal dan cintai.

Proyek 1: Membangun Kalkulator Web Sendiri – Lebih dari Sekadar Hitung-hitungan

Membangun kalkulator mungkin terdengar sederhana, tapi ini adalah latihan yang fantastis untuk memahami interaksi antara HTML, CSS, dan JS. Anggap saja ini adalah kue pertama yang kamu panggang. Kamu butuh bahan (tombol angka, operator), alat masak (display hasil), dan proses (logika perhitungan).

Bagian HTML: Daftar Belanja Bahan Kue

Kita butuh kerangka dasar. Ini adalah "cetakan" kalkulator kita.


<div class="calculator">
<input type="text" class="display" readonly>
<div class="buttons">
<button>7</button>
<button>8</button>
<!-- ...tombol lainnya ... -->
<button class="operator">+</button>
<button class="operator">=</button>
</div>
</div>

Di sini, kita punya sebuah kotak utama, sebuah input untuk menampilkan angka, dan sekumpulan tombol. Sederhana, bukan?

Bagian CSS: Menghias Kue Agar Lezat Dipandang

Tanpa CSS, kalkulator kita hanya akan terlihat seperti kumpulan tombol yang berantakan. CSS memberinya bentuk, warna, dan tata letak agar terlihat seperti kalkulator sungguhan.


.calculator {
width: 300px;
margin: 50px auto;
border: 1px solid #ccc;
border-radius: 8px;
padding: 20px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.display {
width: 100%;
height: 50px;
text-align: right;
font-size: 2em;
margin-bottom: 10px;
padding: 0 10px;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}

Dengan CSS ini, tombol-tombol kita akan tersusun rapi dalam grid, input display akan terlihat lebih profesional, dan keseluruhan kalkulator akan memiliki tampilan yang lebih menarik.

Bagian JavaScript: Resep Rahasia dan Proses Memasak

Inilah jantungnya! JavaScript akan mendengarkan setiap klik tombol, menyimpan angka, operator, dan akhirnya menghitung hasilnya. Analoginya, JS adalah koki yang memastikan semua bahan dicampur dengan benar, dipanggang pada suhu yang tepat, dan disajikan saat sudah matang.


const display = document.querySelector('.display');
const buttons = document.querySelectorAll('.buttons button');
let currentInput = '';
let operator = null;
let previousInput = '';
buttons.forEach(button => {
button.addEventListener('click', () => {
const value = button.textContent;
if (value === 'C') { // Clear
currentInput = '';
operator = null;
previousInput = '';
display.value = '';
} else if (value === '=') { // Calculate
if (currentInput !== '' && previousInput !== '' && operator !== null) {
const result = eval(previousInput + operator + currentInput); // Hati-hati dengan eval!
display.value = result;
currentInput = result;
previousInput = '';
operator = null;
}
} else if (['+', '-', '*', '/'].includes(value)) { // Operator
if (currentInput !== '') {
previousInput = currentInput;
operator = value;
currentInput = '';
}
} else { // Numbers
currentInput += value;
display.value = currentInput;
}
});
});

Kode ini menangani logika di balik setiap tombol: angka, operator, sama dengan, dan tombol "clear". Setiap kali tombol diklik, JS akan memproses input, memperbarui tampilan, dan melakukan perhitungan jika operator dan angka sudah lengkap. (Catatan: Penggunaan eval() untuk kalkulator sederhana di contoh ini memang praktis, tapi untuk aplikasi yang lebih serius, disarankan menggunakan metode parsing dan perhitungan yang lebih aman.)

Proyek 2: Merakit Mimpi dengan Page Builder Sederhana – Tata Letak Tanpa Pusing

Nah, kalau kalkulator itu ibarat merakit mobil Tamiya, page builder ini mirip merakit mobil impianmu di bengkel. Kamu punya berbagai komponen (mesin, ban, bodi) yang bisa kamu pilih, atur, dan modifikasi sesuka hati. Ide utamanya adalah memungkinkan pengguna "membangun" halaman web dengan menyeret dan melepaskan elemen-elemen ke area kanvas.

Bagian HTML: Komponen Mobil dan Area Bengkel

Kita butuh daftar elemen yang bisa diseret (misalnya, heading, paragraf, gambar) dan sebuah area di mana elemen-elemen itu bisa dijatuhkan.


<div class="sidebar">
<div class="draggable-element" draggable="true" data-type="heading">Heading</div>
<div class="draggable-element" draggable="true" data-type="paragraph">Paragraph</div>
<!-- ...elemen lainnya... -->
</div>
<div class="canvas" id="drop-zone">
<p>Drag & drop elements here</p>
</div>

Atribut draggable="true" pada elemen-elemen di sidebar adalah kunci untuk memungkinkan mereka diseret.

Bagian CSS: Desain Bengkel dan Tampilan Komponen

CSS di sini akan mengatur tampilan sidebar, elemen yang bisa diseret, dan area kanvas agar jelas di mana pengguna bisa bekerja.


body {
display: flex;
font-family: sans-serif;
}
.sidebar {
width: 200px;
padding: 15px;
border-right: 1px solid #eee;
background-color: #f9f9f9;
}
.draggable-element {
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
background-color: #fff;
cursor: grab;
text-align: center;
}
.canvas {
flex-grow: 1;
border: 2px dashed #ccc;
margin: 15px;
padding: 20px;
min-height: 500px;
background-color: #fff;
}
.canvas.hover {
background-color: #e0f7fa; /* Efek saat elemen di atasnya */
}

Kita membuat sidebar dan kanvas berdampingan, lalu memberikan gaya agar elemen bisa terlihat jelas dan area drop-zone menarik perhatian.

Bagian JavaScript: Mekanik Bengkel yang Cerdik

Ini adalah bagian paling kompleks. JavaScript akan menangani semua interaksi drag-and-drop, menambahkan elemen baru ke kanvas, dan bahkan memungkinkan modifikasi dasar.


const draggables = document.querySelectorAll('.draggable-element');
const dropZone = document.getElementById('drop-zone');
let draggedElement = null;
draggables.forEach(draggable => {
draggable.addEventListener('dragstart', (e) => {
draggedElement = e.target;
e.dataTransfer.setData('text/plain', e.target.dataset.type);
});
});
dropZone.addEventListener('dragover', (e) => {
e.preventDefault(); // Mencegah perilaku default browser
dropZone.classList.add('hover');
});
dropZone.addEventListener('dragleave', () => {
dropZone.classList.remove('hover');
});
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
dropZone.classList.remove('hover');
const elementType = e.dataTransfer.getData('text/plain');
let newElement;
if (elementType === 'heading') {
newElement = document.createElement('h2');
newElement.textContent = 'New Heading';
} else if (elementType === 'paragraph') {
newElement = document.createElement('p');
newElement.textContent = 'This is a new paragraph.';
}
// ... bisa tambahkan jenis elemen lainnya ...
if (newElement) {
newElement.contentEditable = true; // Agar bisa diedit langsung
newElement.style.border = '1px dashed blue'; // Tanda bisa diedit
newElement.style.padding = '5px';
newElement.style.margin = '5px 0';
dropZone.appendChild(newElement);
}
});

Kode ini melakukan beberapa hal penting:

  • Merekam elemen yang sedang diseret saat dragstart.
  • Mencegah perilaku default browser pada dragover dan menambahkan efek visual.
  • Saat drop, ia membaca tipe elemen dari data transfer, membuat elemen HTML baru (h2 atau p), lalu menambahkannya ke dropZone.
  • Kita bahkan menambahkan atribut contentEditable="true" agar teks elemen yang baru ditambahkan bisa langsung diedit oleh pengguna! Ini adalah sentuhan kecil yang membuat page builder terasa lebih responsif.

Penutup: Kekuatan Sederhana di Tanganmu

Dari dua proyek ini, kita melihat bagaimana HTML membangun struktur, CSS mempercantik tampilan, dan JavaScript memberikan interaktivitas serta kecerdasan. Kita tidak perlu framework atau library yang rumit untuk memulai. Membangun aplikasi web kalkulator dan page builder sederhana dengan ketiga teknologi dasar ini adalah cara terbaik untuk mengasah keterampilanmu dan memahami bagaimana dunia web bekerja di baliknya.

Jadi, jangan pernah meremehkan kekuatan dasar. Dengan fondasi yang kuat, kamu bisa membangun apa pun yang kamu impikan, dari kalkulator sederhana hingga sistem manajemen konten yang kompleks. Selamat mencoba dan teruslah bereksperimen!