Mengulik Kecerdasan Web: Membangun Kalkulator dan Page Builder Tanpa Framework!

PintarApp Juli 24, 2026
Mengulik Kecerdasan Web: Membangun Kalkulator dan Page Builder Tanpa Framework!

Pernah nggak sih ngerasa frustrasi pas lagi ngoding JavaScript, udah yakin banget logikanya bener, tapi kok outputnya nge-bug terus? Dulu banget, pas awal-awal kenal dunia frontend, saya pernah seharian pusing cuma gara-gara salah penempatan tanda kurung di sebuah fungsi kalkulator sederhana. Hasilnya? Tombol 'sama dengan' malah nge-reset input bukannya ngitung. Rasanya kayak lagi nyetel karburator motor, udah bolak-balik dicek tapi ternyata bautnya kendor satu! Padahal cuma salah sedikit, tapi bikin semua sistem jadi kacau balau. Tapi justru dari 'kesalahan sepele' itulah saya belajar banyak, terutama tentang kekuatan dasar dari HTML, CSS, dan JavaScript.

Di artikel ini, kita akan coba bongkar rahasia di balik pembangunan dua aplikasi web yang kelihatannya kompleks, tapi sebenarnya bisa banget kita buat hanya dengan tiga serangkai ajaib: HTML sebagai kerangka, CSS sebagai perias, dan JavaScript sebagai otaknya. Kita akan membangun sebuah kalkulator sederhana yang fungsional dan juga sebuah page builder dasar dengan fitur drag-and-drop yang interaktif. Siap untuk jadi arsitek digital?

Membangun Otak Pintar: Kalkulator Sederhana Penuh Guna

Bayangkan Anda sedang merakit sebuah robot sederhana. HTML adalah rangka tubuh robot itu: di mana letak layar tampilannya, di mana tombol-tombolnya. CSS adalah cat bodinya, lampu-lampu indikator, dan desain keseluruhan agar robot terlihat menarik dan enak dilihat. Nah, JavaScript adalah sirkuit elektronik, mikroprosesor, dan semua program yang membuat robot bisa bergerak, menerima input dari tombol, lalu memprosesnya untuk ditampilkan di layar. Kalkulator kita juga akan bekerja dengan prinsip yang sama.

1. Pondasi HTML: Rangka Si Kalkulator

Kita butuh sebuah area untuk menampilkan angka dan hasil perhitungan, serta deretan tombol dari angka 0-9, operator (+, -, *, /), tombol "sama dengan", dan "clear".


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

2. Desain CSS: Mempercantik Tampilan

Di sini kita akan menata letak tombol, ukuran font, warna latar, dan sentuhan-sentuhan visual agar kalkulator terlihat profesional dan mudah digunakan.


.calculator-container {
width: 300px;
margin: 50px auto;
border: 1px solid #ccc;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
padding: 15px;
background-color: #f5f5f5;
}
#calc-display {
width: calc(100% - 10px);
height: 40px;
margin-bottom: 15px;
padding: 5px;
font-size: 1.8em;
text-align: right;
border: 1px solid #ddd;
border-radius: 4px;
background-color: #eee;
}
.calc-buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
.calc-buttons button {
width: 100%;
height: 50px;
font-size: 1.2em;
border: none;
border-radius: 5px;
cursor: pointer;
background-color: #e0e0e0;
transition: background-color 0.2s;
}
.calc-buttons button:hover {
background-color: #d0d0d0;
}
.calc-buttons button.operator {
background-color: #ff9800;
color: white;
}
.calc-buttons button.operator:hover {
background-color: #fb8c00;
}
.calc-buttons button.equals {
background-color: #4CAF50;
color: white;
grid-column: span 2; /* Agar tombol '=' lebih lebar */
}
.calc-buttons button.equals:hover {
background-color: #43a047;
}
.calc-buttons button.clear {
background-color: #f44336;
color: white;
}
.calc-buttons button.clear:hover {
background-color: #e53935;
}

3. Otak JavaScript: Menghidupkan Logika

Bagian ini adalah inti dari semuanya. Kita akan menggunakan JavaScript untuk mendengarkan setiap klik tombol, menyimpan angka dan operator, lalu melakukan perhitungan saat tombol "sama dengan" ditekan. Ibaratnya, ini adalah resep masakan yang harus diikuti agar hidangan jadi sempurna.


