单张自定义图标标记旋转角度,变换样式冲突

时间:2019-01-19 03:26:39

标签: leaflet icons transform marker

我通过以下演示复制了此问题:http://jsfiddle.net/baoqger/deL0yuvg/9/

在我的项目中,我有一个自定义图标标记,我想在某些情况下旋转图标。

创建图标后,我添加了一个名字:

const uturnIcon = L.icon({
  iconUrl: 'http://joshuafrazier.info/images/firefox.svg',
  iconSize: [30, 30],
  className: 'u-turn-icon'
})

并为该类添加css样式,如下所示:

.u-turn-icon {
  transform: rotate(20deg) !important
}

问题是默认情况下,图标img的样式属性为transform: translate3d,因此默认变换与我添加的变换样式之间存在冲突。默认的转换样式是由传单本身创建的,当我们缩放地图时,该属性的值也会被更新。

那么如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

代码的第一个问题是它绕图标的角而不是中心旋转图标,因此最终将其放置在错误的位置。第二个问题是Leaflet使用图标的style.transform属性对其进行定位,因此每次地图缩放时旋转都会被覆盖。

@IvanSanchez建议的Leaflet.RotatedMarker插件看起来是一个优雅的解决方案。如果您无法使用该插件,则以下选项可能适用于您:

CSS样式:

.u-turn-icon {
   transform-origin: center;
}

Javascript:

map.on("zoomstart", function(ev) {
  let icons = document.getElementsByClassName("u-turn-icon");
  for(let icon of icons) {
    icon.style.visibility = "hidden";
  }
});

map.on("zoomend", function(ev){
  let icons = document.getElementsByClassName("u-turn-icon");
  for(let icon of icons) {
    icon.style.transform += " rotate(20deg)";
    icon.style.visibility = "";
  }
});

map.fire("zoomend");

此代码仅在每次缩放地图时简单地重置每个掉头图标的旋转。图标在缩放开始时是隐藏的,在结束时显示,因此您不会注意到它在旋转。手动触发zoomend事件,以在缩放地图之前将图标设置为正确的旋转角度。