HTML

¿Qué hace un DOCTYPE?

DOCTYPE es una abreviatura de Document Type (Tipo de Documento). Un DOCTYPE siempre está asociado a una DTD - para Document Type Definition (Definición de Tipo de Documento).

Una DTD define cómo deben estructurarse los documentos de un tipo determinado (es decir, un button puede contener un span pero no un div), mientras que un DOCTYPE declara qué DTD se supone que respeta un documento (es decir, este documento respeta la DTD HTML).

Para las páginas web, la declaración DOCTYPE es obligatoria. Se utiliza para indicar a los agentes de usuario qué versión de las especificaciones HTML respeta su documento. Una vez que un agente de usuario ha reconocido un DOCTYPE correcto, activará el modo estándar (no-quirks mode) que coincide con este DOCTYPE para leer el documento. Si un agente de usuario no reconoce un DOCTYPE correcto, activará el modo de compatibilidad (quirks mode).

La declaración DOCTYPE para los estándares HTML5 es <!DOCTYPE html>.

¿Cómo se sirve una página con contenido en varios idiomas?

Asumiré que se refiere al caso más común, que es cómo servir una página con contenido disponible en varios idiomas, pero el contenido dentro de la página debe mostrarse en un solo idioma consistente.

Cuando se realiza una solicitud HTTP a un servidor, el agente de usuario que realiza la solicitud suele enviar información sobre las preferencias de idioma, como en la cabecera Accept-Language. El servidor puede utilizar esta información para devolver una versión del documento en el idioma apropiado si dicha alternativa está disponible. El documento HTML devuelto también debe declarar el atributo lang en la etiqueta <html>, como <html lang="en">...</html>.

Por supuesto, esto es inútil para que un motor de búsqueda sepa que el mismo contenido está disponible en diferentes idiomas, por lo que también debe utilizar el atributo hreflang en el <head>. Por ejemplo: <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

En el back-end, el marcado HTML contendrá marcadores de posición i18n y contenido para el idioma específico almacenado en formatos YML o JSON. Luego, el servidor genera dinámicamente la página HTML con contenido en ese idioma en particular, generalmente con la ayuda de un framework de back-end.

¿Qué tipo de cosas hay que tener en cuenta al diseñar o desarrollar sitios multilingües?

  • Usar el atributo lang en tu HTML.
  • Dirigir a los usuarios a su idioma nativo - Permitir que un usuario cambie su país/idioma fácilmente sin problemas.
  • El texto en imágenes basadas en ráster (por ejemplo, png, gif, jpg, etc.) no es un enfoque escalable - Colocar texto en una imagen sigue siendo una forma popular de mostrar fuentes bonitas y no de sistema en cualquier computadora. Sin embargo, para traducir texto de imagen, cada cadena de texto necesitará tener una imagen separada creada para cada idioma. Cualquier cosa que sea más que un puñado de reemplazos como este puede salirse rápidamente de control.
  • Longitud restrictiva de palabras/oraciones - Algunos contenidos pueden ser más largos cuando se escriben en otro idioma. Ten cuidado con los problemas de diseño o desbordamiento. Es mejor evitar diseñar donde la cantidad de texto pueda arruinar o mejorar un diseño. El recuento de caracteres entra en juego con elementos como titulares, etiquetas y botones. Son menos problemáticos con texto de flujo libre, como el cuerpo del texto o los comentarios.
  • Ten en cuenta cómo se perciben los colores - Los colores se perciben de manera diferente en diferentes idiomas y culturas. El diseño debe usar el color de manera apropiada.
  • Formato de fechas y monedas - Las fechas del calendario a veces se presentan de diferentes maneras. Por ejemplo, "May 31, 2012" en EE. UU. frente a "31 May 2012" en partes de Europa.
  • No concatenes cadenas traducidas - No hagas nada como "La fecha de hoy es " + date. Se romperá en idiomas con diferente orden de palabras. En su lugar, usa una cadena de plantilla con sustitución de parámetros para cada idioma. Por ejemplo, mira las siguientes dos oraciones en inglés y chino respectivamente: I will travel on {% date %} y {% date %} 我会出发. Observa que la posición de la variable es diferente debido a las reglas gramaticales del idioma.
  • Dirección de lectura del idioma - En inglés, leemos de izquierda a derecha, de arriba a abajo; en japonés tradicional, el texto se lee de arriba a abajo, de derecha a izquierda.
  • Útil tener - incluir la configuración regional en la ruta (por ejemplo, en_US, zh_CN, etc.).

