Почему иногда при наведении курсора на блок изображение не меняется?

Как исправить эффект задержки при перемещении указателя мыши между блоками на веб-странице?
  • 13 июня 2024 г. 10:31
Ответы на вопрос 2
Причина того, что изображение не меняется при наведении курсора на блок, может быть связана с неправильным функционированием скрипта или CSS стилей, которые обрабатывают данное действие. Возможно, также, что изображение не было правильно привязано к блоку, и поэтому не меняется при наведении.

Чтобы исправить эффект задержки при перемещении указателя мыши между блоками на веб-странице, можно использовать CSS свойство `transition` для плавного перехода между состояниями блока или элемента. Например:

```css
.block {
  transition: all 0.3s ease;
}
```

Также, следует убедиться, что обработчики событий (например, `mouseover` и `mouseout`) написаны правильно и оптимизированы для устранения задержек при перемещении указателя мыши. Важно также избегать избыточного использования анимаций и переходов, которые могут замедлить работу веб-страницы.
Я бы предложила небольшой рефакторинг, чтоб сделать код более читаемым <br/> <pre><code class="javascript">// объект с путями к изображениям для нормального и hover состояний чтоб не засорять основной код ссылками
// предполагаю, что в сумме у вас их 6, по 2 на каждый элемент motionPlitka
const imageSources = {
  preim1: {
    normal: "https://i.ibb.co/ZdHgXTm/green.png",
    hover: "https://i.ibb.co/g6mNxm8/white.png"
  },
  preim2: {
    normal: "https://i.postimg.cc/6pKDm5Lq/green2.png",
    hover: "https://i.postimg.cc/2SPBDMy1/white2.png"
  },
  preim3: {
    normal: "https://ltdfoto.ru/images/2024/06/13/green3.png",
    hover: "https://ltdfoto.ru/images/2024/06/13/white3.png"
  }
};

// выносим функцию изменения картинки в зависимости от состояния (normal или hover)
const setImageSrc = (element, state) =&gt; {
  // находим элемент &lt;img&gt; внутри элемента motionPlitka, на котором у нас курсор
  const img = element.querySelector("img"); 

  // извлекаем список классов элемента и ищем класс, который есть в imageSources
  // в вашем случае preim1, preim2 или preim3
  const className = [...element.classList].find(cls =&gt; imageSources[cls]); 

  // меняем src элемента &lt;img&gt; на значение из объекта imageSources для нужного класса и состояния
  img.src = imageSources[className][state];
};

// получаем все элементы .motionPlitka и добавляем обработчики
document.querySelectorAll(".motionPlitka").forEach(elem =&gt; {
  // при наведении мыши вызываем setImageSrc с состоянием hover
  elem.addEventListener('mouseenter', () =&gt; setImageSrc(elem, 'hover'));
  // при уходе мыши вызываем setImageSrc с состоянием normal
  elem.addEventListener('mouseleave', () =&gt; setImageSrc(elem, 'normal'));
});</code></pre> <br/> Здесь mouseenter и mouseleave срабатывают один раз при входе и выходе мыши из родительского элемента  motionPlitka. В вашем варианте обработчики срабатывали на действия с дочерними элемементами тоже
Похожие вопросы