Commandes de dépliants personnalisés

16

J'ai obtenu de l'aide pour créer un contrôle personnalisé pour Leaflet, mais j'ai toujours du mal à mettre à niveau les styles CSS utilisés par les dernières versions de Leaflet. Fondamentalement, tout ce dont j'ai besoin est une icône dans la boîte blanche, avec l'ombre portée autour d'elle.

Voici ce que j'ai travaillé jusqu'à présent, jetez un œil et n'hésitez pas à le bifurquer:

http://codepen.io/DrYSG/pen/zJsiG

Dr.YSG
la source

Réponses:

16

Je l'ai.

Pour une démonstration, regardez la démonstration de CodePen: http://codepen.io/DrYSG/pen/zJsiG

Voici les extraits JS et CSS qui effectuent le travail approprié:

L.Control.Command = L.Control.extend({
    options: {
        position: 'topleft',
    },

    onAdd: function (map) {
        var controlDiv = L.DomUtil.create('div', 'leaflet-control-command');
        L.DomEvent
            .addListener(controlDiv, 'click', L.DomEvent.stopPropagation)
            .addListener(controlDiv, 'click', L.DomEvent.preventDefault)
        .addListener(controlDiv, 'click', function () { MapShowCommand(); });

        var controlUI = L.DomUtil.create('div', 'leaflet-control-command-interior', controlDiv);
        controlUI.title = 'Map Commands';
        return controlDiv;
    }
});

L.control.command = function (options) {
    return new L.Control.Command(options);
};

et le CSS:

.leaflet-control-command-interior
{
    background-image: url(images/command.png);
    width: 20px;
    height: 20px;
    background-position: 50% 50%;
    background-repeat: no-repeat;
    display: block;
    padding: 3px;
    border-radius: 4px;
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    box-shadow: 0 1px 7px rgba(0, 0, 0, 0.65);
    cursor: auto;
    text-align: center;
    background-color: #FFFFFF;
}

.leaflet-control-command-interior:hover
{
    background-color: #F4F4F4;
}
Dr.YSG
la source
Tout comme un commentaire, le plugin de bouton facile ferait une bonne référence pour cela à l'avenir.
Jason Scheirer
hé, je ne peux pas voir la démo sur codepen ( codepen.io/DrYSG/pen/zJsiG ).
Kedar.Aitawdekar
Oui, il a été supprimé. Mais le code devrait fonctionner pour vous.
Dr.YSG
8

Comme la réponse de Dr.YSG mais en utilisant les classes CSS Leaflet.draw:

L.Control.RemoveAll = L.Control.extend(
{
    options:
    {
        position: 'topleft',
    },
    onAdd: function (map) {
        var controlDiv = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
        L.DomEvent
            .addListener(controlDiv, 'click', L.DomEvent.stopPropagation)
            .addListener(controlDiv, 'click', L.DomEvent.preventDefault)
        .addListener(controlDiv, 'click', function () {
            drawnItems.clearLayers();
        });

        var controlUI = L.DomUtil.create('a', 'leaflet-draw-edit-remove', controlDiv);
        controlUI.title = 'Remove All Polygons';
        controlUI.href = '#';
        return controlDiv;
    }
});
var removeAllControl = new L.Control.RemoveAll();
map.addControl(removeAllControl);
SpiderWan
la source
oui, ça marche aussi.
Dr.YSG
Fab, juste ce que je cherchais
Fiona - myaccessible.website
2

Oui, le bouton facile est également une bonne idée. J'ai revisité cela récemment, et j'ai créé ce module RequireJS (AMD) qui permet de paramétrer le placement (non seulement dans le coin, mais à un emplacement exact) et il récupère également le contenu HTML du document HTML, puis les arrache du DOM et le place dans le contrôle. Vous pouvez simplifier cela si vous le souhaitez.

pour appeler exécuter quelque chose comme ça et il va créer une nouvelle instance:

var zoomIn = new Button(map);
zoomIn.setup('zControl', 'zoomInCtrl', Config.ZinTop, Config.ZinLeft, "zoomIn");

...

define(['jquery', 'leaflet', 'Config', 'Tools'], function ($, L, Config, Tools) {
    function Button(Map, className, id, top, left) {
        var self = this;
        self.bbox = null;
        self.Map= Map;
        self.top = top;
        self.left = left;
        self.action = null;

        self.setup = function (className, id, top, left, action) {
            var button = L.control({
                position: 'bottomleft'
            });
            self.action = action;
            button.onAdd = function (map) {
                var box = L.DomUtil.create('div', className);
                box.innerHTML = $("#" + id).html();
                $("#" + id).remove();
                $(box).attr("id", id);
                $(box).css("position", "fixed");
                $(box).css("top", top);
                $(box).css("left", left);
                self.bbox = box;
                return box;
            };
            self.Map.MAP.addControl(button);
        }

        self.hit = function (cmd) {
            var rect = self.bbox.getBoundingClientRect();
            var box = { top: rect.top, bottom: rect.bottom, left: rect.left, right: rect.right };
            var target = Tools.outset(box, Config.ButtonOutset);
            var hit = Tools.contains(Tools.cmdToPoint(cmd), target);
            return hit;
        }

        self.pick = function (cmd) {
            $(self.bbox).addClass("large");
        }

        self.unpick = function () {
            $(self.bbox).removeClass("large");
        }

        self.invoke = function (cmd) {
            self.Map[self.action]();
        }
    }
    return Button;
});
Dr.YSG
la source
0

On dirait que Leaflet.EasyButton a été mentionné ci-dessus, mais voici un exemple de code:

var myImage = '<img class="button-image" src="image-for-icon.jpg"/>';

L.easyButton( myImage, function(btn,map){ 
    // your stuff to do 'on click' 
}, 'title for the button').addTo(map);

et quelques css:

.button-image{
  display: block;
  height: auto;
  margin: auto;
  max-width: 100%;
}

et un tas de démos si vous en cherchez plus.

user3276552
la source