¿Para qué sirven los atributos `data-`?

Antes de que los frameworks de JavaScript se hicieran populares, los desarrolladores front-end usaban atributos data- para almacenar datos adicionales dentro del propio DOM, sin otros trucos como atributos no estándar, propiedades extra en el DOM. Está destinado a almacenar datos personalizados privados de la página o aplicación, para los cuales no hay atributos o elementos más apropiados.

Hoy en día, el uso de atributos data- generalmente no se fomenta. Una razón es que los usuarios pueden modificar el atributo de datos fácilmente usando la función de inspeccionar elemento en el navegador. El modelo de datos se almacena mejor dentro del propio JavaScript y se mantiene actualizado con el DOM a través del enlace de datos, posiblemente a través de una biblioteca o un framework.

Sin embargo, un uso perfectamente válido de los atributos de datos es añadir un gancho para frameworks de pruebas end-to-end como Selenium y Capybara sin tener que crear clases o atributos de ID sin sentido. El elemento necesita una forma de ser encontrado por una especificación particular de Selenium y algo como data-selector='the-thing' es una forma válida de hacerlo sin complicar el marcado semántico de otra manera.

Considere HTML5 como una plataforma web abierta. ¿Cuáles son los bloques de construcción de HTML5?

  • Semántica - Permitiéndole describir con mayor precisión cuál es su contenido.
  • Conectividad - Permitiéndole comunicarse con el servidor de formas nuevas e innovadoras.
  • Sin conexión y almacenamiento - Permitiendo que las páginas web almacenen datos en el lado del cliente localmente y operen sin conexión de manera más eficiente.
  • Multimedia - Convirtiendo el video y el audio en ciudadanos de primera clase en la Web Abierta.
  • Gráficos y efectos 2D/3D - Permitiendo una gama mucho más diversa de opciones de presentación.
  • Rendimiento e integración - Proporcionando una mayor optimización de la velocidad y un mejor uso del hardware de la computadora.
  • Acceso a dispositivos - Permitiendo el uso de varios dispositivos de entrada y salida.
  • Estilizado - Permitir a los autores escribir temas más sofisticados.

Describa la diferencia entre `cookie`, `sessionStorage` y `localStorage`.

Todas las tecnologías mencionadas anteriormente son mecanismos de almacenamiento de clave-valor en el lado del cliente. Solo pueden almacenar valores como cadenas.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | Iniciador | Cliente o servidor. El servidor puede usar el encabezado Set-Cookie | Cliente | Cliente | | Caducidad | Establecido manualmente | Para siempre | Al cerrar la pestaña | | Persistente entre sesiones del navegador | Depende de si se establece la expiración | Sí | No | | Enviado al servidor con cada solicitud HTTP | Las cookies se envían automáticamente a través del encabezado Cookie | No | No | | Capacidad (por dominio) | 4kb | 5MB | 5MB | | Accesibilidad | Cualquier ventana | Cualquier ventana | Misma pestaña |

Nota: Si el usuario decide borrar los datos de navegación a través de cualquier mecanismo proporcionado por el navegador, esto borrará cualquier cookie, localStorage o sessionStorage almacenado. Es importante tener esto en cuenta al diseñar para la persistencia local, especialmente al comparar con alternativas como el almacenamiento del lado del servidor en una base de datos o similar (que, por supuesto, persistirá a pesar de las acciones del usuario).

Describe la diferencia entre `<script>`, `<script async>` y `<script defer>`.

  • <script> - El análisis de HTML se bloquea, el script se obtiene y se ejecuta inmediatamente, el análisis de HTML se reanuda después de que se ejecuta el script.
  • <script async> - El script se obtendrá en paralelo al análisis de HTML y se ejecutará tan pronto como esté disponible (potencialmente antes de que finalice el análisis de HTML). Usa async cuando el script sea independiente de cualquier otro script en la página, por ejemplo, análisis.
  • <script defer> - El script se obtendrá en paralelo al análisis de HTML y se ejecutará cuando la página haya terminado de analizarse. Si hay varios de ellos, cada script diferido se ejecuta en el orden en que se encontraron en el documento. Si un script depende de un DOM completamente analizado, el atributo defer será útil para garantizar que el HTML esté completamente analizado antes de la ejecución. Un script diferido no debe contener document.write.

