native/fake scroll test
by phloe
HTML
<div class="slider">
<div class="track-wrapper">
<div class="track">
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
</div>
</div>
<div class="paging"></div>
</div>
CSS
html {
background-color: lightblue;
}
.slider {
overflow: hidden;
background-color: #fff;
}
.track-wrapper {
-ms-overflow-style: -ms-autohiding-scrollbar;
overflow-x: scroll;
-webkit-overflow-scrolling: touch;
scroll-snap-points-x: repeat(100%);
scroll-snap-type: proximity;
padding-bottom: 100px;
margin-bottom: -100px;
}
.track-wrapper::-webkit-scrollbar {
display: none;
}
.track {
font-size: 0;
white-space: nowrap;
background-color: magenta;
}
.block {
display: inline-block;
white-space: normal;
font-size: 1rem;
width: 25%;
margin: 20px;
min-height: 300px;
background-color: red;
}
.block:nth-child(2) {
background-color: orange;
}
.block:nth-child(3) {
background-color: yellow;
}
.block:nth-child(4) {
background-color: green;
}
.block:nth-child(5) {
background-color: blue;
}
.block:nth-child(6) {
background-color: purple;
}
.paging {
text-align: center;
}
.paging > * {
background-color: #EEE;
border-radius: ;
text-indent: -9999px;
overflow: hidden;
border: 0;
border-radius: 50%;
width: 20px;
height: 20px;
padding: 0;
margin: 10px;
}
.paging > .current {
background-color: orange;
}
JavaScript
var slider = document.querySelector(".slider");
var wrapper = slider.querySelector(".track-wrapper");
var track = slider.querySelector(".track");
var paging = slider.querySelector(".paging");
(function() {
// hide scrollbar in browsers
var div = document.createElement("div");
div.style.position = "absolute";
slider.appendChild(div);
var height = div.offsetHeight;
slider.removeChild(div);
if (height) {
wrapper.style.marginBottom = -(100 + height) + "px";
}
}());
var currentPage;
var width;
var wrapperWidth;
var scrollLeft;
var count;
var isNative = false;
var offset = 0;
var xStart = 0;
slider.addEventListener("touchstart", function() {
isNative = true;
});
slider.addEventListener("touchend", function() {
isNative = false;
});
slider.addEventListener("mousedown", function(e) {
if (!isNative) {
moveStart(e);
}
});
slider.addEventListener("mouseup", function(e) {
moveEnd();
e.stopPropagation();
});
wrapper.addEventListener("scroll", function() {
setPage(wrapper.scrollLeft);
});
window.addEventListener("resize", update);
function updateDimensions () {
width = wrapper.scrollWidth;
wrapperWidth = wrapper.offsetWidth;
scrollLeft = wrapper.scrollLeft;
count = Math.ceil(width / wrapperWidth);
}
function moveStart(e) {
scrollLeft = wrapper.scrollLeft;
xStart = e.pageX;
window.addEventListener("mousemove", moveTrack);
window.addEventListener("mouseup", moveEnd);
}
function moveEnd() {
window.removeEventListener("mousemove", moveTrack);
window.removeEventListener("mouseup", moveEnd);
resetTrack();
}
function moveTrack(e) {
offset = xStart - e.pageX;
setTrack(offset);
}
function setTrack(offset) {
setPage(Math.min(Math.max(scrollLeft + offset, 0), width));
track.style.transform = "translate3d(" + -offset + "px, 0, 0)";
}
function resetTrack() {
track.style.transform = "";
wrapper.scrollLeft += offset;
}
var pageButtons = [];
var button =...