Google Maps: Làm cách nào để tạo một InfoWindow tùy chỉnh?


99

Google Maps InfoWindow mặc định cho một điểm đánh dấu bản đồ rất tròn. Làm cách nào để tạo một InfoWindow tùy chỉnh với các góc vuông?


Tôi đã cập nhật câu trả lời của mình bằng một liên kết đến một thứ gì đó có vẻ khá tùy chỉnh. Bạn có thể chọn bán kính của riêng mình và các cài đặt khác.
Drew Noakes

Kiểm tra câu trả lời này cho một ví dụ về việc tạo ra một InfoBoxes tùy chỉnh
Don Vaughn

Câu trả lời:


83

CHỈNH SỬA Sau khi tìm kiếm xung quanh, đây có vẻ là lựa chọn tốt nhất:

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

Bạn có thể xem phiên bản tùy chỉnh của InfoBubble này mà tôi đã sử dụng trên Dive Seven, một trang web để ghi nhật ký lặn biển trực tuyến . Nó trông như thế này:


Có một số ví dụ khác ở đây . Tuy nhiên, chúng chắc chắn không đẹp như ví dụ trong ảnh chụp màn hình của bạn.


1
@TWilly, cảm ơn. Dự án đã chuyển sang GitHub. Tôi đã cập nhật các URL.
Drew Noakes

Vui lòng cập nhật các liên kết và bản đồ demo của bạn vì chúng không hoạt động.
MrUpsidown

17

Bạn có thể sửa đổi toàn bộ InfoWindow chỉ bằng jquery ...

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

Tại đây, phần tử <p> sẽ hoạt động như một móc nối vào InfoWindow thực tế. Khi phần tử đã được kích hoạt, phần tử sẽ trở nên hoạt động và có thể truy cập bằng cách sử dụng javascript / jquery, chẳng hạn như $('#hook').parent().parent().parent().parent().

Đoạn mã dưới đây chỉ đặt đường viền 2 pixel xung quanh InfoWindow.

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

Bạn có thể làm bất cứ điều gì như thiết lập một lớp CSS mới hoặc chỉ thêm một phần tử mới.

Chơi xung quanh với các yếu tố để có được những gì bạn cần ...


4
Đây là một bản hack bẩn có thể ngừng hoạt động bất cứ lúc nào!
billy

2
hack - chắc chắn. thiên tài - hoàn toàn!
Nick Mitchell

1
Một ID cho một phần tử chắc chắn sẽ được lặp lại trong trang, đó không phải là một phương pháp hay. ID phải là duy nhất trong trang.
Philippe Lavoie

@PhilippeLavoie Bạn có thể thêm số lượng vào id mỗi khi bạn tạo một infowindow mới.
ATOzTOA

8

Tôi thấy InfoBox hoàn hảo để tạo kiểu nâng cao.

InfoBox hoạt động giống như google.maps.InfoWindow , nhưng nó hỗ trợ một số thuộc tính bổ sung để tạo kiểu nâng cao. Một InfoBox cũng có thể được sử dụng làm nhãn bản đồ. InfoBox cũng kích hoạt các sự kiện tương tự như google.maps.InfoWindow .

Bao gồm http://code.google.com/p/google-maps-utility-library-v3/source/browse/trunk/infobox/src/infobox.js trong trang của bạn


3
Liên kết của bạn đã chết.
Netsi1964

5

Tạo kiểu cho infowindow khá đơn giản với javascript vani. Tôi đã sử dụng một số thông tin từ chủ đề này khi viết bài này. Tôi cũng đã tính đến các vấn đề có thể xảy ra với các phiên bản trước đó của ie (mặc dù tôi chưa thử nghiệm nó với chúng).

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

Mã tạo infowindow như bình thường (không cần plugin, lớp phủ tùy chỉnh hoặc mã lớn), sử dụng div có id để giữ nội dung. Điều này cung cấp một hook trong hệ thống mà chúng ta có thể sử dụng để lấy các phần tử chính xác để thao tác với một biểu định kiểu đơn giản bên ngoài.

Có một vài phần bổ sung (không hoàn toàn cần thiết) xử lý những thứ như đưa một cái móc vào div với hình ảnh cửa sổ thông tin đóng trong đó.

