Initial version

This commit is contained in:
2018-01-17 14:09:34 -05:00
commit fa05241a63
52 changed files with 7254 additions and 0 deletions

View File

@@ -0,0 +1,207 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="../reset.css" rel="stylesheet"/>
<link href="./style.css" rel="stylesheet"/>
<title>MixItUp Pagination Demo - Infinite Scroll</title>
<!--
NB: This grid's responsive behavior has been limited to 2 or 4 columns for
simplicity, but could easily be combined with the responsive pagination demo
to load in a dynamic amount of items while scrolling, as per the current
column count.
-->
</head>
<body>
<div class="controls">
<button type="button" class="control" data-filter="all">All</button>
<button type="button" class="control" data-filter=".green">Green</button>
<button type="button" class="control" data-filter=".blue">Blue</button>
<button type="button" class="control" data-filter=".pink">Pink</button>
<button type="button" class="control" data-filter="none">None</button>
<button type="button" class="control" data-sort="default:asc">Asc</button>
<button type="button" class="control" data-sort="default:desc">Desc</button>
</div>
<div class="container">
<div class="mix green"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="mix green"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="mix green"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="mix green"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="mix green"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix green"></div>
<div class="mix blue"></div>
<div class="mix pink"></div>
<div class="mix blue"></div>
<div class="gap"></div>
<div class="gap"></div>
<div class="gap"></div>
</div>
<script src="../mixitup.min.js"></script>
<script src="../../dist/mixitup-pagination.js"></script>
<script>
var containerEl = document.querySelector('.container');
var loadMoreEl = document.querySelector('.load-more');
var currentLimit = 16;
var incrementAmount = 4;
var canLoadMore = true;
var scrollThreshold = 50;
/**
* A generic throttle function to prevent UI thrashing
* on scroll.
*
* @param {function} fn
* @param {number} interval
* @return {function}
*/
function throttle(fn, interval) {
var timeoutId = -1;
var last = -1;
return function() {
var self = this;
var args = arguments;
var now = Date.now();
var difference = last ? now - last : Infinity;
var later = function() {
last = now;
fn.apply(self, args);
};
if (!last || difference >= interval) {
later();
} else {
clearTimeout(timeoutId);
timeoutId = setTimeout(later, interval - difference);
}
};
}
/**
* Checks if we are within the scroll threshold on each
* scroll event, and if so, increments the page limit.
*
* @return {void}
*/
function handleScroll() {
if (mixer.isMixing() || !canLoadMore) return;
var scrollTop = window.scrollY || window.pageYOffset || document.documentElement.scrollTop;
var offset = scrollTop + window.innerHeight;
var containerHeight = containerEl.offsetHeight;
if (offset >= containerHeight - scrollThreshold) {
incrementPageLimit();
}
}
/**
* Shows a set number of new targets at the bottom of
* the page by incrementing the page limit.
*
* @return {void}
*/
function incrementPageLimit() {
currentLimit += incrementAmount;
mixer.paginate({limit: currentLimit});
}
/**
* Check whether the current matching collection of target
* elements has additional hidden elements, and set the
* `canLoadMore` flag accordingly.
*
* @param {mixitup.State} state
* @return {void}
*/
function handleMixEnd(state) {
// At the end of each operation, we must check whether the current
// matching collection of target elements has additional hidden
// elements, and set the `canLoadMore` flag accordingly.
if (state.activePagination.limit + incrementAmount >= state.totalMatching) {
canLoadMore = false;
} else {
canLoadMore = true;
}
setTimeout(handleScroll, 10);
}
// Instantiate mixitup
var mixer = mixitup(containerEl, {
pagination: {
limit: currentLimit
},
callbacks: {
onMixEnd: handleMixEnd
}
});
// Attach a throttled scroll handler to the scroll event. Will fire
// up to a maximum of once every 50ms.
window.addEventListener('scroll', throttle(handleScroll, 50));
</script>
</body>
</html>

View File

@@ -0,0 +1,170 @@
html,
body {
height: 100%;
background: #f2f2f2;
}
*,
*:before,
*:after {
box-sizing: border-box;
}
/* Controls
---------------------------------------------------------------------- */
.controls {
padding: 1rem;
background: #333;
font-size: 0.1px;
}
.control {
position: relative;
display: inline-block;
width: 2.7rem;
height: 2.7rem;
background: #444;
cursor: pointer;
font-size: 0.1px;
color: white;
transition: background 150ms;
}
.control:hover {
background: #3f3f3f;
}
.control[data-filter]:after {
content: '';
position: absolute;
width: 10px;
height: 10px;
top: calc(50% - 6px);
left: calc(50% - 6px);
border: 2px solid currentColor;
border-radius: 2px;
background: currentColor;
transition: background-color 150ms, border-color 150ms;
}
.control[data-sort]:after {
content: '';
position: absolute;
width: 10px;
height: 10px;
border-top: 2px solid;
border-left: 2px solid;
top: calc(50% - 6px);
left: calc(50% - 6px);
transform: translateY(1px) rotate(45deg);
}
.control[data-sort*=":desc"]:after {
transform: translateY(-4px) rotate(-135deg);
}
.mixitup-control-active {
background: #393939;
}
.mixitup-control-active[data-filter]:after {
background: transparent;
}
.control:first-of-type {
border-radius: 3px 0 0 3px;
}
.control:last-of-type {
border-radius: 0 3px 3px 0;
}
.control[data-filter] + .control[data-sort] {
margin-left: .75rem;
}
.control[data-filter=".green"] {
color: #91e6c7;
}
.control[data-filter=".blue"] {
color: #5ecdde;
}
.control[data-filter=".pink"] {
color: #d595aa;
}
.control[data-filter="none"] {
color: #2f2f2f;
}
/* Container
---------------------------------------------------------------------- */
.container {
padding: 1rem;
text-align: justify;
font-size: 0.1px;
}
.container:after {
content: '';
display: inline-block;
width: 100%;
}
/* Target Elements
---------------------------------------------------------------------- */
.mix,
.gap {
display: inline-block;
vertical-align: top;
}
.mix {
background: #fff;
border-top: .5rem solid currentColor;
border-radius: 2px;
margin-bottom: 1rem;
position: relative;
}
.mix:before {
content: '';
display: inline-block;
padding-top: 56.25%;
}
.mix.green {
color: #91e6c7;
}
.mix.pink {
color: #d595aa;
}
.mix.blue {
color: #5ecdde;
}
/* Grid Breakpoints
---------------------------------------------------------------------- */
/* 2 Columns */
.mix,
.gap {
width: calc(100%/2 - (((2 - 1) * 1rem) / 2));
}
/* 4 Columns */
@media screen and (min-width: 961px) {
.mix,
.gap {
width: calc(100%/4 - (((4 - 1) * 1rem) / 4));
}
}