Ответ 1
Update
Я сделал некоторые важные изменения, которые дают больший контроль над событиями касания. Теперь вы можете установить минимальные/максимальные значения продолжительности касания, расстояния и порога для оси X и Y.
Кроме того, изображения теперь предварительно загружены для более плавного перехода между изображениями.
Я сделал этот довольно сложный код, основанный на событиях касания touchstart
и touchend
, по горизонтали и вертикали. Код ловит события касания, а затем интерпретирует их в порядке, вправо, вниз и влево.
Изображения обмениваются с .animate()
в соответствии с направлением движения. Проведите вверх и влево, загрузите следующие изображения в массив; вниз и правая загрузка предыдущих.
Он как-то длинный и имеет слишком много возможностей для улучшения. Например, вы можете рассчитать время, прошедшее между обоими событиями touchstart и touchhend, чтобы убедиться, что прикосновение было достаточно для запуска пользовательских проверок.
Я рассмотрю основные части кода для получения дополнительных пояснений.
HTML
<div class="wrapper">
<div class="inner">
<!-- images go here -->
</div>
</div>
CSS
-
Упаковщик - высота и ширина должны быть скорректированы с учетом ваших потребностей:
.wrapper { overflow: hidden; position: relative; height: 200px; width: 400px; margin: 0 auto; }
-
Внутренняя оболочка. Чтобы добавить изображения в:
.inner { height: 200px; width: auto; position: absolute; left: 0; white-space: nowrap; }
-
Конверты переноса - используется для перехода и выхода изображений:
.holder, .in, .hidden { position: absolute; }
-
Скрыть предварительно загруженные изображения:
.hidden { display: none; }
JS
-
Переменные и значения по умолчанию:
var total = images.length - 1, /* images total number */ current = 0, /* image index */ startX = '', /* touchstart X coordinate */ startY = '', /* touchstart Y coordinate */ endX = '', /* touchend X coordinate */ endY = ''; /* touchend Y coordinate */ swipeDuration = 1000, /* max touch duration */ swipeDistanceX = 50, /* X-axis min touch distance */ swipeDistanceY = 50, /* Y-axis min touch distance */ thresholdX = 30, /* X-axis max touch displacement */ thresholdY = 30; /* Y-axis max touch displacement */
-
Предварительная загрузка изображений:
Оберните каждый в
holder
, а затем добавьте их вinner
div, вpageinit
событие или любое другое событие jQM.$(document).on("pageinit", "#gallery", function () { $.each(images, function (i, src) { $("<div class='holder hidden'><img src=" + src + " /></div>").appendTo(".inner"); }); $(".inner .holder:first-child").toggleClass("visible hidden"); });
-
Синхронизация сенсорных событий - привязка событий Touch к
inner
div:Продолжительность и расстояние касания добавляются к сравнению.
$(document).on("touchstart", ".inner", function (e, ui) { startX = e.originalEvent.touches[0].pageX; startY = e.originalEvent.touches[0].pageY; start = new Date().getTime(); /* touch start */ }).on("touchmove", ".inner", function (e, ui) { /* prevent page from scrolling */ e.preventDefault(); }).on("touchend", ".inner", function (e, ui) { endX = e.originalEvent.changedTouches[0].pageX; endY = e.originalEvent.changedTouches[0].pageY; end = new Date().getTime(); /* touch end */ if ((end - start) < swipeDuration) { if (startX > endX && Math.abs(startY - endY) <= thresholdY && Math.abs(startX - endX) >= swipeDistanceX) { showImg(current, "left"); } else if (startX < endX && Math.abs(startY - endY) <= thresholdY && Math.abs(startX - endX) >= swipeDistanceX) { showImg(current, "right"); } else if (startY > endY && Math.abs(startX - endX) <= thresholdX && Math.abs(startY - endY) >= swipeDistanceY) { showImg(current, "up"); } else if (startY < endY && Math.abs(startX - endX) <= thresholdX && Math.abs(startY - endY) >= swipeDistanceY) { showImg(current, "down"); } } });
-
Функция перехода
showImg(image index, swipe type)
:Добавлена непрозрачность для анимации.
function showImg(index, type) { if (type == "left") { current = index; if (current >= 0 && current < total) { current++; var distance = $(".visible").width(); $(".inner .holder").eq(current).css({ left: distance }).toggleClass("in hidden"); $(".visible").animate({ left: "-" + distance + "px", opacity: 0 }, 600, function () { $(this).toggleClass("visible hidden").css({ top: "auto", left: "auto" }); }); $(".in").animate({ left: 0, opacity: 1 }, 500, function () { $(this).toggleClass("in visible"); }); } } if (type == "up") { current = index; if (current >= 0 && current < total) { current++; var distance = $(".visible").height(); $(".inner .holder").eq(current).css({ top: distance + "px" }).toggleClass("in hidden"); $(".visible").animate({ top: "-" + distance + "px", opacity: 0 }, 600, function () { $(this).toggleClass("visible hidden").css({ top: "auto", left: "auto" }); }); $(".in").animate({ top: 0, opacity: 1 }, 500, function () { $(this).toggleClass("in visible"); }); } } if (type == "right") { current = index; if (current > 0 && current <= total) { current--; var distance = $(".visible").width(); $(".inner .holder").eq(current).css({ left: "-" + distance + "px" }).toggleClass("in hidden"); $(".visible").animate({ left: distance + "px", opacity: 0 }, 600, function () { $(this).toggleClass("visible hidden").css({ top: "auto", left: "auto" }); }); $(".in").animate({ left: 0, opacity: 1 }, 500, function () { $(this).toggleClass("in visible"); }); } } if (type == "down") { current = index; if (current > 0 && current <= total) { current--; var distance = $(".holder").height(); $(".inner .holder").eq(current).css({ top: "-" + distance + "px" }).toggleClass("in hidden"); $(".visible").animate({ top: distance + "px", opacity: 0 }, 600, function () { $(this).toggleClass("visible hidden").css({ top: "auto", left: "auto" }); }); $(".in").animate({ top: 0, opacity: 1 }, 500, function () { $(this).toggleClass("in visible"); }); } } }
Демо (1)
(1) Протестировано на iPad 2 и iPhone 5 - v7.0.4