Membangun Impian Digital: Dari Kalkulator Sederhana Hingga Page Builder Interaktif dengan HTML, CSS, JS

PintarApp • Oktober 16, 2026
Membangun Impian Digital: Dari Kalkulator Sederhana Hingga Page Builder Interaktif dengan HTML, CSS, JS

Dulu, saat pertama kali terjun ke dunia koding, saya seringkali merasa seperti montir pemula yang baru mengenal obeng dan kunci pas. Banyak komponen yang terlihat sama, tapi fungsinya beda jauh. Salah satu "servis" pertama yang saya coba adalah membuat kalkulator sederhana. Jujur saja, waktu itu saya sempat bingung kenapa angka "2" ditambah "2" hasilnya "22" alih-alih "4". Ternyata, itu karena saya lupa mengubah tipe data dari string menjadi number di JavaScript! Pengalaman kecil itu mengajarkan saya banyak hal fundamental tentang bagaimana "mesin" web bekerja.

Kini, saya ingin mengajak Anda, para pembangun web masa depan, untuk melihat bagaimana kita bisa melangkah lebih jauh dari sekadar kalkulator. Kita akan menyelami pembangunan dua aplikasi web yang cukup powerful namun tetap mengandalkan trio fundamental kita: HTML, CSS, dan JavaScript. Siap? Mari kita bongkar!

Memulai dengan Fondasi Kokoh: Aplikasi Kalkulator

Membangun kalkulator itu seperti merakit meja pertama Anda di bengkel. Anda butuh rangka yang kuat (HTML), polesan cat yang bagus (CSS), dan mekanisme engsel atau laci yang berfungsi (JavaScript). Ini adalah proyek "Halo Dunia" yang sesungguhnya untuk menguasai interaksi dasar di web.

1. Rangka Meja (HTML): Kerangka Kalkulator

Bagian ini adalah tulang punggung aplikasi kita. Mirip seperti menyiapkan kerangka rumah, kita akan menentukan elemen-elemen dasar seperti layar tampilan dan tombol-tombol angka serta operasi. Pastikan setiap tombol punya ID atau kelas yang mudah dikenali agar JavaScript bisa "memegang" mereka nanti.


<div class="calculator">
<input type="text" class="display" readonly>
<div class="buttons">
<button class="button" data-value="7">7</button>
<button class="button" data-value="8">8</button>
<button class="button" data-value="9">9</button>
<button class="button operator" data-value="/">/</button>
<!-- Tombol lain dan operasi -->
<button class="button clear">C</button>
<button class="button equals">=</button>
</div>
</div>

Saya sering menggunakan atribut data-value di sini. Ini seperti memberi label spesifik pada setiap baut atau mur di bengkel, memudahkan kita untuk mengambilnya kembali saat dibutuhkan oleh logika JavaScript.

2. Poles dan Cat (CSS): Tampilan Menarik

Setelah rangka berdiri, saatnya mempercantik. CSS adalah cat semprot dan amplas kita. Kita bisa membuat kalkulator terlihat modern, retro, atau futuristik. Tata letak tombol biasanya paling nyaman menggunakan Flexbox atau Grid, yang memungkinkan penempatan elemen yang rapi dan responsif. Ingat, kenyamanan pengguna itu penting, seperti ergonomi pada perkakas di bengkel!


