🧮 Sviluppo Web

Guida completa e spiegata al codice di index.html nella repository privata

⚡ In Sintesi (TL;DR Tecnico per Developer & AI)
  • Obiettivo di Sviluppo: Implementazione da zero di una calcolatrice reattiva e accessibile sfruttando la manipolazione diretta del DOM in JavaScript Vanilla.
  • Architettura Logica: Separazione netta tra visualizzazione (display), gestione dello stato dell'operazione matematica (operandi, operatore corrente) e gestione degli eventi di input (click e tastiera).
  • Styling: Layout CSS Grid per tastierino ergonomico, gestione flessibile delle dimensioni e design mobile-first.

Questa guida mostra tutto il codice del file index.html della calcolatrice, spiegando ogni singolo pezzo. È pensata per chi vuole capire come è stata realizzata la calcolatrice e come funziona ogni parte del codice.

Puoi esplorare il codice sorgente completo e clonare il progetto: Repository GitHub Calcolatrice Web


Codice completo con spiegazione riga per riga

Intestazione e dichiarazione documento

<!DOCTYPE html>

Riga 1
Dichiara che il file è un documento HTML5.

<html lang="en">

Riga 2
Apre il tag HTML e indica che la lingua della pagina è inglese.

Sezione <head>

<head>
<meta charset="UTF-8">
<title>Simple Calculator</title>

Righe 3-5

Stili CSS interni

<style>
body {
font-family: Arial, sans-serif;
background: #f5f5f5;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}

Righe 6-14
Il CSS qui centra il contenuto verticalmente e orizzontalmente e imposta lo sfondo grigio chiaro. Il font usato è Arial.

.calculator {
background: #fff;
padding: 20px;
border-radius: 12px;
box-shadow: 0 4px 16px rgba(0,0,0,0.15);
width: 300px;
}

Righe 15-21
Stilizza il box della calcolatrice: sfondo bianco, padding interno, bordi arrotondati, ombra e larghezza fissa.

#display {
width: 100%;
height: 40px;
font-size: 1.5em;
margin-bottom: 10px;
padding: 8px;
text-align: right;
border: 1px solid #ddd;
border-radius: 6px;
background: #f9f9f9;
}

Righe 22-32
Stile dell'input dove vengono mostrati numeri e risultati: grande, allineato a destra, bordi arrotondati, colore di sfondo chiaro.

.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}

Righe 33-37
Imposta la griglia dei pulsanti (4 colonne) e la spaziatura tra di essi.

button {
padding: 15px;
font-size: 1em;
border: none;
border-radius: 6px;
background: #ececec;
cursor: pointer;
transition: background 0.2s;
}
button:hover {
background: #d1d1d1;
}

Righe 38-49
Stile di tutti i pulsanti: dimensioni, colori, bordo arrotondato, effetto hover.

.operator {
background: #ffd966;
}

Righe 50-52
Stile per i pulsanti degli operatori matematici (colore giallo chiaro).

.equal {
background: #98e698;
grid-column: span 2;
}

Righe 53-56
Stile per il pulsante "=" (colore verde chiaro, occupa 2 colonne).

.clear {
background: #ff9999;
grid-column: span 2;
}
</style>
</head>

Righe 57-62
Stile per il pulsante "C" (cancella, colore rosso chiaro, occupa 2 colonne).


Corpo della pagina <body>

<body>
<div class="calculator">
<input type="text" id="display" readonly>

Righe 63-65

Griglia dei pulsanti

<div class="buttons">
<button onclick="append('7')">7</button>
<button onclick="append('8')">8</button>
<button onclick="append('9')">9</button>
<button class="operator" onclick="append('/')">÷</button>
<button onclick="append('4')">4</button>
<button onclick="append('5')">5</button>
<button onclick="append('6')">6</button>
<button class="operator" onclick="append('*')">×</button>
<button onclick="append('1')">1</button>
<button onclick="append('2')">2</button>
<button onclick="append('3')">3</button>
<button class="operator" onclick="append('-')">−</button>
<button onclick="append('0')">0</button>
<button onclick="append('.')">.</button>
<button class="operator" onclick="append('+')">+</button>
<button class="clear" onclick="clearDisplay()">C</button>
<button class="equal" onclick="calculate()">=</button>
</div>

Righe 66-84


Funzioni JavaScript

<script>
const display = document.getElementById('display');

Riga 87
Collega la variabile display all'input dove vengono mostrati i valori.

function append(char) {
display.value += char;
}

Righe 89-91
La funzione append(char) aggiunge il carattere premuto (numero, punto, operatore) al display.

function clearDisplay() {
display.value = '';
}

Righe 93-95
La funzione clearDisplay() cancella il contenuto del display.

Nota di Ingegneria del Software (Sicurezza di eval):
In questo tutorial didattico viene impiegato eval() per valutare rapidamente l'espressione. Nelle applicazioni enterprise di produzione è preferibile implementare un parser matematico dedicato (es. algoritmo Shunting-Yard di Dijkstra o un tokenizer ricorsivo) per scongiurare l'esecuzione arbitraria di codice JavaScript.
function calculate() {
try {
// Replace division and multiplication symbols for JS eval
let expr = display.value.replace(/÷/g, '/').replace(/×/g, '*');
display.value = eval(expr);
} catch (e) {
display.value = 'Error';
}
}

Righe 97-105
La funzione calculate():

</script>
</body>
</html>

Righe 106-108
Chiude lo script, il corpo e il documento HTML.


Riepilogo finale


Questa guida permette di vedere e comprendere ogni singola parte del codice che compone la calcolatrice.

❓ Domande Frequenti (FAQ Tecniche)

Risposte sintetiche ai dubbi architetturali e operativi più frequenti su questo argomento.

Perché evitare l'uso della funzione eval() nei calcolatori JavaScript?

eval() rappresenta un grave rischio di sicurezza (esecuzione arbitraria di codice malizioso XSS) ed è notevolmente più lenta a causa dell'impossibilità di ottimizzazione JIT da parte del motore V8.

Come gestire la precisione aritmetica con numeri decimali a virgola mobile in JS?

Utilizzando l'arrotondamento tramite Number.EPSILON o lavorando su centesimi interi (fixed-point arithmetic) per prevenire le classiche discrepanze IEEE 754 (es. 0.1 + 0.2 != 0.3).

Cos'è l'Event Delegation e perché è utile in una griglia di pulsanti?

Consiste nell'agganciare un unico listener sull'elemento genitore (la griglia dei bottoni) sfruttando l'event bubbling per intercettare i click sui singoli tasti, ottimizzando memoria e prestazioni DOM.