Как вращать большие пальцы на Touchy?

Вопрос или проблема

Как я могу добавить поддержку мобильных устройств, возможно, с помощью любого jQuery-свайпа или другого способа?
Вот мой fiddle

Поворот миниатюр работает нормально, единственная проблема в мобильных устройствах – мне нужно кликать для поворота, но вместо этого я хочу поворачивать с помощью свайпа.

Есть ли способ исправить мой код как для настольных, так и для мобильных устройств?
Спасибо

Я пробовал с touchstart, но это не сработало.

jQuery(document).ready(function($) {
    var t = null,
        r = !1;
    $("body").on("mouseenter", ".thumbs", function(e) {
        var o = jQuery(this);
        if (r = !1, void 0 != o.data("thumbs")) {
            var u = o.data("thumbs").split(","),
                i = u.length,
                a = 1;
            t = null, clearTimeout(t), (t = function() {
                0 == r && (o.find("img").attr("srcset", u[a]), a <= i && (a == i && (a = 0), setTimeout(t, 500), a++))
            })()
        }
    }).on("mouseleave", ".thumbs", function(e) {
        r = !0, t = null;
        for (var o = setTimeout(";"), u = 0; u < o; u++) clearTimeout(u);
        var i = $(this).find("img"),
            a = i.attr("src");
        i.attr("srcset", a)
    }).on('touchstart', ".thumbs", function(e) { 
        r = !0, t = null;
        for (var o = setTimeout(";"), u = 0; u < o; u++) clearTimeout(u);
        var i = $(this).find("img"),
            a = i.attr("src");
        i.attr("srcset", a)
        })
});

Вот простая версия на JS с использованием делегирования. Протестировано на iPhone

document.addEventListener("DOMContentLoaded", () => {
  let intervalId = null,
    longPressTimeout = null;

  // Функция для переключения изображений
  const switchImage = (img, thumbsArray, thumbCount) => {
    let currentIndex = 1; // Начнем со второго изображения (предполагая, что первое уже отображается)

    // Запускаем интервал для переключения изображений
    intervalId = setInterval(() => {
      img.setAttribute("srcset", thumbsArray[currentIndex]);
      currentIndex = (currentIndex + 1) % thumbCount; // Циклически переключаем изображения
    }, 500); // Обновляем изображение каждые 500 мс
  };

  // Основная функция для обработки всех взаимодействий
  const handleInteraction = (e) => {
    const thumb = e.target.closest('.thumbs');
    if (!thumb) return; // Если цель события не внутри `.thumbs`, выходим

    const img = thumb.querySelector("img");
    const type = e.type;
    if (e.type === "mouseover" || e.type === "touchstart") {
      // Начинаем переключение изображений и добавляем класс hover при наведении мыши или касании
      img.classList.add('hover'); 

      let thumbsArray = thumb.dataset.thumbs.split(","),
        thumbCount = thumbsArray.length;

      clearInterval(intervalId); // Очищаем предыдущий интервал

      // Запускаем цикл переключения изображений
      switchImage(img, thumbsArray, thumbCount);

      if (type === "touchstart") {
        e.preventDefault(); // Предотвращаем длительное нажатие и прокрутку при касании
        longPressTimeout = setTimeout(() => e.preventDefault(), 500); // Предотвращаем длительное нажатие через 500 мс
      }
    } else if (type === "mouseout" || type === "touchend" || type === "touchcancel") {
      // Останавливаем переключение изображений и удаляем класс hover при выходе мыши или завершении касания
      clearInterval(intervalId); // Останавливаем интервал переключения изображений
      clearTimeout(longPressTimeout); // Очищаем таймаут длительного нажатия
      img.classList.remove('hover'); // Удаляем класс hover
    }
  };

  // Привязываем обработчики событий к контейнеру с использованием делегирования событий
  const container = document.getElementById('container');
  container.addEventListener("mouseover", handleInteraction, true); // mouseenter/leave не всплывают
  container.addEventListener("mouseout", handleInteraction);
  container.addEventListener("touchstart", handleInteraction);
  container.addEventListener("touchend", handleInteraction);
  container.addEventListener("touchcancel", handleInteraction);
});
.post img {
  max-width: 220px;
  aspect-ratio: 3/2;
  float: left;
  border: 2px solid green;
}

