2017-10-11 53 views
1

这是一个jsfiddle https://jsfiddle.net/jes4fggd/。 我想移动地图,但是随着div的跟随,鼠标指针看起来像事件被div抓住。当鼠标位于div或按钮上时,我想传递该事件以进行映射。我只想点击事件可用于按钮,但拖动是为地图。 我试着用voteDiv1.style ['pointer-events'] ='none';但对我来说有点棘手。有没有简单的方法? 谢谢。将div事件从div传递到mapbox图层

var voteDiv1 = document.getElementById('vote1'); 
map.on('mousemove', function (e) { 
    var c = map.project(e.lngLat); 
    console.log(c) 
    voteDiv1.style.left = (c.x) -50 + 'px'; 
    voteDiv1.style.top = (c.y) -50 + 'px'; 
}); 

和另一个例子https://jsfiddle.net/q3ghvuu3/ - 如何移动地图或以这种方式点击一个按钮?

+0

'指针的事件:none'使顺畅的股利的举动,但你不能点击投票按钮。你要做什么样的互动? –

+0

@EvanKnowles我需要处理红色边框div内/上的任何点击事件,并能够拖动地图时,鼠标指针结束该部门 – SERG

回答

1

困惑什么你要基于的描述,但这里是我最好的猜测:

  • 点击地图应该拖动地图,如预期
  • 点击按钮应该单击该按钮预期
  • 移动地图上移动光标应该移动的按钮周围的地图
  • 单击并拖动按钮应该拖动地图(不是多数用户希望)

我会重申我最初的担心,这个UI是一个坏主意。用户熟悉看到地图上覆盖的按钮,例如Google地图上的缩放按钮,并且知道要拖动地图,他们可以在任何地方点击,但可以使用按钮。所以我仍然建议不要这样做。但在这里。

要完成它,我们会将pointer-events: none添加到按钮元素。这样所有的点击和拖动都会通过地图。然后,我们检查点击的位置,看它是否发生在与按钮相同的位置,如果是,则发送一个click事件到按钮。

mapboxgl.accessToken = 'pk.eyJ1IjoiYmVuZGVybGlvIiwiYSI6ImNqM29qdXR5djAwMTQzM214M2hnZWVycWsifQ.jtDIyytOGMJ0TS9Pp6zFVg'; 
 
var map = new mapboxgl.Map({ 
 
    container: 'map', // container id 
 
    style: 'mapbox://styles/mapbox/streets-v9', // stylesheet location 
 
    center: [-74.50, 40], 
 
    zoom: 9 // starting zoom 
 
}); 
 

 
var voteDiv1 = document.getElementById('vote1'); 
 
map.on('mousemove', function(e) { 
 
    var c = map.project(e.lngLat); 
 
    voteDiv1.style.left = (c.x) - 50 + 'px'; 
 
    voteDiv1.style.top = (c.y) - 50 + 'px'; 
 
}); 
 

 
document.getElementById("plus").addEventListener("click", function() { 
 
    alert("Plus clicked") 
 
}) 
 

 
document.getElementById("map").addEventListener("click", function(event) { 
 
    var button = document.getElementById("plus"); 
 
    var buttonBB = button.getBoundingClientRect(); 
 

 
    if (
 
    event.pageX > buttonBB.left && 
 
    event.pageX < buttonBB.right && 
 
    event.pageY > buttonBB.top && 
 
    event.pageY < buttonBB.bottom 
 
) { 
 
    var bottomEvent = new Event("click"); 
 
    bottomEvent.pageX = event.pageX; 
 
    bottomEvent.pageY = event.pageY; 
 

 
    button.dispatchEvent(bottomEvent); 
 
    } 
 
    
 
    
 
})
html, 
 
body { 
 
    margin: 0; 
 
    padding: 0; 
 
    width: 100%; 
 
    height: 100%; 
 
} 
 

 
#map { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    width: 100%; 
 
} 
 

 
#vote1 { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: absolute; 
 
    top: 0px; 
 
    left: 0px; 
 
    margin: 0px; 
 
    padding: 0px; 
 
    border: 2px solid red; 
 
    display: flex; 
 
    flex-direction: column; 
 
    justify-content: center; 
 
    align-items: center; 
 
    pointer-events: none; 
 
}
<link href="https://api.tiles.mapbox.com/mapbox-gl-js/v0.40.1/mapbox-gl.css" rel="stylesheet" /> 
 
<script src="https://api.tiles.mapbox.com/mapbox-gl-js/v0.40.1/mapbox-gl.js"></script> 
 

 
<div id='map'></div> 
 

 
<div id="vote1"> 
 
    <div id="box" sectionId="" style="border:1px solid blue;"> 
 
    <button id="plus" style="width:150px; height:150px">+</button> 
 
    </div> 
 
</div>

+0

感谢您的答案,但如果我有一个大鼠标按钮后,我想单击它或拖动地图。像这样https://jsfiddle.net/q3ghvuu3/ – SERG

+1

如果JSFiddle做了你想要的东西,你不能使用该代码吗? –

+1

你是说你想能够点击并按住按钮,并让它拖动地图?我会在糟糕的用户界面的基础上推荐它。 –