2
respostas

Responsividade

Boa noite, tudo bem? Gostaria de uma ajuda no meu código com relação a responsividade, no computador ele funciona perfeitamente, porém, em celulares não apresenta um resultado satisfatório, segue abaixo o link do meu Git e do site-teste.

https://github.com/luisboaventura

https://portfolio-teste-dun-tau.vercel.app

2 respostas

Oi, Luís! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Analisando o seu CSS, percebi que o código está quase todo responsivo. No entanto, notei que em telas menores, parte do texto destacado, especialmente a palavra "qualidade", estava sendo cortada:

Imagem de uma página de portfólio responsiva exibida em tela estreita. O cabeçalho mostra um menu com os links "Home", "Sobre mim" e "Currículo". Abaixo, há uma ilustração com o texto "Front End". Em seguida, aparece o título "Transformando ideias em interfaces com um Front-End de qualidade!", mas a palavra "qualidade" está cortada, revelando um problema de responsividade ou animação no texto. Abaixo do título, há um parágrafo de apresentação do desenvolvedor Luís Felipe e botões para GitHub e LinkedIn. No rodapé, lê-se "Projetado e desenvolvido por Luís Boaventura.

Isso acontecia por conta de dois pontos principais:

No seu código:

.titulo-destaque {
  width: 0ch;
  animation: mark 0.5s step-end infinite, write 6s steps(22, end) infinite;
}

@keyframes write {
  20% {
    width: 23.6ch;
  }
  
}
  • O uso da unidade ch (largura do caractere "0") para controlar a largura do texto funciona bem em resoluções grandes, mas não é responsivo, já que o texto pode ultrapassar os limites da tela em dispositivos menores.
  • Além disso, a quantidade de steps(22, end) não correspondia ao total real de caracteres da frase, o que deixava o efeito um pouco truncado.

O que podemos alterar para resolver o problema:

.titulo-destaque {
  width: 0ch;
  max-width: 100%;
  animation: mark 0.5s step-end infinite, write 6s steps(40, end) infinite;
}
@keyframes write {
  0% { width: 0; }
  20% { width: 100%; }
  70% { width: 100%; }
  85% { width: 0; }
  100% { width: 0; }
}

E para telas menores:

@media (max-width: 768px) {
  .titulo-destaque {
    font-size: 1.2rem;
    display: inline-block;
    overflow: hidden;
    white-space: nowrap;
    max-width: 100%;
    border-right: 3px solid var(--cor-tercearia);
    animation: mark 0.5s step-end infinite, write-sm 6s steps(40, end) infinite;
  }
}

@keyframes write-sm {
  0% { width: 0; }
  20% { width: 100%; }
  70% { width: 100%; }
  85% { width: 0; }
  100% { width: 0; }
}

Após a correção, ficou assim:

Página de portfólio responsiva com menu, imagem "Front End" e título com a palavra "qualidade" agora exibida corretamente, indicando correção no corte anterior do texto.

Por que essas mudanças funcionam melhor?

  • O width: 100% dentro da animação garante que o texto respeite a largura disponível da tela, tornando o comportamento responsivo.
  • Adicionamos max-width: 100%, display: inline-block, white-space: nowrap e overflow: hidden para manter o efeito de digitação sem quebras de linha nem corte de conteúdo.
  • Aumentamos o número de passos da animação para steps(40, end), o que simula melhor a quantidade de caracteres da sua frase completa.
  • No media query, diminuímos o font-size para o título se ajustar visualmente melhor em telas pequenas.

Curiosidade: a unidade ch é útil para largura de texto baseada em caracteres, mas pode variar muito dependendo da fonte e da tela. Em animações responsivas, usar width: 100% com as configurações corretas de overflow e white-space costuma ser mais seguro.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Oi, Rafaela, tudo bem? Agradeço ajuda prestada, porém ainda estou com algumas dificuldades com relação ao código, diminuindo a tela do meu computador consigo notar que a responsividade em telas menores realmente esta funcionando, porém, no comprimento total da tela a palavra começou a cortar, CSS:



@import url('https://fonts.googleapis.com/css2?family=Krona+One&family=Montserrat&family=swap');

:root {
    --cor-primaria: #181C14;
    --cor-secundaria: #ECDFCC;
    --cor-tercearia: #697565;
    --cor-hover: #3C3D37;

    --fonte-krona: "Krona One", sans-serif;
    --fonte-montserrat:"Montserrat", sans-serif;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    box-sizing: border-box;
    background-color: var(--cor-primaria);
    color: var(--cor-secundaria);
}

