Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 框架

  • core模块

  • dom模块

  • control

  • geometry

  • geo

  • layer

    • marker

      • Marker
      • Marker.Drag
      • Icon
      • Icon.Default
      • DivIcon
        • 概述
        • 源码分析
          • 源码实现
          • 示例
        • 总结​​
    • tile

    • vector

    • Layer
    • LayerGroup
    • FeatureGroup
    • DivOverlay
    • Popup
    • Tooltip
    • ImageOverlay
    • SVGOverlay
    • VideoOverlay
    • GeoJSON
  • Map

  • 《Leaflet源码》笔记
  • layer
  • marker
东流
2025-04-11
目录

DivIcon

# 概述

DivIcon类用于创建自定义的图标对象,可以用于标记点的图标。DivIcon类继承自Icon类,提供了一些方法用于创建图标对象。

# 源码分析

# 源码实现

DivIcon类源码实现如下:

export var DivIcon = Icon.extend({
  options: {
    iconSize: [12, 12], // 图标默认大小
    html: false, // 自定义HTML内容(字符串或DOM元素)
    bgPos: null, // 背景图位置偏移 如雪碧图定位
    className: "leaflet-div-icon", // 默认CSS类
  },
  createIcon: function (oldIcon) {
    // 复用或创建新的div 元素
    var div =
        oldIcon && oldIcon.tagName === "DIV"
          ? oldIcon
          : document.createElement("div"),
      options = this.options;
    
    // 处理 HTML 内容
    if (options.html instanceof Element) {
      empty(div);
      div.appendChild(options.html); // 插入 DOM 元素
    } else {
      div.innerHTML = options.html !== false ? options.html : ""; // 插入字符串或清空
    }
    
    // 设置背景位置
    if (options.bgPos) {
      var bgPos = point(options.bgPos);
      div.style.backgroundPosition = -bgPos.x + "px " + -bgPos.y + "px";
    }
    // 应用样式(大小、定位等)
    this._setIconStyles(div, "icon");

    return div;
  },
  
  // 覆盖父类方法,表示`DivIcon`的实例不渲染阴影
  createShadow: function () {
    return null;
  },
});

// 工厂函数
export function divIcon(options) {
  return new DivIcon(options);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# 示例

使用示例如下

// 创建自定义图标
var myIcon = L.divIcon({
  className: 'my-div-icon',
  html: '<span>🚀</span>',
  bgPos: [10, 20]
});

// 作为标记的图标
L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
1
2
3
4
5
6
7
8
9

# 总结​​

DivIcon 提供了一种高度可定制的方式,用 HTML/CSS 替代图片实现地图标记图标,适用于需要动态内容、动画或复杂样式的场景。其核心是通过操作 DOM 元素和 CSS 样式来实现轻量级渲染,同时继承 Leaflet 图标的通用功能(如定位、弹出框锚点等)。

编辑 (opens new window)
上次更新: 2025/04/24, 05:35:29
Icon.Default
GridLayer

← Icon.Default GridLayer→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式