จัดแต่งทรงผม Google Maps InfoWindow


คำตอบ:


120

Google เขียนโค้ดเพื่อช่วยในเรื่องนี้ นี่คือตัวอย่างบางส่วน: ตัวอย่างการใช้ InfoBubble , เครื่องหมายสไตล์และหน้าต่างข้อมูลกำหนดเอง (โดยใช้ OverlayView)

โค้ดในลิงก์ด้านบนใช้เส้นทางที่แตกต่างกันเพื่อให้ได้ผลลัพธ์ที่คล้ายกัน ความสำคัญของมันคือการจัดรูปแบบ InfoWindows โดยตรงนั้นไม่ใช่เรื่องง่ายและอาจจะง่ายกว่าที่จะใช้คลาส InfoBubble เพิ่มเติมแทน InfoWindow หรือเพื่อแทนที่ GOverlay อีกทางเลือกหนึ่งคือการแก้ไของค์ประกอบของ InfoWindow โดยใช้ javascript (หรือ jQuery) เช่นที่ ATOzTOA แนะนำในภายหลัง

อาจเป็นไปได้ว่าตัวอย่างที่ง่ายที่สุดคือการใช้ InfoBubble แทน InfoWindow InfoBubble สามารถใช้ได้โดยการนำเข้าไฟล์นี้ (ซึ่งคุณควรโฮสต์ด้วยตัวเอง):http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobubble/src/infobubble.js

หน้าโครงการ Github InfoBubble ของ

InfoBubble นั้นเก๋มากเมื่อเทียบกับ InfoWindow:

 infoBubble = new InfoBubble({
      map: map,
      content: '<div class="mylabel">The label</div>',
      position: new google.maps.LatLng(-32.0, 149.0),
      shadowStyle: 1,
      padding: 0,
      backgroundColor: 'rgb(57,57,57)',
      borderRadius: 5,
      arrowSize: 10,
      borderWidth: 1,
      borderColor: '#2c2c2c',
      disableAutoPan: true,
      hideCloseButton: true,
      arrowPosition: 30,
      backgroundClassName: 'transparent',
      arrowStyle: 2
});

infoBubble.open();

คุณยังสามารถเรียกใช้แผนที่และเครื่องหมายที่กำหนดเพื่อเปิด:

infoBubble.open(map, marker);

เป็นอีกตัวอย่างหนึ่งตัวอย่างหน้าต่างข้อมูลที่กำหนดเองขยายคลาส GOverlay จาก Google Maps API และใช้สิ่งนี้เป็นฐานในการสร้างหน้าต่างข้อมูลที่ยืดหยุ่นมากขึ้น ขั้นแรกจะสร้างคลาส:

/* An InfoBox is like an info window, but it displays
 * under the marker, opens quicker, and has flexible styling.
 * @param {GLatLng} latlng Point to place bar at
 * @param {Map} map The map on which to display this InfoBox.
 * @param {Object} opts Passes configuration options - content,
 *   offsetVertical, offsetHorizontal, className, height, width
 */
function InfoBox(opts) {
  google.maps.OverlayView.call(this);
  this.latlng_ = opts.latlng;
  this.map_ = opts.map;
  this.offsetVertical_ = -195;
  this.offsetHorizontal_ = 0;
  this.height_ = 165;
  this.width_ = 266;

  var me = this;
  this.boundsChangedListener_ =
    google.maps.event.addListener(this.map_, "bounds_changed", function() {
      return me.panMap.apply(me);
    });

  // Once the properties of this OverlayView are initialized, set its map so
  // that we can display it.  This will trigger calls to panes_changed and
  // draw.
  this.setMap(this.map_);
}

หลังจากนั้นจะดำเนินการแทนที่ GOverlay:

InfoBox.prototype = new google.maps.OverlayView();

จากนั้นคุณควรแทนที่วิธีการที่คุณต้องการ: createElement, draw, และremove panMapมันค่อนข้างมีส่วนร่วม แต่ในทางทฤษฎีตอนนี้คุณแค่วาด div บนแผนที่ด้วยตัวเองแทนที่จะใช้หน้าต่างข้อมูลปกติ


@ShyamK นี่คือคำถามเกี่ยวกับการจัดรูปแบบหน้าต่างข้อมูล KMLซึ่งอาจช่วยคุณได้ ฉันคิดว่าหลายตัวอย่างในคำตอบของฉันอาจใช้ไม่ได้กับ KML (ฉันไม่แน่ใจ) แต่ก็สามารถปรับเปลี่ยนให้ใช้งานได้ในกรณีนั้นเช่นกัน
Herman Schaaf

