Google지도 : 사용자 지정 InfoWindow를 만드는 방법은 무엇입니까?


99

지도 마커의 기본 Google Maps InfoWindow는 매우 둥글다. 정사각형 모서리가있는 사용자 지정 InfoWindow를 만들려면 어떻게합니까?


나는 꽤 커스터마이징 가능한 것으로 보이는 링크로 내 대답을 업데이트했습니다. 자신의 반경 및 기타 설정을 선택할 수 있습니다.
Drew Noakes

이 답변을 확인 사용자 정의 InfoBoxes를 만드는 또 다른 예를 들면
돈 본이에게

답변:


83

편집 약간의 사냥 후, 이것이 최선의 선택 인 것 같습니다.

https://github.com/googlemaps/js-info-bubble/blob/gh-pages/examples/example.html

온라인 스쿠버 다이빙 로깅을위한 웹 사이트 인 Dive Seven에서 사용한이 InfoBubble의 사용자 지정 버전을 볼 수 있습니다 . 다음과 같이 보입니다.


여기에 몇 가지 예가 더 있습니다 . 그러나 스크린 샷의 예만큼 멋지지는 않습니다.


1
@TWilly, 감사합니다. 프로젝트가 GitHub로 이동되었습니다. URL을 업데이트했습니다.
Drew Noakes

링크와 데모 맵이 작동하지 않으므로 업데이트하십시오.
MrUpsidown

17

jquery 만 사용하여 전체 InfoWindow를 수정할 수 있습니다.

var popup = new google.maps.InfoWindow({
    content:'<p id="hook">Hello World!</p>'
});

여기서 <p> 요소는 실제 InfoWindow에 대한 후크 역할을합니다. domready가 실행되면 요소가 활성화되고 javascript / jquery를 사용하여 액세스 할 수 있습니다 $('#hook').parent().parent().parent().parent().

아래 코드는 InfoWindow 주위에 2 픽셀 테두리를 설정합니다.

google.maps.event.addListener(popup, 'domready', function() {
    var l = $('#hook').parent().parent().parent().siblings();
    for (var i = 0; i < l.length; i++) {
        if($(l[i]).css('z-index') == 'auto') {
            $(l[i]).css('border-radius', '16px 16px 16px 16px');
            $(l[i]).css('border', '2px solid red');
        }
    }
});

새 CSS 클래스를 설정하거나 새 요소를 추가하는 것과 같은 모든 작업을 수행 할 수 있습니다.

필요한 것을 얻기 위해 요소를 가지고 놀아보세요 ...


4
이것은 언제든지 작동을 멈출 수있는 더러운 해킹입니다!
billy

2
해킹-물론입니다. 천재-절대!
Nick Mitchell

1
페이지에서 반드시 반복 될 요소의 ID는 좋은 습관이 아닙니다. ID는 페이지에서 고유해야합니다.
Philippe Lavoie 2014

@PhilippeLavoie 새 정보창을 만들 때마다 ID에 개수를 추가 할 수 있습니다.
ATOzTOA

8

고급 스타일링에 딱 맞는 InfoBox를 찾았습니다.

InfoBox는 google.maps.InfoWindow 처럼 작동 하지만 고급 스타일 지정을위한 몇 가지 추가 속성을 지원합니다. InfoBox를지도 레이블로 사용할 수도 있습니다. InfoBox는 또한 google.maps.InfoWindow 와 동일한 이벤트를 발생시킵니다 .

페이지에 http://code.google.com/p/google-maps-utility-library-v3/source/browse/trunk/infobox/src/infobox.js 포함


3
당신의 링크는 죽었습니다.
Netsi1964

5

정보창의 스타일링은 바닐라 자바 ​​스크립트를 사용하면 매우 간단합니다. 이 글을 작성할 때이 스레드의 정보 중 일부를 사용했습니다. 나는 또한 이전 버전의 가능한 문제를 고려했습니다 (비록 테스트하지는 않았지만).

var infowindow = new google.maps.InfoWindow({
  content: '<div id="gm_content">'+contentString+'</div>'
});

google.maps.event.addListener(infowindow,'domready',function(){
  var el = document.getElementById('gm_content').parentNode.parentNode.parentNode;
  el.firstChild.setAttribute('class','closeInfoWindow');
  el.firstChild.setAttribute('title','Close Info Window');
  el = (el.previousElementSibling)?el.previousElementSibling:el.previousSibling;
  el.setAttribute('class','infoWindowContainer');
  for(var i=0; i<11; i++){
    el = (el.previousElementSibling)?el.previousElementSibling:el.previousSibling;
    el.style.display = 'none';
  }
});

