2017-10-11 83 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

你是說你想能夠點擊並按住按鈕,並讓它拖動地圖?我會在糟糕的用戶界面的基礎上推薦它。 –