Product Craft Bible
Camera & Photo Capture UI
Inicio Media y Archivos Camera & Photo Capture UI
Media y Archivos

Camera & Photo Capture UI

8 reglas web.dev "Capturing images" · MDN MediaDevices.getUserMedia() · Apple HIG · NSCameraUsageDescriptionScanbot SDK "Barcode scanner viewfinder" · MDN "Taking still photos"Apple HIG "Cameras" · Material Design "Camera" · WCAG 2.5.5 Target Size (44×44px)MDN MediaTrackSettings.facingMode · Apple HIG "Cameras" · Material Design "Camera"
93

Camera & Photo Capture UI

8 reglas
799

Pide el permiso de camara en contexto, justo antes de la acción que lo necesita

Solicitar acceso a la camara al cargar la página, sin que el usuario tenga contexto, hace que la mayoría deniegue el prompt y bloquee el acceso de forma permanente. El permiso aterriza mejor cuando va precedido de una breve explicación de por que hace falta la camara y lo dispara un gesto explicito del usuario, nunca un script automático. Una vez denegado, el navegador exige al usuario desbloquear el sitio manualmente en ajustes, así que cada prompt desperdiciado es caro.

web.dev "Capturing images" · MDN MediaDevices.getUserMedia() · Apple HIG · NSCameraUsageDescription
Preferir
Escanea tu documento
Usaremos tu camara para capturar el documento. Toca el botón para empezar.
getUserMedia() solo tras el gesto
Evitar
ejemplo.com quiere usar tu camara
Bloquear
Permitir
Disparado en DOMContentLoaded, sin contexto
800

Muestra una guía de encuadre que coincida con la forma del objeto a capturar

Un overlay con recorte transparente y fondo atenuado le dice al usuario exactamente donde apuntar, eliminando la incertidumbre para INE, QR, cheques o códigos de barras. Sin guía, los usuarios capturan el objetivo descentrado, recortado o en un angulo que el OCR o el decodificador posterior no pueden procesar. La forma del overlay debe coincidir con la física de lo que se captura: cuadrado para QR, rectangulo vertical para identificaciones, horizontal para tarjetas o documentos.

Scanbot SDK "Barcode scanner viewfinder" · MDN "Taking still photos"
Preferir
Evitar
801

Haz el botón de captura grande, central y obvio como acción primaria

El obturador es la acción principal de toda pantalla de camara y debe verse como tal: un botón circular grande, centrado en la franja inferior, con un tap target generoso. Comprimirlo entre otros controles o reducirlo al tamaño de un icono más obliga al usuario a apuntar con precisión mientras sostiene el telefono, una postura inestable. Los controles secundarios (flash, voltear) se colocan a los lados, más pequeños, para que la jerarquía sea inequivoca.

Apple HIG "Cameras" · Material Design "Camera" · WCAG 2.5.5 Target Size (44×44px)
Preferir
Evitar
Capturar
802

Ofrece un cambio claro entre camara frontal y trasera

La mayoría de flujos tienen una camara preferida por defecto (trasera para documentos, frontal para selfies o verificación de rostro), pero el usuario debe poder cambiarla con un solo toque. El control de volteo va proximo al obturador, con un icono de rotación reconocible y un estado que indique que camara esta activa. En la API esto se logra con la constraint facingMode: "environment" o "user"; reabrir el stream con el modo opuesto evita pedir permiso de nuevo.

MDN MediaTrackSettings.facingMode · Apple HIG "Cameras" · Material Design "Camera"
Preferir
Frontal · facingMode user
Evitar
Trasera
Sin opción de cambiar de camara
803

Confirma la captura con destello, vista previa y controles explicitos de Retomar / Usar

Un breve destello blanco da confirmación instantanea e inequivoca de que se capturo un cuadro; sin el, el usuario toca de nuevo creyendo que fallo y genera envios duplicados. La imagen capturada debe mostrarse como vista previa para que juzgue calidad (foco, luz, encuadre) antes de enviar el formulario. El par Retomar / Usar es la interfaz mínima post-captura, con "Usar" como acción primaria. Nunca envies la imagen en silencio sin darle oportunidad de revisarla.

MDN "Taking still photos" (drawImage en canvas) · Apple HIG "Cameras"
Preferir
Retomar
Usar foto
Evitar
Captura en silencio → avanza al siguiente paso, sin preview ni retomar
804

Mapea cada error de camara a un mensaje accionable con ruta de salida

getUserMedia() rechaza con nombres de error distintos que exigen respuestas distintas: NotAllowedError (el usuario o la Permissions Policy bloqueo el acceso y debe desbloquearlo en ajustes), NotFoundError (no hay camara), NotReadableError (otra app la esta usando). Un genérico "Camara no disponible" para todos los casos obliga a un troubleshooting innecesario. Cada estado de error debe ofrecer además una salida: un enlace a la guía de ajustes o un fallback a subir archivo, para que el usuario nunca quede atrapado.

MDN MediaDevices.getUserMedia() (error names) · MDN Permissions-Policy: camera
Preferir
NotAllowedError
Bloqueaste el acceso a la camara. Abre ajustes del sitio > Camara y permitelo.
O sube un archivo →
NotFoundError
No se detecto ninguna camara en este dispositivo.
Sube una foto en su lugar →
Evitar
Algo salio mal. Intenta de nuevo.
805

Ofrece siempre subir archivo junto al disparador de camara, nunca solo camara

El usuario puede haber revocado el permiso, estar en un dispositivo sin camara, en penumbra, o simplemente preferir subir una foto existente. La camara puede ser el default ofrecido en flujos móviles que se benefician de captura en vivo, pero una opción "Elegir de la galeria" o "Subir archivo" siempre debe estar visible, no escondida en un menú overflow. Lo más simple es un <input type="file" accept="image/*"> (sin el atributo capture) junto al botón de camara.

WCAG 2.5.4 Motion Actuation · WCAG 1.3.3 Sensory Characteristics · web.dev "Capturing images" (fallback)
Preferir
Evitar
Solo visor en vivo. Permiso denegado = caja negra sin salida.
806

Etiqueta cada control, anuncia los cambios de estado y nunca dependas solo de la camara

Los controles de camara como botones de solo icono (obturador, voltear, flash, retomar) son invisibles para usuarios de lector de pantalla salvo que cada botón tenga un nombre accesible. Cuando la captura tiene exito, el cambio de estado ("Foto capturada. Revisa la imagen o retoma.") debe anunciarse vía una region aria-live, y el foco debe moverse al primer control accionable. Para flujos que verifican identidad por visión (p. ej. "saluda a la camara"), WCAG 2.5.4 exige una alternativa de UI equivalente.

WCAG 2.5.4 Motion Actuation · WCAG 1.1.1 Non-text Content · WCAG F65 · WebAIM checklist
Preferir
aria-live: "Foto capturada. Revisa o retoma."
Escribir la respuesta en su lugar →
Evitar