Nota: Los atributos async y defer se ignoran para los scripts que no tienen un atributo src.

¿Por qué es generalmente una buena idea colocar los `<link>` de CSS entre `<head></head>` y los `<script>` de JS justo antes de `</body>`? ¿Conoces alguna excepción?

Colocación de <link> en el <head>

Colocar los <link> en el <head> es parte de la especificación adecuada para construir un sitio web optimizado. Cuando una página se carga por primera vez, el HTML y el CSS se analizan simultáneamente; el HTML crea el DOM (Document Object Model) y el CSS crea el CSSOM (CSS Object Model). Ambos son necesarios para crear los elementos visuales en un sitio web, lo que permite un tiempo de 'primera pintura significativa' rápido. Esta renderización progresiva es una categoría de optimización en la que se miden los sitios en sus puntuaciones de rendimiento. Colocar las hojas de estilo cerca del final del documento es lo que prohíbe la renderización progresiva en muchos navegadores. Algunos navegadores bloquean la renderización para evitar tener que volver a pintar elementos de la página si sus estilos cambian. El usuario se queda viendo una página en blanco. Otras veces puede haber destellos de contenido sin estilo (FOUC), que muestran una página web sin estilo aplicado.

Colocación de <script> justo antes de </body>

Las etiquetas <script> bloquean el análisis de HTML mientras se descargan y ejecutan, lo que puede ralentizar tu página. Colocar los scripts en la parte inferior permitirá que el HTML se analice y se muestre al usuario primero.

Una excepción para la posición de los <script> en la parte inferior es cuando tu script contiene document.write(), pero hoy en día no es una buena práctica usar document.write(). Además, colocar los <script> en la parte inferior significa que el navegador no puede comenzar a descargar los scripts hasta que se analice todo el documento. Esto asegura que tu código que necesita manipular elementos del DOM no arrojará un error y detendrá todo el script. Si necesitas colocar <script>s en el <head>, usa el atributo defer, que logrará el mismo efecto de ejecutar el script solo después de que se analice el HTML, pero el navegador puede descargar el script antes.

Ten en cuenta que colocar los scripts justo antes de la etiqueta de cierre </body> creará la ilusión de que la página se carga más rápido en una caché vacía (ya que los scripts no bloquearán la descarga del resto del documento). Sin embargo, si tienes algún código que quieres ejecutar durante la carga de la página, solo comenzará a ejecutarse después de que se haya cargado toda la página. Si colocas esos scripts en la etiqueta <head>, comenzarían a ejecutarse antes, por lo que en una caché preparada la página parecería cargarse más rápido.

Las etiquetas <head> y <body> ahora son opcionales

Según la especificación HTML5, ciertas etiquetas HTML como <head> y <body> son opcionales. La guía de estilo de Google incluso recomienda eliminarlas para ahorrar bytes. Sin embargo, esta práctica aún no está ampliamente adoptada y la ganancia de rendimiento probablemente será mínima y para la mayoría de los sitios no importará.

¿Qué es la renderización progresiva?

La renderización progresiva es el nombre que se le da a las técnicas utilizadas para mejorar el rendimiento de una página web (en particular, mejorar el tiempo de carga percibido) para renderizar el contenido para su visualización lo más rápido posible.

Solía ser mucho más frecuente en los días previos a la internet de banda ancha, ¡pero todavía se utiliza en el desarrollo moderno ya que las conexiones de datos móviles son cada vez más populares (e inestables)!

Ejemplos de tales técnicas:

  • Carga diferida de imágenes (Lazy loading) - Las imágenes de la página no se cargan todas a la vez. Se utilizará JavaScript para cargar una imagen cuando el usuario se desplace a la parte de la página que muestra la imagen.
  • Priorizar el contenido visible (o renderizado por encima del pliegue) - Incluir solo el CSS/contenido/scripts mínimos necesarios para la cantidad de página que se renderizaría en el navegador del usuario primero para mostrarse lo más rápido posible, luego puedes usar scripts diferidos o escuchar el evento DOMContentLoaded/load para cargar otros recursos y contenido.
  • Fragmentos HTML asíncronos - Volcar partes del HTML al navegador a medida que la página se construye en el back-end. Se pueden encontrar más detalles sobre la técnica.