코드는 콘텐츠를 보유하기 위해 ID가있는 div를 사용하여 평소와 같이 정보창을 생성합니다 (플러그인, 맞춤 오버레이 또는 거대한 코드 필요 없음). 이것은 간단한 외부 스타일 시트로 조작 할 올바른 요소를 가져 오는 데 사용할 수있는 시스템에 후크를 제공합니다.

정보 창 닫기 이미지가있는 div에 후크를 제공하는 것과 같은 작업을 처리하는 몇 가지 추가 부분 (엄격히 필요하지는 않음)이 있습니다.

마지막 루프는 포인터 화살표의 모든 부분을 숨 깁니다. 정보 창에 투명성을 원했고 화살표가 방해가 되었기 때문에 직접 필요했습니다. 물론 후크를 사용하여 화살표 이미지를 원하는 png로 바꾸는 코드를 변경하는 것도 매우 간단해야합니다.

jquery로 변경하려면 (왜 그런지 모르겠습니다) 상당히 간단해야합니다.

나는 일반적으로 자바 스크립트 개발자가 아니므로 모든 생각, 의견, 비판을 환영합니다 :)


1
들어 본 적이 있는지 모르겠지만 컴퓨터에 글을 쓸 때 실제로 공간을 만드는 "입력"과 "공간"이라는 새로운 것이 있습니다. 코드로 물건을 작성할 때 일반적으로 유용 눈이 :)을 읽으려고으로부터 피하지 않도록
Chrillewoodz

4

아래 코드가 도움이 될 수 있습니다.

var infowindow = new google.maps.InfoWindow();
 google.maps.event.addListener(marker, 'mouseover', (function(marker) {
            return function() {
                var content = address;
                infowindow.setContent(content);
                infowindow.open(map, marker);
            }
          })(marker));

여기에 < 완벽한 확대 / 축소로 Google지도에서 여러 주소를 찾는 방법 >이라는 기사가 있습니다. 작동하는 JS Fiddle 링크 및 전체 예제에 대해 참조 할 수 있습니다.


2

FWIX.com이 구체적으로 어떻게하는지 잘 모르겠지만, 그들이 Custom Overlays를 사용하고 있다고 내기하겠습니다 .


Custom OVerlay에는 일반 Google지도 마커와 동일한 속성이 모두 있습니까? , 난 아직도의 setIcon 할 수있는 의미 setZIndex 등 사용자 정의 오버레이 또는 내가해야합니까 그 모든 기능을 다시 구현?
SarahBeale

아니요, 맞춤 오버레이는지도에서 렌더링의 기본 기능 만 허용합니다. setIcon, setZindex 등을 원하는 경우 직접 구현해야합니다.
디모데 그루

2

아래 코드를 사용하여 스타일 기본 창을 제거 할 수 있습니다. inforwindow에 HTML 코드를 사용할 수 있습니다.

var inforwindow = "<div style="border-radius: 50%"><img src='URL'></div>"; // show inforwindow image circle
marker.addListener('click', function() {
    $('.gm-style-iw').next().css({'height': '0px'}); //remove arrow bottom inforwindow
    $('.gm-style-iw').prev().html(''); //remove style default inforwindows
});

스타일 기본 정보 제거-지금은 모든 SO에서 최고의 솔루션
djdance


1

팝업 컨테이너 / 캔버스 또는 원하는 방법에 자신의 CSS 클래스를 추가 할 수도 있습니다. 현재 Google지도 3.7에는 코드에서 팝업 div 컨테이너를 앞에 추가하는 캔버스 요소로 스타일이 지정된 팝업이 있습니다. 따라서 googlemaps 3.7에서 다음과 같은 팝업의 domready 이벤트를 통해 렌더링 프로세스를 시작할 수 있습니다.

var popup = new google.maps.InfoWindow();
google.maps.event.addListener(popup, 'domready', function() {
  if (this.content && this.content.parentNode && this.content.parentNode.parentNode) {
    if (this.content.parentNode.parentNode.previousElementSibling) {
      this.content.parentNode.parentNode.previousElementSibling.className = 'my-custom-popup-container-css-classname';
    }
  }
});

element.previousElementSibling은 IE8에 존재하지 않으므로 작동하게 하려면 다음을 따르십시오 .

이벤트 등에 대한 최신 InfoWindow 참조확인하십시오 .

어떤 경우에는 이것이 가장 깨끗하다는 것을 알았습니다.


0

내가 생각 해낸 가장 좋은 대답은 여기에 있다고 생각합니다 : https://codepen.io/sentrathis96/pen/yJPZGx

나는 이것에 대해 신용을 얻을 수 없습니다. 실제로로드하기 위해 Google지도 종속성을 수정하기 위해 다른 코드 펜 사용자로부터 이것을 포크했습니다.

다음에 대한 전화를 기록해 둡니다.

InfoWindow() // constructor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.