Как программно реализовать перемещение объекта на веб-странице или в приложении в зависимости от движения курсора мыши пользователя?

Как реализовать функционал, при котором блок с контентом, ширина которого превышает ширину экрана, будет сдвигаться влево при наведении курсора мыши на правую четверть экрана и останавливаться при отводе курсора, причём сдвиг должен продолжаться до тех пор, пока не станет видим конец блока? Аналогично, как сделать, чтобы блок сдвигался вправо при наведении курсора на левую четверть экрана? Пример желаемой функциональности доступен по ссылке: https://wanda.net/directors/come-ferre/.
  • 4 декабря 2023 г. 14:00
Ответы на вопрос 2
Чтобы реализовать перемещение объекта на веб-странице в зависимости от движения курсора мыши, вы можете использовать язык программирования JavaScript в сочетании с HTML и CSS. Ниже приведен пример того, как можно реализовать требуемую функциональность с использованием этих технологий.

HTML:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Scroll on Hover</title>
<style>
  .wrapper {
    position: relative;
    overflow: hidden;
    width: 100%;
    height: 300px; /* Пример высоты */
  }

  .scroll-content {
    position: absolute;
    white-space: nowrap;
  }

  /* Пример того, как контент может быть внутри */
  .scroll-element {
    display: inline-block;
    width: 300px; /* Пример ширины элементов */
    background-color: #f0f0f0;
    margin-right: 10px;
  }
</style>
</head>
<body>

<div class="wrapper" id="scrollWrapper">
  <div class="scroll-content" id="scrollContent">
    <!-- Примеры элементов внутри блока -->
    <div class="scroll-element">Элемент 1</div>
    <div class="scroll-element">Элемент 2</div>
    <!-- ... -->
    <div class="scroll-element">Элемент N</div>
  </div>
</div>

<script src="scroll-on-hover.js"></script>
</body>
</html>
```

JavaScript (Файл `scroll-on-hover.js`):
```javascript
document.addEventListener('DOMContentLoaded', function() {
  const wrapper = document.getElementById('scrollWrapper');
  const content = document.getElementById('scrollContent');
  let autoScrollTimer;

  wrapper.addEventListener('mousemove', function(e) {
    // Очистка предыдущего таймера
    clearInterval(autoScrollTimer);

    const wrapperRect = wrapper.getBoundingClientRect();
    const quarterWidth = wrapperRect.width / 4;
    const mouseXRelative = e.clientX - wrapperRect.left;

    let speedFactor = 0; // Скорость прокрутки

    // Правая четверть - скролл влево
    if (mouseXRelative > wrapperRect.width - quarterWidth) {
      speedFactor = (mouseXRelative - (wrapperRect.width - quarterWidth)) / quarterWidth;
    }
    // Левая четверть - скролл вправо
    else if (mouseXRelative < quarterWidth) {
      speedFactor = (mouseXRelative - quarterWidth) / quarterWidth;
    }

    // Функция для анимации прокрутки
    function autoScroll() {
      content.style.left = (parseInt(content.style.left || 0) - speedFactor * 5) + 'px';
      // Ограничение прокрутки влево и вправо
      if(parseInt(content.style.left) > 0) content.style.left = '0px';
      var maxScrollLeft = wrapper.offsetWidth - content.offsetWidth;
      if(parseInt(content.style.left) < maxScrollLeft) content.style.left = maxScrollLeft + 'px';
    }

    if (speedFactor !== 0) {
      autoScrollTimer = setInterval(autoScroll, 20); // Параметры скорости зависят от вашего кейса
    }
  });

  wrapper.addEventListener('mouseleave', function() {
    // Остановка прокрутки при уходе курсора с элемента
    clearInterval(autoScrollTimer);
  });
});
```

В данном коде JavaScript создается обработчик событий `mousemove`, который, в зависимости от положения мыши, запускает или останавливает функцию `autoScroll`. Функция `autoScroll` обновляет свойство `left` абсолютно спозиционированного блока `.scroll-content`, создавая эффект прокрутки.

Когда пользователь перемещает курсор в левую или правую четверть области `.wrapper`, функция `autoScroll` автоматически сдвигает элемент `.scroll-content` в нужном направлении. К
а подсмотреть там? идея простая: слушаем mousemove, если курсор в нужно части от ширины экрана, то добавляем/отнимает translate по x, который естественно где-то храним, как вариант можно не translate, а scrollLeft, если overflow: hidden
Похожие вопросы