Статьи

6 jQuery Бесконечные Скролл Демо

Бесконечная прокрутка теперь является обычной функцией, и есть несколько случаев, когда она действительно полезна. Например, есть некоторые сайты, на которых мы просто не можем представить себе хорошую систему нумерации страниц, например, Twitter или даже Facebook. Еще один пример того, как бесконечная прокрутка может быть полезна для поисковой системы: вы захотите продолжить просмотр новых ссылок, пока не найдете нужную, а система нумерации страниц может замедлить ваше исследование.

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

Обратите внимание, что, за исключением последнего, все эти демонстрации написаны с использованием jQuery, а в некоторых примерах используются плагины jQuery. Тем не менее, другие примеры могут быть легко адаптированы для ванильного JS без каких-либо проблем.

1. Бесконечная прокрутка и сетки

В этой демонстрации используется плагин jQuery Masonry вместе с плагином Infinite Scroll . Плагин Masonry хорош для получения макетов жидкостной сетки. Плагин Infinite Scroll от Paul Irish хорош для загрузки уже существующих страниц (так что это хорошо для вашего SEO). Вы можете использовать его для загрузки статических страниц, таких как page2.htmlpage3.htmlpage.php?p=2page.php?p=3 Однако, чтобы использовать его, вам нужно иметь номер страницы для увеличения в ваших URL, поэтому, если у вас есть такие страницы, как page.php?data=xxx

Использование — HTML

 <div class="grid">
	<div class="grid-item grid-item-2">
		<p>content</p>
	</div></div>

<!-- The next page which content will be loaded when scrolled -->
<nav id="pagination">
	<p><a href="page-2.html">Page 2</a></p>
</nav>

Использование — jQuery

 $(document).ready(function() {
	var grid = $('.grid');

	grid.masonry({
		itemSelector: '.grid-item',
		columnWidth: 200
	});

	grid.infinitescroll({
		// Pagination element that will be hidden
		navSelector: '#pagination',

		// Next page link
		nextSelector: '#pagination p a',

		// Selector of items to retrieve
		itemSelector: '.grid-item',

		// Loading message
		loadingText: 'Loading new items…'
	},

	// Function called once the elements are retrieved
	function(new_elts) {
		var elts = $(new_elts).css('opacity', 0);

		elts.animate({opacity: 1});
		grid.masonry('appended', elts);
	});
});

2. Бесконечная прокрутка в блогах

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

Обратите внимание, что в демонстрационной версии ниже новые сообщения генерируются функцией JavaScript, поскольку мы не можем использовать PHP-скрипт в CodePen.

Использование — HTML

 <ul id="posts">
	<li>
		<article>content</article>
	</li></ul>

<p id="loading">
	<img src="images/loading.gif" alt="Loading…" />
</p>

Использование — jQuery

 $(document).ready(function() {
	var win = $(window);

	// Each time the user scrolls
	win.scroll(function() {
		// End of the document reached?
		if ($(document).height() - win.height() == win.scrollTop()) {
			$('#loading').show();

			$.ajax({
				url: 'get-post.php',
				dataType: 'html',
				success: function(html) {
					$('#posts').append(html);
					$('#loading').hide();
				}
			});
		}
	});
});

3. Бесконечная прокрутка изображений

Эта демонстрация загружает изображения на бесконечной прокрутке и никогда не достигает конца. Он использует плагин jQuery Endless Scroll, который можно настроить так, чтобы он запускал загрузку x количества пикселей в нижней части экрана. Демонстрация клонирует одни и те же изображения и вставляет их в конец списка и т. Д., Но сценарий можно настроить так, чтобы довольно легко загружать изображения из разных источников.

Использование — HTML

 <ul id="images">
	<li>
		<a href="https://www.pexels.com/photo/mist-misty-fog-foggy-7919/">
			<img src="https://pexels.imgix.net/photos/7919/pexels-photo.jpg?fit=crop&w=640&h=480" alt="" />
		</a>
	</li></ul>

Использование — jQuery

 $(document).ready(function() {
	$(window).endlessScroll({
		inflowPixels: 300,
		callback: function() {
			var $img = $('#images li:nth-last-child(5)').clone();
			$('#images').append($img);
		}
	});
});

4. Бесконечный список чисел

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

Использование — HTML

 <ul id="numbers">
	<li>1</li>
	<li>2</li>
	<li>3</li>
	<li>4</li>
	<li>5</li></ul>

Использование — jQuery

 $(document).ready(function() {
	var offset = $('#numbers li').length;

	$('#numbers').endlessScroll({
		fireOnce: false,
		fireDelay: false,
		loader: '',
		insertAfter: '#numbers li:last',
		content: function(i) {
			return '<li>' + (i + offset) + '</li>';
		}
	});
});

