2
respostas

Efeito Parallax

Boa noite! Já fazem dois dias que estou quebrando a cabeça tentando reproduzir o efeito parallax no cabeçalho. Isto é, estou procurando informações complementares na internet sobre como criar tal efeito utilizando CSS puro. Eu segui as instruções do curso e o efeito foi bem legal, porém, ainda existem muitas lacunas para o meu entendimento. Alguém, por obséquio, poderia digitar um Passo a Passo (sei que é pedir muito) de como criar tal efeito?

Após o exercício, abri um novo arquivo html para tentar repetir o efeito, mas de alguma forma, as palavras do meu "li" ficam muito pequenas. Nesta tentativa, tentei focar apenas no cabeçalho. Estou fazendo isso:

1)

<header class="cabecalho">
        <h1 class="titulo-cabecalho">Efeito Parallax</h1>
        <p class="subtitulo-cabecalho">Milésima Tentativa</p>

        <ul class="palavras-cabecalho">
                  <li class="palavra-home eficiencia">Eficiência</li>
                    <li class="palavra-home boas-praticas">Boas práticas</li>
                   <li class="palavra-home codigo-limpo">Código limpo</li>
                 <li class="palavra-home css3">CSS3</li>
                 <li class="palavra-home html5">HTML5</li>
                <li class="palavra-home javascript">JavaScript</li>
                 <li class="palavra-home acessibilidade">Acessibilidade</li>
                <li class="palavra-home responsivo">Responsivo</li>
                 <li class="palavra-home otimizacoes">Otimizações</li>
                <li class="palavra-home agilidade">Agilidade</li>
                 <li class="palavra-home design">Design</li>
        </ul>

    </header>

Dúvida: Apenas com o HTML acima já é possível estruturar o meu Parallax?

Agora, configurando o CSS:

2)

/*Primeiro Passo*/

.cabecalho {
    position: relative;
}

/*Segundo Passo*/

