Как реализовать перемещение по странице с помощью функции перетаскивания?

Как можно реализовать функцию перемещения по странице, аналогичную перемещениям на картах, например, как это сделано на сайте <a href="https://tennessine.co.uk/metro/" rel="nofollow">https://tennessine.co.uk/metro/</a>?
  • 28 сентября 2024 г. 20:23
Ответы на вопрос 2
Реализация функции перетаскивания для перемещения по странице может быть довольно интересной задачей. Вот базовая концепция, как можно это сделать с использованием JavaScript и HTML/CSS.

### Основная идея

1. Создать элемент, который будет представлять ваш контент (например, карту).
2. Обработать события мыши (mousedown, mousemove и mouseup), чтобы реализовать перетаскивание.
3. Изменять положение элемента в зависимости от перемещения мыши.

### Пример реализации

```html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Перетаскивание по странице</title>
    <style>
        body {
            margin: 0;
            overflow: hidden; /* Отключаем прокрутку */
        }
        #map {
            width: 1500px; /* Ширина контента */
            height: 1500px; /* Высота контента */
            background-image: url('your-map-image.jpg'); /* Замените на свою карту */
            background-size: cover;
            position: absolute;
            cursor: grab;
        }
    </style>
</head>
<body>
    <div id="map"></div>

    <script>
        const map = document.getElementById('map');
        let isDragging = false;
        let startX, startY, scrollLeft, scrollTop;

        map.addEventListener('mousedown', (e) => {
            isDragging = true;
            startX = e.pageX - map.offsetLeft;
            startY = e.pageY - map.offsetTop;
            scrollLeft = map.scrollLeft;
            scrollTop = map.scrollTop;
            map.style.cursor = 'grabbing';
        });

        map.addEventListener('mouseleave', () => {
            isDragging = false;
            map.style.cursor = 'grab';
        });

        map.addEventListener('mouseup', () => {
            isDragging = false;
            map.style.cursor = 'grab';
        });

        map.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            e.preventDefault();
            const x = e.pageX - map.offsetLeft;
            const y = e.pageY - map.offsetTop;
            const walkX = x - startX; // Разница по горизонтали
            const walkY = y - startY; // Разница по вертикали
            map.scrollLeft = scrollLeft - walkX; // Перемещение по горизонтали
            map.scrollTop = scrollTop - walkY; // Перемещение по вертикали
        });
    </script>
</body>
</html>
```

### Объяснение кода

- **HTML и CSS:** В данном примере мы создаем большой `div`, который служит как элемент карты. Мы устанавливаем фоновое изображение и размеры этого элемента.
  
- **События мыши:** 
  - `mousedown`: Когда пользователь нажимает кнопку мыши, мы записываем начальные координаты и устанавливаем флаг `isDragging` в `true`, чтобы указать, что идет процесс перетаскивания.
  - `mouseup`: Когда пользователь отпускает кнопку мыши, мы сбрасываем флаг, что означает окончание перетаскивания.
  - `mousemove`: Если идет перетаскивание, мы вычисляем новое положение карты, основываясь на перемещении мыши относительно начальной точки.

- **Стиль курсора:** Мы меняем стиль курсора на "grabbing" во время перетаскивания.

### Важно
- Убедитесь, что изображение карты достаточно большого размера, чтобы его можно было прокручивать.
- Вы можете настроить масштабирование и положение отображаемого контента в зависимости от ваших нужд.

Эта простая реализация может быть расширена и улучшена с учетом дополнительных функций, таких как поддержка сенсорных экранов, ограничения на перемещение карты и т.д.
События ondragstart, на тачскинах событие другое, TouchEvent.
Похожие вопросы