Control de Gastos con JavaScript y HTML + CSS

- Si es de tu interés este artículo, apoyanos compartiendo en tus redes sociales favoritas y de esa manera también incentivando a tus amigos que crees les pueda interesar a que nos lean.


Control de Gastos con JavaScript y HTML + CSS


Introducción

En la era digital, administrar nuestros gastos de manera eficiente se ha vuelto fundamental. Contar con una herramienta que permita registrar, visualizar y analizar nuestras finanzas personales facilita una mejor toma de decisiones económicas. En este artículo, presentaremos un Controlador de Gastos Personales, desarrollado con HTML, CSS y JavaScript, el cual ofrece una interfaz intuitiva y atractiva para gestionar ingresos y egresos de manera sencilla.

Tecnologías Utilizadas

Este proyecto ha sido desarrollado utilizando tecnologías web estándar:

  • HTML5: Para la estructura y disposición de los elementos en la página.

  • CSS3: Para el diseño y estilización de la interfaz.

  • JavaScript (ES6+): Para la lógica de funcionamiento, almacenamiento de datos y actualización dinámica.

  • Chart.js: Para la generación de gráficos visuales que ayudan a comprender mejor la distribución de los gastos.

  • LocalStorage: Para almacenar los gastos en el navegador y conservar la información tras recargar la página.

Funcionalidades Principales

El Controlador de Gastos Personales permite:

✅ Registrar gastos con una descripción, monto y categoría.
✅ Visualizar los gastos en una lista dinámica, con detalles de cada uno.
✅ Representar los gastos en un gráfico de tipo “doughnut” con colores diferenciados por categoría.
✅ Persistencia de datos mediante localStorage para mantener los registros guardados.
✅ Diseño atractivo y moderno, con un esquema de colores llamativo que mejora la experiencia del usuario.

Código del Proyecto

El código fuente de este proyecto está disponible a continuación. Se divide en tres secciones principales: estructura (HTML), diseño (CSS) y lógica (JavaScript).

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Controlador de Gastos</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Arial', sans-serif;
        }
        body {
            background: #1e1e2e;
            color: white;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
            text-align: center;
        }
        .container {
            background: #282a36;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0px 0px 15px rgba(0, 255, 255, 0.5);
            max-width: 400px;
            width: 100%;
        }
        input, select, button {
            width: 100%;
            padding: 10px;
            margin: 10px 0;
            border: none;
            border-radius: 5px;
            font-size: 16px;
        }
        button {
            background: #0ff;
            color: black;
            cursor: pointer;
            transition: 0.3s;
        }
        button:hover {
            background: #00ccff;
        }
        .chart-container {
            margin-top: 20px;
            width: 100%;
            max-width: 600px;
        }
        .expenses-list {
            margin-top: 20px;
            background: #333;
            padding: 10px;
            border-radius: 5px;
            max-height: 200px;
            overflow-y: auto;
            text-align: left;
        }
        .expenses-list div {
            padding: 5px;
            border-bottom: 1px solid #555;
        }
        .expenses-list div:last-child {
            border-bottom: none;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>Controlador de Gastos</h2>
        <input type="text" id="description" placeholder="Descripción del gasto">
        <input type="number" id="amount" placeholder="Monto">
        <select id="category">
            <option value="Alimentación">Alimentación</option>
            <option value="Transporte">Transporte</option>
            <option value="Entretenimiento">Entretenimiento</option>
            <option value="Salud">Salud</option>
            <option value="Otros">Otros</option>
        </select>
        <button onclick="addExpense()">Agregar Gasto</button>
        <canvas id="expenseChart" class="chart-container"></canvas>
        <div class="expenses-list" id="expenses-list"></div>
    </div>
    
    <script>
        let expenses = JSON.parse(localStorage.getItem('expenses')) || [];
        const ctx = document.getElementById('expenseChart').getContext('2d');
        let chart;
        
        function updateChart() {
            const categories = {};
            expenses.forEach(expense => {
                categories[expense.category] = (categories[expense.category] || 0) + expense.amount;
            });
            
            if (chart) chart.destroy();
            
            chart = new Chart(ctx, {
                type: 'doughnut',
                data: {
                    labels: Object.keys(categories),
                    datasets: [{
                        data: Object.values(categories),
                        backgroundColor: ['#ff6384', '#36a2eb', '#ffce56', '#4bc0c0', '#9966ff'],
                    }]
                },
                options: {
                    responsive: true,
                    plugins: {
                        legend: {
                            labels: {
                                color: 'white'
                            }
                        }
                    }
                }
            });
        }
        
        function updateExpenseList() {
            const expenseList = document.getElementById('expenses-list');
            expenseList.innerHTML = "";
            expenses.forEach(expense => {
                let div = document.createElement("div");
                div.textContent = `${expense.description} - $${expense.amount} (${expense.category})`;
                expenseList.appendChild(div);
            });
        }
        
        function addExpense() {
            const description = document.getElementById('description').value;
            const amount = parseFloat(document.getElementById('amount').value);
            const category = document.getElementById('category').value;
            
            if (!description || isNaN(amount) || amount <= 0) {
                alert('Por favor, ingrese datos válidos.');
                return;
            }
            
            expenses.push({ description, amount, category });
            localStorage.setItem('expenses', JSON.stringify(expenses));
            updateChart();
            updateExpenseList();
        }
        
        updateChart();
        updateExpenseList();
    </script>
</body>
</html>

No hay comentarios