Vòng lặp cuối cùng ẩn tất cả các phần của mũi tên con trỏ. Bản thân tôi cần điều này vì tôi muốn minh bạch trên infowindow và mũi tên đã cản đường. Tất nhiên, với hook, việc thay đổi mã để thay thế hình ảnh mũi tên bằng png mà bạn chọn cũng khá đơn giản.

Nếu bạn muốn thay đổi nó thành jquery (không biết tại sao bạn lại làm như vậy) thì điều đó sẽ khá đơn giản.

Tôi thường không phải là nhà phát triển javascript nên mọi suy nghĩ, nhận xét, phê bình đều được hoan nghênh :)


1
Tôi không biết bạn đã nghe chưa, nhưng có những thứ mới này được gọi là "enter" và "space" thực sự tạo ra khoảng trống khi bạn viết trên máy tính. Điển hình là hữu ích khi viết những thứ như mã để đôi mắt của bạn không chảy máu ra từ cố gắng để đọc nó :)
Chrillewoodz

4

Đoạn mã dưới đây có thể giúp bạn.

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

Đây là một bài viết < Cách định vị nhiều địa chỉ trên google maps với khả năng thu phóng hoàn hảo > đã giúp tôi đạt được điều này. Bạn có thể tham khảo nó để biết liên kết JS Fiddle hoạt động và ví dụ đầy đủ.


2

Tôi không chắc FWIX.com đang làm việc đó cụ thể như thế nào, nhưng tôi cá rằng họ đang sử dụng Lớp phủ tùy chỉnh .


OVerlay tùy chỉnh có tất cả các thuộc tính giống như một điểm đánh dấu bản đồ google thông thường không? Có nghĩa là, tôi vẫn có thể thực hiện setIcon, setZIndex, v.v. với Lớp phủ tùy chỉnh HOẶC tôi có phải triển khai lại tất cả chức năng đó không?
SarahBeale

Không, lớp phủ tùy chỉnh chỉ cho phép chức năng cơ bản hiển thị trên bản đồ, nếu bạn muốn setIcon, setZindex, v.v., bạn sẽ phải tự triển khai chúng.
Timothy Groote

2

Bạn có thể sử dụng mã bên dưới để loại bỏ thông tin phong cách mặc định. Sau khi bạn có thể sử dụng mã HTML cho inforwindow:

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

loại bỏ inforwindows mặc định phong cách - giải pháp tốt nhất trên tất cả các SO cho bây giờ
djdance

1

Đây là một giải pháp CSS thuần túy dựa trên ví dụ infowindow hiện tại trên google:

https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple

#map *{
  overflow: visible;
}
#content{
  display: block;
  position: absolute;
  bottom: -8px;
  left: -20px;
  background-color: white;
  z-index: 10001;
}

Đây là một giải pháp nhanh sẽ hoạt động tốt cho các cửa sổ thông tin nhỏ. Đừng quên bình chọn nếu nó có ích: P


1

Bạn thậm chí có thể nối thêm lớp css của riêng mình trên vùng chứa / canvas bật lên hoặc theo cách bạn muốn. Các bản đồ google hiện tại 3.7 có các cửa sổ bật lên được tạo kiểu bằng phần tử canvas sẽ thêm vào vùng chứa div cửa sổ bật lên trong mã. Vì vậy, tại googlemaps 3.7 Bạn có thể tham gia vào quá trình kết xuất bằng sự kiện đã có sẵn của cửa sổ bật lên như sau:

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 không có trong IE8- vì vậy nếu bạn muốn làm cho nó hoạt động tại đó, hãy làm theo điều này .

kiểm tra tham chiếu InfoWindow mới nhất để biết các sự kiện và hơn thế nữa ..

Tôi thấy điều này sạch sẽ nhất trong một số trường hợp.


0

Tôi nghĩ câu trả lời hay nhất mà tôi nghĩ ra là ở đây: https://codepen.io/sentrathis96/pen/yJPZGx

Tôi không thể ghi nhận điều này, tôi đã chuyển cái này từ một người dùng codepen khác để sửa lỗi phụ thuộc vào bản đồ google để thực sự tải

Ghi lại cuộc gọi tới:

InfoWindow() // constructor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.