30.11.2024, 16:31
|
Кандидат Javascript-наук
|
|
Регистрация: 27.05.2017
Сообщений: 112
|
|
Закрыть меню по свайпу
Приветствую! В мобильной версии сайта есть меню, которое скрывается по клику на кнопку закрыть. Подскажите, плиз, что добавить в код, чтобы меню закрывалось еще и по свайпу. Заранее спасибо!
<div class="menubar">
<span class="openmenu" onclick="openNav()">
Меню
</span>
</div>
<div id="mySidenav" class="top-menu">
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
<li>Пункт 4</li>
</ul>
<div class="menu-close" onclick="closeNav()">
х
</div>
</div>
function openNav() {
document.getElementById("mySidenav").style.left = "0";
}
function closeNav() {
document.getElementById("mySidenav").style.left = "-281px";
}
|
|
30.11.2024, 20:52
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сам по себе свайп не является событием - это последовательность событий.
Надо поискать какую-нибудь библиотеку, которая может воспринимать такие события, как свайп - тут и нажатие на экран, движение, отпускание экрана и все это с учетом скорости.
Какую то простую реализацию можно тут посмотреть
https://web3r.ru/swipe-event
Последний раз редактировалось voraa, 30.11.2024 в 20:56.
|
|
01.12.2024, 08:24
|
Кандидат Javascript-наук
|
|
Регистрация: 27.05.2017
Сообщений: 112
|
|
Ну... я, перед тем как здесь написать, гуглил варианты, пробовал, но всё не рабочее (то, что по ссылке, кстати, тоже ), поэтому и решил обратиться к профи)
Последний раз редактировалось samdo, 01.12.2024 в 08:31.
|
|
02.12.2024, 18:57
|
Кандидат Javascript-наук
|
|
Регистрация: 27.05.2017
Сообщений: 112
|
|
Спасибо! Но моё незнание js не позволяет модифицировать этот код под моё меню
Поэтому и обратился к вам за помощью.
Последний раз редактировалось samdo, 02.12.2024 в 20:08.
|
|
02.12.2024, 21:44
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
swap close menu
samdo,
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<style type="text/css">
body {
position: relative;
}
.top-menu {
position: absolute;
}
</style>
</head>
<body>
<div class="menubar">
<span class="openmenu" onclick="openNav()">
Меню
</span>
</div>
<div id="mySidenav" class="top-menu">
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
<li>Пункт 4</li>
</ul>
<div class="menu-close" onclick="closeNav()">
х
</div>
</div>
<script>
function openNav() {
document.getElementById("mySidenav").style.left = "0";
}
function closeNav() {
document.getElementById("mySidenav").style.left = "-281px";
}
let touch_y, touch_x;
document.addEventListener("touchstart", (event) => {
let target = event.target;
if (target = target.closest('.top-menu')) {
touch_y = event.changedTouches[event.changedTouches.length - 1].clientY;
touch_x = event.changedTouches[event.changedTouches.length - 1].clientX;
}
})
document.addEventListener("touchend", (event) => {
let target = event.target;
if (target = target.closest('.top-menu')) {
let swap = (Math.abs(touch_y - event.changedTouches[event.changedTouches.length - 1].clientY) > 3 || Math.abs(touch_x - event.changedTouches[event.changedTouches.length - 1].clientX) > 3)
if (swap) {
closeNav()
}
}
})
</script>
</body>
</html>
|
|
03.12.2024, 07:21
|
Кандидат Javascript-наук
|
|
Регистрация: 27.05.2017
Сообщений: 112
|
|
Рони, большущее СПАСИБО! Работает.
|
|
03.12.2024, 18:02
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
рони,
Вот, например, у меня на ноуте это работать не будет.
На ноуте стоит обычная винда, но экран с тачскрином. На десктопных версиях браузеров нет событий touch. Есть только mouse и pointer.
Touch только в мобильных версиях, а pointer есть везде.
|
|
03.12.2024, 20:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
voraa,
понятно, может будет желание и время предложить свой вариант для pointer?
|
|
03.12.2024, 22:49
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от рони
|
voraa,
понятно, может будет желание и время предложить свой вариант для pointer?
|
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<style type="text/css">
body {
position: relative;
}
.top-menu {
position: absolute;
touch-action: none;
}
</style>
</head>
<body>
<div class="menubar">
<span class="openmenu" onclick="openNav()">
Меню
</span>
</div>
<div id="mySidenav" class="top-menu">
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
<li>Пункт 4</li>
</ul>
<div class="menu-close" onclick="closeNav()">
х
</div>
</div>
<script>
function openNav() {
document.getElementById("mySidenav").style.left = "0";
}
function closeNav() {
document.getElementById("mySidenav").style.left = "-281px";
}
let touch_y, touch_x;
document.addEventListener("pointerdown", (event) => {
let target = event.target;
if (target = target.closest('.top-menu')) {
touch_y = event.clientY;
touch_x = event.clientX;
}
})
document.addEventListener("pointerup", (event) => {
let target = event.target;
if (target = target.closest('.top-menu')) {
let swap = (Math.abs(touch_y - event.clientY) > 3 || Math.abs(touch_x - event.clientX) > 3)
if (swap) {
closeNav()
}
}
})
</script>
</body>
</html>
|
|
|
|