Unlimited Wordpress themes, plugins, graphics & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. Navigation Design
Webdesign

Como Construir um Efeito Hover Sublinhado com Desclocamento com CSS e JavaScript

by
Difficulty:IntermediateLength:ShortLanguages:

Portuguese (Português) translation by Adriana Takagi (you can also view the original English article)

No tutorial de hoje, vamos usar um pouco de CSS e JavaScript para criar um efeito sofisticado de menu hover. Não é um resultado final complicado, mas construí-lo vai ser uma grande oportunidade para praticar nossas habilidades front-end.

Sem mais introdução, vamos conferir o que estaremos construindo:

A Linguagem de Marcação

Começamos com um marcador bem básico; um elemento nav que contém o menu e um elemento vazio span:

O CSS

Com a linguagem de marcação pronta, em seguida, especificamos alguns estilos básicos para os elementos relacionados:

Note que o elemento span (.target) está absolutamente posicionado. Como vamos ver em um momento, vamos usar o JavaScript para determinar sua exata posição. Além disso, isso deve aparecer atrás dos links do menu, por isso atribua a ele um z-index negativo.

O JavaScript

Neste ponto, vamos focar a nossa atenção no JavaScript necessário. Para começar, nós direcionamos nos elementos desejados. Nós também definimos um array de cores que vamos usar depois.

Eventos

Em seguida prestamos atenção para os eventos click e mouseenter dos links do menu.

Quando o evento click acontece, evitamos que a página seja recarregada. Claro, isso funciona no nosso caso porque todos os links têm um atributo vazio href. Em um projeto real no entanto, cada um dos links do menu provavelmente abriria uma página diferente.

Mais importante ainda, assim que o evento mouseenter dispara, a função de retorno mouseenterFunc é executada:

mouseenterFunc

O corpo da função mouseenterFunc tem esta aparência:

Dentro desta função fazemos o seguinte:

  1. Adicione a classe active ao pai imediato (li) do link de destino.
  2. Diminua a opacity de todos os links do menu, além do "active".
  3. Use o método getBoundingClientRect para recuperar o tamanho do link associado e sua posição relativa à viewport.
  4. Obtenha uma cor aleatória do array mencionado acima e passe-o como valor para a propriedade border-color do elemento span. Lembre-se, seu valor de propriedade inicial é definido como transparent.
  5. Atribua os valores extraídos do método getBoundingClientRect às propriedades correspondentes do elemento span. Em outras palavras, a tag span herda o tamanho e a posição do link que está sendo passado o mouse.
  6. Redefina a transformação padrão aplicada ao elemento span. Este comportamento é apenas importante na primeira vez que passamos o mouse sobre um link. Neste caso, a transformação do elemento passa de transform: translateX (-60px) para transform: none. Isso nos dá um bom efeito de slide-in.

If Active

É importante observar que o código acima é executado toda vez que passamos o mouse sobre um link. Portanto ele é executado quando nós passamos o mouse sobre um link "ativo" também. Para evitar esse comportamento, nós acondicionamos o código acima dentro de uma instrução if:

Até agora, nossa demo tem a seguinte aparência:

Quase, mas Nem Tanto

Então, tudo parece funcionar como esperado, certo? Bem, isso não é verdade porque se percorrer a página ou redimensionar a janela de visualização, e depois tentar selecionar um link, as coisas ficam confusas. Especificamente, a posição do elemento span torna-se incorreta.

Brinque com a demo da página inteira para ver o que quero dizer.

Para resolver isso, temos que calcular até que ponto percorremos a partir da parte superior da janela e adicionamos este valor ao valor atual top do elemento de destino. Da mesma forma, devemos calcular até que ponto o documento tem sido rolado horizontalmente (apenas neste caso). O valor resultante é adicionado ao valor atual left do elemento de destino.

Aqui estão as duas linhas de código que atualizamos:

Tenha em mente que todo o código acima é executado assim que o navegador processa o DOM e localiza o script relevante. Novamente, para suas próprias implementações e projetos você pode querer executar este código quando a página for carregada, ou algo parecido. Em tal cenário, você vai ter que incorporá-lo em um manipulador de eventos (por exemplo, manipulador de evento load).

Viewport

A última coisa que temos a fazer é garantir que o efeito ainda vá funcionar à medida que redimensionamos a janela do navegador. Para fazer isto, nós prestamos atenção ao evento resize e registramos o manipulador de eventos resizeFunc.

Aqui está o corpo deste manipulador:

Dentro da função acima, fazemos o seguinte:

  1. Verifique se há um item da lista de menu com a classe de active. Se existe tal elemento, isso indica que já passamos o mouse sobre um link.
  2. Obtenha as novas propriedades left e top do item "active" juntamente com as propriedades relacionadas da janela e atribua-as ao elemento span. Observe que recuperamos os valores somente para as propriedades que mudam durante o evento resize. Isso significa que não há necessidade de recalcular a largura e a altura dos links do menu.

Suporte do Navegador

A demo funciona bem em todos os navegadores recentes. Se você encontrar quaisquer problemas, nos informe nos comentários abaixo. Além disso, como você possivelmente notou, usamos o Babel para compilar nosso código ES6 até ES5.

Conclusão

Nesta dica rápida, passamos pelo processo de criação de um simples, mas interessante efeito hover.

Espero que você tenha gostado do que construímos aqui e se inspirou para desenvolver efeitos de menu ainda mais poderosos como o que apareceu (no momento da escrita) no site Stripe.

Você já criou algo semelhante? Se for assim, não deixe de compartilhar conosco os desafios que enfrentou.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.