Перейти к содержимому

Как сделать кнопку показать еще js

  • автор:

Кнопка Показать больше/Показать меньше

Сниппет, создающий кнопку, которая раскрывает дополнительный текст на JavaScript.

Пример текста

Как уже неоднократно упомянуто, стремящиеся вытеснить традиционное производство, нанотехнологии освещают чрезвычайно . интересные особенности картины в целом, однако конкретные выводы, разумеется, объединены в целые кластеры себе подобных! Прежде всего, курс на социально-ориентированный национальный проект прекрасно подходит для реализации системы массового участия.

Шаг 1) Добавляем HTML:

 

Как уже неоднократно упомянуто, стремящиеся вытеснить традиционное производство, нанотехнологии освещают чрезвычайно. интересные особенности картины в целом, однако конкретные выводы, разумеется, объединены в целые кластеры себе подобных! Прежде всего, курс на социально-ориентированный национальный проект прекрасно подходит для реализации системы массового участия.

Шаг 2) Добавляем CSS:

 #more

Шаг 3) Добавляем JavaScript:

Кнопка «Показать еще»

Несколько примеров, как сделать AJAX подгрузку записей из базы данных кликом на кнопку «Показать еще».

Первый вариант: отдельный AJAX-обработчик

В тело страницы помещается PHP-скрипт, который выводит только первые три записи из таблицы `prods` и кнопку «Показать еще».

prepare("SELECT * FROM `prods` LIMIT 3"); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); // Кол-во страниц $sth = $dbh->prepare("SELECT COUNT(`id`) FROM `prods`"); $sth->execute(); $total = $sth->fetch(PDO::FETCH_COLUMN); $amt = ceil($total / 3); ?> 
Показать еще

При клике на кнопку отправляется AJAX-запрос на скрипт ajax.php с GET-параметром page=2 (при следующим клике – page=3 и т.д.), скрипт возвращает следующие три записи, далее они вставляются в конец списка товаров методом jquery append() . Когда все записи показаны, кнопка скрывается.

Код ajax.php

prepare("SELECT * FROM `prods` LIMIT , "); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); foreach ($items as $row) < ?>
CSS-стили:
/* Кнопка */ .showmore-bottom < text-align: center; >.showmore-bottom a < padding: 20px 30px; display: inline-block; border: 1px solid #3f2aff; border-radius: 100px; color: #fff; font-weight: 500; font-size: 16px; text-align: center; vertical-align: top; background-color: #3f2aff; text-decoration: none; margin-bottom: 20px; >/* Вывод товаров */ .prod-list < overflow: hidden; margin: 0 0 20px 0; >.prod-item < width: 174px; height: 230px; float: left; border: 1px solid #ddd; padding: 20px; margin: 0 20px 20px 0; text-align: center; border-radius: 6px; >.prod-item-img < width: 100%; >.prod-item-name < font-size: 13px; line-height: 16px; >.prod-list .prod-item:nth-child(3n)
Пример в действии:

Второй вариант: обработчик «Пагинатор»

Во втором примере, AJAX-запрос отправляется сам на себя. Скрипт выводит записи в зависимости от значения переменной $_GET[‘page’] , которое содержит номер страницы (скрипт основан на пагинаторе).

Стоит отметить, что данный пример избавляет от дублирования кода, но работает медленнее, т.к. через AJAX идет полный HTML-код страницы.

prepare("SELECT SQL_CALC_FOUND_ROWS * FROM `prods` LIMIT , "); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); // Узнаем сколько всего записей в БД $sth = $dbh->prepare("SELECT FOUND_ROWS()"); $sth->execute(); $total = $sth->fetch(PDO::FETCH_COLUMN); $amt = ceil($total / $limit); ?> 
Показать еще
Результат:

18.12.2020, обновлено 05.04.2022
Предыдущая запись Отправка sms через «SMS Aero» в PHP
Следующая запись Подгрузка контента при прокрутке (бесконечная лента)

Комментарии 2

26 января 2021 в 21:13

Здравствуйте!Очень благодарен за Ваш пост!Я использую второй вариант Вашего кода. Архитектура моего приложения — MVC, работа с базой данных через ORM RedBeans. Кнопка Показать еще пропадает при полном выводе данных из таблицы.
Но есть вопрос: подгруженные данные приклике не выводятся в виде. Т.е. они выводятся, курсор их видит и при клике на их место происходит переход по их ссылке (в данном случае на страницу карточки товара).Я не сильно какой кодер. Всю голову сломал, но так и не понял причину.Запрос к DB — $products = \R::find(‘product’, «LIMIT $start, $perpage»);Если нетрудно поделитесь соображениями по этому поводу.Спасибо!Виталий.

11 мая 2021 в 10:32
Почему то не работает пример, бесконечная лента прекрасно работает.

Авторизуйтесь, чтобы добавить комментарий.

Другие публикации

Примеры использования PDO MySQL

В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и.

Примеры отправки AJAX JQuery

AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.

После отправки формы сохранить позицию скролла

В больших формах, с несколькими кнопками «Отправить/сохранить» есть одна проблема – после ее отправки браузер обновит.

Кнопка «Показать ещё» на чистом JavaScript

Кнопка «Показать ещё» обычно применяется, когда у нас очень много контента и его нужно вывести не весь сразу, а постепенно (небольшими порциями). Для этого весь контент разбивается на страницы.

