Full Stack

Guía para el Desarrollo Web

Bienvenidos al mundo del desarrollo web. En esta guía, puedes explorar aspectos esenciales sobre la accesibilidad en proyectos web. Esta información es crucial para desarrollar proyectos web efectivos y accesibles.

Temas Cubiertos

La accesibilidad web se refiere a la práctica de diseñar y desarrollar sitios web de manera que sean accesibles y utilizables para todas las personas. Es decir que todas las personas, más allá de ciertas limitaciones, puedan entender, percibir, navegar e interactuar con la web, tanto en su estructura como en sus contenidos. En este sentido, la accesibilidad web implica eliminar barreras y obstáculos que impidan el acceso a la información en la web, a través del cumplimiento de reglas.

Las reglas para el cumplimiento de la accesibilidad web, principalmente, han sido establecidas por la W3C (WWW Web Wide Web Consortium), un consorcio internacional dedicado a establecer estándares y pautas técnicas para el desarrollo y evolución de la World Wide Web (WWW), el cual fue lanzado por en 1999 por Tim Berners, donde surgió la primera guía sobre accesibilidad web, denominada WCAG 1.0 (Web Content Accessibility Guide), con una serie de 65 recomendaciones sobre accesibilidad dirigidas a los desarrolladores web y su sitio oficial de referencia es w3.org. Las mismas nos orientan sobre cómo una persona con discapacidad y los adultos mayores ven la web actual y cómo debería ser diseñada una página web y sus contenidos para que todos podamos acceder y comprender.

Es la guía sobre accesibilidad web (Web Content Accessibility Guide). La WCAG define cómo crear contenido web más accesible para las personas con discapacidad. Existen varias versiones de esta guía, a medida que pasa el tiempo se van trabajando en base a las recomendaciones anteriores, este desarrollo pasa a una especie de borrador público para que en un futuro se pueda publicar como una guía definitiva. Seguir estas definiciones o pautas permite crear un contenido más accesible para un mayor número de personas con discapacidad, incluyendo ceguera y baja visión. Estas pautas también ayudan a que el nivel de usabilidad del contenido se incremente.

El 5 de octubre de 2023, después de un proceso de varios años, se ha publicado la recomendación de la nueva versión de las Web Content Accessibility Guidelines (WCAG) 2.2.

Se añaden 9 criterios nuevos, uno de ellos es:

Focus Not Obscured (Minimum):

Cuando un componente de la interfaz de usuario recibe el foco de teclado, el componente no puede estar completamente oculto por un contenido creado por el autor. Los ejemplos más habituales de contenidos que se superponen a un elemento con el foco son los pies y encabezados fijos o las capas no modales, por ejemplo, la capa de aceptación de cookies.

Más detalles aquí.

ARIA es una especificación técnica desarrollada por el W3C. Su nombre completo es WAI-ARIA (Web Accessibility Initiative - Accessible Rich Internet Applications). Esta especificación establece un conjunto de atributos que los desarrolladores pueden usar para mejorar la accesibilidad de las aplicaciones y contenido web dinámico, especialmente para personas que utilizan tecnologías de asistencia como lectores de pantalla.

Los atributos ARIA ayudan a mejorar la accesibilidad de los elementos en una página web. A continuación, se presentan los principales componentes de ARIA y algunos ejemplos de uso:

  1. Roles: Describen el tipo de elemento de la interfaz de usuario, como botones, menús o formularios.

    <div role="button">Haga clic aquí</div>
  2. Propiedades: Proporcionan información adicional sobre el estado o características de un elemento.

    <input type="checkbox" aria-checked="false">
  3. Estados: Indican cambios dinámicos en la interfaz de usuario que las tecnologías de asistencia deben conocer.

    <button aria-expanded="true">Mostrar más</button>

