Membangun Dunia Interaktifmu: Kalkulator dan Page Builder dengan HTML, CSS, JS

PintarApp Juli 16, 2026
Membangun Dunia Interaktifmu: Kalkulator dan Page Builder dengan HTML, CSS, JS

Pernah nggak sih kamu merasa seperti sedang memecahkan teka-teki, tapi semua jawabannya salah? Dulu, waktu pertama kali nyoba bikin kalkulator sederhana, saya pernah ketiban sial gara-gara lupa satu hal kecil. Angka-angka yang saya masukkan harusnya dijumlahkan, eh malah digabung jadi satu string panjang. '2' + '2' jadi '22', bukan '4'! Rasanya kayak lagi merakit mesin, semua komponen udah pas, tapi pas dinyalain, malah keluar asap. Ternyata cuma ada satu kabel yang nyambungnya salah. Nah, pengalaman itu ngajarin saya betapa pentingnya detail kecil di dunia koding, terutama saat kita berinteraksi dengan user input.

Dari pengalaman "2+2=22" itu, saya belajar banyak. Dunia web development itu memang penuh kejutan, tapi juga sangat memuaskan. Hari ini, kita akan menyelami dunia HTML, CSS, dan JavaScript untuk menciptakan dua aplikasi web yang cukup berbeda namun sama-sama fundamental: sebuah kalkulator sederhana dan sebuah page builder yang interaktif. Jangan salah, meskipun terlihat sederhana, proyek-proyek ini adalah "bengkel" terbaik untuk mengasah skill front-end kamu!

Memulai dengan Dasarnya: Kalkulator Sederhana

Mari kita bayangkan kalkulator ini seperti perkakas dasar di bengkel kita. Palu, obeng, kunci pas. Fungsinya jelas, tujuannya spesifik. Membangun kalkulator dengan HTML, CSS, dan JS adalah latihan sempurna untuk memahami bagaimana ketiga bahasa ini bekerja sama.

1. HTML: Rangka Kalkulator Kita

HTML adalah kerangka atau sasis mobil kita. Ia mendefinisikan elemen-elemen yang akan dilihat pengguna. Untuk kalkulator, kita butuh layar untuk menampilkan angka dan tombol-tombol operasi.


<div class="calculator">
<input type="text" class="display" value="0" disabled>
<div class="buttons">
<button>7</button>
<button>8</button>
<button>9</button>
<button class="operator">/</button>
<button>4</button>
<button>5</button>
<button>6</button>
<button class="operator">*</button>
<button>1</button>
<button>2</button>
<button>3</button>
<button class="operator">-</button>
<button class="clear">C</button>
<button>0</button>
<button class="equals">=</button>
<button class="operator">+</button>
</div>
</div>

Lihat, ini hanya elemen-elemen dasar. Belum cantik, tapi fondasinya sudah ada.

2. CSS: Mempercantik Tampilan

CSS itu seperti cat mobil dan desain interiornya. Ia mengubah tampilan sasis kita menjadi sesuatu yang menarik dan mudah digunakan. Kamu bisa mengatur warna, ukuran tombol, dan tata letak agar kalkulator kita nyaman dipandang.


