Membangun Impian Digitalmu: Kalkulator dan Page Builder Hanya dengan HTML, CSS, dan JS!

PintarApp Juli 04, 2026
Membangun Impian Digitalmu: Kalkulator dan Page Builder Hanya dengan HTML, CSS, dan JS!

Pernahkah Anda merasa seperti seorang montir mobil yang sedang merakit mesin balap impian dari nol? Atau seorang koki yang menciptakan resep andalan hanya dengan bahan-bahan dasar di dapur? Nah, sensasi itulah yang akan Anda rasakan ketika kita bersama-sama membangun dua aplikasi web yang cukup kompleks, kalkulator dan page builder, hanya dengan tiga pilar utama pengembangan web: HTML, CSS, dan JavaScript! Lupakan dulu framework yang serba instan itu, mari kita pahami fondasinya.

Dulu sekali, saat saya pertama kali terjun ke dunia koding, ada masanya saya merasa "terintimidasi" oleh proyek-proyek besar. Rasanya mustahil bisa membuat aplikasi interaktif tanpa ribuan baris kode rumit atau framework tingkat dewa. Padahal, kuncinya justru ada pada pemahaman yang kuat terhadap dasar-dasarnya. Bayangkan, dengan modal pisau, talenan, dan wajan, Anda sudah bisa membuat hidangan lezat, kan? Begitu juga dengan HTML, CSS, dan JavaScript. Mereka adalah pisau, talenan, dan wajan kita di dunia digital.

HTML: Struktur Kokoh, Pondasi Utama Aplikasi Web

HTML (HyperText Markup Language) adalah seperti kerangka bangunan atau sasis mobil. Dia bukan yang paling indah, bukan yang paling fungsional, tapi tanpa dia, tidak akan ada apa-apa. Ini adalah tulang punggung dari semua yang akan kita buat. Untuk kalkulator, HTML bertugas menyediakan tombol-tombol angka, operator, dan layar tempat hasil perhitungan akan ditampilkan. Untuk page builder, HTML menyediakan kanvas tempat elemen-elemen bisa diseret, serta "blok-blok" komponen yang siap pakai.

Membangun Kerangka Kalkulator

Ketika merancang kalkulator, saya pernah lupa menaruh elemen untuk menampilkan hasil. Alhasil, semua perhitungan berjalan di belakang layar, tapi tidak ada yang tahu hasilnya! Rasanya seperti mobil sudah punya mesin canggih tapi tidak ada setirnya. Berikut adalah contoh sederhana struktur HTML untuk kalkulator:

<div class="calculator">
<input type="text" class="display" readonly>
<div class="buttons">
<button class="btn operator">AC</button>
<button class="btn operator">DEL</button>
<button class="btn operator">%</button>
<button class="btn operator">/</button>
<button class="btn">7</button>
<button class="btn">8</button>
<button class="btn">9</button>
<button class="btn operator">*</button>
<button class="btn">4</button>
<button class="btn">5</button>
<button class="btn">6</button>
<button class="btn operator">-</button>
<button class="btn">1</button>
<button class="btn">2</button>
<button class="btn">3</button>
<button class="btn operator">+</button>
<button class="btn">0</button>
<button class="btn">.</button>
<button class="btn equal operator">=</button>
</div>
</div>

Mendesain Kerangka Page Builder

Untuk page builder, HTML berfungsi seperti set Lego. Kita menyediakan berbagai "blok" yang bisa disatukan. Ada palet komponen, dan ada area kanvas tempat kita menyusun komponen-komponen tersebut. Ini adalah fondasi yang memungkinkan drag-and-drop nantinya.

<div class="page-builder">
<div class="sidebar">
<h3>Komponen</h3>
<div class="component-item" draggable="true" data-type="header">Header</div>
<div class="component-item" draggable="true" data-type="paragraph">Paragraf</div>
<div class="component-item" draggable="true" data-type="button">Tombol</div>
</div>
<div class="canvas" id="drop-zone">
<p>Seret komponen ke sini!</p>
</div>
</div>

CSS: Sentuhan Artistik, Mempercantik Tampilan

Kalau HTML itu sasis mobil, maka CSS (Cascading Style Sheets) adalah cat, interior, velg, dan semua aksesori yang membuat mobil itu tampil memukau. Tanpa CSS, web Anda hanya akan berupa teks hitam di latar belakang putih, sangat membosankan. CSS mengubah struktur mentah HTML menjadi antarmuka yang menarik dan mudah digunakan.