Ejemplos de uso de ARIA:

  1. Formulario accesible:

    <form>
      <label for="username">Nombre de usuario:</label>
      <input type="text" id="username" aria-required="true">
      
      <label for="password">Contraseña:</label>
      <input type="password" id="password" aria-required="true">
      
      <button type="submit" aria-label="Enviar formulario">Enviar</button>
    </form>
  2. Mensajes de error accesibles:

    <input type="email" id="email" aria-describedby="email-error">
    <span id="email-error" aria-live="polite">Por favor, ingrese un email válido.</span>

El atributo alt en una etiqueta <img> proporciona una descripción alternativa de la imagen que se mostrará si la imagen no se puede cargar. Además, esta descripción es leída por lectores de pantalla para usuarios con discapacidad visual.

Ejemplos de código:

  • Imagen de una persona de perfil:

    <img src="perfil-mujer-sonriente-cabello-castano.jpg" alt="Retrato de una mujer sonriente con cabello castaño claro, usando una blusa azul" />

    En este ejemplo, si la imagen no se carga, el texto "Retrato de una mujer sonriente con cabello castaño claro, usando una blusa azul" será mostrado como alternativa.

  • Imagen de un plato de comida en una tienda online:

    <img src="plato-pasta-salsa-tomate-albahaca.jpg" alt="Plato de pasta con salsa de tomate y albahaca, servido en un plato blanco" />

    En este ejemplo, si la imagen no se carga, el texto "Plato de pasta con salsa de tomate y albahaca, servido en un plato blanco" será mostrado como alternativa.

  • Imagen de una prenda de vestir publicada en una tienda online:

    <img src="camisa-algodon-blanca.jpg" alt="Camisa de algodón blanca con botones, con cuello en forma de V" />

    En este ejemplo, si la imagen no se carga, el texto "Camisa de algodón blanca con botones, con cuello en forma de V" será mostrado como alternativa.

Mantener una estructura de carpetas organizada es esencial para el desarrollo web eficiente. Una estructura clara facilita el mantenimiento y la colaboración en proyectos. A continuación se muestra una estructura de carpetas recomendada:

Ejemplo de estructura de carpetas básica:


    proyecto/
    ├── index.html
    ├── css/
    │   └── styles.css
    ├── js/
    │   └── scripts.js
    ├── img/
    │   └── logo.png
    └── fonts/
        └── custom-font.ttf
                        

En este ejemplo, css/ contiene los archivos de estilos, js/ los archivos de JavaScript, img/ las imágenes, y fonts/ las fuentes personalizadas.

Los contrastes adecuados entre texto y fondo son esenciales para la legibilidad y la accesibilidad. Un contraste insuficiente puede dificultar la lectura para personas con deficiencias visuales y otros problemas de visión.

Ejemplo de código:


    /* Fondo oscuro con texto claro */
    body {
        background-color: #333;
        color: #f9f9f9;
    }

    /* Fondo claro con texto oscuro */
    header {
        background-color: #f9f9f9;
        color: #333;
    }
                        

En el ejemplo, se utiliza un fondo oscuro con texto claro para mejorar la legibilidad en la mayoría de las situaciones. Es importante verificar el contraste con herramientas de validación de accesibilidad.

Los lectores de pantalla, como NVDA (NonVisual Desktop Access), permiten a personas con discapacidad visual navegar por la web leyendo el contenido en voz alta. Es fundamental probar los sitios web con lectores de pantalla para asegurar que la información se presenta de manera accesible.

Ejemplo de prueba:

Usa NVDA o cualquier otro lector de pantalla para verificar que todos los elementos interactivos, como botones y enlaces, sean descritos correctamente y que el contenido sea legible. También puedes usar la tecla Tab para navegar entre los elementos interactivos y asegurarte de que el enfoque sea claro y accesible.

Para descargar NVDA, visita el siguiente enlace: Descarga de NVDA

JavaScript se utiliza para validar datos de formularios antes de que sean enviados al servidor. Esto mejora la experiencia del usuario al proporcionar retroalimentación instantánea sobre errores en el formulario.

