Categorias
AMP Accelerated mobile pages

Trabalhando com light-box para imagens com AMP: amp-image-lightbox

No post anterior vimos como implementar um light-box com o componente amp-lightbox e nesse post vamos ver como implementar light-box para imagens, assim iremos trabalhar com o componente amp-image-lightbox. Ele possui algumas particularidades comparado ao componente amp-lightbox mas o comportamento será bem parecido.

amp-image-lightbox

O componente amp-image-lightbox habilita um lightbox específico para images, quando acionado a image será exibida em destaque. Para trabalhar como o componente precisamos primeiramente carregar o script:

<script async custom-element="amp-image-lightbox" src="https://cdn.ampproject.org/v0/amp-image-lightbox-0.1.js"></script>

Em seguida adicionamos em nossa aplicação seguinte o código:

<amp-image-lightbox id="lightbox-caipirinha" layout="nodisplay"></amp-image-lightbox>
<amp-img
  on="tap:lightbox-caipirinha"
  role="button"
  tabindex="0"
  src="caipirinha.jpg"
  width="200"
  height="100"
></amp-img>

O amp-img possui um evento de tap que irá referenciar o light-box que queremos exibir e nesse caso o amp-image-lightbox com id “lightbox-caipirinha” será o nosso alvo, assim como amp-lightbox ele possui o layout “nodisplay” e com o código acima o resultado será o seguinte:

light-box quando acionado

O componente amp-image-lightbox já vem com estilização do background interações, por exemplo, zoom, panorâmica, e ações para fechar o lightbox quando o usuário clicar fora da imagem ou precionar ESC.

Diferente do amp-lightbox o amp-image-light pode ser utilizado por múltiplas images, assim podemos ter duas images fazendo referência ao mesmo light-box. Como no código a seguir:

<amp-image-lightbox id="lightbox-caipirinha" layout="nodisplay"></amp-image-lightbox>

<amp-img
  on="tap:lightbox-caipirinha"
  role="button"
  tabindex="0"
  src="caipirinha1.jpg"
  width="200"
  height="100"
></amp-img>

<amp-img
  on="tap:lightbox-caipirinha"
  role="button"
  tabindex="0"
  src="caipirinha2.jpg"
  width="200"
  height="100"
></amp-img>

Legendas

Um recurso opcional é a inclusão de legendas no light-box, para isso precisamos incluir uma tag “figure” e como filha uma tag “figcaption” ou adicionar uma descrição com aria através da propriedade “aria-describedby” essas serão as duas opções que veremos no código a seguir:

Com tag figure

<amp-image-lightbox id="lightbox-caipirinha" layout="nodisplay"></amp-image-lightbox>

<!-- Captions via figcaption -->
<figure>
  <amp-img
    on="tap:lightbox-caipirinha"
    role="button"
    tabindex="0"
    src="caipirinha.jpg"
    layout="responsive"
    width="300"
    height="246"
  ></amp-img>
  <figcaption>Learn how to prepare the best Caipirinha</figcaption>
</figure>

Resultado do light-box com legenda

Com ARIA

<amp-image-lightbox id="lightbox-caipirinha" layout="nodisplay"></amp-image-lightbox>

<!-- Captions via figcaption -->
<div>
  <amp-img
    on="tap:lightbox-caipirinha"
    role="button"
    tabindex="0"
    src="caipirinha.jpg"
    aria-describedby="image-description"
    layout="responsive"
    width="300"
    height="246"
  ></amp-img>
  <div id="image-description">Caipirinha from Brazil</div>
</div>

Em ambas situações o resultado visual será o mesmo, com a legenda no canto inferior.

Atributos

Os atributos no componente amp-image-lightbox é um pouco diferente do amp-lightbox não temos opções de animação mas temos a seguintes propriedades:

  • layout(obrigatório): deve ser nodisplay
  • id (obrigatório): necessário para ser referenciado pelo elemento que ira disparar a ação de exibir
  • data-close-button-aria-label(opcional): Uma legenda usada pelo ARIA que podemos incluir em nosso botão fechar.

Se quiser saber mais sobre am-lightbox eu publiquei um post falando sobre o componente. Para acompanhar o curso de AMP assine meu canal no YouTube. Qualquer dúvida deixe um comentário e até o proximo post.

Categorias
AMP Accelerated mobile pages

Criando light-box com AMP: amp-lightbox

Nesse post vamos ver como implementar um light-box em nossa aplicação AMP, light-box é um dos recursos mais usados desde a popularização do JavaScript. Na maioria das vezes usado para focar a exibição de elementos gráficos ou mensagens. A plataforma amp disponibiliza três componentes para exibiãção de light-box amp-lightbox, amp-image-lightbox e amp-lightbox-gallery.

Cada um desses componentes possui uma aplicação específica, Para esse tutorial iremos abordar o componente amp-lightbox.

amp-lightbox

Esse componente quando utilizado seu elemento filho será exibido em uma modal quando acionado através de um evento de clique. Com isso temos que ter um segundo elemento para ativa-lo, um botão poderá ser uma alternativa. O componente possui alguns comportamentos já pre definidos, por exemplo, quando o usuário pressionar a tecla “esc” o light-box será fechado. Um alternativa é incluir um elemento com a ação close no light-box.

O componente amp-lightbox é um componente extended assim precisamos carregar o script relacionado:

<script async custom-element="amp-lightbox" src="https://cdn.ampproject.org/v0/amp-lightbox-0.1.js"></script>