.post img.hover {
  border: 2px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div id="container">
  <a href="#" class="post" title="test">
    <div class="thumbs" data-thumbs="https://ichef.bbci.co.uk/ace/standard/976/cpsprodpb/F76F/production/_101934336_hi001487062.jpg,
  https://files.worldwildlife.org/wwfcmsprod/images/Elephant_and_Calf_288447_main/story_full_width/3yl7j5q9n4_WEB_288447.jpg,
  https://cdn.aucklandunlimited.com/zoo/assets/media/giraffe-closeup-rectangle.jpg,
  https://i.guim.co.uk/img/media/10358b976ad9e38136d261204dceb71a7adbf594/121_0_3598_2160/master/3598.jpg?width=465&dpr=1&s=none
  ">
      <img src="https://ichef.bbci.co.uk/ace/standard/976/cpsprodpb/F76F/production/_101934336_hi001487062.jpg" data-original="https://ichef.bbci.co.uk/ace/standard/976/cpsprodpb/F76F/production/_101934336_hi001487062.jpg" alt="test" ></div>
  </a>
</div>

Ответ или решение

Вопрос, который вы подняли, касается реализации поддержки мобильных устройств в вашем проекте, в частности, обработки свайпов для поворота изображений в элементах «thumbs» (миниатюры). Давайте разберем, как это сделать, используя jQuery и чистый JavaScript, а также обсудим подходы к надежной обработке как настольных, так и мобильных взаимодействий.

Проблема

На мобильных устройствах для поворота изображений в элементе thumbs требуется свайп, вместо того, чтобы кликать на изображение. Вам нужно изменить код таким образом, чтобы он обрабатывал события свайпа, позволяя пользователям легко взаимодействовать с вашим интерфейсом.

Решение

Вот как вы можете адаптировать ваш код, чтобы поддерживать как нажатия мыши на настольных устройствах, так и свайпы на мобильных устройствах.

1. Использование jQuery для обработки событий

Если вы продолжаете использовать jQuery, добавим обработчики событий для мобильных взаимодействий.

jQuery(document).ready(function($) {
    var t = null,
        currentIndex = 0,
        thumbsArray = [];

    // Функция для смены изображений
    var switchImage = function(thumb) {
        const img = thumb.find("img");
        currentIndex = (currentIndex + 1) % thumbsArray.length;
        img.attr("srcset", thumbsArray[currentIndex]);
    };

    $(".thumbs").on("mouseenter touchstart", function() {
        var o = $(this);
        thumbsArray = o.data("thumbs").split(",");
        currentIndex = 0;

        clearInterval(t);
        t = setInterval(function() {
            switchImage(o);
        }, 500);

        // Обрабатываем long press (долгое нажатие) для мобильных
        if (event.type === "touchstart") {
            event.preventDefault();
        }

    }).on("mouseleave touchend", function() {
        clearInterval(t);
    });

    // Добавление обработки свайпа
    var touchStartX = 0;
    var touchEndX = 0;

    $(".thumbs").on("touchstart", function(event) {
        touchStartX = event.changedTouches[0].screenX;
    });

    $(".thumbs").on("touchend", function(event) {
        touchEndX = event.changedTouches[0].screenX;
        handleSwipe();
    });

    function handleSwipe() {
        if (touchEndX < touchStartX) {
            // Свайп влево
            switchImage($(this));
        } else if (touchEndX > touchStartX) {
            // Свайп вправо
            currentIndex = (currentIndex - 1 + thumbsArray.length) % thumbsArray.length;
            $(this).find("img").attr("srcset", thumbsArray[currentIndex]);
        }
    }
});

2. Чистый JavaScript

Для пользователей, которые предпочитают использовать чистый JavaScript, рассмотрим аналогичное решение:

document.addEventListener("DOMContentLoaded", () => {
    const thumbs = document.querySelectorAll('.thumbs');
    let currentIndex = 0;
    let intervalId = null;

    thumbs.forEach(thumb => {
        const img = thumb.querySelector('img');
        const thumbsArray = thumb.dataset.thumbs.split(",");

        thumb.addEventListener("mouseover", () => {
            currentIndex = 0;
            switchImage();
            intervalId = setInterval(switchImage, 500);

            thumb.addEventListener("touchstart", (event) => {
                event.preventDefault();
            });
        });

        thumb.addEventListener("mouseleave", () => {
            clearInterval(intervalId);
        });

        thumb.addEventListener("touchstart", (event) => {
            const touchStartX = event.changedTouches[0].screenX;

            thumb.addEventListener("touchend", (event) => {
                const touchEndX = event.changedTouches[0].screenX;
                if (touchEndX < touchStartX) {
                    // Свайп влево
                    switchImage(thumb, true);
                } else if (touchEndX > touchStartX) {
                    // Свайп вправо
                    switchImage(thumb, false);
                }
            });
        });

        const switchImage = (thumb, forward = true) => {
            img.setAttribute("srcset", thumbsArray[currentIndex]);
            currentIndex = forward ? (currentIndex + 1) % thumbsArray.length : (currentIndex - 1 + thumbsArray.length) % thumbsArray.length;
        };
    });
});

Заключение

С приведенным выше кодом, вы сможете поддерживать функционал смены изображений как на настольных, так и на мобильных устройствах. Убедитесь, что обработка событий происходит корректно, включая тайминги и индексы в массиве изображений. Также не забудьте протестировать ваше решение на разных мобильных устройствах, чтобы убедиться в его стабильности.

Этот подход повысит удобство взаимодействия пользователей и обеспечит плавную работу вашего веб-приложения на всех платформах.

Оцените материал
Добавить комментарий

Капча загружается...