Memoles Kalkulator

Di awal belajar CSS, saya sering bingung kenapa tombol kalkulator saya malah bertumpuk-tumpuk, tidak rapi seperti kalkulator sungguhan. Ternyata, saya lupa kekuatan display: grid atau flexbox! CSS memungkinkan kita mengatur tata letak, warna, ukuran, hingga responsivitas agar tampilannya rapi di berbagai perangkat.

<style>
.calculator {
border: 1px solid #ccc;
border-radius: 5px;
padding: 20px;
width: 300px;
margin: 50px auto;
background-color: #f9f9f9;
box-shadow: 0 0 15px rgba(0,0,0,0.2);
}
.display {
width: 95%;
height: 60px;
font-size: 2em;
text-align: right;
margin-bottom: 10px;
border: 1px solid #aaa;
border-radius: 3px;
padding: 0 10px;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
.btn {
width: 100%;
height: 60px;
font-size: 1.5em;
border: none;
border-radius: 5px;
cursor: pointer;
background-color: #e0e0e0;
transition: background-color 0.2s;
}
.btn:hover {
background-color: #d0d0d0;
}
.btn.operator {
background-color: #f0a020;
color: white;
}
.btn.operator:hover {
background-color: #e09010;
}
.btn.equal {
grid-column: span 2; /* Contoh untuk tombol '=' yang lebih lebar */
background-color: #28a745;
}
.btn.equal:hover {
background-color: #218838;
}
</style>

Menata Page Builder

CSS di page builder berperan agar "blok Lego" kita terlihat berbeda satu sama lain, dan area kanvasnya jelas terlihat sebagai tempat untuk meletakkan komponen. Memberi border, latar belakang, dan efek hover akan sangat membantu user experience.

<style>
.page-builder {
display: flex;
min-height: 80vh;
border: 1px solid #ddd;
margin: 20px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.sidebar {
width: 200px;
padding: 15px;
background-color: #f4f4f4;
border-right: 1px solid #eee;
}
.component-item {
padding: 10px;
margin-bottom: 10px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
cursor: grab;
text-align: center;
box-shadow: 0 2px 5px rgba(0,0,0,0.05);
}
.component-item:hover {
background-color: #e9e9e9;
}
.canvas {
flex-grow: 1;
padding: 20px;
background-color: #fff;
border: 2px dashed #ccc;
display: flex;
flex-direction: column;
gap: 10px;
align-items: flex-start; /* Untuk menata komponen ke atas */
min-height: 100%;
}
.canvas.hovered {
border-color: #007bff;
background-color: #eaf5ff;
}
/* Styling for dropped components */
.dropped-header { font-size: 2em; margin-bottom: 10px; }
.dropped-paragraph { font-size: 1em; margin-bottom: 5px; }
.dropped-button { padding: 8px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
</style>

JavaScript: Jantung dan Otak Aplikasi Web

Inilah bagian paling seru! Jika HTML adalah sasis dan CSS adalah estetika, maka JavaScript (JS) adalah mesin, kelistrikan, dan sistem navigasi mobil Anda. Dia yang membuat segalanya bergerak, merespons interaksi, dan berpikir. Tanpa JS, kalkulator Anda hanya kumpulan tombol cantik yang tidak bisa menghitung, dan page builder Anda hanya pajangan blok Lego mati.

Menghidupkan Kalkulator dengan JS

Dulu, saya pernah mengalami error "NaN" (Not a Number) di kalkulator saya. Ternyata, saya lupa mengkonversi nilai dari string menjadi angka sebelum melakukan operasi matematika. Kesalahan sepele tapi bikin pusing! JavaScript akan mendengarkan setiap klik tombol, mengumpulkan input, melakukan perhitungan, dan menampilkan hasilnya di layar.

<script>
const display = document.querySelector('.display');
const buttons = document.querySelectorAll('.btn');
let currentInput = '';
let operator = null;
let previousInput = '';
buttons.forEach(button => {
button.addEventListener('click', (e) => {
const value = e.target.textContent;
if (value === 'AC') {
currentInput = '';
operator = null;
previousInput = '';
display.value = '';
return;
}
if (value === 'DEL') {
currentInput = currentInput.slice(0, -1);
display.value = currentInput;
return;
}
if (value === '=') {
if (currentInput === '' || previousInput === '' || operator === null) return;
const result = operate(parseFloat(previousInput), parseFloat(currentInput), operator);
display.value = result;
currentInput = result.toString();
previousInput = '';
operator = null;
return;
}
if (['+', '-', '*', '/', '%'].includes(value)) {
if (currentInput === '') return;
if (previousInput !== '') { // Rantai operasi
const result = operate(parseFloat(previousInput), parseFloat(currentInput), operator);
previousInput = result.toString();
display.value = previousInput;
} else {
previousInput = currentInput;
}
operator = value;
currentInput = ''; // Reset current input for next number
return;
}
currentInput += value;
display.value = currentInput;
});
});
function operate(num1, num2, op) {
switch (op) {
case '+': return num1 + num2;
case '-': return num1 - num2;
case '*': return num1 * num2;
case '/': return num2 === 0 ? 'Error' : num1 / num2;
case '%': return num1 % num2;
default: return NaN;
}
}
</script>

Membuat Page Builder Interaktif dengan JS

Membangun page builder dengan drag-and-drop itu seperti menjadi seorang konduktor orkestra. Anda harus mengatur banyak instrumen (event listener) agar berbunyi selaras. Ada dragstart, dragover, dragleave, dan drop. Dulu, saya sering lupa memanggil event.preventDefault() di dragover, sehingga elemen tidak mau jatuh di tempat yang seharusnya. Rasanya seperti mencoba memancing tapi lupa melempar kail ke air!

<script>
const componentItems = document.querySelectorAll('.component-item');
const dropZone = document.getElementById('drop-zone');
let draggedItem = null;
componentItems.forEach(item => {
item.addEventListener('dragstart', (e) => {
draggedItem = e.target;
e.dataTransfer.setData('text/plain', e.target.dataset.type); // Store component type
setTimeout(() => {
e.target.style.opacity = '0.5';
}, 0);
});
item.addEventListener('dragend', (e) => {
e.target.style.opacity = '1';
draggedItem = null;
});
});
dropZone.addEventListener('dragover', (e) => {
e.preventDefault(); // Crucial for allowing drop
dropZone.classList.add('hovered');
});
dropZone.addEventListener('dragleave', () => {
dropZone.classList.remove('hovered');
});
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
dropZone.classList.remove('hovered');
const componentType = e.dataTransfer.getData('text/plain');
let newElement;
switch (componentType) {
case 'header':
newElement = document.createElement('h2');
newElement.textContent = 'Ini Header Baru';
newElement.classList.add('dropped-header');
break;
case 'paragraph':
newElement = document.createElement('p');
newElement.textContent = 'Ini paragraf dengan teks default yang bisa diedit.';
newElement.classList.add('dropped-paragraph');
break;
case 'button':
newElement = document.createElement('button');
newElement.textContent = 'Klik Saya';
newElement.classList.add('dropped-button');
break;
default:
return;
}
dropZone.appendChild(newElement);
});
</script>

Manfaat Belajar dari Proyek Ini

Membangun kalkulator dan page builder dari nol menggunakan HTML, CSS, dan JavaScript saja adalah cara terbaik untuk mengasah keterampilan fundamental Anda. Anda akan memahami bagaimana elemen-elemen web saling berinteraksi, bagaimana mengatur tata letak yang kompleks, dan bagaimana membuat logika interaktif yang responsif. Ini adalah investasi jangka panjang untuk karir pengembangan web Anda, seperti seorang arsitek yang memahami betul bagaimana setiap bata diletakkan, bukan hanya bisa memakai cetakan bangunan.

  • Memperkuat Fondasi: Anda akan menguasai cara kerja HTML, CSS, dan JS secara mendalam.
  • Logika Pemrograman: Terutama pada kalkulator, Anda akan melatih cara memecahkan masalah dan merancang alur logika.
  • Interaksi Pengguna: Page builder adalah studi kasus yang sangat baik untuk memahami event DOM dan interaksi drag-and-drop.
  • Kreativitas Tanpa Batas: Anda tidak terikat oleh batasan framework, sehingga bisa bereksperimen lebih bebas.

Penutup: Mulai Petualangan Kodingmu Sekarang!

Jadi, seperti montir yang puas setelah mendengar mesin rakitannya menderu sempurna, atau koki yang bangga melihat orang menikmati masakannya, Anda juga akan merasakan kepuasan luar biasa setelah berhasil membuat kalkulator dan page builder sendiri. Ini adalah bukti bahwa dengan alat yang tepat dan pemahaman yang kuat, Anda bisa membangun hampir apa saja di web. Jangan tunda lagi, buka editor kode Anda, dan mulailah merakit impian digital Anda!