Ejemplo de código 1:


    document.getElementById('miFormulario').addEventListener('submit', function(event) {
        let nombre = document.getElementById('nombre').value;
        if (nombre === '') {
            alert('El nombre es obligatorio.');
            event.preventDefault(); // Evita que el formulario se envíe
        }
    });
                        

En este ejemplo, el formulario no se enviará si el campo "nombre" está vacío, y el usuario verá una alerta.

Ejemplo de código 2:


    <form id="formulario">
        <label for="nombreInput">Nombre:</label>
        <input type="text" id="nombreInput" placeholder="Ingresá solo letras" aria-describedby="nombreError" oninput="validarNombre()" required>
        <span id="nombreError" style="color: red; display: none;" aria-live="polite">❌ No se permiten números ni espacios en blanco.</span>
        <br>
        <label for="emailInput">Email:</label>
        <input type="email" id="emailInput" placeholder="Ingresá tu email" required>
        <br>
        <input type="submit" value="Enviar">
    </form>
    
    <script>
        function validarNombre() {
            var nombre = document.getElementById('nombreInput').value;
            var nombreError = document.getElementById('nombreError');
            
            // Verifica si el nombre contiene números o solo espacios en blanco
            if (/\d/.test(nombre) || /^\s*$/.test(nombre)) {
                nombreError.style.display = 'inline';
            } else {
                nombreError.style.display = 'none';
            }
        }
    
        document.getElementById('formulario').addEventListener('submit', function(event) {
            var nombre = document.getElementById('nombreInput').value;
            var email = document.getElementById('emailInput').value;
    
            // Verifica si el nombre contiene números o solo espacios en blanco
            if (/\d/.test(nombre) || /^\s*$/.test(nombre)) {
                event.preventDefault();  // Evita el envío del formulario
                alert('El campo nombre no puede contener números ni estar compuesto solo por espacios en blanco.');
            } else if (email === '') {
                event.preventDefault();  // Evita el envío del formulario
                alert('El campo email es obligatorio.');
            } else {
                alert('Formulario enviado correctamente.');
            }
        });
    </script>
                        

En este ejemplo, el formulario no se enviará si no cumple con las validaciones personalizadas.

Las etiquetas semánticas en HTML5 (como <header>, <footer>, <article>, y <section>) proporcionan significado adicional al contenido de la página, lo que mejora la accesibilidad y el SEO.

Ejemplo de código:


                        <header>
                            <h1>Título del Sitio</h1>
                            <nav>
                                <ul>
                                    <li><a href="#home">Inicio</a></li>
                                    <li><a href="#about">Sobre</a></li>
                                </ul>
                            </nav>
                        </header>

                        <main>
                            <section>
                                <h2>Sección Principal</h2>
                                <p>Contenido de la sección.</p>
                            </section>
                        </main>

                        <footer>
                            <p>Derechos reservados</p>
                        </footer>
                        

En este ejemplo, se usan etiquetas semánticas para estructurar el contenido de manera clara y accesible.

Bootstrap es un framework CSS que facilita el diseño de páginas web responsivas y con un aspecto profesional. Ofrece una amplia gama de componentes y utilidades para estilizar y estructurar tu sitio web de manera rápida y eficiente.

Ejemplo de código:


                        <button class="btn btn-primary">Botón Primario</button>
                        <div class="container">
                            <div class="row">
                                <div class="col">Columna 1</div>
                                <div class="col">Columna 2</div>
                            </div>
                        </div>
                        

En este ejemplo, se utiliza el componente de botón y el sistema de rejilla de Bootstrap para crear un diseño simple.

Git es un sistema de control de versiones distribuido que permite gestionar el historial de cambios en un proyecto. Usar Git facilita la colaboración y el mantenimiento del código a lo largo del tiempo. Se puede utilizar junto con Github.