11
ควรสังเกตว่าลิงก์ใดลิงก์หนึ่งของคุณที่นี่เป็นตัวอย่างของอ็อบเจ็กต์ InfoBox (หน้าต่างข้อมูลประเภทอื่น) ไม่ใช่อ็อบเจ็กต์ InfoWindow (หน้าต่างข้อมูล Google ดั้งเดิม) สิ่งที่ควรทราบหากคุณกำลัง googling และอาจสับสนว่าทำไมคุณถึงพบ InfoBox () ใหม่และ InfoWindow () ใหม่ได้ InfoBox เป็นรุ่นใหม่กว่าและง่ายกว่าในการปรับแต่ง IMO และยังมีอีกมากมายที่คุณสามารถปรับแต่งได้ อีกตัวอย่างหนึ่งที่สามารถเห็นได้ในคำตอบ SO นี้
Don Vaughn

1
โอ้ไม่คนสุดท้ายก็ไม่ใช่: นั่นเกี่ยวกับ infoBox ด้วย
matteo

ดีนี่คือสิ่งที่ฉันกำลังมองหาฉันจะเพิ่มปุ่มปิดได้อย่างไร?
Yusuf1494

36

คุณสามารถแก้ไข InfoWindow ทั้งหมดโดยใช้ jquery เพียงอย่างเดียว ...

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

ที่นี่ <p> องค์ประกอบจะทำหน้าที่เป็นตะขอใน InfoWindow จริง เมื่อ Domready เริ่มทำงานองค์ประกอบจะทำงานและเข้าถึงได้โดยใช้ javascript / jquery เช่น$('#hook').parent().parent().parent().parent()เช่น

โค้ดด้านล่างจะกำหนดเส้นขอบ 2 พิกเซลรอบ ๆ 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');
        }
    }
});

คุณสามารถทำอะไรก็ได้เช่นตั้งค่าคลาส CSS ใหม่หรือเพียงแค่เพิ่มองค์ประกอบใหม่

เล่นกับองค์ประกอบต่างๆเพื่อให้ได้สิ่งที่คุณต้องการ ...


4
สิ่งนี้ใช้ได้กับฉัน (โดยมีผู้ปกครองน้อยกว่าหนึ่งคน) และใช้งานเบราว์เซอร์ acorss (โอเปร่า, ff, เช่นซาฟารี, โครเมี่ยม) แต่ไม่ทำงานด้านล่าง IE9
johntrepreneur

อุปกรณ์ประกอบฉากสำหรับรวมรหัสพิเศษบางอย่างที่ฉันกำลังมองหาวิธีใช้ ขอบคุณ
MetalPhoenix

ฉันได้รับ 'ไม่ได้กำหนดป๊อปอัป' เมื่อฉันรวมไว้ในเอกสาร (พร้อม) ในหน้าต่าง (โหลด) หรือถ้าฉันวางลงในคอนโซลโดยตรงเมื่อโหลดหน้า ฉันไม่มีไฟล์ js ภายนอกหรืออะไร?
user1380540

นี่ไม่ใช่ความคิดที่ดีเนื่องจากโลจิสติกส์การแสดงผลแผนที่ Google ไม่ได้เป็นแบบถาวร ใช้ป๊อปอัปแทน: developers.google.com/maps/documentation/javascript/examples/…
Ali Sheikhpour

5
google.maps.event.addListener(infowindow, 'domready', function() {

    // Reference to the DIV that wraps the bottom of infowindow
    var iwOuter = $('.gm-style-iw');

    /* Since this div is in a position prior to .gm-div style-iw.
     * We use jQuery and create a iwBackground variable,
     * and took advantage of the existing reference .gm-style-iw for the previous div with .prev().
    */
    var iwBackground = iwOuter.prev();

    // Removes background shadow DIV
    iwBackground.children(':nth-child(2)').css({'display' : 'none'});

    // Removes white background DIV
    iwBackground.children(':nth-child(4)').css({'display' : 'none'});

    // Moves the infowindow 115px to the right.
    iwOuter.parent().parent().css({left: '115px'});

    // Moves the shadow of the arrow 76px to the left margin.
    iwBackground.children(':nth-child(1)').attr('style', function(i,s){ return s + 'left: 76px !important;'});

    // Moves the arrow 76px to the left margin.
    iwBackground.children(':nth-child(3)').attr('style', function(i,s){ return s + 'left: 76px !important;'});

    // Changes the desired tail shadow color.
    iwBackground.children(':nth-child(3)').find('div').children().css({'box-shadow': 'rgba(72, 181, 233, 0.6) 0px 1px 6px', 'z-index' : '1'});

    // Reference to the div that groups the close button elements.
    var iwCloseBtn = iwOuter.next();

    // Apply the desired effect to the close button
    iwCloseBtn.css({opacity: '1', right: '38px', top: '3px', border: '7px solid #48b5e9', 'border-radius': '13px', 'box-shadow': '0 0 5px #3990B9'});

    // If the content of infowindow not exceed the set maximum height, then the gradient is removed.
    if($('.iw-content').height() < 140){
      $('.iw-bottom-gradient').css({display: 'none'});
    }

    // The API automatically applies 0.7 opacity to the button after the mouseout event. This function reverses this event to the desired value.
    iwCloseBtn.mouseout(function(){
      $(this).css({opacity: '1'});
    });
  });

// CSS ใส่สไตล์ชีต

