Broşür işaretleyicide açılır pencere konumu değiştiriliyor mu?


14

Leaflet'teki işaretçi simgesimin alt kısmında bir açılır pencere açmak istiyorum.

kodum:

var mymap = L.map('mapid').setView([51.505, -0.09], 13);

L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw', {
    maxZoom: 18,
    attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
    '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
    'Imagery © <a href="http://mapbox.com">Mapbox</a>',
    id: 'mapbox.streets'
}).addTo(mymap);

var lati = 51.51;
var longi = -0.09;

var popupLocation1 = new L.LatLng(lati, longi);
var popupContent1 = 'This is a nice popup';

popup1 = new L.Popup();
popup1.setLatLng(popupLocation1);
popup1.setContent(popupContent1);

var m1 = L.marker([ lati, longi ]).addTo(mymap);

m1.bindPopup(popup1);

m1.openPopup();

Bu yüzden işaretleyicimin üstünde bir açılır pencere var.

Aşağıdaki gibi bir pop-up almak istiyorum:

resim açıklamasını buraya girin



bağlantınızda hiçbir çalışma çözümü yoktur. Belki de yorum doğrudur: "Yapabileceğiniz şey, işaretçiyi tıklamak ve özel kodla kendi pop-up'ınızı çizmektir" Alt pop-up için basit bir yol yok mu?
Gerd

1
Mevcut durum, işaretçinin altındaki açılır pencere ile ilgili sorunuzla ilgili artwork21'in yorum bağlantısında olduğu gibidir. Önerilen eklenti ile FranceImage'ın cevabına ( stackoverflow.com/a/27144900/5108796 ) bakın . Bu eklentiyi kullanabilir veya kendi özel açılır pencerenizi oluşturmak için ilham alabilirsiniz.
16:38 de ghybs

Açılır pencerenin kendisinin CSS konumlandırmasında yapamaz mıyız? Varsayılan olarak alttan referans alan budur, eğer üste geçersek, seçilen yazı tiplerine / yazı tiplerine / satır yüksekliklerine ve metin satır sayısına bakılmaksızın [sabit bir ofsete kadar] doğru olur mu? Muhtemelen bir şeye bakmıyorum.
user3445853

Yanıtlar:


4

Ofsetleri popupAnchorseçenekleri kullanarak belirtebilirsiniz , ancak beklediğiniz yerde değil. İlk olarak, böyle bir simge belirtmeniz gerekir:

var myIcon = L.divIcon({ popupAnchor: [0, -30] });

Daha sonra işaretçi seçeneklerinizde bu simgeyi kullanabilirsiniz:

var marker = L.marker(location, {
                 icon: myIcon
             }).bindPopup(function (marker) {...}); //Shortened

Artık pop-up pencereniz işaretçinizin 30 piksel üzerinde açılıyor. Bu, küçük popish üçgeni pop-up'ınızın üstüne yerleştirmeniz gerektiği için tam olarak ne istediğinizi değil, ama yine de bahsetmeye değer olduğunu düşünüyorum.


@Johannes'in en yeni [29 Ağu 2019] cevabı ile aynı sorun: Bu ofset, açılır pencerede ikinci veya daha fazla metin satırı olduğu kadar hızlı; veya CSS'deki değişiklikler (yazı tipi boyutu, yazı tipi, satır yüksekliği, dolgu, kenar boşluğu, açılır pencere boyutu, ...). Bu nedenle orijinal cevap "doğal çözüm yoktur" anlamına gelir.
user3445853


3

Bunun eski bir soru olduğunu biliyorum, ama cevabında açıklanan @Robert yolunu almanıza gerek yok.

PopupDevralındığı gibi , DivOverlayofset seçeneğini doğrudan başlatırken ayarlayabilirsiniz Popup:

    var popup = L.popup({
        offset: [0, -30]
    })
      .setLatLng(location)
      .setContent("Test Text")
      .openOn(mapId);

Dokümanları okuyun: https://leafletjs.com/reference-1.5.0.html#popup


Bu yaklaşımla ilgili sorun, ofset için sihirli sayılara sahip olmanızdır: Yazı tipi boyutu veya yazı tipi veya hatta satır yüksekliği değişirse, ofset kötüdür. Daha problemli olarak, bazı pop-up pencereler ikinci (veya üçüncü vb.) Bir metin satırı içeriyorsa, şimdi tam satır yüksekliği (veya iki vb.) Çok yüksektir ve muhtemelen işaretleyiciyle ve çevresiyle tamamen örtüşmektedir. Büyük olasılıkla pop-up içindeki metnin yüksekliğini ölçmeniz ve ofseti dinamik olarak değiştirmeniz ve oluşturma sırasında / sonrasında JS kullanarak taşımanız gerekir; veya çok sabit bir CSS'ye sahip olun ve işaretçiyi eklemeden önce broşür haritanız sırasında hesaplayın.
user3445853

1

Bu sadece CSS'de mümkün görünüyor. Aşağıda !importantyalnızca üç CSS öğesini geçersiz kılıyorum ve bir :beforesözde öğe ekliyorum . Aslında ilk önce pop-up'ı alt yerine üst kısım ile sıralıyorum , burada 55px sadece seçtiğiniz işaretleyiciye ve kişisel zevkinize bağlı.

Sonra pop-up "ipucu" aşağıdan aşağıya hareket top:0pxve "normal" hile kullanarak yapılan olmadığını keşfetmek (yani: kabarcık kenarındaki ilk pozisyon kalın şeffaf kenarlık 0x0 boyutlu sahte bir öğe, sonra renk öğenin işaret etmek istediğiniz yerin zıt sınırı; bizim durumumuzda alt kenarlık). Bunun yerine, sol üst köşeden döndürülmüş bir dikdörtgenden yapılmış gibi görünüyor (belki: çünkü tarayıcıyı GPU'yu kullanmaya zorlar ve bu nedenle her şeyi hızlandırır?) Ve noktayı yeterince almıyorum (pun) benim ipucu doğru yerde ama görünmez); bu yüzden sadece yanlış yerde olan kutu gölgesini kaldırıyorum ve her şeyi olduğu gibi bırakıyorum --- "eski ipucunu" anlayan herkes bunu ayarlayın.

Bunun yerine, "normal" işlemle kendi ipucumu oluşturuyorum (emin değilseniz, 3x şeffaf ve 1x beyaz yerine aşağıdaki dört kenar rengini değiştirin --- örneğin border-bottom-color: blue; border-left-color: green; border-top-color: yellow' border-right-color: red).

#map {
   position: absolute;
   top: 0;
   right: 0;
   left: 0;
   bottom: 0;
   z-index: 0;
}
.leaflet-popup {top: 55px !important;}
/* Here I move the "tip" to the right location, but didn't succeed in making it visible. So I just remove the box-shadow and leave it: */
.leaflet-popup-tip-container {
   top: 0px !important;
}
.leaflet-popup-tip {
   box-shadow: none !important;
}
.leaflet-popup:before 
    {
    content: "";
    position: absolute;
    border: 13px solid transparent;
    border-bottom-color: white;
    bottom: 0px;
    margin-left: -13px;
}

Gibi bu JSFiddle gösteriyor, her iki işaretleri farklı açılır-boyutları ile hiçbir sorun (farklı genişlik, farklı textHeight) çalışırsanız.

Tüm bunlar, geçersiz kıldığım öğelerin değişmesi muhtemel olmadığından, Leaflet'deki güncellemelere karşı sağlam görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.