const display = document.getElementById('calc-display');
const buttons = document.querySelectorAll('.calc-buttons button');
let currentInput = '';
let operator = null;
let firstOperand = null;
buttons.forEach(button => {
button.addEventListener('click', () => {
const value = button.dataset.value;
const action = button.dataset.action;
if (value) {
currentInput += value;
display.value = currentInput;
} else if (action === 'clear') {
currentInput = '';
operator = null;
firstOperand = null;
display.value = '';
} else if (action === 'equals') {
if (firstOperand !== null && operator !== null && currentInput !== '') {
let result;
const secondOperand = parseFloat(currentInput);
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 (button.classList.contains('operator') && currentInput !== '') {
if (firstOperand === null) {
firstOperand = parseFloat(currentInput);
} else if (operator !== null) {
// Perform previous calculation if chaining operations
// (Simplified for this example, usually involves another function call)
}
operator = value;
currentInput = ''; // Clear current input for next operand
}
});
});

Dengan tiga langkah ini, kalkulator dasar Anda sudah jadi! Dari sini, Anda bisa mengembangkannya dengan fitur memori, persentase, atau bahkan mode ilmiah.

Merancang Kanvas Interaktif: Page Builder Drag-and-Drop

Sekarang, mari kita melangkah lebih jauh dan membangun sesuatu yang sedikit lebih kompleks: sebuah page builder sederhana. Bayangkan Anda seorang koki yang sedang menyiapkan hidangan. Di satu sisi, ada bahan-bahan mentah (teks, gambar, tombol), dan di sisi lain ada meja saji kosong yang siap dihias. Nah, HTML adalah daftar bahan-bahan dan meja sajinya. CSS adalah peralatan makan yang cantik, hiasan di piring, dan penataan meja agar terlihat mengundang. Dan JavaScript? Itu adalah tangan cekatan sang koki yang memilih bahan, memotongnya, menyusunnya di atas piring, dan bahkan mengubah-ubah posisinya sesuai keinginan untuk menciptakan presentasi yang sempurna!

1. Fondasi HTML: Kotak Perkakas dan Kanvas Kosong

Kita perlu "kotak perkakas" yang berisi komponen-komponen yang bisa ditarik (teks, gambar, tombol), dan "kanvas" tempat komponen-komponen itu akan dijatuhkan.


<div class="page-builder-app">
<div class="builder-toolbox">

Komponen

<div class="builder-component" draggable="true" data-type="text"><p>Teks Paragraf</p></div> <div class="builder-component" draggable="true" data-type="heading"><h2>Judul Halaman</h2></div> <div class="builder-component" draggable="true" data-type="image"><img src="https://via.placeholder.com/100" alt="Gambar Placeholder"></div> <div class="builder-component" draggable="true" data-type="button"><button>Tombol Aksi</button></div> </div> <div class="builder-canvas" id="builder-canvas"> <p>Seret komponen ke sini untuk mulai membangun halaman Anda!</p> </div> </div>

2. Desain CSS: Membentuk Antarmuka yang Intuitif

CSS di sini tidak hanya mempercantik, tapi juga memberikan petunjuk visual, misalnya garis putus-putus pada kanvas saat ada elemen yang siap dijatuhkan.


.page-builder-app {
display: flex;
gap: 20px;
margin: 30px auto;
max-width: 1200px;
min-height: 600px;
border: 1px solid #ddd;
box-shadow: 0 0 15px rgba(0,0,0,0.05);
background-color: #fff;
padding: 20px;
}
.builder-toolbox {
width: 250px;
padding: 15px;
border-right: 1px solid #eee;
background-color: #f8f8f8;
flex-shrink: 0;
}
.builder-toolbox h3 {
margin-top: 0;
color: #333;
border-bottom: 1px solid #eee;
padding-bottom: 10px;
margin-bottom: 15px;
}
.builder-component {
padding: 10px;
margin-bottom: 10px;
background-color: #e6f7ff;
border: 1px solid #91d5ff;
border-radius: 4px;
cursor: grab;
text-align: center;
font-size: 0.9em;
color: #333;
}
.builder-component:hover {
background-color: #bae7ff;
}
.builder-component img {
max-width: 100%;
height: auto;
display: block;
margin: 5px auto;
}
.builder-canvas {
flex-grow: 1;
border: 2px dashed #ccc;
min-height: 500px;
padding: 20px;
background-color: #ffffff;
transition: border-color 0.2s;
}
.builder-canvas.drag-over {
border-color: #007bff;
background-color: #eaf6ff;
}
.canvas-element { /* Styling for elements dropped into canvas */
border: 1px solid #ddd;
padding: 10px;
margin-bottom: 10px;
background-color: #fefefe;
cursor: grab;
position: relative;
}

3. Otak JavaScript: Menggerakkan Interaksi Drag-and-Drop

Ini adalah bagian paling seru! JavaScript akan menangani semua logika drag-and-drop, membuat elemen baru di kanvas, dan memungkinkan kita untuk memanipulasinya.


const toolboxComponents = document.querySelectorAll('.builder-component');
const canvas = document.getElementById('builder-canvas');
let draggedComponentData = null; // Store data of the dragged component
toolboxComponents.forEach(component => {
component.addEventListener('dragstart', (e) => {
// e.dataTransfer.setData is crucial for passing data during drag
e.dataTransfer.setData('text/plain', e.target.dataset.type);
draggedComponentData = e.target.dataset.type; // Store data for convenience
e.dataTransfer.effectAllowed = 'copy'; // Indicate that a copy will be made
});
});
canvas.addEventListener('dragover', (e) => {
e.preventDefault(); // Mencegah perilaku default browser (yang biasanya tidak mengizinkan drop)
canvas.classList.add('drag-over');
e.dataTransfer.dropEffect = 'copy'; // Visual feedback for copying
});
canvas.addEventListener('dragleave', () => {
canvas.classList.remove('drag-over');
});
canvas.addEventListener('drop', (e) => {
e.preventDefault();
canvas.classList.remove('drag-over');
const componentType = e.dataTransfer.getData('text/plain');
let newElement;
if (componentType === 'text') {
newElement = document.createElement('p');
newElement.textContent = 'Ini adalah paragraf baru. Klik untuk edit!';
} else if (componentType === 'heading') {
newElement = document.createElement('h2');
newElement.textContent = 'Judul Baru Anda';
} else if (componentType === 'image') {
newElement = document.createElement('img');
newElement.src = 'https://via.placeholder.com/200x150';
newElement.alt = 'Gambar yang baru';
newElement.style.maxWidth = '100%';
newElement.style.height = 'auto';
newElement.style.display = 'block';
} else if (componentType === 'button') {
newElement = document.createElement('button');
newElement.textContent = 'Klik Saya!';
}
if (newElement) {
newElement.classList.add('canvas-element');
canvas.appendChild(newElement);
// Hapus teks placeholder jika kanvas sudah ada isinya
if (canvas.querySelector('p:first-child') && canvas.querySelector('p:first-child').textContent === 'Seret komponen ke sini untuk mulai membangun halaman Anda!') {
canvas.querySelector('p:first-child').remove();
}
}
});

Menyatukan Kekuatan: Lebih dari Sekadar Kode

Dari dua contoh di atas, kita bisa melihat betapa powerful-nya kombinasi HTML, CSS, dan JavaScript. Kita tidak perlu framework atau library yang kompleks untuk membuat aplikasi web yang interaktif dan fungsional. Ini adalah fondasi yang sangat kuat:

  • HTML sebagai Pondasi: Ini adalah tulang belulang dari aplikasi kita. Struktur yang bersih dan semantik adalah kunci.
  • CSS sebagai Desainer: Memberi nyawa pada tampilan, memastikan aplikasi kita tidak hanya bekerja tapi juga enak dipandang dan mudah digunakan.
  • JavaScript sebagai Penggerak Otak: Ini adalah kecerdasan di balik interaksi. Dari merespons klik tombol hingga memanipulasi elemen secara dinamis, JavaScript adalah mesinnya.

Tips untuk Programmer Pemula (dan yang Berpengalaman)

Membangun kedua aplikasi ini mungkin terdengar sepele, tapi ini adalah latihan yang bagus untuk mengasah pemahaman Anda tentang fundamental web. Ingat pengalaman saya dengan karburator yang kendor? Itu mengajarkan saya bahwa detail kecil itu penting. Jadi, beberapa tips dari saya:

  • Mulai dari yang Kecil: Jangan langsung ingin membuat aplikasi sebesar Facebook. Mulailah dengan fitur sederhana, lalu kembangkan.
  • Pahami Konsep Dasar: Jangan buru-buru pakai framework. Pahami dulu bagaimana HTML, CSS, dan JavaScript bekerja di balik layar. Ini seperti belajar dasar-dasar memancing sebelum memakai alat canggih. Anda akan lebih mengerti mengapa alat itu bekerja.
  • Debug dengan Sabar: Error itu bagian dari perjalanan. Gunakan console.log() atau fitur Developer Tools di browser Anda. Anggap saja Anda sedang menjadi detektif, mencari petunjuk mengapa kode Anda 'berulah'.
  • Praktik, Praktik, Praktik: Konsisten adalah kunci. Semakin sering Anda ngoding, semakin tajam intuisi Anda.

Membuat kalkulator atau page builder mungkin terdengar seperti proyek "kuno", tapi di situlah letak emasnya. Dengan menguasai dasar-dasar ini, Anda akan memiliki fondasi yang kokoh untuk mempelajari teknologi yang lebih baru dan kompleks. Jadi, siapkan editor kode Anda, dan mulailah berkreasi!