Controlli opuscoli personalizzati


16

Ho avuto un po 'di aiuto nella creazione di un controllo personalizzato per il volantino, ma ho ancora problemi ad aggiornare gli stili CSS utilizzati dalle ultime versioni di Leaflet. Fondamentalmente, tutto ciò di cui ho bisogno è un'icona nella casella bianca, con l'ombra esterna attorno ad essa.

Ecco cosa ho lavorato finora, dai un'occhiata e sentiti libero di rovesciarlo:

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

Risposte:


16

Fatto.

Per una demo guarda la demo di CodePen: http://codepen.io/DrYSG/pen/zJsiG

Ecco i frammenti JS e CSS che svolgono il lavoro rilevante:

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

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

Proprio come un commento, il semplice plug-in per pulsanti sarebbe un buon riferimento per questo in futuro.
Jason Scheirer,

ehi, non riesco a vedere la demo su codepen ( codepen.io/DrYSG/pen/zJsiG ).
Kedar.Aitawdekar,

Sì, è stato rimosso. Ma il codice dovrebbe funzionare per te.
Dr.YSG,

8

Come la risposta di Dr.YSG ma usando le classi 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);

sì, anche quello funziona.
Dr.YSG,

Favoloso, proprio quello che stavo cercando
Fiona - myaccessible.website

2

Sì, anche il pulsante facile è una buona idea. L'ho rivisitato di recente e ho creato questo modulo RequireJS (AMD) che consente di parametrizzare il posizionamento (non solo nell'angolo, ma in una posizione esatta) e inoltre recupera il contenuto HTML dal documento HTML, quindi lo strappa del DOM e lo sottopone al controllo. Puoi semplificarlo se vuoi.

per invocare eseguire qualcosa del genere e creerà una nuova istanza:

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

Sembra che Leaflet.EasyButton sia stato menzionato sopra, ma ecco alcuni esempi di codice:

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

e alcuni css:

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

e un sacco di demo se stai cercando di più.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.