Materialise CSS 不显示带有 Leaflet 网络映射覆盖的多个复选框

Materialize CSS not showing multiple checkboxes with Leaflet web-mapping overlays

我正在使用 Materialise 0.97.7 和 Leaflet 1.0.1(最新)

<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.1/leaflet-src.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.1/leaflet.css">

当我尝试创建一个带有多个复选框的叠加层来切换项目时,没有出现复选框,只有标签,它们用作切换,但我想要复选框或开关。如果我将 CSS cdn 切换到另一个框架,例如 Bootstrap,它们就会出现。

如果有人感兴趣,可用于脱芽的传单代码: http://leafletjs.com/reference-1.0.0.html#layergroup

// items to toggle
var myItems = new L.LayerGroup();
// bind popup to each item once checkbox is selected
L.marker([lat, lon]).bindPopup('Item').addTo(myItems);
// create overlays multi-checkbox selection
var overlays = {
    Items = myItems
};
// add overlays to the web-map
L.control.layers(null, overlays).addTo(map);

这显然不是 Leaflet 的问题,因为它可以与其他 CSS

任何人都可以提供修复程序吗?

谢谢

看起来 visual checkbox from Materialize CSS 是 Materialise CSS 在您输入的 <label> 标签中创建的工件,而实际的 <input type="checkbox" /> 被隐藏了。

这就是 Leaflet 图层控件所发生的情况:<input> 被隐藏了,但是由于 Leaflet 没有将适当的 <label> 关联到 <input>(或者至少,不是 Materialise CSS 期望的方式),Materialise CSS 没有占位符来创建视觉替换。

至于您的评论,我不确定您是否可以 "opt out" 如此轻松地从样式表中获得。在您的特定情况下,您可以尝试覆盖 Leaflet 复选框的 Materialize CSS 规则,以避免它们被隐藏起来:

input[type="checkbox"].leaflet-control-layers-selector {
  position: inherit;
  left: inherit;
  opacity: inherit;
}

演示:https://jsfiddle.net/3v7hd2vx/289/

然而,您评论的最后一部分确实可行,并且可以导致更有趣的结果:Leaflet 代码结构的优点之一是您可以很容易地扩展其 classes甚至只是重写一些方法。

例如,请参阅 Extending Leaflet: Class Theory 教程。

在你的情况下,这只需要确保有一个正确的 <label> 关联到图层控件 <input type="checkbox" />:

L.Control.Layers.include({
  _addItem: function(obj) {
    var label = document.createElement('label'),
        checked = this._map.hasLayer(obj.layer),
        input;

    if (obj.overlay) {
      input = document.createElement('input');
      input.type = 'checkbox';
      input.className = 'leaflet-control-layers-selector';
      input.defaultChecked = checked;
    } else {
      input = this._createRadioElement('leaflet-base-layers', checked);
    }

    input.layerId = L.stamp(obj.layer);

    // Create an explicit ID so that we can associate a <label> to the <input>.
    var id = input.id = 'leaflet-layers-control-layer-' + input.layerId;

    L.DomEvent.on(input, 'click', this._onInputClick, this);

    // Use a <label> instead of a <span>.
    var name = document.createElement('label');
    name.innerHTML = ' ' + obj.name;
    name.setAttribute('for', id); // Associate the <label> to the <input>.

    var holder = document.createElement('div');

    label.appendChild(holder);
    holder.appendChild(input);
    holder.appendChild(name);

    var container = obj.overlay ? this._overlaysList : this._baseLayersList;
    container.appendChild(label);

    this._checkDisabledLayers();
    return label;
  }
});

(大部分代码只是从original method复制而来,实际上只有3行插入或修改,如注释所示)

演示:https://jsfiddle.net/3v7hd2vx/288/

有了这个,您让 Materialize CSS 完成它的工作并创建复选框替换,这样结果就是您将该库包含到您的页面上所期望的结果。

使用 Materialize CSS 开关而不是复选框的演示:https://jsfiddle.net/3v7hd2vx/290/

(与上面类似的方法覆盖概念,但稍微复杂一些,因为您需要用 class 的 <div> 包裹整个 <label><input> "switch" 并添加一个额外的 "lever" 占位符)。

您可以尝试将此添加到您的 CSS

.leaflet-control-layers-overlays input[type='checkbox'] {
   display: block !important;
 }