5. Бесконечные таблицы

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

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

Использование — HTML

 <table id="spreadsheet">
	<tr>
		<td></td>
		<th></th></tr>
	<tr>
		<th></th>
		<td></td></tr></table>

Использование — jQuery

 $(document).ready(function() {
	var win = $(window);
	var doc = $(document);

	// Each time the user scrolls
	win.scroll(function() {
		// Vertical end reached?
		if (doc.height() - win.height() == win.scrollTop()) {
			// New row
			var tr = $('<tr />').append($('<th />')).appendTo($('#spreadsheet'));

			// Current number of columns to create
			var n_cols = $('#spreadsheet tr:first-child th').length;
			for (var i = 0; i < n_cols; ++i)
				tr.append($('<td />'));
		}

		// Horizontal end reached?
		if (doc.width() - win.width() == win.scrollLeft()) {
			// New column in the heading row
			$('#spreadsheet tr:first-child').append($('<th />'));

			// New column in each row
			$('#spreadsheet tr:not(:first-child)').each(function() {
				$(this).append($('<td />'));
			});
		}
	});
});

6. Бесконечная прокрутка + нумерация страниц

Против бесконечной прокрутки есть минусы: если она не реализована должным образом, пользовательский интерфейс может быть нарушен. Если вы позволите пользователю загружать бесконечный список, они могут потерять свое место через некоторое время. Это вещь, которая никогда не дополняет традиционную систему нумерации страниц. Однако разбиение на страницы требует от пользователя действий, которые не нужны при бесконечной прокрутке.

Эти два факта дали Тиму Севериену идею: что, если мы объединили бесконечную прокрутку и нумерацию страниц, чтобы воспользоваться преимуществами обоих методов? Результатом является последняя демонстрация.

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

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

Использование — HTML

 <div class="article-list" id="article-list"></div>
<ul class="article-list__pagination article-list__pagination--inactive" id="article-list-pagination"></ul>

Использование — JavaScript

Обратите внимание, что этот код использует ES6, но вы можете легко преобразовать его в ES5.

 function getPageId(n) {
	return 'article-page-' + n;
}

function getDocumentHeight() {
	const body = document.body;
	const html = document.documentElement;
	
	return Math.max(
		body.scrollHeight, body.offsetHeight,
		html.clientHeight, html.scrollHeight, html.offsetHeight
	);
};

function getScrollTop() {
	return (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
}

function getArticleImage() {
	const hash = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
	const image = new Image;
	image.className = 'article-list__item__image article-list__item__image--loading';
	image.src = 'http://api.adorable.io/avatars/250/' + hash;
	
	image.onload = function() {
		image.classList.remove('article-list__item__image--loading');
	};
	
	return image;
}

function getArticle() {
	const articleImage = getArticleImage();
	const article = document.createElement('article');
	article.className = 'article-list__item';
	article.appendChild(articleImage);
	
	return article;
}

function getArticlePage(page, articlesPerPage = 16) {
	const pageElement = document.createElement('div');
	pageElement.id = getPageId(page);
	pageElement.className = 'article-list__page';
	
	while (articlesPerPage--) {
		pageElement.appendChild(getArticle());
	}
	
	return pageElement;
}

function addPaginationPage(page) {
	const pageLink = document.createElement('a');
	pageLink.href = '#' + getPageId(page);
	pageLink.innerHTML = page;
	
	const listItem = document.createElement('li');
	listItem.className = 'article-list__pagination__item';
	listItem.appendChild(pageLink);
	
	articleListPagination.appendChild(listItem);
	
	if (page === 2) {
		articleListPagination.classList.remove('article-list__pagination--inactive');
	}
}

function fetchPage(page) {
	articleList.appendChild(getArticlePage(page));
}

function addPage(page) {
	fetchPage(page);
	addPaginationPage(page);
}

const articleList = document.getElementById('article-list');
const articleListPagination = document.getElementById('article-list-pagination');
let page = 0;

addPage(++page);

window.onscroll = function() {
	if (getScrollTop() < getDocumentHeight() - window.innerHeight) return;
	addPage(++page);
};

Вывод

Мы рассмотрели шесть различных примеров реализации бесконечной прокрутки. Независимо от того, что вы пытаетесь построить, вы должны быть в состоянии использовать один из этих методов для достижения желаемого результата. Как всегда, мы хотели бы услышать ваши мысли: вы создали что-нибудь классное с помощью одного из этих плагинов или техник? У вас есть любимый плагин, который, по вашему мнению, должен был быть упомянут? Дайте нам знать об этом в комментариях!