.gm-style-iw {
  background-color: rgb(237, 28, 36);
    border: 1px solid rgba(72, 181, 233, 0.6);
    border-radius: 10px;
    box-shadow: 0 1px 6px rgba(178, 178, 178, 0.6);
    color: rgb(255, 255, 255) !important;
    font-family: gothambook;
    text-align: center;
    top: 15px !important;
    width: 150px !important;
}

รหัสนี้มีปัญหากับส่วนท้ายใน Chrome คุณต้องคลิก 2x เพื่อให้หางแสดงตำแหน่งที่ถูกต้อง
cpcdev


3

ฉันใช้รหัสต่อไปนี้เพื่อใช้ CSS ภายนอก:

boxText = document.createElement("html");
boxText.innerHTML = "<head><link rel='stylesheet' href='style.css'/></head><body>[some html]<body>";

infowindow.setContent(boxText);
infowindow.open(map, marker);

1
ฉันสามารถกำหนดเป้าหมาย css ได้โดยตรงโดยใช้. gm-style> div> div: nth-child (3)> div: nth-child (4)> div> div> div: nth-child (2) {
Charlie- Greenman

1

ใช้กล่องข้อมูลปลั๊กอินจาก Google Maps Utility Library ทำให้การจัดรูปแบบ / การจัดการป๊อปอัปแผนที่ง่ายขึ้นมาก

โปรดทราบว่าคุณจะต้องตรวจสอบให้แน่ใจว่าโหลดหลังจาก google maps API:

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&callback=initMap" async defer></script>
<script src="/js/infobox_packed.js" async defer></script>

1

ฉันมีการออกแบบหน้าต่าง infowindow แผนที่ของ Google พร้อมรูปภาพและเนื้อหาบางส่วนตามด้านล่าง

ใส่คำอธิบายภาพที่นี่

map_script (สำหรับการอ้างอิง html ของ infowindow เท่านั้น)

for (i = 0; i < locations.length; i++) { 
    var latlng = new google.maps.LatLng(locations[i][1], locations[i][2]);
    marker = new google.maps.Marker({
        position: latlng,
        map: map,
        icon: "<?php echo plugins_url( 'assets/img/map-pin.png', ELEMENTOR_ES__FILE__ ); ?>"
    });

    var property_img = locations[i][6],
    title = locations[i][0],
    price = locations[i][3],
    bedrooms = locations[i][4],
    type = locations[i][5],
    listed_on = locations[i][7],
    prop_url = locations[i][8];

    content = "<div class='map_info_wrapper'><a href="+prop_url+"><div class='img_wrapper'><img src="+property_img+"></div>"+
    "<div class='property_content_wrap'>"+
    "<div class='property_title'>"+
    "<span>"+title+"</span>"+
    "</div>"+

    "<div class='property_price'>"+
    "<span>"+price+"</span>"+
    "</div>"+

    "<div class='property_bed_type'>"+
    "<span>"+bedrooms+"</span>"+
    "<ul><li>"+type+"</li></ul>"+
    "</div>"+

    "<div class='property_listed_date'>"+
    "<span>Listed on "+listed_on+"</span>"+
    "</div>"+
    "</div></a></div>";

    google.maps.event.addListener(marker, 'click', (function(marker, content, i) {
        return function() {
            infowindow.setContent(content);
            infowindow.open(map, marker);
        }
    })(marker, content, i));
}

สิ่งที่สำคัญที่สุดคือ CSS

 #propertymap .gm-style-iw{
    box-shadow:none;
    color:#515151;
    font-family: "Georgia", "Open Sans", Sans-serif;
    text-align: center;
    width: 100% !important;
    border-radius: 0;
    left: 0 !important;
    top: 20px !important;
}

 #propertymap .gm-style > div > div > div > div > div > div > div {
    background: none!important;
}

.gm-style > div > div > div > div > div > div > div:nth-child(2) {
     box-shadow: none!important;
}
 #propertymap .gm-style-iw > div > div{
    background: #FFF!important;
}

 #propertymap .gm-style-iw a{
    text-decoration: none;
}

 #propertymap .gm-style-iw > div{
    width: 245px !important
}

 #propertymap .gm-style-iw .img_wrapper {
    height: 150px;  
    overflow: hidden;
    width: 100%;
    text-align: center;
    margin: 0px auto;
}

 #propertymap .gm-style-iw .img_wrapper > img {
    width: 100%;
    height:auto;
}

 #propertymap .gm-style-iw .property_content_wrap {
    padding: 0px 20px;
}

 #propertymap .gm-style-iw .property_title{
    min-height: auto;
}

1
ขอบคุณ! CSS ใช้งานไม่ได้ แต่ทำได้อย่างง่ายดายโดยใช้เครื่องมือสำหรับนักพัฒนาและเข้าเรียนโดยตรงไม่จำเป็นต้องใช้รูปแบบ. gm
user2060451

-1

คุณสามารถใช้คลาส css ได้เช่นกัน

$('#hook').parent().parent().parent().siblings().addClass("class_name");

ขอให้เป็นวันที่ดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.