/ Gists / Scrolling on desktop with mouse in overflowed element (JS)
On gists

Scrolling on desktop with mouse in overflowed element (JS)

JavaScript

demo.html Raw #

<!--
https://jsbin.com/bihofirugo/2/edit?html,css,output
-->

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>

	
	
	<div class="container">
    <img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">
		<img src="https://picsum.photos/id/237/200/300" alt="Foto 1">

</div>

<style>
.container {
    white-space: nowrap;
    overflow-x: auto;
    cursor: grab;
    user-select: none; /* Zabrání výběru textu nebo obrázků při tažení */
}

.container img {
    display: inline-block;
    width: 200px;
    height: 150px;
    pointer-events: none; /* Zabrání interakci s obrázky (např. drag-and-drop obrázků) */
}

.container.grabbing {
    cursor: grabbing;
}
</style>

<script>
const container = document.querySelector('.container');
let isDragging = false;
let startX;
let scrollLeft;

container.addEventListener('mousedown', (e) => {
    isDragging = true;
    container.classList.add('grabbing');
    startX = e.pageX - container.offsetLeft;
    scrollLeft = container.scrollLeft;
    e.preventDefault(); // Zabrání výchozímu chování (např. výběr textu)
});

container.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    e.preventDefault(); // Zabrání výchozímu chování při pohybu
    const x = e.pageX - container.offsetLeft;
    const walk = (x - startX) / 0.5; // Rychlost scrollování
    container.scrollLeft = scrollLeft - walk;
});

container.addEventListener('mouseup', () => {
    isDragging = false;
    container.classList.remove('grabbing');
});

container.addEventListener('mouseleave', () => {
    if (isDragging) {
        isDragging = false;
        container.classList.remove('grabbing');
    }
});

// Pro jistotu přidáme globální posluchač na mouseup, aby se tažení ukončilo i mimo kontejner
document.addEventListener('mouseup', () => {
    if (isDragging) {
        isDragging = false;
        container.classList.remove('grabbing');
    }
});
</script>
	
</body>
</html>