Um botão “Carregar mais” adiciona mais conteúdo a uma página quando clicado por um usuário. Essa é uma abordagem comum para blogs, pois permite que o usuário decida como e quando as informações são exibidas.
Aqui está uma olhada no produto final em que trabalharemos hoje – role até a parte inferior da caneta e clique no botão para adicionar mais conteúdo à página:
1. Recipiente de cartão e HTML de botão
Começaremos colocando o recipiente para nossos cartões na página. Adicionaremos os cartões ao contêiner usando JavaScript para que o div fique vazio.
Nossa implementação inclui um botão “carregar mais” e também exibe o número atual de cartões sendo exibidos e o número total de cartões disponíveis. Incluiremos esses recursos em um card-actions
div. O conteúdo em card-count
e card-total
será adicionado com JavaScript.
Showing of cards
2. Estilizando os cartões e o botão
Os cartões que adicionaremos ao div do contêiner de cartão terão um nome de classe de “card”.
#card-container { display: flex; flex-wrap: wrap; } .card { height: 55vh; width: calc((100% / 3) - 16px); margin: 8px; border-radius: 3px; transition: all 200ms ease-in-out; display: flex; align-items: center; justify-content: center; } .card:hover { box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); }
Vamos estilizar nosso load-more
botão de maneira semelhante aos cartões e adicione um pseudo-seletor desabilitado para mostrar quando o final dos cartões foi atingido.
.card-actions { margin: 8px; padding: 16px 0; display: flex; justify-content: space-between; align-items: center; } #load-more { width: calc((100% / 3) - 8px); padding: 16px; background-color: white; border: none; cursor: pointer; transition: all 200ms ease-in-out; border-radius: 3px; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.15rem; } #load-more:not([disabled]):hover { box-shadow: 0 1px 9px rgba(0, 0, 0, 0.2); } #load-more[disabled] { background-color: #eaeaea !important; }
3. Adicionando funcionalidades com JavaScript
É assim que a implementação funcional do botão carregar mais será:
- Defina um número de cartões a serem adicionados à página cada vez que o usuário clicar no botão.
- Detecte quando o número total de cartões foi adicionado e desative o botão.
Definindo Constantes
Primeiro, pegue todos os elementos que precisaremos do nosso DOM:
const cardContainer = document.getElementById("card-container"); const loadMoreButton = document.getElementById("load-more"); const cardCountElem = document.getElementById("card-count"); const cardTotalElem = document.getElementById("card-total");
Agora precisamos definir nossas variáveis globais.
Precisaremos de um valor para o número máximo de cartões a serem adicionados à página. Se você estiver obtendo seus dados de um servidor, esse valor será o comprimento da resposta do servidor. Vamos inicializar um limite de cartão de 99.
const cardLimit = 99;
o cardTotalElem
é o elemento para exibir o número máximo de cartões na página para que possamos definir o innerHTML
para o cardLimit
valor;
cardTotalElem.innerHTML = cardLimit;
Em seguida, definiremos uma variável para quantos cartões queremos aumentar a página:
const cardIncrease = 9;
Assim como em nosso tutorial de rolagem infinita, queremos saber quantas “páginas” teremos, ou seja, quantas vezes podemos aumentar o conteúdo até atingir o limite máximo. Por exemplo, com nosso definido cardLimit
e cardIncrease
variáveis, podemos aumentar o conteúdo 10 vezes (assumindo que já carregamos os primeiros 9 elementos) até atingirmos o limite. Faremos isso dividindo o cardLimit
pelo cardIncrease
.
const pageCount = Math.ceil(cardLimit / cardIncrease);
Em seguida, definiremos um valor para determinar em qual página estamos:
let currentPage = 1;
Criando um novo cartão
Agora que temos todas as nossas constantes, vamos fazer uma função para adicionar um novo cartão ao container de cartões. Vamos definir o innerHTML
dos nossos cartões ao valor do índice para que possamos acompanhar o número de cartões que estamos adicionando.
Um recurso divertido nesta demonstração é que cada cartão tem uma cor de fundo gerada aleatoriamente.
const getRandomColor = () => { const h = Math.floor(Math.random() * 360); return `hsl(${h}deg, 90%, 85%)`; }; const createCard = (index) => { const card = document.createElement("div"); card.className = "card"; card.innerHTML = index; card.style.backgroundColor = getRandomColor(); cardContainer.appendChild(card); };
Também podemos aplicar esta função ao nosso load-more
botão no carregamento da página para dar uma cor de fundo aleatória também:
window.onload = function () { loadMoreButton.style.backgroundColor = getRandomColor(); };
Adicionando cartões ao contêiner
Adicionaremos nossos cartões ao nosso contêiner usando uma funcionalidade semelhante à que usamos no tutorial Rolagem infinita.
Primeiro, determine o intervalo de cartões a serem adicionados à página. o addCards
função aceitará um pageIndex
parâmetro, que irá atualizar o global currentPage
valor. Se estivermos na página 1, adicionaremos os cartões de 1 a 9. Se estivermos na página 2, adicionaremos os cartões de 10 a 18 e assim por diante.
Podemos definir isso matematicamente como:
const addCards = (pageIndex) => { currentPage = pageIndex; const startRange = (pageIndex - 1) * cardIncrease; const endRange = pageIndex * cardIncrease; for (let i = startRange + 1; i <= endRange; i++) { createCard(i); } };
Nesta função, nosso intervalo inicial será sempre um a menos que o valor que estamos tentando obter (ou seja, na página 1, o intervalo inicial é 0, na página 2, o intervalo inicial é 9), portanto, consideraremos isso definindo o valor do nosso índice de loop for para startRange + 1
.
Detectando quando o limite do cartão é atingido
Um limite que teremos que observar é o endRange
número. Se estivermos na última página, queremos que nosso intervalo final seja o mesmo que o cardLimit
. Por exemplo, se tivermos um cardLimit
de 75 e um cardIncrease
de 10 e estamos na página 8, nosso startRange
será de 70 e nosso endRange
valor deve ser 75.
Vamos modificar nosso addCards
função para dar conta disso:
const addCards = (pageIndex) => { currentPage = pageIndex; const startRange = (pageIndex - 1) * cardIncrease; const endRange = currentPage == pageCount ? cardLimit : pageIndex * cardIncrease; for (let i = startRange + 1; i <= endRange; i++) { createCard(i); } };
Nossa demonstração também inclui um cardTotal
elemento que exibe o número de cartões que estão sendo mostrados na página, então definiremos o innerHTML
deste elemento como o intervalo final.
const addCards = (pageIndex) => { currentPage = pageIndex; const startRange = (pageIndex - 1) * cardIncrease; const endRange = currentPage == pageCount ? cardLimit : pageIndex * cardIncrease; cardCountElem.innerHTML = endRange; for (let i = startRange + 1; i <= endRange; i++) { createCard(i); } };
Outra coisa a observar é desabilitar o botão carregar mais quando o cardLimit
é atingido. Podemos definir um handleButtonStatus
função para determinar se o botão deve ser desativado, ou seja, quando o currentPage
é igual a cardLimit
:
const handleButtonStatus = () => { if (pageCount === currentPage) { loadMoreButton.classList.add("disabled"); loadMoreButton.setAttribute("disabled", true); } };
Vamos então passar essa nova função para o nosso addCards
função:
const addCards = (pageIndex) => { currentPage = pageIndex; handleButtonStatus(); const startRange = (pageIndex - 1) * cardIncrease; const endRange = pageIndex * cardIncrease > cardLimit ? cardLimit : pageIndex * cardIncrease; cardCountElem.innerHTML = endRange; for (let i = startRange + 1; i <= endRange; i++) { createCard(i); } };
Carregando cartões iniciais
Definimos um recurso para adicionar cartões ao contêiner, então atualizaremos nosso window.onload
função para definir os cartões iniciais a serem adicionados à página.
window.onload = function () { addCards(currentPage); loadMoreButton.style.backgroundColor = getRandomColor(); };
Manipulando Carga Mais
Cuidaremos da adição do conteúdo aumentando o currentPage
número por 1 cada vez que o Carregue mais botão é clicado. Como já adicionamos todas as verificações de limite em nosso addCards
função, não precisaremos fazer nenhuma outra verificação em nosso evento de clique.
window.onload = function () { addCards(currentPage); loadMoreButton.style.backgroundColor = getRandomColor(); loadMoreButton.addEventListener("click", () => { addCards(currentPage + 1); }); };
Conclusão
E terminamos! Implementamos com sucesso um recurso de botão “Carregar mais” em nossa página da web!