.calculator {
width: 300px;
margin: 50px auto;
border: 1px solid #ccc;
box-shadow: 2px 2px 10px rgba(0,0,0,0.1);
border-radius: 8px;
overflow: hidden;
}
.display {
width: 100%;
height: 60px;
font-size: 2em;
text-align: right;
padding: 10px;
background-color: #333;
color: #fff;
border: none;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
button {
padding: 20px;
font-size: 1.2em;
border: 1px solid #eee;
background-color: #f9f9f9;
cursor: pointer;
transition: background-color 0.2s;
}
button:hover {
background-color: #e0e0e0;
}
.operator {
background-color: #f0a04b;
color: white;
}
.equals {
background-color: #4CAF50;
color: white;
}

Dengan CSS, kalkulator kita sudah mulai terlihat seperti kalkulator sungguhan!

3. JavaScript: Otak di Balik Kalkulator

Nah, ini bagian paling seru! JavaScript adalah mesin dan sistem kelistrikan mobil kita. Ia yang membuat kalkulator bisa berinteraksi, menghitung, dan menampilkan hasil. Di sinilah logika "2+2=4" bekerja, bukan "22".


const display = document.querySelector('.display');
const buttons = document.querySelectorAll('.buttons button');
let currentInput = '';
let operator = null;
let firstOperand = null;
buttons.forEach(button => {
button.addEventListener('click', (e) => {
const value = e.target.innerText;
if (value === 'C') {
currentInput = '';
operator = null;
firstOperand = null;
display.value = '0';
return;
}
if (value === '=') {
if (firstOperand !== null && operator !== null && currentInput !== '') {
const secondOperand = parseFloat(currentInput);
let result;
switch (operator) {
case '+': result = firstOperand + secondOperand; break;
case '-': result = firstOperand - secondOperand; break;
case '*': result = firstOperand * secondOperand; break;
case '/': result = firstOperand / secondOperand; break;
}
display.value = result;
firstOperand = result;
currentInput = '';
operator = null;
}
return;
}
if (['+', '-', '*', '/'].includes(value)) {
if (currentInput !== '') {
firstOperand = parseFloat(currentInput);
operator = value;
currentInput = '';
}
return;
}
currentInput += value;
display.value = currentInput;
});
});

Kode di atas menangani logika saat tombol diklik. Ia memeriksa apakah tombol yang ditekan adalah angka, operator, sama dengan, atau tombol clear. Ini adalah dasar dari event handling dan DOM manipulation, dua pilar penting dalam interactive web applications.

Level Selanjutnya: Membangun Page Builder Interaktif

Setelah mahir merakit kalkulator, mari kita naik level! Bagaimana jika kita bisa 'merakit' halaman web sendiri hanya dengan menyeret dan melepaskan komponen? Inilah ide di balik page builder. Ibaratnya, kalau kalkulator itu palu, page builder ini adalah seluruh set perkakas bengkel, plus robot perakit otomatis!

1. Konsep Dasar Page Builder

Sebuah page builder memungkinkan pengguna untuk membangun tata letak halaman web secara visual, tanpa perlu menulis kode HTML atau CSS secara manual. Kita akan membuat elemen-elemen yang bisa "diseret" (draggable) dan area di mana elemen-elemen tersebut bisa "dijatuhkan" (droppable). Ini adalah aplikasi front-end yang menunjukkan kekuatan penuh DOM manipulation dan event handling dengan JavaScript.

2. HTML: Komponen dan Kanvas

Untuk page builder, HTML kita akan terdiri dari dua area utama: panel komponen yang bisa diseret, dan area kanvas tempat kita akan menjatuhkan komponen tersebut.


<div class="page-builder-container">
<div class="components-panel">
<div class="component" draggable="true" data-type="heading">Heading</div>
<div class="component" draggable="true" data-type="paragraph">Paragraph</div>
<div class="component" draggable="true" data-type="button">Button</div>
</div>
<div class="canvas" ondrop="drop(event)" ondragover="allowDrop(event)">
<p>Drag components here</p>
</div>
</div>

Di sini, atribut draggable="true" sangat penting untuk elemen yang ingin kita seret. Atribut ondrop dan ondragover pada kanvas akan menangani event saat elemen diseret di atas atau dijatuhkan ke dalamnya.

3. CSS: Styling untuk Drag-and-Drop

CSS akan membuat panel komponen dan kanvas terlihat jelas, serta memberikan umpan balik visual saat elemen diseret.


.page-builder-container {
display: flex;
gap: 20px;
margin: 50px auto;
width: 90%;
max-width: 1200px;
}
.components-panel {
width: 200px;
border: 1px solid #ddd;
padding: 15px;
background-color: #f8f8f8;
border-radius: 8px;
}
.component {
padding: 10px;
margin-bottom: 10px;
background-color: #e9e9e9;
border: 1px solid #ccc;
cursor: grab;
border-radius: 4px;
text-align: center;
}
.component:hover {
background-color: #e0e0e0;
}
.canvas {
flex-grow: 1;
border: 2px dashed #ccc;
min-height: 400px;
padding: 20px;
background-color: #fff;
border-radius: 8px;
}
.canvas.drag-over { /* Added by JS when an item is dragged over */
border-color: #007bff;
background-color: #e6f7ff;
}

4. JavaScript: Sang Orkestrator Drag-and-Drop

Ini adalah bagian paling kompleks. JavaScript akan mengelola seluruh proses drag-and-drop. Kita perlu fungsi untuk memulai penyeretan, memungkinkan penjatuhan, dan menangani saat elemen benar-benar dijatuhkan.


let draggedItem = null;
function dragStart(event) {
draggedItem = event.target;
event.dataTransfer.setData("text/plain", event.target.dataset.type); // Store component type
}
function allowDrop(event) {
event.preventDefault(); // Mencegah perilaku default browser (yang akan menolak drop)
event.target.classList.add('drag-over'); // Visual feedback
}
function dragLeave(event) {
event.target.classList.remove('drag-over');
}
function drop(event) {
event.preventDefault();
event.target.classList.remove('drag-over');
const componentType = event.dataTransfer.getData("text/plain");
let newElement;
switch (componentType) {
case 'heading':
newElement = document.createElement('h2');
newElement.innerText = 'New Heading';
break;
case 'paragraph':
newElement = document.createElement('p');
newElement.innerText = 'This is a new paragraph.';
break;
case 'button':
newElement = document.createElement('button');
newElement.innerText = 'Click Me';
newElement.style.padding = '10px 15px';
newElement.style.margin = '5px';
break;
default:
return;
}
// Append the new element to the canvas
event.target.appendChild(newElement);
}
// Attach event listeners to draggable components
document.querySelectorAll('.component').forEach(comp => {
comp.addEventListener('dragstart', dragStart);
});
// Attach event listeners to the canvas
const canvas = document.querySelector('.canvas');
canvas.addEventListener('dragover', allowDrop);
canvas.addEventListener('dragleave', dragLeave);
canvas.addEventListener('drop', drop);

Fungsi dragStart menyimpan informasi elemen yang diseret. allowDrop memastikan elemen bisa dijatuhkan ke kanvas, dan drop adalah inti dari segalanya, ia membuat elemen HTML baru berdasarkan jenis komponen yang diseret dan menambahkannya ke kanvas. Ini adalah contoh klasik dynamic DOM manipulation yang memungkinkan web development yang sangat fleksibel.

Mengapa Ini Penting untuk Skill Web Developmentmu?

Membangun kalkulator dan page builder bukan sekadar proyek iseng. Ini adalah "sekolah" terbaik untuk menguasai fondasi front-end web development:

  • Memahami DOM: Kamu belajar bagaimana JavaScript bisa "membaca" dan "memanipulasi" struktur HTML (Document Object Model). Ibaratnya, kamu tahu di mana letak setiap baut di mobil dan bagaimana cara mengencangkan atau melonggarkannya.
  • Event Handling: Dari klik tombol kalkulator hingga seret-lepas elemen page builder, kamu akan sangat akrab dengan berbagai jenis "event" dan bagaimana JavaScript meresponsnya. Ini krusial untuk membuat aplikasi yang interaktif.
  • Logika Pemrograman: Kalkulator mengajarimu logika dasar seperti urutan operasi dan penanganan input. Page builder membawamu lebih jauh ke dalam logika yang lebih kompleks seperti bagaimana elemen baru dibuat dan ditempatkan.
  • Interaksi HTML & CSS: Kamu akan melihat secara langsung bagaimana ketiga bahasa ini berkolaborasi menciptakan pengalaman pengguna yang mulus. HTML menyediakan struktur, CSS mempercantik, JS menghidupkan.
  • Dasar-dasar UX/UI: Meskipun sederhana, kamu akan mulai memikirkan bagaimana pengguna berinteraksi dengan aplikasimu dan bagaimana membuat interaksi tersebut intuitif.

Tantangan dan Tips untuk Para Petualang Koding

Tentu saja, perjalanan ini tidak selalu mulus. Saya ingat dulu saat mencoba membuat drag-and-drop, elemennya kadang suka nyangkut atau tidak mau jatuh di tempat yang diinginkan. Rasanya seperti sedang mencoba menyetel karburator mobil tua yang bandel, kadang perlu sedikit sentuhan sana-sini. Ini beberapa tips dari saya:

  • Debugging itu Teman: Gunakan console.log() secara liberal untuk melacak nilai variabel dan alur eksekusi kode. Developer Tools di browser adalah "multimeter" andalanmu.
  • Pahami Event Lifecycle: Terutama untuk drag-and-drop, pahami urutan event seperti dragstart, dragover, dragleave, dan drop. Kesalahan di sini sering jadi biang kerok.
  • Struktur Kode yang Rapi: Pisahkan logika kalkulator dan page builder ke dalam fungsi-fungsi yang lebih kecil. Ini akan membuat kode lebih mudah dibaca dan dikelola, seperti menata perkakas di kotak alat agar mudah dicari.
  • Jangan Takut Mencoba: Modifikasi kodenya! Tambahkan fitur baru ke kalkulatormu (misalnya, fungsi akar kuadrat) atau buat komponen baru untuk page builder-mu (misalnya, gambar atau video).

Penutup: Kreasikan Dunia Digitalmu

Dari kalkulator sederhana hingga page builder yang memungkinkanmu merakit halaman web, kamu sudah melangkah jauh dalam memahami kekuatan HTML CSS JS. Proyek-proyek ini adalah bukti bahwa dengan alat yang tepat dan sedikit kreativitas, kamu bisa membangun hampir semua hal di dunia web. Jadi, teruslah bereksperimen, teruslah belajar, dan yang terpenting, nikmati setiap proses merakit "mesin" digitalmu!

Siapa tahu, dari sini, kamu bisa menciptakan aplikasi web revolusioner yang mengubah cara orang berinteraksi dengan internet. Selamat mencoba dan selamat berkarya!