Skip to content

Instantly share code, notes, and snippets.

@graouts
Last active August 30, 2019 13:21
Show Gist options
  • Save graouts/e7390caa34f08549f95a0ae8b3d10a93 to your computer and use it in GitHub Desktop.
Save graouts/e7390caa34f08549f95a0ae8b3d10a93 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>touch-action</title>
<style>
body {
margin: 0;
}
.text {
padding: 1em;
}
.scrollable {
touch-action: pan-y;
width: 100vw;
height: 100vw;
overflow: hidden;
position: relative;
}
.scrollable > div {
position: absolute;
top: 0;
left: 0;
width: 400%;
height: 100%;
}
.scrollable > div > div {
display: inline-block;
width: 100vw;
height: 100vw;
}
</style>
<script>
class Scroller {
constructor(container)
{
this.scroller = container.firstElementChild;
this._currentPointerXTranslation = 0;
this._currentScrollerXTranslation = 0;
this._minScrollerXTranslation = (this.scroller.childElementCount - 1) * -container.getBoundingClientRect().width;
container.addEventListener("pointerdown", this);
}
handleEvent(event)
{
if (!event.isPrimary)
return;
switch (event.type) {
case "pointerdown":
this.begin(event);
break;
case "pointermove":
this.update(event);
break;
case "pointerup":
case "pointercancel":
this.end(event);
break;
}
}
get currentPointerXTranslation()
{
return this._currentPointerXTranslation;
}
set currentPointerXTranslation(x)
{
this._currentScrollerXTranslation = Math.max(this._minScrollerXTranslation, Math.min(x, 0));
this.scroller.style.transform = `translateX(${this._currentScrollerXTranslation}px)`;
this._currentPointerXTranslation = x;
}
begin(event)
{
event.currentTarget.addEventListener("pointermove", this);
event.currentTarget.addEventListener("pointerup", this);
event.currentTarget.addEventListener("pointercancel", this);
this._currentPointerXTranslation = this._currentScrollerXTranslation;
this.previousPointerX = event.pageX;
}
update(event)
{
const pointerX = event.pageX;
this.currentPointerXTranslation += pointerX - this.previousPointerX;
this.previousPointerX = pointerX;
}
end(event)
{
event.currentTarget.removeEventListener("pointermove", this);
event.currentTarget.removeEventListener("pointerup", this);
event.currentTarget.removeEventListener("pointercancel", this);
}
}
window.addEventListener("DOMContentLoaded", () => {
new Scroller(document.querySelector(".scrollable"));
});
</script>
</head>
<body>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
<div class="scrollable">
<div>
<div style="background-color: blue"></div><div style="background-color: green"></div><div style="background-color: yellow"></div><div style="background-color: red"></div>
</div>
</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment