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

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;
}

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);

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;
});

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.