Leaflet JS - 实施手势处理以强制执行 2 指滚动
Leaflet JS - Implementing Gesture Handling to enforce 2 fingered scrolling
您知道何时在移动设备上向下滚动具有 google 地图的网页。地图变暗并告诉你 "Use two fingers to move the map"。
我想在我的 Leaflet 地图中实现这一点。 Leaflet 目前不提供这种开箱即用的功能。
Google 将此功能称为手势处理。如果您将它设置为 "Cooperative",您将获得我刚才描述的效果。
https://developers.google.com/maps/documentation/javascript/interaction
如我的代码示例所示,检测所用手指的数量并显示消息非常容易。
(您需要在移动设备或模拟器上 运行 才能看到它的效果)
如果是 1 个手指,我取消 touchmove 事件并显示我的警告。
否则我允许事件应用于地图。
但是我需要想出一些方法,在我在地图上取消它之后将一个手指触摸事件应用到包含页面。这样用户就可以滚动页面。
有没有人知道如何实现这一点?我考虑过使用 dispatchEvent 将接收到的 touchmove 事件对象直接中继到父文档。
例如:
document.dispatchEvent(触摸移动事件);
但没有运气。也许有更好的整体方法。
var myMap = L.map('mapid').setView([51.505, -0.09], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19
}).addTo(myMap);
$("#mapid").on("touchmove", function(e) {
if (e.touches.length !== 2) {
$('.mask').fadeIn();
return false;
}
});
$("#mapid").on("touchend", function(e) {
if ($('.mask').is(':visible')) {
$('.mask').fadeOut();
}
});
#mapid {
height: 600px;
}
.mask {
display: none;
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
top: 0;
left: 0;
z-index: 400;
}
.message {
color: #ffffff;
position: absolute;
width: 100%;
text-align: center;
top: 50%;
transform: translateY(-50%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw==" crossorigin=""></script>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<head>
<body>
<h1>Leaflet Map</h1>
<div id="mapid"></div>
<div class="scroll-shield"></div>
<div class="mask">
<div class="message">
<p>Use two fingers to move the map</p>
</div>
</div>
<h2>Stuff below</h2>
<ul>
<li>Here</li>
<li>is</li>
<li>some</li>
<li>stuff</li>
<li>below</li>
</ul>
</body>
关键是确保在初始化地图时禁用拖动、点击和 scrollWheelZoom。
然后在检测到 2 指拖动或使用 command 或 ctrl 键滚动时暂时 re-enabling 它们。
我现在已经将这个解决方案打包成传单插件。
您知道何时在移动设备上向下滚动具有 google 地图的网页。地图变暗并告诉你 "Use two fingers to move the map"。
我想在我的 Leaflet 地图中实现这一点。 Leaflet 目前不提供这种开箱即用的功能。
Google 将此功能称为手势处理。如果您将它设置为 "Cooperative",您将获得我刚才描述的效果。 https://developers.google.com/maps/documentation/javascript/interaction
如我的代码示例所示,检测所用手指的数量并显示消息非常容易。 (您需要在移动设备或模拟器上 运行 才能看到它的效果)
如果是 1 个手指,我取消 touchmove 事件并显示我的警告。 否则我允许事件应用于地图。 但是我需要想出一些方法,在我在地图上取消它之后将一个手指触摸事件应用到包含页面。这样用户就可以滚动页面。
有没有人知道如何实现这一点?我考虑过使用 dispatchEvent 将接收到的 touchmove 事件对象直接中继到父文档。 例如: document.dispatchEvent(触摸移动事件); 但没有运气。也许有更好的整体方法。
var myMap = L.map('mapid').setView([51.505, -0.09], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19
}).addTo(myMap);
$("#mapid").on("touchmove", function(e) {
if (e.touches.length !== 2) {
$('.mask').fadeIn();
return false;
}
});
$("#mapid").on("touchend", function(e) {
if ($('.mask').is(':visible')) {
$('.mask').fadeOut();
}
});
#mapid {
height: 600px;
}
.mask {
display: none;
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
top: 0;
left: 0;
z-index: 400;
}
.message {
color: #ffffff;
position: absolute;
width: 100%;
text-align: center;
top: 50%;
transform: translateY(-50%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw==" crossorigin=""></script>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<head>
<body>
<h1>Leaflet Map</h1>
<div id="mapid"></div>
<div class="scroll-shield"></div>
<div class="mask">
<div class="message">
<p>Use two fingers to move the map</p>
</div>
</div>
<h2>Stuff below</h2>
<ul>
<li>Here</li>
<li>is</li>
<li>some</li>
<li>stuff</li>
<li>below</li>
</ul>
</body>
关键是确保在初始化地图时禁用拖动、点击和 scrollWheelZoom。
然后在检测到 2 指拖动或使用 command 或 ctrl 键滚动时暂时 re-enabling 它们。
我现在已经将这个解决方案打包成传单插件。