¿Por qué usaría un atributo `srcset` en una etiqueta de imagen? Explique el proceso que usa el navegador al evaluar el contenido de este atributo.

Usted usaría el atributo srcset cuando desea servir diferentes imágenes a los usuarios dependiendo del ancho de la pantalla de su dispositivo: servir imágenes de mayor calidad a dispositivos con pantalla retina mejora la experiencia del usuario, mientras que servir imágenes de menor resolución a dispositivos de gama baja aumenta el rendimiento y disminuye el desperdicio de datos (porque servir una imagen más grande no tendrá ninguna diferencia visible). Por ejemplo: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt=""> le dice al navegador que muestre el gráfico .jpg pequeño, mediano o grande según la resolución del cliente. El primer valor es el nombre de la imagen y el segundo es el ancho de la imagen en píxeles. Para un ancho de dispositivo de 320px, se realizan los siguientes cálculos:

  • 500 / 320 = 1.5625
  • 1000 / 320 = 3.125
  • 2000 / 320 = 6.25

Si la resolución del cliente es 1x, 1.5625 es la más cercana, y el navegador seleccionará 500w correspondiente a small.jpg.

Si la resolución es retina (2x), el navegador usará la resolución más cercana por encima del mínimo. Lo que significa que no elegirá el 500w (1.5625) porque es mayor que 1 y la imagen podría verse mal. El navegador entonces elegirá la imagen con una relación resultante más cercana a 2, que es 1000w (3.125).

Los srcset resuelven el problema por el cual desea servir archivos de imagen más pequeños a dispositivos con pantallas estrechas, ya que no necesitan imágenes enormes como las pantallas de escritorio, y también, opcionalmente, desea servir imágenes de diferentes resoluciones a pantallas de alta densidad/baja densidad.

¿Ha usado diferentes lenguajes de plantillas HTML antes?

Sí, Pug (anteriormente Jade), ERB, Slim, Handlebars, Jinja, Liquid y EJS, por nombrar algunos. En mi opinión, son más o menos lo mismo y brindan una funcionalidad similar de escape de contenido y filtros útiles para manipular los datos a mostrar. La mayoría de los motores de plantillas también le permitirán inyectar sus propios filtros en caso de que necesite un procesamiento personalizado antes de la visualización.

¿Cuál es la diferencia entre canvas y SVG?

Canvas se basa en ráster, trabajando con píxeles, mientras que SVG se basa en vectores, empleando descripciones matemáticas de formas. Canvas emplea dibujo imperativo, donde cada paso se especifica con JavaScript, ideal para gráficos dinámicos e interactivos como animaciones y juegos.

Por el contrario, SVG utiliza dibujo declarativo, con formas y trazados definidos directamente en HTML, lo que lo hace más accesible y amigable para el SEO. Canvas es óptimo para escenas complejas debido a su menor sobrecarga, pero el escalado puede provocar la pérdida de calidad de imagen. SVG, al ser independiente de la resolución, se adapta a varios tamaños de pantalla sin sacrificar la calidad.

En última instancia, canvas se adapta a gráficos dinámicos e intensivos en rendimiento, mientras que SVG sobresale en gráficos escalables e independientes de la resolución, con ventajas inherentes de accesibilidad y SEO.

¿Qué son los elementos vacíos en HTML?

Los elementos vacíos en HTML son elementos que no contienen ningún contenido entre sus etiquetas de apertura y cierre. En su lugar, son etiquetas de cierre automático, lo que significa que tienen una barra diagonal (/) antes del corchete angular de cierre (>). Algunos ejemplos comunes de elementos vacíos incluyen:

  • <img>: Se utiliza para incrustar imágenes en el documento.
  • <input>: Se utiliza para aceptar la entrada del usuario.
  • <br>: Se utiliza para insertar saltos de línea o saltos de línea forzados.
  • <hr>: Se utiliza para crear reglas horizontales o separadores.