leaflet 实现地图上标记的发散闪烁动画

先看效果

js文件:blinkmarker.js

L.blinkMarker = function (point, property) {
    // 使用js标签,便于操作,这个temDivEle的作用是将divEle通过innerHTML的方式获取为字符串
    var tempDivEle = document.createElement("div");
    var divEle = document.createElement("div");
    var spanEl = document.createElement("span");
    var aEl = document.createElement("a");
    tempDivEle.append(divEle);
    divEle.append(spanEl);
    spanEl.append(aEl);
    // 设置上基础的样式
    spanEl.classList.add("pulse-icon");
    aEl.classList.add("dive-icon");
    // 操作样式
    var style = document.createElement("style");
    style.type = "text/css";
    document.head.appendChild(style);
    sheet = style.sheet;
    // 主体颜色
    if (property) {
        if (property.color) {
            spanEl.style.backgroundColor = property.color;
            if (!property.diveColor) {
                aEl.style.boxShadow = "0 0 6px 2px " + property.color;
            }
        }
        // 标记大小
        if (property.iconSize) {
            spanEl.style.width = property.iconSize[0] + "px";
            spanEl.style.height = property.iconSize[1] + "px";
        }
        // 发散的color
        if (property.diveColor) {
            // 发散的重度
            if (property.level) {
                aEl.style.boxShadow = "0 0 " + (property.level * 3) + "px " + property.level + "px " + property.diveColor;
            } else {
                aEl.style.boxShadow = "0 0 6px 2px " + property.diveColor;
            }
        }
        // 发散的重度
        if (property.level) {
            if (property.diveColor) {
                aEl.style.boxShadow = "0 0 " + (property.level * 3) + "px " + property.level + "px " + property.diveColor;
            }else if (property.color) {
                aEl.style.boxShadow = "0 0 " + (property.level * 3) + "px " + property.level + "px " + property.color;
            }else{
                aEl.style.boxShadow = "0 0 " + (property.level * 3) + "px " + property.level + "px red";
            }
        }

        // 闪烁的速度
        if (property.speedTime) {
            aEl.style.setProperty("animation", "pulsate " + property.speedTime + "s infinite")
        }
    }
    var myIcon = L.divIcon({ className: 'my-div-icon', html: tempDivEle.innerHTML });
    var marker = L.marker(point, { icon: myIcon, title: property.title });
    return marker;
}

css样式文件:blinkmarker.css

.pulse-icon {
    display: inline-block;
    width: 15px;
    height: 15px;
    border-radius: 100%;
    background-color: red;
    position: relative;
    box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.1);
}

.dive-icon {
    content: "";
    box-shadow: 0 0 6px 2px red;
    animation: pulsate 1s ease-out;
    animation-iteration-count: infinite;
    animation-delay: 1.1s;
    -webkit-border-radius: 100%;
    border-radius: 100%;
    height: 200%;
    width: 200%;
    animation: pulsate 2s infinite;
    position: absolute;
    margin: -50% 0 0 -50%;
}

@keyframes pulsate {
    0% {
        transform: scale(0.1, 0.1);
        opacity: 0;
        -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
        filter: alpha(opacity=0);
    }
    50% {
        opacity: 1;
        -ms-filter: none;
        filter: none;
    }
    100% {
        transform: scale(1.2,1.2);
        opacity: 0;
        -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
        filter: alpha(opacity=0);
    }
}

测试实例

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>闪烁点</title>
    <link rel="stylesheet" type="text/css" href="../leaflet/dist/leaflet.css">
    <script type="text/javascript" src="../leaflet/dist/leaflet.js"></script>
    <!-- 引入闪烁marker -->
    <link rel="stylesheet" type="text/css" href="css/blinkmarker.css">
    <script type="text/javascript" src="js/blinkmarker.js"></script>
    <style type="text/css">
        body {
            padding: 0;
            margin: 0;
        }

        html,
        body,
        #map {
            height: 100%;
        }
    </style>
</head>

<body>
    <div id='map'></div>
</body>
<script type="text/javascript">
    /**
     * 这一部分用于加载地图,我这里用的是离线地图,需要适当修改
     */
    var url = 'http://localhost:9090/img/{z}/{x}/{y}.png';
    var map = L.map('map', {
        center: [34.694, 113.587],
        zoom: 6,
        zoomControl: false
    });
    //将图层加载到地图上,并设置最大的聚焦还有map样式
    L.tileLayer(url, {
        maxZoom: 18,
        minZoom: 3
    }).addTo(map);

    //以下是加载闪烁标记
    // 支持以下属性iconSize: 主体大小(默认15,15),color:主体颜色(默认红色),diveColor: 发散颜色(red),title: 标题,level: 闪烁的粗细(2),speedTime: 发散闪烁的速度(2)
    /**
     L.blinkMarker(LatLng,{iconSize: [50,50],color: 'green',diveColor: 'blue',title: "啦啦啦"})
     */
    L.blinkMarker([36.694, 118.587], { 
        iconSize: [50, 50], 
        color: 'green', 
        diveColor: 'blue', 
        level: '3',
        speedTime: 2,
        title: "啦啦啦" }).addTo(map);
    L.blinkMarker([34.694, 112.587], { iconSize: [12, 12], color: 'green',speedTime: 0.5}).addTo(map);
    L.blinkMarker([35.694, 113.587], { iconSize: [18, 18], diveColor: 'aqua' }).addTo(map);
    L.blinkMarker([32.694, 116.587], { iconSize: [25, 25], level: '3', speedTime: 1 }).addTo(map);
    // document.styleSheets[0].addRule('.pulse-icon::after { box-shadow:  0 0 6px 2px green }', 0);


</script>

</html>

原文链接:https://blog.csdn.net/weixin_43464964/java/article/details/105686596

另外一种方法,就是用gif动图去做:

var LeafIcon = L.Icon.extend({
                    options: {
                        iconSize: [60, 50],
                        iconAnchor: [30, 25]
                    }
                });
             var markerIcon = new LeafIcon({ iconUrl: './gif/marker.gif' });
            let marker=L.marker([item.lat, item.lon], { icon: markerIcon });
原文地址:https://www.cnblogs.com/tiandi/p/13211941.html