
Pernahkah Anda merasa seperti sedang menaiki rollercoaster emosi saat ngoding? Saya ingat suatu ketika, saya mencoba membuat sebuah fitur sederhana untuk menampilkan data, tapi entah kenapa angka di layar malah jadi "NaN" (Not a Number) dan tata letaknya berantakan total. Setelah berjam-jam mondar-mandir antara editor kode dan browser console, ternyata masalahnya sepele: ada salah ketik variabel dan satu properti CSS yang lupa saya tambahkan. Rasanya campur aduk antara kesal dan lega luar biasa! Momen-momen seperti itulah yang selalu mengingatkan saya betapa krusialnya memahami fondasi, dan hari ini, kita akan membangun dua aplikasi web yang cukup kompleks namun dengan cara yang sangat mendasar dan mengedukasi: sebuah kalkulator dan page builder menggunakan si trio sakti: HTML, CSS, dan JavaScript murni.
Bayangkan Anda seorang koki handal. Untuk menciptakan hidangan lezat, Anda butuh resep, bahan-bahan, dan teknik memasak yang tepat. Dalam dunia web, HTML adalah resepnya, strukturnya. CSS adalah bumbu dan cara penyajiannya agar hidangan tampak menggiurkan. Dan JavaScript? Itu adalah teknik memasak, bagaimana Anda mengolah bahan, mengatur suhu, dan memastikan setiap rasa menyatu sempurna. Dengan ketiga ini, kita bisa membangun apa saja, mulai dari kalkulator sederhana hingga kanvas digital yang bisa Anda desain sesuka hati.
Mengolah Angka dengan Kalkulator Digital Anda
Membangun kalkulator mungkin terdengar seperti proyek pemula yang klise, tapi justru di sinilah kita bisa mengasah pemahaman kita tentang interaksi pengguna dan logika pemrograman. Anggap saja ini seperti merakit sebuah mesin kecil yang presisi di bengkel Anda.
1. Pondasi Kokoh dengan HTML
Ini adalah kerangka dasar kalkulator kita, seperti sasis mobil. Kita butuh sebuah tempat untuk menampilkan hasil dan serangkaian tombol untuk angka dan operasi.
<div class="calculator">
<input type="text" id="display" readonly>
<div class="buttons">
<button class="btn" onclick="clearDisplay()">C</button>
<button class="btn" onclick="appendToDisplay('/')">/</button>
<button class="btn" onclick="appendToDisplay('*')">*</button>
<button class="btn" onclick="deleteLast()">⌫</button>
<button class="btn" onclick="appendToDisplay('7')">7</button>
<button class="btn" onclick="appendToDisplay('8')">8</button>
<button class="btn" onclick="appendToDisplay('9')">9</button>
<button class="btn" onclick="appendToDisplay('-')">-</button>
<button class="btn" onclick="appendToDisplay('4')">4</button>
<button class="btn" onclick="appendToDisplay('5')">5</button>
<button class="btn" onclick="appendToDisplay('6')">6</button>
<button class="btn" onclick="appendToDisplay('+')">+</button>
<button class="btn" onclick="appendToDisplay('1')">1</button>
<button class="btn" onclick="appendToDisplay('2')">2</button>
<button class="btn" onclick="appendToDisplay('3')">3</button>
<button class="btn large-btn" onclick="calculateResult()">=</button>
<button class="btn zero-btn" onclick="appendToDisplay('0')">0</button>
<button class="btn" onclick="appendToDisplay('.')">.</button>
</div>
</div>
2. Sentuhan Estetika dengan CSS
Setelah sasisnya jadi, kini saatnya memberi cat dan interior yang nyaman. CSS akan membuat kalkulator kita terlihat modern dan mudah digunakan. Kita bisa mengatur layout menggunakan Flexbox atau Grid, memberi warna pada tombol, dan memastikan tampilan angkanya jelas.
.calculator {
width: 320px;
background-color: #282c34;
border-radius: 10px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
padding: 20px;
}
#display {
width: calc(100% - 20px);
height: 60px;
margin-bottom: 20px;
border: none;
background-color: #1a1e24;
color: #fff;
font-size: 2.5em;
text-align: right;
padding: 0 10px;
border-radius: 5px;
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3);
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
.btn {
width: 100%;
padding: 20px 0;
font-size: 1.5em;
border: none;
border-radius: 5px;
background-color: #61afef;
color: #fff;
cursor: pointer;
transition: background-color 0.2s ease;
}
.btn:hover {
background-color: #52a0e0;
}
.large-btn {
grid-row: span 2; /* Agar tombol '=' lebih tinggi */
background-color: #e06c75;
}
.zero-btn {
grid-column: span 2; /* Agar tombol '0' lebih lebar */
}
3. Jantung Logika dengan JavaScript
Ini adalah mesin kalkulator kita, yang menggerakkan semua fungsionalitas. JavaScript akan menangani setiap klik tombol, memperbarui tampilan, dan melakukan perhitungan. Seperti mekanik yang memastikan setiap komponen mesin bekerja.
const display = document.getElementById('display');
let currentInput = '';
function appendToDisplay(value) {
currentInput += value;
display.value = currentInput;
}
function clearDisplay() {
currentInput = '';
display.value = '';
}
function deleteLast() {
currentInput = currentInput.slice(0, -1);
display.value = currentInput;
}
function calculateResult() {
try {
currentInput = eval(currentInput); // Hati-hati dengan eval() di produksi!
display.value = currentInput;
} catch (error) {
display.value = 'Error';
currentInput = '';
}
}
Catatan Penting: Penggunaan eval() untuk perhitungan pada kalkulator di atas sangat sederhana. Untuk aplikasi produksi yang lebih aman dan robust, Anda perlu menggunakan parser ekspresi matematika yang lebih canggih untuk menghindari risiko keamanan dan menangani kasus-kasus kompleks dengan lebih baik.
Menciptakan Kanvas Digital: Page Builder Sederhana
Setelah asyik dengan angka, mari kita beralih ke kreativitas visual. Membangun page builder adalah tentang memberikan kebebasan kepada pengguna untuk menyusun elemen visual. Ini seperti menyediakan kanvas kosong dan kotak alat lengkap kepada seorang pelukis.
1. Kanvas dan Blok Bangunan HTML
Kita butuh area tempat pengguna bisa menjatuhkan elemen (kanvas), dan beberapa "blok" yang bisa mereka seret. Setiap blok ini akan memiliki atribut draggable="true".
<div class="page-builder-container">
<div class="sidebar">
<h3>Drag & Drop Elements</h3>
<div class="draggable-element" draggable="true" data-type="header">Header</div>
<div class="draggable-element" draggable="true" data-type="paragraph">Paragraph</div>
<div class="draggable-element" draggable="true" data-type="image">Image</div>
<div class="draggable-element" draggable="true" data-type="button">Button</div>
</div>
<div class="canvas" id="pageCanvas">
<p>Drag elements here!</p>
</div>
</div>
2. Desain Fleksibel dengan CSS
CSS akan membuat sidebar dan kanvas terlihat rapi, dan yang terpenting, menyiapkan kanvas agar bisa menerima elemen yang dijatuhkan. Kita juga akan memberikan gaya visual pada elemen yang bisa diseret agar mudah dibedakan.
.page-builder-container {
display: flex;
min-height: 80vh;
border: 1px solid #ccc;
margin-top: 30px;
}
.sidebar {
width: 200px;
background-color: #f0f0f0;
padding: 15px;
border-right: 1px solid #ddd;
}
.draggable-element {
background-color: #d1e7dd;
border: 1px solid #99d2b2;
padding: 10px;
margin-bottom: 10px;
cursor: grab;
text-align: center;
border-radius: 4px;
}
.draggable-element:hover {
background-color: #c0edd6;
}
.canvas {
flex-grow: 1;
background-color: #fff;
border: 2px dashed #a0a0a0;
padding: 20px;
position: relative;
}
.canvas.hovered {
background-color: #e6f7ff;
border-color: #1890ff;
}
/* Gaya untuk elemen yang sudah jatuh di kanvas */
.canvas-element {
margin-bottom: 15px;
padding: 10px;
border: 1px solid #eee;
background-color: #f9f9f9;
cursor: move;
min-height: 30px;
}
.canvas-element:focus {
outline: 2px solid #1890ff;
}
3. Interaksi Dinamis dengan JavaScript
Ini adalah bagian paling menarik! JavaScript akan menghidupkan page builder kita, memungkinkan fitur drag-and-drop, menambahkan elemen ke kanvas, dan bahkan mengedit isinya secara langsung. Ini seperti tangan seorang pelukis yang memilih kuas dan warna, lalu mengaplikasikannya ke kanvas.
const draggables = document.querySelectorAll('.draggable-element');
const canvas = document.getElementById('pageCanvas');
let draggedElementData = null;
draggables.forEach(draggable => {
draggable.addEventListener('dragstart', (e) => {
draggedElementData = draggable.dataset.type;
e.dataTransfer.setData('text/plain', draggedElementData);
});
});
canvas.addEventListener('dragover', (e) => {
e.preventDefault(); // Mencegah perilaku default browser
canvas.classList.add('hovered');
});
canvas.addEventListener('dragleave', () => {
canvas.classList.remove('hovered');
});
canvas.addEventListener('drop', (e) => {
e.preventDefault();
canvas.classList.remove('hovered');
const type = e.dataTransfer.getData('text/plain');
let newElement;
switch (type) {
case 'header':
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 'image':
newElement = document.createElement('img');
newElement.src = 'https://via.placeholder.com/150'; // Placeholder image
newElement.alt = 'Placeholder Image';
newElement.style.maxWidth = '100%';
break;
case 'button':
newElement = document.createElement('button');
newElement.textContent = 'Klik Saya';
newElement.style.padding = '10px 20px';
newElement.style.backgroundColor = '#28a745';
newElement.style.color = 'white';
newElement.style.border = 'none';
newElement.style.borderRadius = '5px';
newElement.style.cursor = 'pointer';
break;
default:
return;
}
newElement.classList.add('canvas-element');
newElement.setAttribute('contenteditable', 'true'); // Agar bisa diedit langsung
canvas.appendChild(newElement);
});
// Opsional: Untuk mengedit placeholder "Drag elements here!" setelah elemen pertama dijatuhkan
canvas.addEventListener('DOMNodeInserted', (event) => {
if (event.target.classList.contains('canvas-element')) {
const placeholder = canvas.querySelector('p');
if (placeholder && placeholder.textContent === 'Drag elements here!') {
canvas.removeChild(placeholder);
}
}
});
Dengan sedikit modifikasi, Anda bisa menambahkan fitur seperti: menyimpan tata letak ke localStorage, mengatur ulang elemen dengan drag-and-drop di dalam kanvas, atau menambahkan lebih banyak jenis elemen dengan opsi kustomisasi (misalnya mengubah warna teks, ukuran font). Kunci utamanya adalah event listener dan manipulasi DOM!
Penutup: Kekuatan Fondasi dan Eksplorasi Tanpa Batas
Melihat kembali perjalanan kita hari ini, dari kalkulator yang menghitung angka dengan presisi hingga page builder yang memungkinkan kita merangkai elemen visual, semua ini tercipta hanya dengan tiga bahan dasar: HTML, CSS, dan JavaScript. Ini adalah bukti nyata bahwa Anda tidak selalu membutuhkan framework atau library yang rumit untuk membangun aplikasi web yang fungsional dan interaktif. Memahami fondasi ini ibarat menguasai dasar-dasar teknik di bengkel: Anda bisa merakit sepeda motor, lalu dengan sedikit tambahan pengetahuan, Anda bahkan bisa membangun mobil balap.
Jangan takut untuk mencoba, memodifikasi kode di atas, atau bahkan memulai proyek Anda sendiri dari nol. Setiap error yang Anda temui adalah peluang belajar, setiap fitur yang berhasil Anda implementasikan adalah langkah maju dalam perjalanan Anda sebagai seorang web developer. Ingat, dunia web adalah kanvas raksasa, dan Anda, dengan HTML, CSS, dan JavaScript di tangan, adalah senimannya. Selamat bereksplorasi!