.calculator {
width: 300px;
margin: 50px auto;
border: 1px solid #ccc;
border-radius: 10px;
padding: 15px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.display {
width: 100%;
height: 60px;
font-size: 2em;
text-align: right;
margin-bottom: 10px;
padding: 10px;
border: 1px solid #eee;
border-radius: 5px;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
.button {
padding: 15px;
font-size: 1.2em;
border: none;
border-radius: 5px;
background-color: #f0f0f0;
cursor: pointer;
transition: background-color 0.2s ease;
}
.button:hover {
background-color: #e0e0e0;
}
.operator {
background-color: #ffa500;
color: white;
}
.equals {
background-color: #28a745;
color: white;
}

3. Mekanisme Engsel (JavaScript): Logika di Balik Angka

Ini adalah bagian paling seru, di mana kalkulator kita benar-benar "hidup". JavaScript akan mendengarkan setiap klik tombol, mengumpulkan angka dan operasi, lalu melakukan perhitungan. Di sinilah kita akan berhadapan dengan addEventListener, manipulasi DOM (Document Object Model), dan tentu saja, operasi matematika dasar. Ingat cerita saya tentang "2+2=22"? Pastikan Anda menangani konversi tipe data dengan benar!


const display = document.querySelector('.display');
const buttons = document.querySelectorAll('.button');
let currentInput = '';
let operator = null;
let firstOperand = null;
buttons.forEach(button => {
button.addEventListener('click', (e) => {
const value = e.target.dataset.value;
if (value) {
currentInput += value;
display.value = currentInput;
} else if (e.target.classList.contains('operator')) {
if (currentInput !== '') {
firstOperand = parseFloat(currentInput);
operator = e.target.textContent;
currentInput = '';
}
} else if (e.target.classList.contains('equals')) {
if (firstOperand !== 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;
currentInput = result.toString();
firstOperand = null;
operator = null;
}
} else if (e.target.classList.contains('clear')) {
currentInput = '';
operator = null;
firstOperand = null;
display.value = '';
}
});
});

Bagian terpenting di sini adalah bagaimana kita mengelola state (currentInput, operator, firstOperand) dan bagaimana kita memproses input dari pengguna secara berurutan.

Melangkah Lebih Jauh: Membangun Page Builder Sederhana

Jika kalkulator adalah meja bengkel Anda, maka page builder itu ibarat bengkel kustomisasi mobil pribadi. Anda punya berbagai suku cadang (komponen), dan Anda bisa merakitnya sesuai keinginan di area kerja (canvas). Ini proyek yang lebih kompleks tapi sangat memuaskan, mengajarkan banyak tentang interaksi pengguna tingkat tinggi dan manipulasi DOM.

1. Komponen Dasar (Suku Cadang)

Pertama, kita butuh "suku cadang" untuk page builder kita. Ini bisa berupa tombol, teks paragraf, gambar, atau elemen HTML lainnya. Kita akan membuat elemen-elemen ini dapat di-drag. Kuncinya ada pada atribut draggable="true" di HTML.


<div class="sidebar">
<div class="component" draggable="true" data-type="header">Header</div>
<div class="component" draggable="true" data-type="paragraph">Paragraph</div>
<div class="component" draggable="true" data-type="button">Button</div<
<!-- Tambahkan komponen lain -->
</div>
<div class="canvas" id="drop-zone">
<!-- Elemen yang di-drop akan muncul di sini -->
</div>

Saya suka membayangkan data-type ini seperti label pada kotak perkakas, sehingga kita tahu persis alat apa yang kita ambil.

2. Kanvas (Area Kerja) dan Logika Drag & Drop (Mekanik Ahli)

Di sinilah keajaiban terjadi. Kita akan menggunakan Drag and Drop API bawaan browser. Ini melibatkan beberapa event penting:

  • dragstart: Saat komponen mulai di-drag. Kita bisa menyimpan informasi tentang komponen yang di-drag di sini.
  • dragover: Saat komponen berada di atas area drop. Penting untuk mencegah perilaku default browser yang tidak mengizinkan drop.
  • drop: Saat komponen dijatuhkan di area drop. Di sinilah kita akan membuat salinan komponen dan menambahkannya ke DOM.

const components = document.querySelectorAll('.component');
const dropZone = document.getElementById('drop-zone');
let draggedComponentData = null;
components.forEach(component => {
component.addEventListener('dragstart', (e) => {
draggedComponentData = e.target.dataset.type;
e.dataTransfer.setData('text/plain', draggedComponentData); // Untuk kompatibilitas
e.target.style.opacity = '0.5'; // Memberikan feedback visual
});
component.addEventListener('dragend', (e) => {
e.target.style.opacity = '1';
});
});
dropZone.addEventListener('dragover', (e) => {
e.preventDefault(); // Mencegah default untuk mengizinkan drop
dropZone.style.border = '2px dashed blue'; // Feedback visual
});
dropZone.addEventListener('dragleave', () => {
dropZone.style.border = '1px solid #ccc';
});
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
dropZone.style.border = '1px solid #ccc';
const dataType = e.dataTransfer.getData('text/plain'); // Ambil data
// Buat elemen baru berdasarkan dataType
let newElement;
switch (dataType) {
case 'header':
newElement = document.createElement('h2');
newElement.textContent = 'Ini Header Baru';
break;
case 'paragraph':
newElement = document.createElement('p');
newElement.textContent = 'Ini paragraf baru yang bisa diedit.';
break;
case 'button':
newElement = document.createElement('button');
newElement.textContent = 'Klik Saya!';
newElement.style.padding = '10px 20px';
newElement.style.backgroundColor = '#007bff';
newElement.style.color = 'white';
newElement.style.border = 'none';
newElement.style.borderRadius = '5px';
newElement.style.cursor = 'pointer';
break;
}
if (newElement) {
newElement.contentEditable = true; // Agar bisa diedit langsung
newElement.classList.add('droppable-element'); // Kelas untuk styling/interaksi lebih lanjut
dropZone.appendChild(newElement);
}
});

Memberikan newElement.contentEditable = true; itu seperti memberi kunci pas universal ke pengguna, mereka bisa langsung mengubah isi elemen yang baru saja mereka seret. Tentu saja, untuk page builder yang lebih canggih, Anda akan menambahkan panel pengaturan untuk mengubah warna, ukuran font, dan properti CSS lainnya, yang juga melibatkan lebih banyak manipulasi DOM dan CSS dari JavaScript.

Kesimpulan: Kekuatan Ada di Tangan Anda

Dari pengalaman saya yang dulu kebingungan kenapa 2+2 bisa jadi 22, hingga sekarang bisa membuat struktur aplikasi yang cukup kompleks, kuncinya selalu sama: memahami dasar-dasarnya dengan baik. HTML adalah cetak biru, CSS adalah estetika, dan JavaScript adalah otak di balik segalanya. Dengan menguasai ketiganya, Anda tidak hanya membangun sebuah aplikasi, tetapi Anda juga sedang mengasah "naluri" programmer Anda.

Membangun kalkulator mengajarkan Anda tentang input, output, dan logika sederhana. Melangkah ke page builder, Anda belajar tentang interaksi pengguna yang lebih kaya, manipulasi DOM dinamis, dan bagaimana mengelola berbagai "suku cadang" yang berbeda. Jangan pernah meremehkan kekuatan trio fundamental ini. Mereka adalah pondasi untuk semua framework dan library JavaScript modern yang lebih canggih. Jadi, teruslah bereksperimen, teruslah merakit, dan teruslah berkarya. Dunia digital menunggu inovasi Anda!