1. 點擊地圖外dom實現
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" />
<script type="text/javascript" src="https://openlayers.org/en/v5.3.0/build/ol.js"></script>
<title>openlayers 標記點閃爍</title>
</head>
<body>
<div id="map"></div>
<div id="baidu"><img src="https://www.baidu.com/img/flexible/logo/pc/result@2.png"></div>
<script>
var beijing = ol.proj.fromLonLat([116.28, 39.54]);
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: beijing,
zoom: 4
})
});
var tip = document.getElementById('baidu');
var overlay = new ol.Overlay({
element: tip,
positioning: 'center-center'
});
overlay.setPosition(beijing);
map.addOverlay(overlay)
let flag = true
let animate = null
tip.onclick = () => {
clearInterval(animate)
animate = setInterval(() => {
flag = !flag
let po = flag ? '10px' : '-10px'
tip.style.top = po
}, 500);
}
</script>
</body>
<style>
#baidu {
width: 100px;
position: absolute;
top: 10px;
}
img {
width: 100%;
}
</style>
</html>
2. 點擊地圖內features實現
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" />
<script type="text/javascript" src="https://openlayers.org/en/v5.3.0/build/ol.js"></script>
<title>openlayers 標記點閃爍</title>
</head>
<body>
<div id="map"></div>
<div id="baidu"><img src="https://www.baidu.com/img/flexible/logo/pc/result@2.png"></div>
<script>
var beijing = ol.proj.fromLonLat([116.28, 39.54]);
var dot = ol.proj.fromLonLat([103.28, 39.34]);
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: beijing,
zoom: 4
})
});
//實例化矢量點要素,通過矢量圖層添加到地圖容器中
//這樣就實現了預先加載圖文標注
var iconFeature = new ol.Feature({
geometry: new ol.geom.Point(beijing),
name: '北京市', //名稱屬性
population: 2115 //人口數(萬)
});
//設置點要素樣式
iconFeature.setStyle(createLabelStyle(iconFeature));
//矢量標注的數據源
var vectorSource = new ol.source.Vector({
features: [iconFeature]
});
//矢量標注圖層
var vectorLayer = new ol.layer.Vector({
source: vectorSource,
visible: true
});
map.addLayer(vectorLayer);
//矢量標注樣式設置函數,設置image為圖標ol.style.Icon
function createLabelStyle(feature) {
console.log(feature);
return new ol.style.Style({
text: new ol.style.Text({
text: '北京',
font: "normal 20px 微軟雅黑", // 文字樣式
}),
});
}
var tip = document.getElementById('baidu');
var overlay = new ol.Overlay({
element: tip,
positioning: 'center-center'
});
overlay.setPosition(dot);
map.addOverlay(overlay)
let animate = null
let select = new ol.interaction.Select();
map.addInteraction(select)
let flag = true
select.on('select', (e) => {
clearInterval(animate)
animate = setInterval(() => {
flag = !flag
let po = flag ? '10px' : '-10px'
tip.style.top = po
}, 800);
})
</script>
</body>
<style>
#baidu {
width: 100px;
position: absolute;
top: 10px;
}
img {
width: 100%;
}
</style>
</html>