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

PintarApp Mei 27, 2026
Membangun Dunia Digitalmu Sendiri: Kalkulator Interaktif dan Page Builder Dinamis dengan HTML, CSS, JavaScript

Pernahkah kalian merasa 'kok susah banget ya bikin aplikasi web yang interaktif?' Jujur, saya dulu sering kena mental saat awal-awal ngoding. Dulu saya pernah pusing tujuh keliling pas lagi nyoba bikin kalkulator sederhana, gara-gara salah penempatan event listener. Tombolnya gak mau ngerespon, layarnya diem aja kayak patung, padahal logika udah saya utak-atik berkali-kali. Rasanya kayak lagi nyoba nyalain motor tapi lupa pasang businya. Tapi justru dari kesalahan-kesalahan kecil itu, kita jadi paham betul bagaimana pondasi sebuah aplikasi bekerja. Nah, kali ini, kita bakal kupas tuntas bagaimana sih caranya kita bisa menciptakan dua aplikasi web yang cukup powerful, yaitu kalkulator dan page builder, hanya dengan modal trio serangkai sakti: HTML, CSS, dan JavaScript.

Kalian mungkin berpikir, 'Ah, bikin kalkulator atau page builder, kan udah banyak library atau framework yang canggih.' Betul, memang ada banyak. Tapi percayalah, memahami dasarnya adalah kunci utama. Ibarat seorang chef handal, dia tidak hanya bisa mengikuti resep masakan, tapi juga tahu betul bagaimana karakter setiap bahan, bagaimana suhu oven memengaruhi kue, dan bagaimana bumbu bisa menciptakan harmoni rasa. Begitu juga di dunia development, menguasai HTML untuk struktur, CSS untuk estetika, dan JavaScript untuk interaksi, adalah resep dasar yang tak lekang oleh waktu untuk membuat aplikasi web yang fungsional dan menarik.

Membangun Kalkulator Digital dari Awal: Fondasi Hitunganmu

Mari kita mulai dengan tantangan pertama: si kalkulator. Ini adalah proyek klasik yang sempurna untuk mengasah kemampuan frontend development kalian. Bayangkan kalian sedang di bengkel, ingin merakit sebuah alat hitung yang presisi dan mudah digunakan. Kalian punya rangka dasar (itu HTML kita), lalu kalian cat dan poles permukaannya biar enak dipandang (ini peran CSS). Terakhir, kalian pasang mesin penggerak dan tombol-tombolnya agar alat itu bisa berfungsi sesuai keinginan (nah, ini dia JavaScript).

Struktur HTML: Tulang Rusuk Kalkulator

Bagian pertama adalah HTML, yang akan kita gunakan untuk membangun tampilan dan tombol-tombol kalkulator. Ini adalah kerangka dasar, layaknya sasis mobil. Kita butuh sebuah layar untuk menampilkan angka, dan serangkaian tombol untuk angka (0-9) serta operator (+, -, *, /, =).


<div class="calculator">
<input type="text" class="calculator-display" disabled>
<div class="calculator-buttons">
<button class="operator" data-action="clear">AC</button>
<button class="operator" data-action="divide">/</button>
<button class="operator" data-action="multiply">*</button>
<button>7</button>
<button>8</button>
<button>9</button>
<button class="operator" data-action="subtract">-</button>
<button>4</button>
<button>5</button>
<button>6</button>
<button class="operator" data-action="add">+</button>
<button>1</button>
<button>2</button>
<button>3</button>
<button class="equal-sign" data-action="calculate">=</button>
<button class="zero-button">0</button>
<button data-action="decimal">.</button>
</div>
</div>

Styling CSS: Membuat Kalkulator Tampil Memukau

Setelah kerangka jadi, kita percantik dengan CSS. Ini seperti mengecat mobil, memilih velg, dan menata interior. Kita akan membuat tombol-tombolnya berjejer rapi, layarnya terlihat jelas, dan memberikan sedikit sentuhan warna agar kalkulator tidak monoton.


