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