JSFiddle - React, Tailwind, and code Playground
by Danny Michaelis
HTML
<div class="container">
<div class="wrap">
<div class="page page1"></div>
<div class="page page2"></div>
<div class="page page3"></div>
<div class="page page4"></div>
</div>
</div>
CSS
.container, .page, .wrap {
width: 300px;
height: 400px;
}
.container {
background: #efefef;
box-shadow: 0px 0px 10px black;
overflow: hidden;
position: relative;
margin: 5px auto;
}
.wrap {
width: 1200px;
position: absolute;
top: 0;
left: 0;
}
.page {
float: left;
display: block;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.page1 {
background: yellow;
}
.page2 {
background: green;
}
.page3 {
background: blue;
}
.page4 {
background: red;
}
JavaScript
var mouseDown = false,
right;
var xi, xf, leftX = 0;
var nPages = $(".page").size();
var pageSize = $(".page").width();
var threshold = pageSize / 2;
var currentPage = 0;
var mouseStart, wrapLeftPosition, mouseMoveDelta, movedRight;
$(".container").mousedown(function (clickEvent) {
mouseStart = clickEvent.pageX;
$(this).on("mousemove", function (moveEvent) {
mouseMoveDelta = moveEvent.pageX - xi;
$(".wrap").css({
left: (leftX + mouseMoveDelta)
});
movedRight = (mouseMoveDelta < 0) ? true : false;
});
}).on('mouseup mouseleave', (function (clickEvent) {
$(this).off('mousemove');
handleEndOfMovement(clickEvent.pageX);
});
function handleEndOfMovement(lastMousePosition) {
wrapLeftPosition = $("wrap").position().left;
mouseMoveDelta = lastMousePosition - mouseStart;
if (mouseMoveDelta < -threshold || mouseMoveDelta > threshold) {
setFocusedPage();
} else {
restore();
}
}
function transitionPageMovement() {
$(".wrap").stop().animate({
"left": -(currentPage * pageSize)
}, 200, function () {
leftX = $("wrap").position().left;
});
}
function restore() {
transitionPageMovement()
}
function setFocusedPage() {
if (leftX >= (-threshold)) { // First Page
currentPage = 0;
} else if (leftX < (-threshold) && leftX >= (-(nPages + 1) * threshold)) { // Second to N-1 Page
(right) ? currentPage++ : currentPage--;
} else if (leftX < -((nPages + 1) * threshold)) { // Third Page
currentPage = nPages - 1;
}
transitionPageMovement();
}