Реализация перехода на следующую страницу JS

Рейтинг: 0Ответов: 2Опубликовано: 11.07.2023

Мой 1-ый пост, поэтому прошу тапками не кидать. ^^ Имеется гридовая сетка, состоящая из 18 элементов вида:

<div class="grids__container">
                <div class="grids__card">
                   <a href="#" class="grids__card-link grids__card-link_active">
                        <img src="./assets/img/jpg/news/Moto.jpg" alt="motosport">
                        <p class="grids__card-title grids__card-title_active">
                            <span>Заголовок статьи</span>
                       </p>
                   </a>
                </div>
                <div class="grids__card">
                   <a href="#" class="grids__card-link grids__card-link_active">
                        <img src="./assets/img/jpg/news/Moto.jpg" alt="motosport">
                        <p class="grids__card-title grids__card-title_active">
                            <span>Заголовок статьи</span>
                       </p>
                   </a>
                </div>
              </div>

Подскажите плз - как сделать так, чтобы по достижении элементов с классом grids__card количества 18 шт, 19-ый grids__card скрывался, а в футере появлялась возможность перелистывания страниц с элементами в обе стороны. Такая примерно
введите сюда описание изображения

Ответы

▲ 0

Это очень странное задание... зачем писать код, который ничего не делает. Ну ладно, вот самый просто вариант на CSS. Точно так же можно и на JS делать.

body {
  margin: 0;
}

.wrapper {
  width: 100%;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 1vh;
}

.block {
  border: 1px solid #000;
  box-sizing: border-box;
  width: 24.25vw;
  height: 24.25vh;
  text-align: center;
}

.wrapper:has(.block:nth-child(9)) .block:nth-child(n + 9) {
  display: none;
}

.pagination {
  margin: 10px auto;
  text-align: center;
  display: none;
}

.wrapper:has(.block:nth-child(9))+.pagination {
  display: block;
}
<div class="wrapper">
  <div class="block">1</div>
  <div class="block">2</div>
  <div class="block">3</div>
  <div class="block">4</div>
  <div class="block">5</div>
  <div class="block">6</div>
  <div class="block">7</div>
  <div class="block">8</div>
  <div class="block">9</div>
  <div class="block">10</div>
  <div class="block">11</div>
  <div class="block">12</div>
  <div class="block">13</div>
  <div class="block">14</div>
</div>

<div class="pagination">
  <a href="#">Это ссылка. Она ничего не делает</a>
</div>

Если блоков больше 8 оно будет показывать ссылку пагинации и скрывать другие элементы.

▲ 0

Нашел оптимальное решение, мб кому пригодится:

html:

<main>

  <h1>Pagination with Vanilla JavaScript</h1>
  <ul id="paginated-list" aria-live="polite">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>
    <li>Item 7</li>
    <li>Item 8</li>
    <li>Item 9</li>
    <li>Item 10</li>
    <li>Item 11</li>
    <li>Item 12</li>
    <li>Item 13</li>
    <li>Item 14</li>
    <li>Item 15</li>
    <li>Item 16</li>
    <li>Item 17</li>
    <li>Item 18</li>
    <li>Item 19</li>
    <li>Item 20</li>
    <li>Item 21</li>
    <li>Item 22</li>
    <li>Item 23</li>
    <li>Item 24</li>
    <li>Item 25</li>
    <li>Item 26</li>
    <li>Item 27</li>
    <li>Item 28</li>
    <li>Item 29</li>
    <li>Item 30</li>
  </ul>

  <nav class="pagination-container">

    <div id="pagination-numbers">

    </div>
  </nav>
</main>

<footer>
  Pen by <a href="https://www.jemimaabu.com" target="_blank" rel="noopener">Jemima Abu</a> <span class="heart">&hearts;</span>
</footer>

css:

@import url('https://fonts.googleapis.com/css2?family=Inter&display=swap');

body {
  font-family: 'Inter', sans-serif;
  line-height: 1.7;
  font-size: 1.1rem;
  margin: 0;
  color: #27253d;
  background: #e6f3f8;
}

main {
  position: relative;
  padding: 1rem 1rem 3rem;
  min-height: calc(100vh - 4rem);
}

h1 {
  margin-top: 0;
}

.hidden {
  display: none;
}

.pagination-container {
  width: calc(100% - 2rem);
  display: flex;
  align-items: center;
  position: absolute;
  bottom: 0;
  padding: 1rem 0;
  justify-content: center;
}

.pagination-number,
.pagination-button{
  font-size: 1.1rem;
  background-color: transparent;
  border: none;
  margin: 0.25rem 0.25rem;
  cursor: pointer;
  height: 2.5rem;
  width: 2.5rem;
  border-radius: .2rem;
}

.pagination-number:hover,
.pagination-button:not(.disabled):hover {
  background: #fff;
}

.pagination-number.active {
  color: #fff;
  background: #0085b6;
}

footer {
  padding: 1em;
  text-align: center;
  background-color: #FFDFB9;
}

footer a {
  color: inherit;
  text-decoration: none;
}

footer .heart {
  color: #DC143C;
}

js:

const paginationNumbers = document.getElementById("pagination-numbers");
const paginatedList = document.getElementById("paginated-list");
const listItems = paginatedList.querySelectorAll("li");

const paginationLimit = 10;
const pageCount = Math.ceil(listItems.length / paginationLimit);
let currentPage = 1;

const appendPageNumber = (index) => {
  const pageNumber = document.createElement("button");
  pageNumber.className = "pagination-number";
  pageNumber.innerHTML = index;
  pageNumber.setAttribute("page-index", index);
  pageNumber.setAttribute("aria-label", "Page " + index);

  paginationNumbers.appendChild(pageNumber);
};

const getPaginationNumbers = () => {
  for (let i = 1; i <= pageCount; i++) {
    appendPageNumber(i);
  }
};

const handleActivePageNumber = () => {
  document.querySelectorAll(".pagination-number").forEach((button) => {
    button.classList.remove("active");
    const pageIndex = Number(button.getAttribute("page-index"));
    if (pageIndex == currentPage) {
      button.classList.add("active");
    }
  });
};

const setCurrentPage = (pageNum) => {
  currentPage = pageNum;
  handleActivePageNumber();

  const prevRange = (pageNum - 1) * paginationLimit;
  const currRange = pageNum * paginationLimit;

  listItems.forEach((item, index) => {
    item.classList.add("hidden");
    if (index >= prevRange && index < currRange) {
      item.classList.remove("hidden");
    }
  });
};

window.addEventListener("load", () => {
  getPaginationNumbers();
  setCurrentPage(1);

  document.querySelectorAll(".pagination-number").forEach((button) => {
    const pageIndex = Number(button.getAttribute("page-index"));

    if (pageIndex) {
      button.addEventListener("click", () => {
        setCurrentPage(pageIndex);
      });
    }
  });
});

ссыль - https://codepen.io/tutsplus/pen/qBxQapN