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 =...