Código fuente de la Calculadora

HTML


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.1/css/all.min.css"
        integrity="sha512-5Hs3dF2AEPkpNAR7UiOHba+lRSJNeM2ECkwxUIxC1Q/FLycGTbNapWXB4tP889k5T5Ju8fs4b1P5z/iB4nMfSQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
    <link rel="stylesheet" href="./styles.css">
    <script src="Calculadora.js" type="text/javascript" defer></script>
    <script src="Display.js" type="text/javascript" defer></script>
    <script src="appC.js" defer></script>
    <title>Calculadora</title>
</head>

<body>
    <div class="contenedor">
        <div class="pantalla">0<!-- inyectado por JS --></div>
        <div class="contenedor_de_teclas">
            <div class="div_teclas">
                <div class="tecla tecla_naranja" data-id="C">C</div>
                <div class="tecla tecla_naranja" data-id="borrar"><i class="fa-solid fa-delete-left"></i></div>
                <div class="tecla tecla_naranja" data-id="dividir"><i class="fa-solid fa-divide"></i></div>
                <div class="tecla tecla_naranja" data-id="expandir"><i class="fa-solid fa-expand"></i></div>
            </div>
            <div class="div_teclas">
                <div class="tecla " data-id="7">7</div>
                <div class="tecla " data-id="8">8</div>
                <div class="tecla " data-id="9">9</div>
                <div class="tecla tecla_naranja" data-id="multiplicar"><i class="fa-solid fa-x"></i></div>
            </div>
            <div class="div_teclas">
                <div class="tecla " data-id="4">4</div>
                <div class="tecla " data-id="5">5</div>
                <div class="tecla " data-id="6">6</div>
                <div class="tecla tecla_naranja" data-id="restar"><i class="fa-solid fa-minus"></i></div>
            </div>
            <div class="div_teclas">
                <div class="tecla " data-id="1">1</div>
                <div class="tecla " data-id="2">2</div>
                <div class="tecla " data-id="3">3</div>
                <div class="tecla tecla_naranja" data-id="sumar"><i class="fa-solid fa-plus"></i></div>
            </div>
            <div class="div_teclas">
                <div class="tecla " data-id="0">0</div>
                <div class="tecla " data-id=".">.</div>
                <div class="tecla tecla_naranja expandir" data-id="="><i class="fa-solid fa-equals"></i></div>
            </div>  
        </div>
    </div>


</body>

</html>
  

CSS


:root{
    --btn-shadow: inset 0px 0px 13px 2px black;
}

*{
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}
body{
    width: 100%;
    height: 100vh;
    display: grid;
    place-items: center;
}
.contenedor{
    width: 60%;
    max-width: 300px;
    min-width:250px ;
    background-color: rgb(35, 35, 35);
    color: rgb(240, 236, 232);
    border-radius: 10px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: 2px;
    font-family:'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
}
.pantalla{
    width: 100%;
    height: 100px;
    border-radius: 10px 10px 0px 0px;
    box-shadow:var(--btn-shadow) ;
    text-align: right;
    display: flex;
    padding: 7px;
    justify-content:right;
    align-items: flex-end;
    font-size: 30px;
}
.contenedor_de_teclas{
    width: 100%;
    display: grid;
    gap: 10px;
    padding: 10px;
}
.div_teclas{
    width: 100%;
    display: flex;
   
    justify-content: space-around;
}
.tecla{
    width: 50px ;
    height: 50px;
    display: grid;
    place-items: center;
    box-shadow: var(--btn-shadow);
    border-radius: 4px;
    cursor: pointer;
}

.tecla_naranja{
    background-color: rgb(87, 85, 84);
    font-size: 20px;
}
.expandir{
    width: 43%;
}
  

JavaScript



/* Clase creada para hacer los cálculos 
con datos NUMÉRICOS */


class Calculadora {
    sumar(num1, num2){
        return num1 + num2
    }
    restar(num1, num2){
        return num1 - num2
    }
    dividir(num1, num2){
        return num1 / num2
    }
    multiplicar(num1, num2){
        return num1 * num2
    }

}

const querySelector = (selector) => {
    return document.querySelector(selector)
}

const pantalla = querySelector('.pantalla')
const contenedor = querySelector('.contenedor')

//la instancia display controla la lógica definida dentro 
//de la clase Display ya que no se puede utilizar una clase 
//directamente porque es como un molde o modelo y 
//hasta que no se crea una instancia(que sería un objeto) 
//no se pueden acceder a sus datos, funciones ,etc... almacenados.
const display = new Display(pantalla)

contenedor.addEventListener('click',(e)=>{
//target será el elemento padre o el mismo elemento 
//clicado en sí que tenga como atributo 'data-id', 
//cuando usas selectores de atributos con métodos como:
// .querySelector(), .querySelectorAll(), o .closest(), los corchetes ([]) se utilizan para buscar elementos basados en un atributo específico del HTML
//El método closest() en JavaScript se utiliza para encontrar el ancestro más cercano de un elemento que coincida con un selector CSS, ejemplo: const parent = paragraph.closest('#parent')
 const target = e.target.closest('[data-id]')
 if(!target) return//si no existe en su elemento padre o en el elemento clicado NO se ejecuta nada del resto del código
 const dataId = target.dataset.id
 const content = target.textContent

    switch (dataId) {
        case 'sumar':
        case 'restar':
        case 'multiplicar':
        case 'dividir':
        case 'porcentaje':
            display.computar(dataId)
            break;
        case '=':
            display.calcula()
            break;
        case 'borrar':
            display.borrar()
            break;
        case 'C':
            display.eliminar()
            break;
    
        default:
            display.agregarNumero(content)
            break;
    }
})



class Display{
    constructor(pantalla){
        this.pantalla = pantalla
        this.calculos = new Calculadora()
        this.valorActual = ''
        this.valorAnterior = ''
        this.operacion = undefined
        this.signos ={
            sumar: '+',
            restar: '-',
            multiplicar: '*',
            dividir: '/',
         
        }
    }
    borrar(){
        this.valorActual = this.valorActual.toString().slice(0,-1)
        this.imprimirValores()
    }
    eliminar(){
        this.valorActual = ''
        this.valorAnterior = ''
        this.operacion = undefined
        this.imprimirValores()
    }

    computar(tipoDeOperacion){
        if (this.valorActual === '') return;
        if (this.valorAnterior !== '') {
            this.calcula();
        }
        this.operacion = tipoDeOperacion 
        this.valorAnterior = this.valorActual 
        this.valorActual = ''
        this.imprimirValores()
    }
    imprimirValores(){
        
            this.pantalla.textContent = `${this.valorAnterior} ${this.signos[this.operacion] || ''} ${this.valorActual}`;
    }

    agregarNumero(numero){
        if(numero === '.' && this.valorActual.includes('.')) return
        this.valorActual = this.valorActual.toString()  + numero.toString()
        this.imprimirValores()
    }

    calcula(){
        const valorActualNumero = parseFloat(this.valorActual);
        const valorAnteriorNumero = parseFloat(this.valorAnterior);
        if (isNaN(valorActualNumero) || isNaN(valorAnteriorNumero)) return;
        this.valorActual = this.calculos[this.operacion](valorAnteriorNumero, valorActualNumero);
        this.operacion = undefined;
        this.valorAnterior = '';
        this.imprimirValores();
    }

 
   
}