3
respostas

Dúvida - exibir os dois preços na tela

Estou tentando exibir na tela dois preços, com desconto e sem desconto. Consegui exibir os dois, mas não consigo alinhar o preço com desconto abaixo do preço sem desconto. Alguém pode me ajudar? Segue o que consegui fazer:

HTML - na section coloquei essa div para tentar de alguma forma alinhar os preços com desconto


<section class="livros wrap" id="livros">
    <div id="livros-desconto"></div>

Arquivo JS que busca livros da API

//
let livros = []

const endPointDaAPI = 'https://guilhermeonrails.github.io/casadocodigo/livros.json';
getBuscarLivrosDaAPI();

//modo de manter uma moeda para cada país, nesse caso apenas Brasileira
const preco = new Intl.NumberFormat("pt-br", {
    style: "currency",
    currency: "BRL",
    minimumFractionDigits: 2,
});

async function getBuscarLivrosDaAPI() {
    const res = await fetch(endPointDaAPI);
    livros = await res.json();
    console.log(livros)
    livrosComDesconto = aplicarDescontoLivros(livros);
    exibirDescontoLivro(livrosComDesconto); //Chamar a função de preço com desconto
    exibirLivrosNaTela(livros);  //Chamar a função de preço sem desconto
    
}

Nesse arquivo JS fiz uma função para exibir o preço com desconto aplicarDescontoLivros(livros), que é igual a exibirLivrosNaTela(listaDeLivros) que exibe os preços sem desconto. A grande questão é conseguir colocar as duas tags p dentro da

para conseguir alinha-las.


const elementoParaInserirLivros = document.getElementById('livros');
const elementoParaInserirPrecoDesconto = document.getElementById('livros-desconto'); 



function exibirLivrosNaTela(listaDeLivros) {
    listaDeLivros.forEach(livro => {
        elementoParaInserirLivros.innerHTML += `
    <div class="livro" id="livro">
      <img class="livro__imagens" src="${livro.imagem}" alt="${livro.alt}" />
      <h2 class="livro__titulo">
        ${livro.titulo}
      </h2>
      <p class="livro__descricao">${livro.autor}</p>
      <p class="livro__preco" id="preco">${preco.format(livro.preco)}</p>  
      <div class="tags">
        <span class="tag">${livro.categoria}</span>
      </div>
    </div>
        `
    })

    }

    function exibirDescontoLivro(listadeLivrosComDesconto) {
      listadeLivrosComDesconto.forEach(livro => {
        elementoParaInserirPrecoDesconto.innerHTML += `
        <p class="livro__preco" id="preco">${preco.format(livro.preco)}</p>  `
        
      })
    }
Arquivo JS que tem a função para aplicar desconto
function aplicarDescontoLivros(livros) {
    const desconto = 0.10;
    let livrosComDesconto = livros.map(livro => {
        return {...livro, preco: livro.preco - (livro.preco * desconto)}
    })
    return livrosComDesconto;
}
![Resultado na Tela](https://imgur.com/a/wOuC6XL)
3 respostas

Olá, Luis! Tudo bem?

Pelo que entendi, você está tendo dificuldades em alinhar os preços com desconto abaixo dos preços sem desconto na tela, certo?

Uma forma de resolver esse problema é ajustar a estrutura do HTML e CSS para que os preços com desconto fiquem alinhados corretamente.

Uma sugestão é adicionar uma classe específica para os preços com desconto e utilizar o CSS para alinhar esses elementos abaixo dos preços sem desconto. Por exemplo:

<div class="livro" id="livro">
  <img class="livro__imagens" src="${livro.imagem}" alt="${livro.alt}" />
  <h2 class="livro__titulo">
    ${livro.titulo}
  </h2>
  <p class="livro__descricao">${livro.autor}</p>
  <p class="livro__preco" id="preco">${preco.format(livro.preco)}</p>  
  <div class="tags">
    <span class="tag">${livro.categoria}</span>
  </div>
  <p class="livro__preco-desconto" id="preco-desconto">${preco.format(livro.preco)}</p>
</div>

No CSS, você pode adicionar uma regra para a classe .livro__preco-desconto para ajustar o alinhamento:

.livro__preco-desconto {
  margin-top: 10px; /* Ajuste o valor conforme necessário */
}

Dessa forma, os preços com desconto serão exibidos abaixo dos preços sem desconto.

Espero que essa sugestão possa te ajudar a resolver o problema de alinhamento dos preços na tela. Se tiver alguma outra dúvida, é só me perguntar!

Espero ter ajudado e bons estudos!

Olá Ranan, estou bem e você?

Acho que não expliquei direito...Se eu fizer do jeito que você mostrou os dois preços vão ficar iguais, porque estão na mesma função, mesma template string.

No meu código além da função exibirLivrosNaTela(listaDeLivros) criada pelo instrutor do curso, criei uma outra função exibirDescontoLivro(listadeLivrosComDesconto) para exibir o valor com desconto, para ter os dois valores de preço.

O problema de alinhamento é por as duas tags p estarem em funções diferentes e templates strings diferentes.

Oi, Luís

Seria isso?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

  • Código alterado
let livros = []

const endPointDaAPI = 'https://guilhermeonrails.github.io/casadocodigo/livros.json';
getBuscarLivrosDaAPI();

//modo de manter uma moeda para cada país, nesse caso apenas Brasileira
const preco = new Intl.NumberFormat("pt-br", {
  style: "currency",
  currency: "BRL",
  minimumFractionDigits: 2,
});

async function getBuscarLivrosDaAPI() {
  const res = await fetch(endPointDaAPI);
  livros = await res.json();
  console.log(livros)
  livrosComDesconto = aplicarDescontoLivros(livros);
  exibirLivrosNaTela(livros);  //Chamar a função de preço sem desconto

}

const elementoParaInserirLivros = document.getElementById('livros');
const elementoParaInserirPrecoDesconto = document.getElementById('livros-desconto');

function exibirLivrosNaTela(listaDeLivros) {
  listaDeLivros.forEach((livro,i) => {
    elementoParaInserirLivros.innerHTML += `
    <div class="livro" id="livro">
      <img class="livro__imagens" src="${livro.imagem}" alt="${livro.alt}" />
      <h2 class="livro__titulo">
        ${livro.titulo}
      </h2>
      <p class="livro__descricao">${livro.autor}</p>
      <p class="livro__preco" id="preco">
        <s>${preco.format(livro.preco)}</s> 
        ${preco.format(livrosComDesconto[i].preco)}
      </p> 
      <div class="tags">
        <span class="tag">${livro.categoria}</span>
      </div>
    </div>        `
  })
}

function aplicarDescontoLivros(livros) {
  const desconto = 0.10;
  let livrosComDesconto = livros.map(livro => {
    return { ...livro, preco: livro.preco - (livro.preco * desconto) }
  })
  return livrosComDesconto;
}