Разбивка контента на страницы, подгрузка страниц выполняется с помощью нажатия на кнопку «Показать ещё»

При этом сначала отображается только первая страница (на этом примере это две карточки) и кнопка «Загрузить ещё» . Если пользователь хочет посмотреть ещё записи ( следующую страницу ), то он просто нажимает на кнопку .

Это похоже на постраничную навигацию, но только предыдущие записи остаются на месте, а новые добавляются после них . При этом обычно это на сайте реализуется с использованием AJAX, то есть без перезагрузки страницы.

Шаг 1. Написание backend-кода на PHP

Перед тем как перейти к разработке frontend-кода, необходимо сначала написать серверный сценарий, который будет обрабатывать наш запрос и возвращать ответ в формате JSON. Можно конечно и в формате HTML, но это уже будет очень простой случай, который в рамках этой статьи рассматривать не будем.

Серверный сценарий напишем, например, на PHP. Кроме этого, не забываем, чтобы он работал необходимо установить веб-сервер с поддержкой PHP на локальную машину.

Для написания кода на PHP создадим файл, например, с именем more.php в корне сайта.

Создание PHP-файла в текстовом редакторе Visual Studio Code

Данные в этом примере будем получать для простоты из подготовленного массива, а не из базы данных:

$items = [ [ 'title' => '. ', 'img' => '1.png', ], [ 'title' => '. ', 'img' => '2.png', ], // . ];

Количество записей на одной странице будем определять с помощью константы LIMIT :

const LIMIT = 2;

Сейчас у нас одна страница будет состоять из 2 записей. Всего записей (элементов в массиве) узнаем с помощью функции count :

$total = count($articles);

Номер страницы ( page ) будем передавать серверу через POST. В скрипте на PHP для получения этого значения воспользуемся глобальной переменной $_POST[‘page’] :

$page = (int)($_POST['page'] ?? 1);

Дополнительно на странице клиента будем отображать кроме самих данных ещё их оставшееся количество. Вычисление оставшегося количества записей будем выполнять следующим образом:

$remain = $total - $page * LIMIT;

Сами отдаваемые данные будем получать как срез массива с помощью array_slice :

$data = array_slice($items, ($page - 1) * LIMIT, LIMIT);

Кроме этого, клиенту будем передавать шаблон, который затем с помощью JavaScript будем использовать для генерации HTML-кода карточки:

$template =  {{title}}
{{title}}
HTML;

Возвращать ответ будем в формате JSON. Для этого перед отправкой данных установим соответствующий заголовок:

header('Content-Type: application/json');

Отправлять клиенту будем следующий массив данных, который используя функцию json_encode переведём в JSON:

echo json_encode([ 'total' => $total, 'page' => $page, 'remain' => $remain, 'template' => $template, 'data' => $data, ]);

Теперь давайте проверим, что выведет полученный PHP-файл, сохранённый в корне сайта под именем more.php . Для этого откроем браузер и в адресной строке введем путь к нему (в данном случае: http://localhost/more.php ):

Ответ

В окне браузера мы видим JSON-код, то есть результат выполнения файла more.php на сервере.

Шаг 2. Создание HTML-кода

Теперь, после того как серверный код работает, создадим HTML-страничку index.html :

Создание HTML-страницы в текстовом редакторе Visual Studio Code

Все элементы, связанные с кнопкой «Показать ещё» обернём в .cards :

Начнем написание HTML-кода с разметки контейнера для карточек. Добавлять карточки в контейнер будем с помощью JavaScript, поэтому этот элемент у нас будет пустым:

Кроме кнопки у нас ёще будет блок .cards-progress , в котором расположим прогресс-бар и текстовую информацию о количестве показанных карточек:

Ну и сама кнопка:

 

У кнопки имеется атрибут data-page , который будем использования для хранения количества показанных страниц.

Кнопка у нас имеет svg-иконку, которую создали посредством . При этом сама она определена в с использованием , который вставили сразу после открывающего тега :

Шаг 3. Стилизация карточек и кнопки

Создавать CSS-код будем в отдельном файле main.css, который расположим рядом с index.html . Подключение main.css к index.html выполним с помощью :

Вёрстку контейнера ( .card-container ), в который мы будем добавлять карточки, выполним через флексы:

/* Контейнер для карточек */ .card-container { display: flex; flex-wrap: wrap; gap: 1rem; }

Расстояние между карточками зададим с помощью CSS-свойство gap .

Стилизация карточки товара

Карточка товара ( .card ) у нас будет состоять из изображения ( .card-img ) и заголовка ( .card-title ). Для оформления самой карточки и её элементов будем использовать следующие стили:

/* Карточка товара */ .card { flex: 1 0 150px; border-radius: 0.5rem; box-shadow: 0 0.125rem 0.25rem rgb(0 0 0 / 8%); text-align: center; padding: 1rem; } .card-img { display: block; max-width: 100%; height: auto; } 

Стили для кнопки:

.btn-more { display: flex; color: #212529; font-size: 1rem; line-height: 1.5; background-color: #f5f5f5; font-family: inherit; border-radius: 0.25rem; border: 0 solid #f5f5f5; cursor: pointer; align-items: center; transition: filter .15s ease-in-out; padding: 0.375rem 0.75rem; gap: 0.25rem; margin-left: auto; margin-right: auto; } .btn-more:disabled { opacity: .65; color: #212529; background-color: #eee; } .icon { display: block; width: 1rem; height: 1rem; fill: currentcolor; } .btn-more-loading .icon { animation: 0.75s linear infinite rotate; } @keyframes rotate { to { transform: rotate(360deg); } }

При нажатии на кнопку она будет переводиться в неактивное состояние ( disabled ). Кроме этого, к ней будет добавляться с помощью JavaScript класс btn-more-loading , который будет активировать CSS-анимацию, и иконка в кнопке будет непрерывно вращаться.

Стили для кнопки «Показать ещё» и прогресс-бара

Стилизацию прогресс-бара и дополнительной информации, расположенного рядом с ним, выполним следующим образом:

.cards-progress { max-width: 150px; align-items: center; display: flex; gap: 0.5rem; margin: 1rem auto 0.5rem; font-size: 0.75rem; color: rgba(33, 37, 41, 0.75); } .progress { flex: 1 0 100px; display: flex; height: 0.25rem; overflow: hidden; background-color: #e9ecef; } .progress-bar { background-color: #3f51b5; transition: width 0.3s ease; }

Прогресс-бар – это очень полезный элемент, который позволяет увидеть пользователям количество показанных и оставшихся карточек. Кроме этого, с помощью него они могут оценить, насколько большим является список и сколько времени им потребуется для просмотра всех элементов.

Вся разметка, связанная с кнопкой «Показать ещё» у нас находятся в корневом элементе .card . Его стилизацию в рамках этого примера выполним так:

.cards { max-width: 400px; margin: 1rem auto; }

То есть ограничим его ширине и выровняем по центру, а также добавим внешние отступы сверху и снизу.

Для скрытия элементов мы будем использовать класс d-none :

/* Класс для скрытия элемента */ .d-none { display: none; }

В этом примере у нас он используется для скрытия кнопки «Показать ещё», когда все карточки уже отображены и загружать уже больше нечего. Добавляется он в этом случае к элементу с помощью JavaScript. Кроме этого, d-none используется ещё в HTML-коде для скрытия .

Шаг 4. Добавление функциональности к кнопке с помощью JavaScript

Всю функциональность, связанную с кнопкой на странице, будем выполнять с помощью JavaScript, который напишем без использования каких-либо библиотек. Для этого создадим файл main.js и подключим его к нашей HTML-странице:

Начнём создания JavaScript с выборки кнопки:

JavaScript

const btnMoreElem = document.querySelector('.btn-more');

Теперь напишем асинхронную функцию, которая будет выполняться при нажатии на кнопку, то есть она у нас будет использоваться в качестве обработчика события click :

JavaScript

const loadMoreCards = async (e) => { try { // получим элемент, на котором произошло событие, в данном случае кнопку const targetElem = e.target; // получим корневой элемент, в котором располагаются вся разметка, связанная с карточками и кнопкой const cardsElem = targetElem.closest('.cards'); // сделаем кнопку неактивной targetElem.disabled = true; // добавим к кнопке класс btn-more-loading, который добавляет анимацию вращения для иконки targetElem.classList.add('btn-more-loading'); // создадим новый объект класса FormData const body = new FormData(); // добавим в body номер текущей страницы body.append('page', targetElem.dataset.page); // получим ответ от сервера const response = await fetch('more.php', {method: 'POST', body}); // выполняем действия указанные в if, если ответ от сервера успешный if (response.ok) { // читаем ответ от сервера как JSON и преобразовываем его в объект JavaScript const result = await response.json(); // выполняем код анонимной функции, переданной в качестве аргумента методу setTimeout, через 500мс window.setTimeout(() => { // скрываем кнопку загрузки, если все карточки показаны result.remain { let html = result.template; Object.keys(item).forEach((field) => { html = html.replaceAll(`{{${field}}}`, item[field]); }) return html; }); // устанавливаем в качестве содержимого элемента .cards-count количество показанных карточек cardsElem.querySelector('.cards-count').textContent = result.total - result.remain; // устанавливаем в качестве содержимого элемента .cards-total общее количество карточек cardsElem.querySelector('.cards-total').textContent = result.total; // обновляем ширину прогресс-бара, отвечающего за количество показанных карточек cardsElem.querySelector('.progress-bar').style.width = `${(result.total - result.remain) / result.total * 100}%`; // вставляем карточки в контейнер document.querySelector('.card-container').insertAdjacentHTML('beforeend', cards.join('')); // удаляем анимацию иконки, с помощью удаления класса btn-more-loading targetElem.classList.remove('btn-more-loading'); // делаем кнопку доступной для нажатия targetElem.disabled = false; }, 500); } } catch (error) { console.error(error); } }

Этот код выполняет в следующем порядке вот эти действия:

Теперь созданную функцию loadMoreCards укажем в качестве обработчика события click :

btnMoreElem.addEventListener('click', loadMoreCards);

Формирование первой страницы будем выполнять на клиенте с помощью JavaScript. Для этого просто программным способом кликнем по кнопке «Загрузить ещё»:

btnMoreElem.click();

Скриншот, на котором приведён ответ сервера при нажатии на кнопку:

Ответ сервера, который мы получаем, когда нажимаем на кнопку «Показать ещё»

Заключение

Закончили! Мы успешно создали кнопку «Показать еще» на веб-странице:

Как сделать кнопку «Показать еще» в таблице

Часто интернет магазины публикуют на своем сайте таблицы с описанием товара, его комплектацией и ценой. И бывает так, что такие таблицы занимают очень много места, а если таблица не одна, то такая страница превращается в очень длинный список, который становится не удобно просматривать в поиске нужного материала.

На помощь в этом случае приходят раскрывающиеся таблицы, которые сначала показывают только часть информации, а для просмотра всего содержимого, ее можно развернуть, например нажав на кнопку «Показать еще», что положительно сказывается на читаемости такой страницы.
Ниже вы найдете подробную инструкцию, как сделать кнопку «Показать еще» в таблице и как сделать так, чтобы такую кнопку можно было указать для нескольких таблиц.
Для работы будем использовать HTML, CSS, JS(JQuery).
Первым делом нужно сделать каркас такой таблицы, чтобы все правильно работало.

Не будем здесь рассматривать создание самой таблицы и оформление ее внешнего вида, перейдем сразу к функционалу такой таблицы, так как этот код лишь дополнение к уже готовой таблице, а не ее создание с нуля.

HTML код таблицы

Оформим нашу таблицу в тег div и при необходимости дадим ему какой-нибудь класс. Это нужно больше для визуального оформления таблицы, чем для ее функционала.

  
..
Показать еще

Если говорить о функционале, то для того чтобы сделать кнопку «Показать еще», такая таблица должна иметь два блока с тегом tbody . Первый блок будет отображать таблицу в сокращенном варианте, а содержимое второго блока будет разворачиваться при нажатии на кнопку «Показать еще».
Второму блоку tbody нужно присвоить класс и идентификатор, чтобы потом с ними работать в скрипте. В нашем примере, это класс hideblock и идентификатор tab1 .

Далее нашей таблице нужна сама кнопка «Показать еще», с помощью которой мы будем разворачивать скрытую часть таблицы. В примере мы ее поместили внутри элемента tfoot нашей таблицы.
Кнопке также нужно дать какой то класс, например table-button , чтобы сделать ей внешнее оформление.
Также внутри тега td нашей кнопки мы разместим тег span и присвоим ему некий класс и атрибут data-tab , это нужно для работы нашего скрипта.
Нужно заметить, что data-tab здесь должен быть такой же, как и id у второго блока tbody нашей таблицы.

Это все, что касается HTML кода, чтобы сделать кнопку «Показать еще» в таблице, далее рассмотрим таблицу стилей таблицы и скрипт для обработки кода.

CSS код таблицы

Из стилей для нашей таблице нужно добавить лишь класс hideblock , который отвечает за скрытую часть таблицы и сделать его не видимым.

 .hideblock

Появляться содержимое этого блока будет по клику на кнопку с помощью скрипта.

JS(jQuery) код таблицы

Разворачиваться таблица будет по нажатии на специальную кнопку с помощью скрипта.
Ниже будет описание данного скрипта, вам нужно будет переделать его под свои классы и идентификаторы, если вы использовали не такие, как в примере.

 jQuery(function() < $(".services_more").click(function() < let if ($("#" + id).hasClass("hideblock")) < $("#" + id).removeClass("hideblock"); $(this).attr("old-data", $(this).html()); $(this).html("Свернуть"); >else < $("#" + id).addClass("hideblock"); $(this).html($(this).attr("old-data")); >>); >); 

При нажатии на кнопку с классом services_more в переменную id записывается значение атрибута data-tab . В котором хранится id тега.
Далее обрабатывается условие, где проверяется наличия класса hideblock у тега в переменной id .
Если класс есть, то он удаляется и в атрибут old-data кнопки добавляется html содержимое тега id , текст на кнопке меняется на «Свернуть»
Если класса нет, то он добавляется к тегу из переменной id и в содержимое html кнопки записывается содержимое атрибута old-data .

Кнопка «Показать ещё» на чистом JavaScript

Кнопка «Показать ещё» обычно применяется, когда у нас очень много контента и его нужно вывести не весь сразу, а постепенно (небольшими порциями). Для этого весь контент разбивается на страницы.

Разбивка контента на страницы, подгрузка страниц выполняется с помощью нажатия на кнопку «Показать ещё»

При этом сначала отображается только первая страница (на этом примере это две карточки) и кнопка «Загрузить ещё» . Если пользователь хочет посмотреть ещё записи ( следующую страницу ), то он просто нажимает на кнопку .

Это похоже на постраничную навигацию, но только предыдущие записи остаются на месте, а новые добавляются после них . При этом обычно это на сайте реализуется с использованием AJAX, то есть без перезагрузки страницы.

Шаг 1. Написание backend-кода на PHP

Перед тем как перейти к разработке frontend-кода, необходимо сначала написать серверный сценарий, который будет обрабатывать наш запрос и возвращать ответ в формате JSON. Можно конечно и в формате HTML, но это уже будет очень простой случай, который в рамках этой статьи рассматривать не будем.

Серверный сценарий напишем, например, на PHP. Кроме этого, не забываем, чтобы он работал необходимо установить веб-сервер с поддержкой PHP на локальную машину.

Для написания кода на PHP создадим файл, например, с именем more.php в корне сайта.

Создание PHP-файла в текстовом редакторе Visual Studio Code

Данные в этом примере будем получать для простоты из подготовленного массива, а не из базы данных:

$items = [ [ 'title' => '. ', 'img' => '1.png', ], [ 'title' => '. ', 'img' => '2.png', ], // . ];

Количество записей на одной странице будем определять с помощью константы LIMIT :

const LIMIT = 2;

Сейчас у нас одна страница будет состоять из 2 записей. Всего записей (элементов в массиве) узнаем с помощью функции count :

$total = count($articles);

Номер страницы ( page ) будем передавать серверу через POST. В скрипте на PHP для получения этого значения воспользуемся глобальной переменной $_POST[‘page’] :

$page = (int)($_POST['page'] ?? 1);

Дополнительно на странице клиента будем отображать кроме самих данных ещё их оставшееся количество. Вычисление оставшегося количества записей будем выполнять следующим образом:

$remain = $total - $page * LIMIT;

Сами отдаваемые данные будем получать как срез массива с помощью array_slice :

$data = array_slice($items, ($page - 1) * LIMIT, LIMIT);

Кроме этого, клиенту будем передавать шаблон, который затем с помощью JavaScript будем использовать для генерации HTML-кода карточки:

$template =  {{title}}
{{title}}
HTML;

Возвращать ответ будем в формате JSON. Для этого перед отправкой данных установим соответствующий заголовок:

header('Content-Type: application/json');

Отправлять клиенту будем следующий массив данных, который используя функцию json_encode переведём в JSON:

echo json_encode([ 'total' => $total, 'page' => $page, 'remain' => $remain, 'template' => $template, 'data' => $data, ]);

Теперь давайте проверим, что выведет полученный PHP-файл, сохранённый в корне сайта под именем more.php . Для этого откроем браузер и в адресной строке введем путь к нему (в данном случае: http://localhost/more.php ):

Ответ

В окне браузера мы видим JSON-код, то есть результат выполнения файла more.php на сервере.

Шаг 2. Создание HTML-кода

Теперь, после того как серверный код работает, создадим HTML-страничку index.html :

Создание HTML-страницы в текстовом редакторе Visual Studio Code

Все элементы, связанные с кнопкой «Показать ещё» обернём в .cards :

Начнем написание HTML-кода с разметки контейнера для карточек. Добавлять карточки в контейнер будем с помощью JavaScript, поэтому этот элемент у нас будет пустым:

Кроме кнопки у нас ёще будет блок .cards-progress , в котором расположим прогресс-бар и текстовую информацию о количестве показанных карточек:

Ну и сама кнопка:

 

У кнопки имеется атрибут data-page , который будем использования для хранения количества показанных страниц.

Кнопка у нас имеет svg-иконку, которую создали посредством . При этом сама она определена в с использованием , который вставили сразу после открывающего тега :

Шаг 3. Стилизация карточек и кнопки

Создавать CSS-код будем в отдельном файле main.css, который расположим рядом с index.html . Подключение main.css к index.html выполним с помощью :

Вёрстку контейнера ( .card-container ), в который мы будем добавлять карточки, выполним через флексы:

/* Контейнер для карточек */ .card-container { display: flex; flex-wrap: wrap; gap: 1rem; }

Расстояние между карточками зададим с помощью CSS-свойство gap .

Стилизация карточки товара

Карточка товара ( .card ) у нас будет состоять из изображения ( .card-img ) и заголовка ( .card-title ). Для оформления самой карточки и её элементов будем использовать следующие стили:

/* Карточка товара */ .card { flex: 1 0 150px; border-radius: 0.5rem; box-shadow: 0 0.125rem 0.25rem rgb(0 0 0 / 8%); text-align: center; padding: 1rem; } .card-img { display: block; max-width: 100%; height: auto; } 

Стили для кнопки:

.btn-more { display: flex; color: #212529; font-size: 1rem; line-height: 1.5; background-color: #f5f5f5; font-family: inherit; border-radius: 0.25rem; border: 0 solid #f5f5f5; cursor: pointer; align-items: center; transition: filter .15s ease-in-out; padding: 0.375rem 0.75rem; gap: 0.25rem; margin-left: auto; margin-right: auto; } .btn-more:disabled { opacity: .65; color: #212529; background-color: #eee; } .icon { display: block; width: 1rem; height: 1rem; fill: currentcolor; } .btn-more-loading .icon { animation: 0.75s linear infinite rotate; } @keyframes rotate { to { transform: rotate(360deg); } }

При нажатии на кнопку она будет переводиться в неактивное состояние ( disabled ). Кроме этого, к ней будет добавляться с помощью JavaScript класс btn-more-loading , который будет активировать CSS-анимацию, и иконка в кнопке будет непрерывно вращаться.

Стили для кнопки «Показать ещё» и прогресс-бара

Стилизацию прогресс-бара и дополнительной информации, расположенного рядом с ним, выполним следующим образом:

.cards-progress { max-width: 150px; align-items: center; display: flex; gap: 0.5rem; margin: 1rem auto 0.5rem; font-size: 0.75rem; color: rgba(33, 37, 41, 0.75); } .progress { flex: 1 0 100px; display: flex; height: 0.25rem; overflow: hidden; background-color: #e9ecef; } .progress-bar { background-color: #3f51b5; transition: width 0.3s ease; }

Прогресс-бар – это очень полезный элемент, который позволяет увидеть пользователям количество показанных и оставшихся карточек. Кроме этого, с помощью него они могут оценить, насколько большим является список и сколько времени им потребуется для просмотра всех элементов.

Вся разметка, связанная с кнопкой «Показать ещё» у нас находятся в корневом элементе .card . Его стилизацию в рамках этого примера выполним так:

.cards { max-width: 400px; margin: 1rem auto; }

То есть ограничим его ширине и выровняем по центру, а также добавим внешние отступы сверху и снизу.

Для скрытия элементов мы будем использовать класс d-none :

/* Класс для скрытия элемента */ .d-none { display: none; }

В этом примере у нас он используется для скрытия кнопки «Показать ещё», когда все карточки уже отображены и загружать уже больше нечего. Добавляется он в этом случае к элементу с помощью JavaScript. Кроме этого, d-none используется ещё в HTML-коде для скрытия .

Шаг 4. Добавление функциональности к кнопке с помощью JavaScript

Всю функциональность, связанную с кнопкой на странице, будем выполнять с помощью JavaScript, который напишем без использования каких-либо библиотек. Для этого создадим файл main.js и подключим его к нашей HTML-странице:

Начнём создания JavaScript с выборки кнопки:

JavaScript

const btnMoreElem = document.querySelector('.btn-more');

Теперь напишем асинхронную функцию, которая будет выполняться при нажатии на кнопку, то есть она у нас будет использоваться в качестве обработчика события click :

JavaScript

const loadMoreCards = async (e) => { try { // получим элемент, на котором произошло событие, в данном случае кнопку const targetElem = e.target; // получим корневой элемент, в котором располагаются вся разметка, связанная с карточками и кнопкой const cardsElem = targetElem.closest('.cards'); // сделаем кнопку неактивной targetElem.disabled = true; // добавим к кнопке класс btn-more-loading, который добавляет анимацию вращения для иконки targetElem.classList.add('btn-more-loading'); // создадим новый объект класса FormData const body = new FormData(); // добавим в body номер текущей страницы body.append('page', targetElem.dataset.page); // получим ответ от сервера const response = await fetch('more.php', {method: 'POST', body}); // выполняем действия указанные в if, если ответ от сервера успешный if (response.ok) { // читаем ответ от сервера как JSON и преобразовываем его в объект JavaScript const result = await response.json(); // выполняем код анонимной функции, переданной в качестве аргумента методу setTimeout, через 500мс window.setTimeout(() => { // скрываем кнопку загрузки, если все карточки показаны result.remain { let html = result.template; Object.keys(item).forEach((field) => { html = html.replaceAll(`{{${field}}}`, item[field]); }) return html; }); // устанавливаем в качестве содержимого элемента .cards-count количество показанных карточек cardsElem.querySelector('.cards-count').textContent = result.total - result.remain; // устанавливаем в качестве содержимого элемента .cards-total общее количество карточек cardsElem.querySelector('.cards-total').textContent = result.total; // обновляем ширину прогресс-бара, отвечающего за количество показанных карточек cardsElem.querySelector('.progress-bar').style.width = `${(result.total - result.remain) / result.total * 100}%`; // вставляем карточки в контейнер document.querySelector('.card-container').insertAdjacentHTML('beforeend', cards.join('')); // удаляем анимацию иконки, с помощью удаления класса btn-more-loading targetElem.classList.remove('btn-more-loading'); // делаем кнопку доступной для нажатия targetElem.disabled = false; }, 500); } } catch (error) { console.error(error); } }

Этот код выполняет в следующем порядке вот эти действия:

Теперь созданную функцию loadMoreCards укажем в качестве обработчика события click :

btnMoreElem.addEventListener('click', loadMoreCards);

Формирование первой страницы будем выполнять на клиенте с помощью JavaScript. Для этого просто программным способом кликнем по кнопке «Загрузить ещё»:

btnMoreElem.click();

Скриншот, на котором приведён ответ сервера при нажатии на кнопку:

Ответ сервера, который мы получаем, когда нажимаем на кнопку «Показать ещё»

Заключение

Закончили! Мы успешно создали кнопку «Показать еще» на веб-странице:

Кнопка Показать больше/Показать меньше

Сниппет, создающий кнопку, которая раскрывает дополнительный текст на JavaScript.

Пример текста

Как уже неоднократно упомянуто, стремящиеся вытеснить традиционное производство, нанотехнологии освещают чрезвычайно . интересные особенности картины в целом, однако конкретные выводы, разумеется, объединены в целые кластеры себе подобных! Прежде всего, курс на социально-ориентированный национальный проект прекрасно подходит для реализации системы массового участия.

Шаг 1) Добавляем HTML:

 

Как уже неоднократно упомянуто, стремящиеся вытеснить традиционное производство, нанотехнологии освещают чрезвычайно. интересные особенности картины в целом, однако конкретные выводы, разумеется, объединены в целые кластеры себе подобных! Прежде всего, курс на социально-ориентированный национальный проект прекрасно подходит для реализации системы массового участия.

Шаг 2) Добавляем CSS:

 #more

Шаг 3) Добавляем JavaScript:

Как сделать кнопку «показать еще»?

В исходном коде список всех фильмов. При нажатии на кнопку «показать еще» появляются по 4 фильма. Это важно, потому что надо не подгружать страницы, а именно разбить длинный список контента.

Ответил: hent4ib

у webrambo был скрипт
http://webrambo.ru/101-ajax-podgruzka-novostey-dle.html

2 комментария

Похожие вопросы

Как организовать список серий на сайте в выпадающем списке

13.10.2011 Romario Общие вопросы по вёрстке, Модули, Хаки

Реализация всплывающих подсказок с выводом контента в dle

01.10.2012 Prowockator Общие вопросы по вёрстке

Вкладка при нажатии на кнопку

21.12.2012 jarrro Общие вопросы по вёрстке, Шаблоны (TPL), Стили (CSS)

При нажатии на кнопку «добавить комментарий» страница поднимается вверх

29.01.2014 serg91100 Общие вопросы по вёрстке, Хаки, Ламерские вопросы

Как сделать кнопку добавить отзыв?

10.09.2014 skinny Общие вопросы, Общие вопросы по вёрстке, Стили (CSS)

Как добавить два изображения по бокам от «контента» сайта?

01.12.2015 fops88 Общие вопросы по вёрстке

Как сверстать шаблон вывода контента, 2 блока по бокам и один между ними?

15.10.2016 baseroad Общие вопросы по вёрстке, Шаблоны (TPL)

Как сделать, чтобы при выборе «область А» из доп. полей, подгружался другой список при доб. новости?

04.03.2017 lissp Общие вопросы, Общие вопросы по вёрстке, Шаблоны (TPL)

Как сделать поочередное появление полей при добавлении новости?

14.03.2017 Stasiq Общие вопросы по вёрстке

Как выполнять одновременно 2 действия при нажатии на кнопку?

17.03.2018 Railway_Academy Общие вопросы по вёрстке
Последние события
raimikmb | Плагин для сброса FastCGI кеша 3

Фото raimikmb

raimikmb
Плагин для сброса FastCGI кеша
Сегодня, 17:34

Так понимаю в данном варианте должен сбрасываться весь кеш а не конкретной статьи ? Есть еще такое решение в конфиге nginx добавить:

location ~ /purge(/.*) { fastcgi_cache_purge phpcache "$scheme$request_method$host$1"; > 

таком случае можно сбросить кеш нужной статьи если пройти по ссылке site.ru/kategorija/purge/3434-ststja.html

Вот только как прикрутить данный вариант если добавляются комментарии, редактируется статья .

raimikmb | Плагин для сброса FastCGI кеша 3

Фото raimikmb

raimikmb
Плагин для сброса FastCGI кеша
Сегодня, 17:16

По логике должен срабатывать сброс если редактировать статью в Ajax окне. Но получаю ошибку:

2024/01/08 17:02:34 [error] 8109#8109: *145 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to undefined function clear_fastcgi_cache() in /home/admin/web/www/public_html/engine/cache/system/plugins/51d2d836d1b2ddf58b46871f190ca471.php:1955 Stack trace: #0 /home/admin/web/www/public_html/engine/ajax/controller.php(195): include_once() #1 {main> thrown in /home/admin/web/www/public_html/engine/cache/system/plugins/51d2d836d1b2ddf58b46871f190ca471.php on line 1955" while reading response header from upstream, client: xx.xx.xx.xx, server: www, request: "POST /engine/ajax/controller.php?mod=editnews HTTP/2.0", upstream: "fastcgi://unix:/var/run/php-www.sock:", host: "www", referrer: "statja.html"

New-dev.ru | Модуль по серийного вывода серий 2

Фото New-dev.ru

New-dev.ru
Модуль по серийного вывода серий
Сегодня, 14:15
Mundo | Доп. поле с выбором вариантов методом Dr . 2
Mundo
Доп. поле с выбором вариантов методом Drag’n’Drop
6-01-2024, 18:34

Создание нового уникального дополнительного поля с названием — Выбор из вариантов.

При создании поля в админпанели добавить возможность создания «Сущности» в неограниченном количестве. Каждая новая созданная «Сущность» это — Загруженое изображение (иконка) + Значение поля.

Дополнительное поле должно поддерживать мультивыбор.

Заполнение данного доп. поля в новости осуществляется методом перетаскивание предварительно созданных для этого доп. поля «Сущностей» методом Drag’n’Drop.

После заполнения доп. поля и сохранения новости информация записывается в базу данных в той же последовательности в которой доп. поле было заполнено. Разделителем для значений выступает запятая «,»

Возможно будет необходимо реализовать совместимость с плагином LAZYDEV DLE xField Tab PRO – группирование дополнительных полей по вкладкам. В случае если это потребуется.

Mundo | Доп. поле с выбором вариантов методом Dr . 2
Mundo
Доп. поле с выбором вариантов методом Drag’n’Drop
6-01-2024, 17:40

Кто может реализовать данный функционал, прошу выйти на связь в комментариях или ПМ, готов достойно заплатить. Помимо этой работы есть еще много другой.

Mundo | Как реализовать метод Drag’n’Drop в доп. . 2
Mundo
Как реализовать метод Drag’n’Drop в доп. полях DLE? Кто возьмётся?
6-01-2024, 15:24

Скорее всего не поняли. Нужно создать новый тип дополнительного поля, заполнение которого будет осуществляться методом драг ен дроп, с предварительно загруженными вариантами ответов (вместо текста иконки или картинки) и возможностью запоминать последовательность выбора.

Как пример в Dle уже есть подобный функционал доп поле тип — список есть хак от лайзидева который добавляет множественный выбор к этому полю. Проблема в том, что варианты ответов списка можно добавлять в виде текста, в моем случае вариантов может быть около 40, потому удобнее былобы сделать это визуально иконками/картинками а ещё лучше сохранить возможность запоминать последовательность выбора.

lutskboy | Как реализовать метод Drag’n’Drop в доп. . 2

Фото lutskboy

lutskboy
Как реализовать метод Drag’n’Drop в доп. полях DLE? Кто возьмётся?
5-01-2024, 20:57
может лучше использовать тип галерея? там массово можно загружать. либо я не понял сути вопроса
TeraMoune | Как сделать редирект с несуществующих ст . 1

Фото TeraMoune

TeraMoune
Как сделать редирект с несуществующих страниц пагинации на правильные и существующие?
5-01-2024, 01:50

Этот не редиректит с несуществующей /категория/12/ на /категория/5/

Так и не должно ведь. Оно работает с страницами page
TeraMoune | Launcher 2

Фото TeraMoune

TeraMoune
Launcher
4-01-2024, 20:19
Для просмотра содержимого спойлера, перейдите к выбранному событию.

Суть такая как и в wordpress и других устройствах где есть концепция системы плагинов. Везде есть какая-то возможность установки приложений. У системы android это расширение google play, у wordpress это раздел в административной панели cms.

Этот модуль имеет такую же суть, он позволит установить\обновить плагины, узнать о изменениях и тд не покидая своего сайта (раздела администратора) однако надо зарегистрироваться на сайте (домене сервера на котором хостится мой сайт) ссылка на регу будет на странице авторизации в админке (гостевых доступов нету). Но на данный момент я пока не занимаюсь всем этим и это пока в неопределённом состоянии.

P.S. А вот какие плагины и для чего это уже сами выясняйте, я описывать их все тут не стану. Их описание есть конкретно там, и описание, и документация или какая-то инфа и скриншоты, и видео если где-то есть.

Кнопка «Показать еще»

Несколько примеров, как сделать AJAX подгрузку записей из базы данных кликом на кнопку «Показать еще».

Первый вариант: отдельный AJAX-обработчик

В тело страницы помещается PHP-скрипт, который выводит только первые три записи из таблицы `prods` и кнопку «Показать еще».

prepare("SELECT * FROM `prods` LIMIT 3"); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); // Кол-во страниц $sth = $dbh->prepare("SELECT COUNT(`id`) FROM `prods`"); $sth->execute(); $total = $sth->fetch(PDO::FETCH_COLUMN); $amt = ceil($total / 3); ?> 
Показать еще

При клике на кнопку отправляется AJAX-запрос на скрипт ajax.php с GET-параметром page=2 (при следующим клике – page=3 и т.д.), скрипт возвращает следующие три записи, далее они вставляются в конец списка товаров методом jquery append() . Когда все записи показаны, кнопка скрывается.

Код ajax.php

prepare("SELECT * FROM `prods` LIMIT , "); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); foreach ($items as $row) < ?>
CSS-стили:
/* Кнопка */ .showmore-bottom < text-align: center; >.showmore-bottom a < padding: 20px 30px; display: inline-block; border: 1px solid #3f2aff; border-radius: 100px; color: #fff; font-weight: 500; font-size: 16px; text-align: center; vertical-align: top; background-color: #3f2aff; text-decoration: none; margin-bottom: 20px; >/* Вывод товаров */ .prod-list < overflow: hidden; margin: 0 0 20px 0; >.prod-item < width: 174px; height: 230px; float: left; border: 1px solid #ddd; padding: 20px; margin: 0 20px 20px 0; text-align: center; border-radius: 6px; >.prod-item-img < width: 100%; >.prod-item-name < font-size: 13px; line-height: 16px; >.prod-list .prod-item:nth-child(3n)
Пример в действии:

Второй вариант: обработчик «Пагинатор»

Во втором примере, AJAX-запрос отправляется сам на себя. Скрипт выводит записи в зависимости от значения переменной $_GET[‘page’] , которое содержит номер страницы (скрипт основан на пагинаторе).

Стоит отметить, что данный пример избавляет от дублирования кода, но работает медленнее, т.к. через AJAX идет полный HTML-код страницы.

prepare("SELECT SQL_CALC_FOUND_ROWS * FROM `prods` LIMIT , "); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); // Узнаем сколько всего записей в БД $sth = $dbh->prepare("SELECT FOUND_ROWS()"); $sth->execute(); $total = $sth->fetch(PDO::FETCH_COLUMN); $amt = ceil($total / $limit); ?> 
Показать еще
Результат:

18.12.2020, обновлено 05.04.2022
Предыдущая запись Отправка sms через «SMS Aero» в PHP
Следующая запись Подгрузка контента при прокрутке (бесконечная лента)

Комментарии 2

26 января 2021 в 21:13

Здравствуйте!Очень благодарен за Ваш пост!Я использую второй вариант Вашего кода. Архитектура моего приложения — MVC, работа с базой данных через ORM RedBeans. Кнопка Показать еще пропадает при полном выводе данных из таблицы.
Но есть вопрос: подгруженные данные приклике не выводятся в виде. Т.е. они выводятся, курсор их видит и при клике на их место происходит переход по их ссылке (в данном случае на страницу карточки товара).Я не сильно какой кодер. Всю голову сломал, но так и не понял причину.Запрос к DB — $products = \R::find(‘product’, «LIMIT $start, $perpage»);Если нетрудно поделитесь соображениями по этому поводу.Спасибо!Виталий.

11 мая 2021 в 10:32
Почему то не работает пример, бесконечная лента прекрасно работает.

Авторизуйтесь, чтобы добавить комментарий.

Другие публикации

Примеры использования PDO MySQL

В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и.

Примеры отправки AJAX JQuery

AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.

После отправки формы сохранить позицию скролла

В больших формах, с несколькими кнопками «Отправить/сохранить» есть одна проблема – после ее отправки браузер обновит.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *