Membangun Aplikasi Web Super Keren: Dari Kalkulator Sederhana Hingga Page Builder Interaktif dengan HTML, CSS, dan JavaScript

PintarApp Agustus 13, 2026
Membangun Aplikasi Web Super Keren: Dari Kalkulator Sederhana Hingga Page Builder Interaktif dengan HTML, CSS, dan JavaScript

Pernahkah Anda mencoba membuat kalkulator web pertama dan terkaget-kaget saat '1' ditambah '1' malah menghasilkan '11'? Jujur, saya pernah! Itu salah satu momen "Aha!" bagi saya di awal ngoding, menyadari bahwa JavaScript itu pintar, tapi harus kita bimbing dengan benar. Angka yang kita ketik di input browser awalnya diperlakukan sebagai teks, bukan angka murni. Kesalahan kecil itu mengingatkan saya betapa pentingnya memahami setiap detail, bahkan saat membangun aplikasi yang tampaknya sederhana.

Nah, hari ini kita akan ngoprek bareng, menggali lebih dalam potensi HTML, CSS, dan JavaScript untuk menciptakan dua aplikasi web yang sangat berbeda namun sama-sama powerful: sebuah kalkulator fungsional dan sebuah page builder interaktif. Ini bukan sekadar teori, tapi panduan praktis untuk Anda yang ingin merasakan sensasi "merakit" aplikasi web dari nol, seolah Anda seorang ahli mekanik merakit mesin impiannya.

Merakit Mesin Hitung Saku: Kalkulator Web dengan HTML, CSS, dan JavaScript

Membangun kalkulator web itu ibarat merakit sebuah jam tangan mewah. Setiap komponennya harus presisi, tampilannya menawan, dan mekanismenya bekerja sempurna. Di sini, HTML adalah kerangka jam tangan, casing, dial, dan semua tombolnya. Ini adalah fondasi struktural yang akan kita sentuh dan lihat. Kemudian, CSS adalah sentuhan estetika: warna casing, gaya font pada angka, penataan tombol yang rapi, dan efek ketika tombol ditekan. Terakhir, JavaScript adalah mesin penggerak utamanya, gigi-gigi dan pegas-pegas kecil yang membuat jam tangan (kalkulator) bisa menghitung waktu (operasi matematika) dengan akurat.

Bagian I: Struktur HTML – Rangka Jam Tangan

Kita butuh sebuah layar untuk menampilkan angka dan tombol-tombol untuk input. Sederhana saja, kita bisa menggunakan elemen div untuk wadah kalkulator, sebuah input type="text" yang readonly untuk layar, dan serangkaian button untuk angka dan operator.


<div class="calculator">
<input type="text" class="display" readonly>
<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>

Bagian II: Styling CSS – Estetika yang Memukau

Dengan CSS, kita bisa mengatur tampilan kalkulator agar tidak hanya berfungsi tapi juga enak dipandang. Kita bisa menggunakan Flexbox atau Grid untuk menata tombol-tombol dengan rapi, memberikan warna yang kontras, dan menambahkan efek hover agar interaksi terasa lebih hidup. Misalnya, membuat tombol-tombol berbaris rapi dalam grid 4x4, dengan ukuran dan padding yang pas, seolah menyusun puzzle dengan presisi.


.calculator {
border: 1px solid #ccc;
border-radius: 5px;
width: 300px;
margin: 50px auto;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.display {
width: calc(100% - 20px);
padding: 10px;
font-size: 2em;
text-align: right;
border: none;
background-color: #eee;
margin-bottom: 10px;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 5px;
padding: 10px;
}
button {
padding: 15px;
font-size: 1.2em;
border: 1px solid #ddd;
border-radius: 3px;
cursor: pointer;
background-color: #f9f9f9;
}
button:hover {
background-color: #e0e0e0;
}
.operator, .equals {
background-color: #f0a020;
color: white;
}
.clear {
background-color: #d04040;
color: white;
}

Bagian III: Logika JavaScript – Mesin Penggerak Utama

Inilah jantungnya! JavaScript akan "mendengarkan" setiap klik tombol, menyimpan angka dan operator, lalu melakukan perhitungan. Kita akan menggunakan event listener untuk menangkap interaksi pengguna. Ingat cerita saya di awal? Di sinilah kita harus memastikan angka-angka dikonversi dengan benar menggunakan parseFloat() atau Number() sebelum operasi matematika dilakukan, agar '1' + '1' jadi '2', bukan '11'.


const display = document.querySelector('.display');
const buttons = document.querySelectorAll('.buttons button');
let currentInput = '';
let operator = null;
let firstOperand = null;
let waitingForSecondOperand = false;
buttons.forEach(button => {
button.addEventListener('click', () => {
const value = button.textContent;
if (button.classList.contains('operator')) {
handleOperator(value);
return;
}
if (button.classList.contains('equals')) {
calculate();
return;
}
if (button.classList.contains('clear')) {
clearCalculator();
return;
}
inputDigit(value);
});
});
function inputDigit(digit) {
if (waitingForSecondOperand === true) {
currentInput = digit;
waitingForSecondOperand = false;
} else {
currentInput = currentInput === '0' ? digit : currentInput + digit;
}
display.value = currentInput;
}
function handleOperator(nextOperator) {
const inputValue = parseFloat(currentInput);
if (operator && waitingForSecondOperand)  {
operator = nextOperator;
return;
}
if (firstOperand === null) {
firstOperand = inputValue;
} else if (operator) {
const result = performCalculation[operator](firstOperand, inputValue);
currentInput = String(result);
firstOperand = result;
}
waitingForSecondOperand = true;
operator = nextOperator;
display.value = currentInput;
}
const performCalculation = {
'/': (firstOperand, secondOperand) => firstOperand / secondOperand,
'*': (firstOperand, secondOperand) => firstOperand * secondOperand,
'+': (firstOperand, secondOperand) => firstOperand + secondOperand,
'-': (firstOperand, secondOperand) => firstOperand - secondOperand
};
function calculate() {
if (operator === null || waitingForSecondOperand) {
return;
}
const secondOperand = parseFloat(currentInput);
if (operator) {
currentInput = String(performCalculation[operator](firstOperand, secondOperand));
display.value = currentInput;
firstOperand = parseFloat(currentInput);
operator = null;
waitingForSecondOperand = false;
}
}
function clearCalculator() {
currentInput = '0';
operator = null;
firstOperand = null;
waitingForSecondOperand = false;
display.value = currentInput;
}

Dengan kode di atas, kita sudah punya kalkulator yang berfungsi. Ini adalah dasar yang kokoh, layaknya mesin jam yang presisi.

Membangun "Bengkel Desain": Page Builder Interaktif dengan HTML, CSS, dan JavaScript

Sekarang, mari kita naik level! Dari merakit jam tangan, kita beralih ke membangun bengkel desain sendiri, yaitu page builder. Bayangkan Anda sedang bermain LEGO, tapi LEGO digital. Anda bisa mengambil balok (elemen HTML seperti teks, gambar, tombol), menatanya, mengubah warnanya, dan menyusunnya menjadi struktur yang kompleks (halaman web). HTML adalah balok-balok LEGO-nya, CSS adalah aturan bagaimana balok itu terlihat dan bisa disambungkan, dan JavaScript adalah tangan Anda yang mengambil, memindahkan, menambahkan, dan mengedit balok-balok tersebut.

Prinsip Dasar Page Builder

Inti dari page builder adalah kemampuan untuk memanipulasi Document Object Model (DOM) secara dinamis. Ini berarti kita akan menambahkan, menghapus, dan mengubah elemen HTML yang sudah ada di halaman secara langsung dari JavaScript, berdasarkan interaksi pengguna (misalnya, drag-and-drop).

Bagian I: HTML – Balok-balok LEGO

Kita butuh dua area utama: area "palet" untuk elemen-elemen yang bisa ditarik, dan area "kanvas" tempat halaman akan dibangun. Setiap elemen di palet akan memiliki atribut draggable="true".


<div class="page-builder-container">
<div class="sidebar">
<h3>Komponen</h3>
<div class="component" draggable="true" data-type="heading">Heading</div>
<div class="component" draggable="true" data-type="paragraph">Paragraf</div>
<div class="component" draggable="true" data-type="button">Tombol</div>
<div class="component" draggable="true" data-type="image">Gambar</div>
</div>
<div class="canvas" id="drop-area">
<h2>Seret Komponen ke Sini</h2>
</div>
</div>

Bagian II: CSS – Aturan Pemasangan dan Warna

CSS akan membuat palet dan kanvas terlihat jelas, serta memberikan tampilan default untuk setiap komponen. Kita juga perlu menambahkan sedikit gaya untuk menunjukkan area yang bisa dijatuhkan (drop target) ketika ada elemen yang sedang ditarik.


.page-builder-container {
display: flex;
gap: 20px;
margin: 50px auto;
max-width: 1200px;
}
.sidebar {
width: 200px;
border: 1px solid #eee;
padding: 15px;
background-color: #f8f8f8;
box-shadow: 0 0 5px rgba(0,0,0,0.05);
}
.component {
padding: 10px;
margin-bottom: 10px;
border: 1px dashed #ccc;
background-color: #fff;
cursor: grab;
text-align: center;
}
.component:active {
cursor: grabbing;
}
.canvas {
flex-grow: 1;
border: 2px dashed #007bff;
min-height: 400px;
padding: 20px;
background-color: #fafafa;
}
.canvas.drag-over {
background-color: #e6f2ff;
border-color: #0056b3;
}
/* Styles for dropped elements */
.canvas h1, .canvas h2, .canvas p, .canvas button, .canvas img {
border: 1px dashed #ddd; /* Visual cue for editable elements */
padding: 5px;
margin-bottom: 10px;
cursor: pointer;
}

Bagian III: JavaScript – Tangan Anda yang Ajaib

Inilah bagian tersulit tapi paling seru! JavaScript akan menangani semua interaksi drag-and-drop. Kita akan menggunakan event seperti dragstart pada komponen di sidebar, dragover dan drop pada kanvas.

  • dragstart: Saat komponen ditarik, kita simpan informasi jenis komponennya.
  • dragover: Memungkinkan elemen untuk dijatuhkan di kanvas (secara default, elemen tidak bisa dijatuhkan di sembarang tempat). Kita juga bisa memberikan visual feedback (misalnya, mengubah warna border kanvas).
  • drop: Saat komponen dijatuhkan, kita buat elemen HTML baru sesuai jenisnya dan tambahkan ke dalam kanvas.

const components = document.querySelectorAll('.component');
const dropArea = document.getElementById('drop-area');
let draggedComponentType = null;
components.forEach(component => {
component.addEventListener('dragstart', (e) => {
draggedComponentType = e.target.dataset.type;
e.dataTransfer.setData('text/plain', draggedComponentType); // For compatibility
});
});
dropArea.addEventListener('dragover', (e) => {
e.preventDefault(); // Mencegah default behaviour (membuka sebagai link)
dropArea.classList.add('drag-over');
});
dropArea.addEventListener('dragleave', () => {
dropArea.classList.remove('drag-over');
});
dropArea.addEventListener('drop', (e) => {
e.preventDefault();
dropArea.classList.remove('drag-over');
const componentType = e.dataTransfer.getData('text/plain'); // Get type from dragstart
let newElement;
switch (componentType) {
case 'heading':
newElement = document.createElement('h2');
newElement.textContent = 'Judul Baru';
break;
case 'paragraph':
newElement = document.createElement('p');
newElement.textContent = 'Ini adalah paragraf baru. Klik untuk mengedit.';
break;
case 'button':
newElement = document.createElement('button');
newElement.textContent = 'Klik Saya';
break;
case 'image':
newElement = document.createElement('img');
newElement.src = 'https://via.placeholder.com/150'; // Placeholder image
newElement.alt = 'Gambar Placeholder';
break;
default:
return;
}
// Menambahkan kemampuan edit in-place
newElement.setAttribute('contenteditable', 'true');
newElement.addEventListener('focus', () => {
newElement.style.outline = '2px dashed #007bff';
});
newElement.addEventListener('blur', () => {
newElement.style.outline = 'none';
});
newElement.addEventListener('dblclick', () => {
newElement.focus(); // Fokuskan saat double click untuk edit
});
dropArea.appendChild(newElement);
// Hapus pesan "Seret Komponen ke Sini" jika sudah ada komponen
if (dropArea.querySelector('h2').textContent === 'Seret Komponen ke Sini') {
dropArea.querySelector('h2').remove();
}
});

Dengan kode JavaScript ini, Anda sudah memiliki fondasi untuk sebuah page builder sederhana. Tentu saja, ini bisa dikembangkan lebih lanjut dengan fitur seperti mengubah gaya (warna, font, ukuran) dari elemen yang dijatuhkan, menyimpan layout, atau bahkan drag-and-drop antar elemen yang sudah ada di kanvas.

Sinergi Kreativitas: Lebih dari Sekadar Kode

Dari kalkulator sederhana yang presisi seperti jam tangan hingga page builder yang fleksibel layaknya bengkel kreasi, keduanya menunjukkan bagaimana HTML, CSS, dan JavaScript bekerja sama. HTML menyediakan strukturnya, CSS mempercantik tampilannya, dan JavaScript adalah otak di balik interaktivitasnya.

Kisah "1" + "1" = "11" itu bukan sekadar kesalahan, tapi sebuah pelajaran berharga tentang bagaimana detail kecil bisa membuat perbedaan besar dalam sebuah aplikasi. Begitu juga dalam membangun page builder, setiap baris kode dragstart, dragover, dan drop adalah instruksi presisi agar "balok LEGO" Anda bisa bergerak dan terpasang sempurna.

Jadi, jangan ragu untuk bereksperimen. Modifikasi kalkulator agar bisa menyimpan riwayat, atau tambahkan lebih banyak komponen ke page builder Anda. Dunia pengembangan web itu luas, dan setiap baris kode yang Anda tulis adalah langkah menuju keahlian yang lebih tinggi. Selamat ngoprek!