Com essa introdução vamos criar o nosso primeiro exemplo, baseado no projeto the best caipirinha, vamos utilizar o light-box para trazer mais informações sobre os items da nossa receita, por exemplo, descrição sobre cana de açúcar com isso temos o seguinte código:

<button on="tap:sugarcane-wiki">sugarcane</button>

<amp-lightbox id="sugarcane-wiki" layout="nodisplay">
                <p>
                  Sugarcane, or sugar cane, or simply cane, are several species of tall perennial true grasses of the genus Saccharum...
                </p>
</amp-lightbox>

Apenas com o botão e o componente amp-lighbox temos nosso light box somente com a funcionalidade como podemos ver na imagem abaixo:

Agora é hora de adicionar a parte visual, para isso precisamos adicionar o estilo para o nosso elementos com isso vamos criar classes para estilizar nossos elementos em nosso CSS e aciona-los em nosso elementos HTML:

CSS

.lightbox {
        align-items: center;
        background: rgba(0, 0, 0, 0.8);
        box-sizing: border-box;
        display: flex;
        flex-direction: column;
        justify-content: center;
        height: 100%;
        width: 100%;
        position: absolute;
        padding: 2em;
      }

      .lightbox_p {
        color: #fff;
        font-size: 1.5em;
        font-weight: 500;
      }

HMTL

<amp-lightbox id="sugarcane-wiki" layout="nodisplay">
              <div class="lightbox">
                <p class="lightbox_p">
                  Sugarcane, or sugar cane, or simply cane, are several species of tall perennial true grasses of the genus Saccharum....
                </p>
                <p class="lightbox_p">source: wikipedia</p>
              </div>
            </amp-lightbox>

Adicionando o estilo temos o seguinte resultado:

Apenas adicionando o botão para abrir o light-box, para fechar precisamos pressionar a tecla “esc” mas isso pode não ser intuitivo para os nossos usuários com isso vamos adicionar um botão fechar dentro de nosso light-box.

<amp-lightbox id="sugarcane-wiki" layout="nodisplay">
              <div class="lightbox">
                <p class="lightbox_p">
                  Sugarcane, or sugar cane, or simply cane, are several species of tall perennial true grasses of the genus Saccharum....
                </p>
                <p class="lightbox_p">source: wikipedia</p>
                <button class="lightbox_close" on="tap:sugarcane-wiki.close">close</button>
              </div>
            </amp-lightbox>

Adicionamos um botão com a ação de close sobre o light-box, falando em ações o componente amp-lightbox aceita duas ações open e close. Por padrão ele aciona a ação de open por isso que no botão para abrir o light-box não especificamos a ação. Agora para realizar a estilização do nosso botão vamos adicioar o seguinte CSS:

.lightbox_close {
        position: absolute;
        right: 32px;
        top: 32px;
        width: 32px;
        height: 32px;
        opacity: 0.7;
        text-indent: -999px;
        overflow: hidden;
        border: none;
        background: transparent;
      }

      .lightbox_close:hover {
        opacity: 1;
      }

      .lightbox_close::before,
      .lightbox_close::after {
        background-color: #fff;
        content: '';
        position: absolute;
        left: 16px;
        top: 0;
        height: 33px;
        width: 3px;
      }

      .lightbox_close::before {
        transform: rotate(45deg);
      }

      .lightbox_close::after {
        transform: rotate(-45deg);
      }

E o resultado será o seguinte:

com CSS criamos o botão de fechar o texto é escondido para ser ligo apenas por leitores de tela

Outro opção que poderíamos incluir se o usuário fechasse o light-box clicando no background com isso adicionamos o evento de clique no elemento com o class “lightbox”:

<amp-lightbox id="sugarcane-wiki" layout="nodisplay">
              <div class="lightbox"
                on="tap:sugarcane-wiki.close"
                role="button"
                tabindex="0">
                <p class="lightbox_p">
                  Sugarcane, or sugar cane, or simply cane, are several species of tall perennial true grasses of the genus Saccharum...
                </p>
                <p class="lightbox_p">source: wikipedia</p>
              </div>
              <button class="lightbox_close" on="tap:sugarcane-wiki.close">close</button>
            </amp-lightbox>

No código acima adicionei o evento de tap no elemento lightbox também adicionei duas propriedades por questões de acessibilidade “role” e “tabindex” para tornar a div clicável e não interferir na ordem lógica dos elementos para leitores de tela.

Atributos

Então vimos alguns exemplos práticos com light-box agora vamos ver alguns atributos:

  • animate-in (opcional): define o estilo de animação de abertura do light-box. Por default sua aparição vai ser feita por fade-in. Mas temos disponíveis: fade-in, fly-in-bottom e fly-in-top.
  • close-button (obrigatório para AMP ads): renderiza um botão no to do lightbox. Ele é somente válido e obrigatório para AMP ads.
  • id (obrigatório): valor único para identificar o lightbox.
  • layout (obrigatório): deve ser definido como nodisplay.
  • scrollable (opcional): Quando este atributo é definido o conteúdo do light-box pode ter rolagem horizontal habilitada quando necessário.

O tipos de animações com animate-in eu vou deixar para mostrar em uma vídeo aula no meu canal, mas caso queira saber mais sobre AMP confira a página com outros tutoriais aqui.

Em breve estarei adicionando mais posts sobre os componentes amp, qualquer dúvida deixe um comentário e até o próximo vídeo.