.palavras-home{
    position: absolute;
    perspective:6px;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

/* Terceiro Passo*/
.palavra-home {
    position: absolute;
    font-family: Arial sans-serif;
    font-weight: bold;
    color: #D5447E;
    font-size: 80%;
}
/* Quarto passo */

.eficiencia {
    top: 50%;
    left: 60%;
    transform: translate(-50%, -50%) rotate(-5deg) translateZ(4px);

Depois disso, eu aplico uma fonte de 400% ao meu "li" e em seguida adiciono uma SCALE (0.25).

Dúvida: Por que a fonte precisa ser de 400%? E por que a escala de 0.25? Como se chegou a esse número? A fórmula abaixo para scale procede? Scale= perspective/perspective-translate

Bom, quando atualizo minha página até este ponto, as palavras do "li" ficam muito pequenas. Aumentei a escala para 1, ajudou um pouco, mas o problema é que precisa funcionar com 0.25. Não sei o que estou fazendo de errado.

Resolvi continuar, já que meu objetivo era conseguir o efeito Parallax, pensei que daria um jeito no tamanho da fonte mais tarde. Pois bem:

/* Quinto passo*/

html, body {
    height: 100%;
    overflow-x: hidden;
}

/*Sexto passo*/ E ao mesmo tempo retiro perspective do meu UL*/

body {
    perspective: 6px;
    perspective-origin: 50% 160px;
}

/*Sétimo passo*/
.palavras-cabecalho, .cabecalho{
    transform-style: preserve-3d;
}

Neste processo tenho as seguintes dúvidas:

  • Por que dar um height de 100% para o html e para o body?

  • Por que perspective precisa ser trocada de lugar?

  • Por que perspective-origin é de 50% e por que 160px? (perspective-origin: 50% 160px;)

Ficaria muito grato se alguém separasse um tempo para esclarecer minhas dúvidas. Quero usar Effects Parallax adicionando background-image.

http://localhost:63342/Projeto%20Alura/avancando-html-css-4efaeb810446e16fc2620b2e5bce0365bbe09c93/index.html?_ijt=5j40hmrqc2hm5s20v0knk3t1f1

Estou adorando aprender HTML e CSS, mas ficaria frustrado se seguisse com o curso sem ter entendido essa parte.

Aguardando (ansiosamente) uma resposta =)

2 respostas

Bom dia, Amauri

  • Dúvida: Apenas com o HTML acima já é possível estruturar o meu Parallax? Não, é necessário o mínimo de CSS para que o efeito funcione, pois o HTML apenas "diz" para o navegador quais são as tags que existem e quais textos entram nelas. O CSS quem diz aonde eles vão ficar.

  • Por que a fonte precisa ser de 400%?

  • E por que a escala de 0.25?

Pra você sacar o que está rolando, você precisa entender qual é o conceito da coisa. Essa dúvida ocorre tipicamente por que a gente esquece de sacar o que vou te passar agora.

Quando você usa uma animação em parallax, você tem profundidade ou um eixo Z

O eixo Z é o que deixa as coisas mais "perto" ou mais longe. Ou seja, ao usar o translateZ você cria um espaço 3D

Repara bem, que agora seu display tem como ir pra direita, pra esquerda, pra cima, pra baixo, pra frente e pra trás. Se a sua fonte está atrás, mas você quer ela do mesmo tamanho das outras, você pode criar um efeito de que ela veio pra frente aumentando o tamanho dela, mesmo ela estando lá atrás.

Como se estivesse nessa imagem aqui:

Não existe fórmula pra saber qual é o tamanho certo de aumentar ou diminuir um elemento no CSS Isso por que ele depende muito mais do que você está fazendo no seu código e qual é o objetivo do seu design. Explicando: Se no seu código você determina que seu elemento no eixo Z vai ter um translate de -100%, ou seja, enviar ele 100% pra trás, você pode aumentar a fonte em 200% pra causa a IMPRESSÃO de que ela está próxima. É como se um carro estivesse muito longe, mas pra parecer que ele está perto, você aumentasse o tamanho dele. Isso é apenas pra causar o efeito, não tem nada em especial nisso. Quanto ao design, alguns designs de site pedem que você traga elementos mais pra longe ou mais pra perto enquanto a página rola. Veja este exemplo aqui e você vai entender, ele é um perfeito microcosmo do que acabei de te explicar.

Percebeu que o celular vai pra frente e pra trás dependendo do movimento do scroll que você faz? Isso é para o que o translate Z é extremamente útil

COMO FAZER O EFEITO

Esse tutorial daqui pra baixo, foi retirado da seguinte página - https://alligator.io

Seguinte, eu não vou te dar a resposta, vou te dar a direção. Então você pode começar com a marcação de exemplo:

<main class="wrapper">
  <section class="section parallax bg1">
    <h1>Such Adorableness</hi>
  </section>
  <section class="section static">
    <h1>Boring</h1>
  </section>
  <section class="section parallax bg2">
    <h1>SO FWUFFY AWWW</hi>
  </section>
</main>

.wrapper -> Determina as propriedades de perspectiva pra página inteira

.section - Tamanho ,exibição e propriedades do texto, não muito relevante

.static - Coloca o background na seção. Apenas para demonstração

.parallax - Adiciona o pseudoelemnto :after com imagem de background e transforms necessários para o efeito

.bg1, .bg2 -> adiciona as respectivas imagens em cada section

Agora o CSS

.wrapper {
  /* A altura precisa ser determinada para um valor fixo para funcionar
  100vh é a altura inteira do navegador */
  height: 100vh;
  /* A escala das imagens adicionaria scrollbar, então escondemos */
  overflow-x: hidden;
  /* Habilita o scroll na página*/
  overflow-y: auto;
  /* Adiciona a perspectiva para 2px. Isso simula a distância ( Z - frente e tras) em relação aos "olhos" do usuário ou navegador .*/
  perspective: 2px;
}

.section {
  /* Necessário para adicionar filhos absolutos a ele. */
  position: relative;
  /* A altura da section precisa ser adicionada, não interessa qual o tamanho, apenas precisa estar lá */
  height: 100vh;

  /* formatação de texto. */
  display: flex;
  align-items: center;
  justify-content: center;
  color: white;
  text-shadow: 0 0 5px #000;
}

.parallax::after {
  /* exibe e posiciona o pseudoelemento */
  content: " ";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;

  /* Move o pseudoelemento para longe do usuário/camera
   * Então faz a escala pra pegar o viewpoert todo .
   *Por que o pseudoelemento está bem longe, parece que ele está se movendo mais devagar */
  transform: translateZ(-1px) scale(1.5);
  /* Força o background pra pegar o elemetno inteiro. */
  background-size: 100%;
  /* Previne a imagem de passar "por cima" dos elementos  */
  z-index: -1;
}

/*Estilo do elemento, sem importancia */
.static {
  background: crimson;
}

/* determina as imagens */
.bg1::after {
  background-image: url('https://placekitten.com/g/900/700');
}

.bg2::after {
  background-image: url('https://placekitten.com/g/800/600');
}

Importante

Se você mandar as imagens mais pra trás, eles vão parecer que estão se movendo mais devagar.