.header {
    padding: 2% 0 0 15% ;
}

.header__menu {
    display: flex;
    gap: 80px;
}

.header__menu__link {
    font-family: var(--fonte-montserrat);
    font-size: 1.5rem;
    font-weight: 600;
    color: var(--cor-tercearia);
    text-decoration:none;
    position: relative;
}

nav a::after{
    content:" ";
    width: 0%;
    height: 3px;
    background-color: var(--cor-tercearia);
    position: absolute;
    bottom: 0;
    left: 0;
    transition: 0.5s ease-in-out;
}

nav a:hover::after{
    width: 100%;
}

.container {
    padding: 10% 15%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 120px;
    
}

.container__conteudo {
    width: 615px;
    display: flex;
    flex-direction:column;
    gap: 40px;
}

.container__conteudo__titulo{
    font-size: 2.25rem;
    font-family: var(--fonte-krona);
}

.titulo-destaque {
    font-size: 2rem;
    display: block;
    color: var(--cor-tercearia);
    border-right: 2px solid var(--cor-tercearia);
    white-space: nowrap;
    overflow: hidden;
    width: 0ch;
    max-width: 100%;
    animation: mark 0.5s step-end infinite, write 6s steps(40, end) infinite;
}

@keyframes mark {
    50% {
        border-right-color: transparent;
    }
}

@keyframes write {
    0% { width: 0; }
    20% { width: 100%; }
    70% { width: 100%; }
    85% { width: 0; }
    100% { width: 0; }
}

.container__conteudo__texto{
    font-size: 1.5rem;
    font-family: var(--fonte-montserrat);
}

.botoes {
    margin-top: 1rem;
    display: flex;
    align-items: center;
    flex-direction: column;
    justify-content: center;
    gap: 16px;
}

.container__conteudo__titulo__2 {
    font-size: 1.5rem;
    font-family: var(--fonte-krona);
    font-weight: 400;
}

.botao {
    display: flex;
    justify-content: center;
    gap: 16px;
    width: 50%;
    padding: 1.0rem 1.2rem;
    text-decoration: none;
    border-radius: 16px;
    font-weight:500;
    transition: 0.3s;
    text-align: center;
    border: 2px solid var(--cor-tercearia);
}

.botao:hover {
    border: 3px solid var(--cor-tercearia);
    cursor:pointer;
}

.linkedin {
    
    color: var(--cor-secundaria);
    font-family: var(--fonte-krona);
    font-size: 1.5rem;
}

.linkedin:hover {
    background-color: var(--cor-hover);
    color: var(--cor-tercearia);
    padding: 3%;
}

.github {

    color: var(--cor-secundaria);
    font-family: var(--fonte-krona);
    font-size: 1.5rem;
}

.github:hover {
    background-color: var(--cor-hover);
    color: var(--cor-tercearia);
    padding: 3%;
}

.imagem__capa {
   width: 35%; 
   border-radius: 5% ;
}

.footer {
    background-color: var(--cor-tercearia);
    color: var(--cor-primaria);
    padding: 18px;
    text-align: center;
    font-family: var(--fonte-montserrat);
    font-size: 1.5rem;
    font-weight: 400;
}

.container__conteudo__texto a{
    text-decoration: none;
    color: var(--cor-tercearia);
}

.curriculo {
    border-radius: 5%;
    width: 35%;
}

.estudos {
    padding: 2%;
}

.about{
    border-radius: 5%;
    width: 35%;
}

img {
    max-width: 100%;
    height: auto;
}

@media (max-width: 1460px) {
    .container {
        flex-direction: column-reverse;
        padding: 5%;
    }
    .header {
        padding: 8%;
    }
    .header__menu {
        justify-content: center;
    }
    .container__conteudo {
        width: 100%;
    }
    .botao {
        width: 80%;
        font-size: 1.2rem;
    }

    
}

@media (max-width: 768px) {
    .titulo-destaque {
      font-size: 1.2rem;
      display: inline-block;
      overflow: hidden;
      white-space: nowrap;
      max-width: 100%;
      border-right: 3px solid var(--cor-tercearia);
      animation: mark 0.5s step-end infinite, write-sm 6s steps(40, end) infinite;
    }
  }
  
  @keyframes write-sm {
    0% { width: 0; }
    20% { width: 100%; }
    70% { width: 100%; }
    85% { width: 0; }
    100% { width: 0; }
  }