Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Desarrollo web con AMP - Nivel intermedio

Coppel UX
November 18, 2019

Desarrollo web con AMP - Nivel intermedio

Material a nivel intermedio sobre desarrollo y diseño de sitios web con AMP (Accelerated Mobile Pages), adaptado a español de los materiales publicados en amp.dev.

Coppel UX

November 18, 2019
Tweet

More Decks by Coppel UX

Other Decks in Programming

Transcript

  1. ¡Hola de nuevo! • En el último curso, aprendimos: •

    ¿Qué es AMP? • AMP Boilerplate • El validador y el caché de AMP • Componentes y Documentación de AMP
  2. ¡Hola de nuevo! • Comenzamos a construir el sitio de

    Cheese Bike: • Video • Carrusel de Imágenes • Enlaces para Redes Sociales
  3. Objetivos del curso • Aprender cómo responder a la interacción

    del usuario • Recopilar información utilizando formularios • Crear funcionalidades elaboradas combinando varios componentes
  4. Qué construiremos • Navegación por el menú deslizable • Formulario

    de suscripción al boletín • Carrusel de lujo de doble imagen • Posibilidad de ampliar imágenes • Carrusel de miniaturas correspondiente
  5. Combinando componentes • Construimos características con componentes • Pero no

    hay un componente <amp-newsletter-subscription-form> • Podemos resolver esto combinando componentes • Decide qué quieres construir. • Encuentra uno o más componentes que resuelvan esos desafíos • Conecta los componentes juntos
  6. Qué aprenderemos • Captura en AMP de eventos y acciones

    (handlers y actions) • Formularios AMP • Plantillas AMP con “mustache”
  7. Prerequisitos CSS un conjunto de reglas que definen cómo se

    ve todo HTML lenguaje de marcado estándar para crear páginas web Javascript el código en un sitio web, usado para hacer que el sitio sea interactivo
  8. Pre-requisitos del curso • Diseñado para desarrolladores nuevos o actuales.

    • Esta es una continuación del curso para principiantes. • Deberías sentirte cómodo con: • El AMP boilerplate y la estructura de la página • El validador de AMP y cómo usarlo • Cómo usar componentes AMP y su documentación
  9. Sigue el código con Glitch • Editor de código en

    línea • Recomendado para completar los ejercicios del curso. • Código de muestra y soluciones proporcionadas como repositorios de Glitch
  10. Repositorio del curso intermedio en Glitch • Puedes continuar usando

    tu Glitch desde el curso para principiantes • O puede comenzar con esto: • glitch.com/~grateful-block • Ambos contienen todo lo que necesita para este y futuros cursos (por ejemplo, imágenes y código del servidor) • Se proporcionará un nuevo Glitch con ejercicios de código completos al final de cada curso •
  11. Configuración del validador de AMP • Extensión de Chrome que

    detecta errores en páginas AMP • Se ejecuta automáticamente en páginas AMP • Descarga la extensión en: validator.ampproject.org
  12. Construyendo un menú • Los sitios de varias páginas necesitan

    navegación • Muchos sitios y aplicaciones móviles usan un menú de navegación • Nuestro menú debe: • Abrir dando clic en un icono (☰) en la parte superior de la página • Cerrar el menú abierto dando clic fuera del menú o haciendo clic en el icono ✕ • Contener varios enlaces a otras páginas.
  13. Construyendo un menú • Utilizaremos <amp-sidebar> • Los iconos ☰

    y ✕ pueden colocarse dentro de etiquetas <div> • Los enlaces pueden ser una lista (<ul>, <li>, and <a>)
  14. Construyendo un menú • ¿Cómo detectamos cuando un usuario ha

    hecho clic en un icono? • ¿Cómo abrimos el menú <amp-sidebar>? • Aprendamos cómo AMP detecta la entrada del usuario y responde a ella
  15. Introducción a interacción con el usuario y a eventos •

    ¿Cómo interactúan los usuarios con un sitio web? • Dando clic con el mouse • Tocando con los dedos en una pantalla táctil • Escribiendo con un teclado • Estas interacciones también se llaman eventos.
  16. Introducción a interacción con el usuario y a eventos •

    ¿Cómo responde un sitio a las interacciones del usuario? • Al hacer clic en un botón, se marca todo nuestro correo electrónico como leído o se abre un menú • Presionando Escape en el teclado cierra un menú • Deslizar hacia la derecha con los dedos acepta una tarea o conexión • En AMP estas respuestas se llaman “acciones”
  17. Introducción a interacción con el usuario y a eventos •

    En AMP trabajamos con eventos a través del atributo on • Este atributo especifica el evento de interés y la acción a tomar cuando ocurre. • Las interacciones del usuario desencadenan eventos, y luego AMP verifica si hay una acción asociada con ese evento para el componente afectado: <button on="tap:warning.hide">
  18. Eventos y Acciones - Ejemplo clásico <div id="warning">Esta es una

    advertencia.</div> <button onclick="document.getElementById('warning').hidden = true;"> Ocultar advertencia </button>
  19. Eventos y Acciones - Ejemplo con jQuery <div id="warning">Esta es

    una advertencia.</div> <button onclick="$('#warning').hide();"> Ocultar advertencia </button>
  20. Eventos y Acciones - Ejemplo con AMP <div id="warning">Esta es

    una advertencia.</div> <button on="tap:warning.hide"> Ocultar advertencia </button> <button on="tap:warning.hide">
  21. Introducción a interacción con el usuario y a eventos •

    hide es una de las acciones genéricas para todos los componentes / elementos • Algunos componentes también tienen acciones únicas • Las acciones pueden parecer funciones y pueden aceptar argumentos • A veces, la acción se puede omitir por completo si no es ambigua
  22. Objetivos del ejercicio • Agregar un menú de navegación a

    nuestro sitio • Practicar el uso de eventos y acciones.
  23. <amp-sidebar> • Oculta el contenido hasta que se abre •

    La barra lateral con ID sidebar1 se puede abrir con las acciones: • sidebar1.open • sidebar1.toggle • sidebar1 • Se puede cerrar con la acción sidebar1.close
  24. Instrucciones del ejercicio • Agrega en <header> una etiqueta <div>

    que contenga el ☰ que muestra u oculta el menú cuando es tocado. La etiqueta <div> debería tener la clase navbar-trigger. • Agrega un componente <amp-sidebar> con el id sidebar1 y la clase sidebar • La barra debería contener un elemento <nav> con la clase nav • En el elemento <nav> agrega una lista de cuatro enlaces, todos deben apuntar a # por ahora: “Nuestra historia”, “Nuestras bicicletas”, “Modelos recientes” y “Contacto” • Las etiquetas <ul> deberían usar la clase label • Las etiquetas <li> deberían usar la clase nav-item • Agrega una etiqueta <div> al menú con una ✕ que cierre el menú cuando sea tocado.
  25. Solución <amp-sidebar class="sidebar" id="sidebar1" layout="nodisplay" side="left"> <div class="navbar-trigger" role="button" tabindex="0"

    on="tap:sidebar1.toggle">X</div> <nav class="nav"> <ul class="label"> <li class="nav-item"> <a href="#">Nuestra historia</a> </li> (✄snip) </ul> </nav> </amp-sidebar>
  26. Agregando el script del componente extendido <!doctype html> <html ⚡>

    <head> <meta charset="utf-8"> <link rel="canonical" href="hello-world.html"> <meta name="viewport" content="width=device-width,minimum-scale=1, initial-scale=1"> <style amp-boilerplate>(✄snip)</style> <noscript><style amp-boilerplate>(✄)</style></noscript> <script async src="https://cdn.ampproject.org/v0.js"></script> <script async custom-element="amp-sidebar" src="https://cdn.ampproject.org/v0/amp-sidebar-0.1.js"></script> </head> <body>Hello World!</body> </html>
  27. Accesibilidad • Es posible que haya visto errores de validación

    como estos en el ejercicio • AMP aplica las mejores prácticas para la accesibilidad • Los elementos interactivos necesitan atributos adicionales para las personas que utilizan tecnologías de asistencia.
  28. Accesibilidad • Las etiquetas <div> cliqueables deben tener el rol

    de button (¡o utilizar una etiqueta <button> en su lugar!) • Los elementos interactivos necesitan poder recibir foco con el teclado, así que también necesita un atributo tabindex
  29. Objetivos del ejercicio • Agregar submenús anidados a nuestra navegación

    • Encontrar componentes para cumplir con los requisitos • Practicar con el uso de componentes dentro de otros componentes.
  30. Menús anidados • Queremos menús anidados que abran cuando los

    elementos principales sean seleccionados. • <amp-sidebar> no dice cómo crear menús anidados. • Necesitaremos utilizar otro componente para resolver este requerimiento.
  31. Patrón de acordeón • La búsqueda de "contenido plegable UI"

    devuelve resultados para "acordeones" • Los componentes de acordeón se expanden o contraen al seleccionarlos. • El componente AMP se llama <amp-accordion>
  32. <amp-accordion> • Esconde el contenido hasta que se expande •

    Se expande automáticamente cuando es seleccionado • Contiene una o más etiquetas <section> • Cada <section> debe contener dos etiquetas:: • El encabezado • El contenido expandible • Podemos colocar un <amp-accordion> en <amp-sidebar> así como colocamos una <amp-img> en el <amp-carousel>
  33. Instrucciones del ejercicio • Convertir el elemento “Nuestras Bicicletas” en

    un <amp-accordion> que contenga una lista con enlaces a “Ricotta Racer”, “Cheddar Chaser” y “Parmesan Pacer”. • Convertir el elemento “Modelos más Recientes” en un <amp-accordion> que contenga una lista con el enlace “Ricotta Racer”. • <amp-accordion> debería tener una clase dropdown y el layout container • Añade la clase nav-dropdown a las etiquetas <li> que contienen un <amp-accordion> • Las etiquetas <ul> en <amp-accordion> deberían tener una clase dropdown-items • Las etiquetas <li> en <amp-accordion> deberían tener una clase dropdown-item
  34. Solución <amp-sidebar class="sidebar" id="sidebar1" layout="nodisplay" side="left"> (✄snip) <nav class="nav"> <ul

    class="label"> (✄snip) <li class="nav-item nav-dropdown"> <amp-accordion layout="container" class="dropdown"> (✄snip) </amp-accordion> </li> (✄snip) </ul> </nav> </amp-sidebar>
  35. Solución <amp-accordion layout="container" class="dropdown"> <section> <header>Nuestras Bicicletas</header> <ul class="dropdown-items"> <li

    class="dropdown-item"> <a href="#">Ricotta Racer</a> </li> (✄snip) </ul> </section> </amp-accordion>
  36. Agregando el script del componente extendido <!doctype html> <html ⚡>

    <head> <meta charset="utf-8"> <link rel="canonical" href="hello-world.html"> <meta name="viewport" content="width=device-width,minimum-scale=1, initial-scale=1"> <style amp-boilerplate>(✄snip)</style> <noscript><style amp-boilerplate>(✄)</style></noscript> <script async src="https://cdn.ampproject.org/v0.js"></script> <script async custom-element="amp-accordion" src="https://cdn.ampproject.org/v0/amp-accordion-0.1.js"> </script> </head> <body>Hello World!</body> </html>
  37. Construcción de un formulario de suscripción a una lista de

    correo • Queremos que los usuarios se suscriban a nuestro boletín de marketing • El formulario de registro debe: • Aceptar el nombre completo y el correo electrónico del usuario (se requieren ambos campos) • Si el envío falla, mostrar un error • Si el envío se realiza correctamente, agradecer al usuario por su registro. • En las páginas que no son AMP, usaríamos <form>, pero AMP proporciona <amp-form> • ¡Veamos cómo son diferentes!
  38. Introducción a Formularios • Los formularios envían datos a un

    servidor • Estos contienen entradas como: • Campos de texto • Cuadros de opciones • Casillas de verificación • Botones de radio • Después de enviar el formulario, la página se actualiza con la respuesta del servidor.
  39. Introducción a Formularios • Los usuarios web modernos esperan formularios

    web más amigables • La página no debe actualizarse cuando se envía el formulario • Los usuarios quieren confirmación de que sus datos fueron aceptados • Deben mostrarse mensajes útiles si se producen errores. • Los desarrolladores suelen buscar JavaScript para resolver estos problemas.
  40. Introducción a Formularios • Los formularios AMP amplían los formularios

    HTML normales con formas más fáciles de resolver: • Validación de formulario • Verificación de formulario • Envío de formulario sin actualización de página • Mensajes de éxito y error • Proporcionan eventos que permiten que el sitio reaccione cuando se envían formularios, válidos, inválidos, verificados, etc. • ¡Estos eventos son útiles para mostrar cuadros de diálogo o iconos de progreso!
  41. Introducción a Formularios • Los formularios AMP también agregan funcionalidad

    a las entradas • Los eventos "change" y "input-debounced" facilitan el seguimiento cuando los valores de entrada están cambiando • Ganchos CSS para facilitar el diseño de formularios • AMP también proporciona polyfills que hacen que los formularios funcionen bien en todos los navegadores
  42. Objetivos del ejercicio • Practicar creando formularios • Experimentar cómo

    los formularios AMP extienden los formularios tradicionales
  43. Nuestro formulario de suscripción • Utiliza <form>, no <amp-form> •

    Incluye campos para nombre de usuario y email • Incluye un botón de “Suscripción” • El formulario utiliza /submit-form en tu servidor en Glitch • El atributo method te permite elegir los métodos POST o GET para tu envío • El atributo action-xhr contiene el URL del servidor al que se enviarán los datos.
  44. Instrucciones del ejercicio • Agrega un <h2> sobre los enlaces

    de redes sociales con la clase main-heading y el contenido “Suscribete a nuestro Boletín” • Añade un <div> con la clase subscribe-card-container debajo del <h2> • En ese <div>, agrega un <div> con la clase subscribe-card • En el <div> de subscribe-card agrega un <form> con la clase main-form, el método post, la action-xhr en /submit-form y el target como _top • Agrega dos elementos <input> de tipo text y nombres name y email • Cada uno debe estar dentro de un <div> con la clase input • Agrega una etiqueta <input> con tipo submit y la etiqueta “Suscríbete” con la clase btn
  45. <h2 class="main-heading">Suscríbete a nuestro Boletín</h2> <div class="subscribe-card-container"> <div class="subscribe-card"> <form

    method="post" action-xhr="/submit-form" target="_top" class="main-form"> <div class="input"> <input type="text" name="name" id="form-name" required> <label for="form-name">Name:</label> </div> (✄snip) <input type="submit" value="Subscribe" class="btn"> </form> </div> </div> Solución
  46. Agregando el script del componente extendido <!doctype html> <html ⚡>

    <head> <meta charset="utf-8"> <link rel="canonical" href="hello-world.html"> <meta name="viewport" content="width=device-width,minimum-scale=1, initial-scale=1"> <style amp-boilerplate>(✄snip)</style> <noscript><style amp-boilerplate>(✄)</style></noscript> <script async src="https://cdn.ampproject.org/v0.js"></script> <script async custom-element="amp-form" src="https://cdn.ampproject.org/v0/amp-form-0.1.js"> </script> </head> <body>Hello World!</body> </html>
  47. Uso de Plantillas para dar Retroalimentación • El formulario se

    envía, pero no sabemos si el envío se realizó correctamente. • amp-form ayuda al proveer submit-success y submit-error • Estos elementos deben ser hijos directos de <form> • Solo se muestran cuando el envío del formulario es exitoso o cuando falla • El contenido de los elementos etiquetados con submit-success or submit-error tienen un tratamiento diferente
  48. Uso de Plantillas para dar Retroalimentación • Las Plantillas (templates)

    convierten datos dinámicos en HTML • El tipo más común de tipo de plantilla en AMP es amp-mustache • Las plantillas mustache sirven para llenar los huecos en una oración • “Hay muchas maneras {{ adjetivo }} de escoger a tus {{ sustantivo }}” • Si agregamos “edificante” y “amigos” entonces la oración se lee: “Hay muchas maneras edificantes de escoger a tus amigos” • Las plantillas mustache hacen lo mismo pero utilizan JSON para generar HTML
  49. Plantilla de ejemplo Dados los siguientes datos: { "nombre": "Roberto",

    "trabajo": "constructor" } y esta plantilla: <template type="amp-mustache"> <p>¡{{nombre}} es un excelente {{trabajo}}!</p> </template> Se generará el siguiente HTML: <p>¡Roberto es un excelente constructor!</p>
  50. Plantilla de ejemplo 2 Dados los siguientes datos: { "descripcion":

    "Foto de un tigre", "url": "tigre.jpg", "ancho": "200", "alto": "200" } y esta plantilla: <template type="amp-mustache"> <amp-img alt="{{descripcion}}" src="imagenes/{{url}}" width="{{ancho}}" height="{{alto}}" layout="responsive"> </amp-img> </template>
  51. Plantilla de ejemplo 2 Se generará el siguiente HTML: <amp-img

    alt="Foto de un tigre" src="images/tigre.jpg" width="200" height="200" layout="responsive"> </amp-img>
  52. Más sobre <amp-mustache> • Las plantillas mustache pueden hacer otras

    cosas: • Pueden iterar sobre una colección de valores • El contenido puede mostrarse de manera condicional si una variable es definida • Pueden incluso mostrar contenido HTML sin escapar La documentación tiene más information
  53. Objetivos del ejercicio • Agregar mensajes de éxito y error

    a nuestro formulario • Practicar usando plantillas mustache
  54. Nuestro formulario de suscripción • Utiliza la documentación de <amp-mustache>

    para agregar mensajes de éxito y error a tu formulario. • El mensaje de éxito debería agradecer al usuario por su nombre al suscribirse. • El mensaje de error debería decir al usuario que hubo un error.
  55. <amp-mustache> • Necesitarás JavaScript de <amp-mustache> • El ejemplo de

    datos de éxito del servidor es: { "name": "Bob Johnson", "email": "[email protected]" } • Las plantillas no necesitan tener ninguna variable de mustache.
  56. Instrucciones del ejercicio • Debajo del botón de enviar, agrega

    un <div> con el atributo submit-success • Agrega una <template> con type amp-mustache • Debería generar una <p> con la clase form-submit-response • El mensaje debería incluir el name desde el servidor • Agrega una <div> con el atributo submit-error • Agrega una <template> con type amp-mustache • Debería generar una <p> con la clase form-submit-response • Este mensaje no requiere de name
  57. <input type="submit" value="Subscribe" class="btn"> <div submit-success> <template type="amp-mustache"> <p class="form-submit-response">

    ¡Éxito! Gracias {{name}} por suscribirte! </p> </template> </div> <div submit-error> <template type="amp-mustache"> <p class="form-submit-response"> ¡Oops! Lo siento, ocurrió un error. </p> </template> </div> Solución
  58. Agregando el script del componente extendido <!doctype html> <html ⚡>

    <head> <meta charset="utf-8"> <link rel="canonical" href="hello-world.html"> <meta name="viewport" content="width=device-width,minimum-scale=1, initial-scale=1"> <style amp-boilerplate>(✄snip)</style> <noscript><style amp-boilerplate>(✄)</style></noscript> <script async src="https://cdn.ampproject.org/v0.js"></script> <script async custom-element="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js"> </script> </head> <body>Hello World!</body> </html>
  59. Agregar interacciones al carrusel de imágenes • En el curso

    inicial, agregamos un carrusel de imágenes de bicicletas • Responderemos a los comentarios de los evaluadores: • "Quiero saltar directamente a una diapositiva en particular" • "No sé en cuál diapositiva estoy" • "Las imágenes son demasiado pequeñas, no puedo ver los detalles de la imagen" • ¡Necesitamos abordar esta retroalimentación!
  60. Agregar interacciones al carrusel de imágenes • Vamos a realizar

    las siguientes mejoras en el carrusel: • Agregar un carrusel adicional de imágenes en miniatura que cambien la diapositiva del carrusel original al hacer clic • Distinguir visualmente la miniatura de la diapositiva actual • Al hacer clic en la imagen del carrusel original, se mostrará una versión ampliada de la imagen. • Usaremos nuevos componentes y haremos que trabajen juntos
  61. Objetivos del ejercicio • Add a new carousel of thumbnail

    images • Learn how to use events and actions to synchronize components • Practice using documentation to look up component actions
  62. <amp-carousel> • Nuestro primer carrusel solo mostró una diapositiva •

    Un carrusel de tipo carrusel muestra múltiples diapositivas horizontalmente • Cuando los usuarios dan clic en una imagen del carrusel de miniaturas, la diapositiva del carrusel original debe cambiar • ¿Cómo?
  63. <amp-carousel> • "Cuando los usuarios dan clic ..." - ¡Suena

    como un evento! • "... cambiar la diapositiva" - ¡suena como una acción! • El evento para clics o pulsaciones de dedos es tap • En la documentación, la acción para cambiar la diapositiva de un carrusel es goToSlide (index = N) • N está indexado a cero (es decir, la segunda diapositiva es el índice 1) • Solo está disponible en <amp-carousel> con diapositivas tipo slides
  64. Instrucciones del ejercicio • Agrega un <amp-carousel> con un type=carousel,

    un layout=fixed-height, una clase thumbnail-carousel y una altura de 78 pixeles • Dale a cada imagen miniatura <amp-img> un layout=fixed, un ancho de 96 pixeles y una altura de 72 pixeles. • Las imágenes miniatura son: cheddar-chase-thumb, cheese-thumb, and mouse-thumb, in that order • Cuando cualquier <amp-img> reciba un clic, se debe mostrar la imagen correspondiente en el carrusel original.
  65. <amp-carousel layout="responsive" width="412" height="309" type="slides" loop id="carousel">(✄snip)</amp-carousel> <amp-carousel class="thumbnail-carousel" layout="fixed-height"

    width="auto" height="78"> <amp-img on="tap:carousel.goToSlide(index=0)" layout="fixed" role="button" tabindex="0" width="96" height="72" src="https://...cheddar-chaser-thumb.jpg?1540228250623"></amp-img> <amp-img on="tap:carousel.goToSlide(index=1)" layout="fixed" role="button" tabindex="1" width="96" height="72" src="https://...cheese-thumb.jpg?1540228249992"></amp-img> <amp-img on="tap:carousel.goToSlide(index=2)" layout="fixed" role="button" tabindex="2" width="96" height="72" src="https://...mouse-thumb.jpg?1540228249062"></amp-img> </amp-carousel> Solución
  66. Objetivos del ejercicio • Distinguir visualmente la miniatura seleccionada •

    Los cambios de diapositiva en el carrusel más grande cambian la miniatura seleccionada • Practica colocando componentes dentro de otros componentes
  67. <amp-selector> • Necesitamos rastrear la miniatura seleccionado • <amp-selector> contiene

    una colección de elementos seleccionables • Los elementos seleccionables tienen el atributo option • Los elementos seleccionables no tienen que ser hijos directos de <amp-selector> • Al elemento seleccionado se le asigna el atributo selected
  68. <amp-selector> • Cuando el usuario cambia la diapositiva del carrusel

    original debe cambiar también la miniatura seleccionada • ¡"Cuando la diapositiva cambie" suena como un evento! • ¡"Establecer la miniatura seleccionada" suena como una acción! • El evento para cuando cambia la diapositiva <amp-carousel> es slideChange • Puede obtener el nuevo índice de diapositiva usando event.index • La acción para cambiar la selección de <amp-selector> es toggle(index = N) • N es el valor del atributo option de un elemento seleccionable
  69. Instrucciones del ejercicio • Agregua un <amp-selector> con ID ampSelector,

    nombra single_image_select y layout container que rodee al carrusel de miniaturas • Agrega un atributo option a cada miniatura que coincida con el índice de diapositiva de la imagen correspondiente en el carrusel original • Agrega un controlador de eventos al carrusel original que alterne la miniatura apropiada cuando la diapositiva cambia • No se necesita actualizar los estilos
  70. <amp-selector layout="container" name="single_image_select" id="ampSelector"> <amp-carousel class="thumbnail-carousel" layout="fixed-height" width="auto" height="78"> <amp-img

    on="tap:carousel.goToSlide(index=0)" layout="fixed" role="button" tabindex="0" width="96" height="72" option="0" src="https://...cheddar-chaser-thumb.jpg?1540228250623"></amp-img> <amp-img on="tap:carousel.goToSlide(index=1)" layout="fixed" role="button" tabindex="1" width="96" height="72" option="1" src="https://...cheese-thumb.jpg?1540228249992"></amp-img> <amp-img on="tap:carousel.goToSlide(index=2)" layout="fixed" role="button" tabindex="2" width="96" height="72" option="2" src="https://...mouse-thumb.jpg?1540228249062"></amp-img> </amp-carousel> </amp-selector> Solución
  71. Agregando el script del componente extendido <!doctype html> <html ⚡>

    <head> <meta charset="utf-8"> <link rel="canonical" href="hello-world.html"> <meta name="viewport" content="width=device-width,minimum-scale=1, initial-scale=1"> <style amp-boilerplate>(✄snip)</style> <noscript><style amp-boilerplate>(✄)</style></noscript> <script async src="https://cdn.ampproject.org/v0.js"></script> <script async custom-element="amp-selector" src="https://cdn.ampproject.org/v0/amp-selector-0.1.js"> </script> </head> <body>Hello World!</body> </html>
  72. Objetivos del ejercicio • Ofrecer a los usuarios una forma

    de ver con más detalle las imágenes en el carrusel • Continuar practicando la conexión de componentes con acciones y eventos.
  73. Caja de luz (lightbox) • Necesitamos hacer zoom en las

    imágenes de nuestro carrusel • Una opción es utilizar una caja de luz, o lightbox • El contenido de la caja de luz se muestra al frente del resto del contenido de la página • El resto de la página se oscurece.
  74. <amp-image-lightbox> • Es un componente de pantalla completa que implementa

    una caja de luz • Define el ID de un <amp-image-lightbox> en la acción de un evento en un <amp-img> para expandir la imagen a pantalla completa • Generalmente tiene un layout de nodisplay para que no sea visible hasta que sea abierto.
  75. <amp-lightbox-gallery> • Extiende el comportamiento de los componentes <amp-img> y

    <amp-carousel> • Agrega el atributo lightbox para abrir una caja de luz cuando el componente es seleccionado • No es necesario tener un <amp-image-lightbox> conectado • No se necesita un manejador de eventos para abrir la caja de luz
  76. Instrucciones del ejercicio • Agrega el atributo lightbox a tu

    <amp-carousel> con imágenes grandes • Agrega el script <amp-lightbox-gallery> en <head>
  77. <amp-carousel on="slideChange:ampSelector.toggle(index=event.index)" layout="responsive" width="412" height="309" type="slides" loop id="carousel" lightbox> <amp-img

    layout="responsive" width="412" height="309" src="https://...cheddar-chaser.jpg?1540228205366"></amp-img> <amp-img layout="responsive" width="412" height="309" src="https://...cheese.jpg?1540228223785"></amp-img> <amp-img layout="responsive" width="412" height="309" src="https://...mouse.jpg?1540228223963"></amp-img> </amp-carousel> Solución
  78. Agregando el script del componente extendido <!doctype html> <html ⚡>

    <head> <meta charset="utf-8"> <link rel="canonical" href="hello-world.html"> <meta name="viewport" content="width=device-width,minimum-scale=1, initial-scale=1"> <style amp-boilerplate>(✄snip)</style> <noscript><style amp-boilerplate>(✄)</style></noscript> <script async src="https://cdn.ampproject.org/v0.js"></script> <script async custom-element="amp-lightbox-gallery" src="https://cdn.ampproject.org/v0/amp-lightbox-gallery-0.1.js"> </script> </head> <body>Hello World!</body> </html>
  79. Qué hemos aprendido • Cómo manejar interacciones del usuario con

    eventos y acciones • Cómo capturar datos del usuario con <amp-form> • Cómo alinear los componentes de AMP a los requerimientos • Construir características elaboradas al combinar componentes • Los componentes pueden colocarse dentro de otros o comunicarse con eventos y acciones
  80. • Un sitio interactivo con AMP • Le agregamos a

    nuestro sitio: • Menús anidados • Forma de suscripción a boletín de correo • Carrusel de imágenes en miniatura • Una caja de luz para la galería Qué construímos
  81. Siguientes pasos • Contenido dinámico vs contenido estático • Cómo

    almacenar datos locales en variables de estado • Descargar datos de un servidor en respuesta a la interacción del usuario • Cómo reaccionar ante las acciones del usuario y cambiar lo que está en la pantalla • Analizar otros tipos de sitios web y crearlos con AMP • El repositorio en Glitch con todos los ejercicios completos de este curso está en :glitch.com/~enshrined-eyebrow