Ejemplo de comandos básicos:


    # Inicializar un nuevo repositorio
    git init

    # Agregar un repositorio remoto a un repositorio local existente.
    # Este comando se usa para conectar tu repositorio local con un repositorio en GitHub o en otro servidor.
    # "origin" es el nombre por defecto para el repositorio remoto.
    git remote add origin https://github.com/usuario/repo.git

    # Clonar un repositorio existente.
    # Este comando se usa para hacer una copia completa de un repositorio que ya existe en GitHub
    # y crear un repositorio local en tu máquina con toda su historia.
    git clone https://github.com/usuario/repositorio.git

    # Añadir archivos al área de preparación.
    git add archivo.txt

    # Realizar un commit.
    git commit -m "Mensaje del commit"

    # Subir cambios a la rama main en GitHub.
    # Después de haber agregado el repositorio remoto con "git remote add" o clonado el repositorio,
    # puedes subir (push) tus cambios a este repositorio en GitHub.
    git push origin main
    

Estos comandos te permiten comenzar a usar Git, gestionar tus archivos y colaborar en proyectos con otros desarrolladores.

Más detalles de Git aquí.

Git permite trabajar con ramas, lo que facilita que varias personas colaboren en un mismo proyecto sin afectar el código principal. Cada integrante puede trabajar en su propia rama y luego integrar los cambios en una rama de desarrollo común, como development, y finalmente en main.

Pasos básicos para colaborar con ramas:


Ejemplo: 
- Equipo conformado por Manuel y Natalia.
- El proyecto estará en el Github de Natalia.

Manuel debe hacer los siguientes pasos:

0. Natalia debe permitir la colaboración, añadiendo permisos en GitHub, para que Manuel pueda modificar el repositorio.
https://docs.github.com/es/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository

1. Clonar el repositorio (si aún no lo has hecho)
git clone https://github.com/usuario/repo.git

2. Crear una nueva rama para trabajar
git checkout -b mi-rama

3. Hacer los cambios en tu rama
git add .
git commit -m "Mensaje de los cambios"

4. Subir los cambios a tu rama en el repositorio remoto
git push origin mi-rama

5. Luego, en la rama development, ambos pueden integrar sus cambios:
git checkout development
git pull origin development

6. Fusionar los cambios de tu rama en development
git merge mi-rama

7. Subir los cambios a la rama development
git push origin development

8. Cuando los cambios estén listos y revisados, se puede fusionar en main:
git checkout main
git pull origin main
git merge development
git push origin main
            

Descripción de la jerarquía de ramas

  • main: Es la rama principal y estable del proyecto. Contiene el código que se ha revisado y que está listo para producción.
  • development: Esta es la rama en la que se integran los cambios de las diferentes ramas de trabajo antes de fusionarlos en main. Es la rama de desarrollo, que puede tener código aún en pruebas.
  • mi-rama (ejemplo): Cada colaborador trabaja en su propia rama individual (por ejemplo, mi-rama). Estas ramas se crean desde development y se fusionan en development cuando los cambios están listos.

Este flujo de trabajo permite que ambos integrantes trabajen en paralelo, cada uno en su propia rama, sin conflictos, y luego fusionen sus cambios de forma ordenada en development y main.


                main
                |
                |---------------------> development
                                           |           
                     ----------------------|-------------------
                     |                      |                  |
                  mi-rama                mi-rama2           otras ramas
             
            

Más detalles sobre ramas en Git aquí.

Acerca de las ramas en Github aquí.

Video de apoyo aquí.

Existe una gran importancia en la filosofía de Diseño Centrado en el Usuario, que permite un marco metodológico apropiado para abordar la accesibilidad y usabilidad desde el inicio.

"La accesibilidad, al igual que la usabilidad, son cualidades relacionadas con el software que deben complementarse, tratarse y abordarse desde las etapas iniciales del desarrollo. No son sinónimos, pero tampoco son conceptos independientes. La usabilidad afecta e incide directamente en la experiencia del usuario, mientras que la accesibilidad permite que esa experiencia se lleve a cabo. La accesibilidad puede delimitar los contenidos y funcionalidades que se transmiten, más allá de cuán usables sean." — Accesibilidad web - Una mirada integral (2020)

Para más información, visite: Accesibilidad web - Una mirada integral