/* Contoh CSS sederhana */
.calculator {
border: 1px solid #ccc;
border-radius: 5px;
width: 300px;
margin: 50px auto;
box-shadow: 2px 2px 10px rgba(0,0,0,0.1);
}
.calculator-display {
width: calc(100% - 20px);
height: 60px;
background-color: #222;
color: #fff;
font-size: 2em;
text-align: right;
padding: 10px;
border: none;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
.calculator-buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 5px;
padding: 10px;
}
button {
width: 100%;
height: 60px;
font-size: 1.5em;
border: none;
border-radius: 5px;
background-color: #e0e0e0;
cursor: pointer;
transition: background-color 0.2s;
}
button:hover {
background-color: #d0d0d0;
}
.operator { background-color: #f7950c; color: white; }
.equal-sign { background-color: #28a745; color: white; grid-column: span 2; }
.zero-button { grid-column: span 2; }

Logika JavaScript: Otak di Balik Kalkulator

Dan ini dia bintang utamanya, JavaScript. Ini adalah mesin dan sistem kelistrikan yang membuat kalkulator bekerja. Di sini kita akan mendeteksi setiap tombol yang ditekan, mengelola angka yang dimasukkan, dan melakukan perhitungan. Sedikit tips, seringkali kesalahan kecil di awal seperti salah menginisialisasi variabel atau melewatkan kondisi if bisa membuat kalkulator ngambek, tidak mau menghitung. Rasanya kayak lagi nyari kunci pas yang hilang di bengkel, padahal cuma jatuh di bawah meja.


const display = document.querySelector('.calculator-display');
const buttons = document.querySelector('.calculator-buttons');
let firstOperand = null;
let operator = null;
let waitingForSecondOperand = false;
function inputDigit(digit) {
if (waitingForSecondOperand === true) {
display.value = digit;
waitingForSecondOperand = false;
} else {
display.value = display.value === '0' ? digit : display.value + digit;
}
}
function handleOperator(nextOperator) {
const inputValue = parseFloat(display.value);
if (operator && waitingForSecondOperand) {
operator = nextOperator;
return;
}
if (firstOperand === null) {
firstOperand = inputValue;
} else if (operator) {
const result = calculate(firstOperand, inputValue, operator);
display.value = parseFloat(result.toFixed(7)); // Handle floating point issues
firstOperand = result;
}
waitingForSecondOperand = true;
operator = nextOperator;
}
function calculate(first, second, op) {
if (op === '+') return first + second;
if (op === '-') return first - second;
if (op === '*') return first * second;
if (op === '/') return first / second;
return second;
}
function resetCalculator() {
display.value = '0';
firstOperand = null;
operator = null;
waitingForSecondOperand = false;
}
buttons.addEventListener('click', (event) => {
const { target } = event;
if (!target.matches('button')) {
return;
}
if (target.classList.contains('operator')) {
if (target.dataset.action === 'clear') {
resetCalculator();
} else if (target.dataset.action === 'calculate') {
handleOperator(target.dataset.action);
} else {
handleOperator(target.dataset.action);
}
return;
}
if (target.dataset.action === 'decimal') {
if (!display.value.includes('.')) {
display.value += '.';
}
return;
}
inputDigit(target.textContent);
});
resetCalculator(); // Initialize display

Menjelajah Lebih Jauh: Membangun Page Builder Dinamis

Sekarang kita naik level! Pernah main LEGO kan? Kalian punya tumpukan balok-balok dan ingin menyusunnya menjadi bentuk apa saja. Nah, page builder ini ibarat kotak LEGO raksasa yang kita buat sendiri. HTML adalah pondasi alas tempat kita meletakkan balok, juga daftar balok-balok yang tersedia (elemen seperti teks, gambar, tombol). CSS adalah warna dan bentuk baloknya, juga bagaimana alas itu terlihat rapi dan punya garis panduan. Sementara JavaScript adalah 'tangan' ajaib yang bisa mengambil balok dari tumpukan, meletakkannya di alas, memindahkannya, bahkan menghapusnya. Ini juga yang membuat balok-balok itu 'menempel' saat kita lepas.

Membangun page builder tentu lebih kompleks daripada kalkulator. Kalian akan berurusan dengan konsep 'drag and drop', manipulasi DOM (Document Object Model) secara dinamis, dan mungkin bahkan penyimpanan konfigurasi halaman. Ini adalah contoh nyata bagaimana JavaScript bisa mengubah statisnya HTML dan CSS menjadi pengalaman yang sangat interaktif.

Prinsip Dasar Page Builder

  • Elemen yang Dapat Diseret (Draggable Elements): Ini adalah 'balok LEGO' kita. Bisa berupa teks, gambar, tombol, atau div kosong.
  • Area Jatuhkan (Droppable Area): Ini adalah 'alas LEGO' kita, tempat elemen-elemen tersebut akan diletakkan.
  • Interaksi JavaScript: Memastikan elemen bisa diseret, dijatuhkan, dan dimanipulasi setelah dijatuhkan (misalnya, mengubah teks, ukuran, atau warna).

Kerangka HTML untuk Page Builder

Kita butuh sebuah panel berisi elemen-elemen yang bisa diseret, dan sebuah area utama (canvas) tempat elemen-elemen itu akan dibangun.


<div class="page-builder-container">
<div class="sidebar">
<h3>Elements</h3>
<div class="draggable-element" draggable="true" data-type="text">Text Block</div>
<div class="draggable-element" draggable="true" data-type="image">Image Block</div>
<div class="draggable-element" draggable="true" data-type="button">Button Block</div>
<button id="savePage">Save Page</button>
</div>
<div class="canvas" id="pageCanvas">
<!-- Dropped elements will go here -->
</div>
</div>

Sentuhan CSS untuk Tampilan Builder

CSS akan membuat sidebar elemen terlihat jelas dan canvas memiliki batas yang tegas, memberikan kesan bahwa ini adalah area kerja kita. Gaya visual ini membantu pengguna memahami interaksi yang mungkin dilakukan.


/* Contoh CSS Page Builder */
.page-builder-container {
display: flex;
min-height: 80vh;
border: 1px solid #eee;
margin: 20px auto;
width: 90%;
box-shadow: 0 0 10px rgba(0,0,0,0.05);
}
.sidebar {
width: 200px;
background-color: #f8f8f8;
padding: 15px;
border-right: 1px solid #eee;
}
.draggable-element {
padding: 10px;
margin-bottom: 10px;
background-color: #fff;
border: 1px dashed #ccc;
cursor: grab;
text-align: center;
}
.draggable-element:hover {
background-color: #e9e9e9;
}
.canvas {
flex-grow: 1;
background-color: #fff;
padding: 20px;
border: 1px solid #ddd;
min-height: 500px;
}
.canvas.drag-over {
background-color: #e0f7fa;
border: 1px dashed #00bcd4;
}
/* Style for dropped elements */
.canvas > div {
min-height: 50px;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #b3e5fc;
background-color: #e1f5fe;
position: relative;
cursor: move;
}

Interaksi JavaScript untuk Drag and Drop

Di sinilah magic JavaScript bermain. Kita akan menggunakan API Drag and Drop HTML5. Kita perlu mendeteksi kapan elemen mulai diseret (dragstart), kapan elemen berada di atas area jatuhkan (dragover), dan kapan elemen dijatuhkan (drop). Dulu, saya pernah frustasi karena elemennya nggak mau 'nempel' di canvas, padahal udah dijatuhin. Ternyata saya lupa menambahkan event.preventDefault() di event dragover, yang fungsinya seperti 'membolehkan' objek lain masuk ke area itu. Rasanya kayak udah mancing berjam-jam, umpannya dimakan, tapi ikannya lepas gara-gara senarnya kurang kencang!


const draggables = document.querySelectorAll('.draggable-element');
const canvas = document.getElementById('pageCanvas');
let draggedElement = null;
draggables.forEach(draggable => {
draggable.addEventListener('dragstart', (e) => {
draggedElement = e.target;
e.dataTransfer.setData('text/plain', e.target.dataset.type);
});
});
canvas.addEventListener('dragover', (e) => {
e.preventDefault(); // This is crucial to allow dropping
canvas.classList.add('drag-over');
});
canvas.addEventListener('dragleave', () => {
canvas.classList.remove('drag-over');
});
canvas.addEventListener('drop', (e) => {
e.preventDefault();
canvas.classList.remove('drag-over');
const elementType = e.dataTransfer.getData('text/plain');
let newElement;
if (elementType === 'text') {
newElement = document.createElement('div');
newElement.innerHTML = '<p contenteditable="true">Edit this text</p>';
} else if (elementType === 'image') {
newElement = document.createElement('div');
newElement.innerHTML = '<img src="https://via.placeholder.com/150" alt="Placeholder" style="max-width:100%;">';
} else if (elementType === 'button') {
newElement = document.createElement('div');
newElement.innerHTML = '<button>Click Me</button>';
}
if (newElement) {
newElement.classList.add('dropped-element');
canvas.appendChild(newElement);
}
draggedElement = null;
});
// Optional: Save/Load Page (requires more complex logic, e.g., using localStorage)
document.getElementById('savePage').addEventListener('click', () => {
const pageContent = canvas.innerHTML;
localStorage.setItem('savedPage', pageContent);
alert('Page saved!');
});
// Example of loading page
window.addEventListener('load', () => {
const savedPage = localStorage.getItem('savedPage');
if (savedPage) {
canvas.innerHTML = savedPage;
}
});

Kesimpulan: Kekuatan Ada di Tanganmu

Lihat kan? Dengan HTML, CSS, dan JavaScript saja, kita bisa membangun aplikasi yang luar biasa interaktif. Dari kalkulator sederhana yang jadi fondasi pemahaman logika, sampai page builder yang memungkinkan kita menjadi arsitek visual sebuah halaman web. Keduanya adalah bukti nyata bahwa kamu tidak perlu framework super canggih untuk memulai belajar web development atau membuat aplikasi web interaktif. Kunci utamanya adalah pemahaman dasar yang kuat dan kreativitas tanpa batas.

Jadi, jangan pernah takut untuk bereksperimen. Anggap saja setiap error adalah 'bug' yang perlu kamu 'perbaiki' dengan obeng virtualmu. Setiap proyek yang kamu selesaikan adalah 'mobil' baru yang berhasil kamu rakit. Selamat ngoding, para insinyur digital masa depan!