Disabilita lo zoom della rotellina del mouse su Google Maps incorporato


198

Sto lavorando su un sito WordPress in cui gli autori di solito incorporano Google Maps utilizzando iFrames nella maggior parte dei post.

Esiste un modo per disabilitare lo zoom tramite la rotellina del mouse su tutti usando Javascript?


32
Imposta l'opzione mappa scrollwheelsu false.
Anto Jurković,

o disabilitarlo direttamente tramite JS: map.disableScrollWheelZoom ();
Th3Alchemist,

4
Ho paura che non puoi. A causa delle restrizioni di sicurezza, non vi è alcun accesso di scripting alla mappa e AFAIK non è disponibile alcun parametro URL che ti dà la possibilità di disabilitarla.
Dr.Molle,

Hanno esattamente lo stesso problema. Desideri disabilitare gli eventi di scorrimento del mouse su incorporati con iframe map. Non l'ho ancora trovato.
Grzegorz,

7
Si tratta di mappe incorporate, non sono sicuro del motivo per cui le persone pubblicano soluzioni per l'uso della libreria JS delle mappe
zanderwar,

Risposte:


255

Stavo avendo lo stesso problema: quando si scorre la pagina, il puntatore si sposta sulla mappa, inizia a ingrandire / rimpicciolire la mappa invece di continuare a scorrere la pagina. :(

Quindi ho risolto questo mettendo un divcon un .overlayesattamente prima di ogni iframeinserimento gmap , vedi:

<html>
  <div class="overlay" onClick="style.pointerEvents='none'"></div>
  <iframe src="https://mapsengine.google.com/map/embed?mid=some_map_id" width="640" height="480"></iframe>
</html>

Nel mio CSS ho creato la classe:

.overlay {
   background:transparent; 
   position:relative; 
   width:640px;
   height:480px; /* your iframe height */
   top:480px;  /* your iframe height */
   margin-top:-480px;  /* your iframe height */
}

Il div coprirà la mappa, impedendo agli eventi puntatore di raggiungerla. Ma se fai clic sul div, diventa trasparente agli eventi puntatore, attivando di nuovo la mappa!

Spero di esserti stato di aiuto :)


9
Questa è un'ottima soluzione Nel mio caso, ho dovuto specificare un z-indexper poter sovrapporre correttamente, però.
RCNeil,

1
IMO la soluzione migliore a questo problema ancora! Abbiamo affrontato questo problema per molto tempo e questo rende una soluzione riutilizzabile bella e abbastanza pulita!
Diego Paladino,

11
questo dovrebbe essere contrassegnato come risposta, anche se probabilmente è più facile impostare la sovrapposizione come posizionata in modo assoluto su un contenitore padre e quindi solo larghezza 100% altezza 100%, inoltre non ha bisogno di una proprietà di sfondo.
carica

3
Ho creato un plugin jQuery molto semplice per automatizzare questo. Dai un'occhiata
Emiliano Díaz,

8
Esiste un modo semplice per estendere questa soluzione in modo che gli eventi della rotellina vengano ignorati, ma i clic a sinistra non vengano ignorati? Questa soluzione è buona, ma richiede agli utenti di fare doppio clic sul collegamento ipertestuale "Indicazioni stradali nella parte superiore della mappa (una volta per penetrare il div e poi di nuovo per fare clic sul collegamento ipertestuale stesso.)
jptsetme

136

Ho provato la prima risposta in questa discussione e non ha funzionato per me, non importa quello che ho fatto, quindi ho trovato la mia soluzione:

Avvolgi l'iframe con una classe (.maps in questo esempio) e idealmente incorpora in modo rispondente il codice: http://embedresponsively.com/ - Cambia il CSS dell'iframe in pointer-events: nonee quindi usando la funzione click di jQuery sull'elemento genitore puoi cambiare l'iframe css perpointer-events:auto

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'></iframe>
</div>

CSS

.maps iframe{
    pointer-events: none;
}

jQuery

$('.maps').click(function () {
    $('.maps iframe').css("pointer-events", "auto");
});

$( ".maps" ).mouseleave(function() {
  $('.maps iframe').css("pointer-events", "none"); 
});

Sono sicuro che esiste un solo modo JavaScript per farlo, se qualcuno vuole aggiungere a questo sentiti libero.

Il modo JavaScript per riattivare gli eventi puntatore è piuttosto semplice. Basta dare un ID all'iFrame (cioè "iframe"), quindi applicare un evento onclick al div cointainer:

onclick="document.getElementById('iframe').style.pointerEvents= 'auto'"

<div class="maps" onclick="document.getElementById('iframe').style.pointerEvents= 'auto'">
   <iframe id="iframe" src="" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>

4
Grazie per la soluzione "senza API". +1
Tortura grave

21
Puoi anche aggiungere questo per riportarlo al suo stato originale quando il mouse lascia: $ ('. Maps'). Mouseleave (function () {$ ('. Maps iframe'). Css ("pointer-events", " nessuno ");});
Luis,

5
Solo una nota: l'utilizzo pointer-events: noneimpedirà qualsiasi interazione con la mappa (trascinamento, navigazione, clic, ecc.).
LuBre,

@LuBre sì, questo è chiaro, ecco perché c'è la funzione clic di jQuery per cambiarla in auto.
nathanielperales,

1
Bella risposta! Vuoi assicurarti di abilitare la mappa giusta e non tutta la pagina$(this).find('iframe').css("pointer-events", "auto");
Tom Prats

54

Ho esteso la soluzione @nathanielperales.

Di seguito la descrizione del comportamento:

  • fai clic sulla mappa per abilitare lo scorrimento
  • quando il mouse lascia la mappa, disabilita lo scorrimento

Sotto il codice javascript:

// Disable scroll zooming and bind back the click event
var onMapMouseleaveHandler = function (event) {
  var that = $(this);

  that.on('click', onMapClickHandler);
  that.off('mouseleave', onMapMouseleaveHandler);
  that.find('iframe').css("pointer-events", "none");
}

var onMapClickHandler = function (event) {
  var that = $(this);

  // Disable the click handler until the user leaves the map area
  that.off('click', onMapClickHandler);

  // Enable scrolling zoom
  that.find('iframe').css("pointer-events", "auto");

  // Handle the mouse leave event
  that.on('mouseleave', onMapMouseleaveHandler);
}

// Enable map zooming with mouse scroll when the user clicks the map
$('.maps.embed-container').on('click', onMapClickHandler);

Ed ecco un esempio di jsFiddle .


1
Grazie per questo spezzato. L'ho usato con la seguente aggiunta alla fine:$('.maps.embed-container').find('iframe').css("pointer-events", "none");
Lhermann,

Grazie per il codice In realtà ha risolto un diverso problema che ho avuto. Ho incorporato alcuni grafici da Google Spreadsheet e lo scorrimento con la rotellina del mouse ha smesso di funzionare per l'intera pagina per qualche motivo. Il tuo codice lo ha fatto scorrere di nuovo con la rotellina del mouse. Grazie ancora.
Scott M. Stolz,

31

Sto ri-modificando il codice scritto da #nathanielperales, ha funzionato davvero per me. Semplice e facile da catturare, ma funziona solo una volta. Quindi ho aggiunto mouseleave () su JavaScript. Idea adattata da #Bogdan E ora è perfetta. Prova questo. I crediti vanno a #nathanielperales e #Bogdan. Ho appena combinato entrambe le idee. Grazie ragazzi. Spero che questo possa aiutare anche gli altri ...

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'>  </iframe>
</div>

CSS

.maps iframe{
    pointer-events: none;
}

jQuery

$('.maps').click(function () {
    $('.maps iframe').css("pointer-events", "auto");
});

$( ".maps" ).mouseleave(function() {
  $('.maps iframe').css("pointer-events", "none"); 
});

Improvvisa - Adatta - Supera

Ed ecco un esempio di jsFiddle.


1
Soluzione più pulita. Bello! Ma TUTTE le soluzioni hanno un problema: gli utenti devono fare doppio clic sulla mappa. Come può passare immediatamente il clic, quindi è sufficiente un clic?
Loren,

1
Forse potresti evitare il clic passando pointer-events: autosolo dopo che il mouse si è "spostato" sulla mappa per una certa durata? cioè avvia il timer quando il mouse entra in iframe e resettalo quando il mouse lascia. Se il timer arriva a X millisecondi, passa a pointer-events: auto. E ogni volta che il mouse lascia l'iframe, ti basta tornare indietro pointer-events: none.
Stucampbell,

Preferisco usare dblclick invece di click, comunque buona soluzione.
Moxet Khan,

25

Sì, è abbastanza facile. Ho affrontato un problema simile. Basta aggiungere la proprietà css "pointer-events" al div iframe e impostarlo su 'none' .

Esempio: <iframe style = "pointer-events: none" src = ........>

Nota a margine: questa correzione disabiliterebbe tutti gli altri eventi del mouse sulla mappa. Ha funzionato per me poiché non abbiamo richiesto alcuna interazione dell'utente sulla mappa.


20
Perché non usare solo un'immagine allora? stai caricando molte risorse extra solo per disabilitarle tutte.
Deweydb,

2
Sì, ma non riesco a fare clic sui widget
Jeffrey Nicholson Carré,

1
ti preghiamo di notare che questo non funzionerà su IE <11 - caniuse.com/#search=pointer-events
totallyNotLizards

@deweydb - non è illegale?
Matt Saunders,

@MattSaunders non è sicuro se questo fosse il caso in quel momento, ma lo è ora. Puoi caricare un'immagine di mappa statica direttamente dall'API di Google, forse è questo che suggeriva deweydb? Sarebbe sicuramente un modo fattibile per aggirare il problema.
Azariah,

19
var mapOptions = {
   scrollwheel: false,
   center: latlng,
   mapTypeId: google.maps.MapTypeId.ROADMAP
};

13

Dopo aver fatto qualche ricerca hai 2 opzioni. Poiché le nuove mappe API con iframe embed non sembrano supportare la disabilitazione della rotellina del mouse.

In primo luogo sarebbe utilizzare google maps precedente ( https://support.google.com/maps/answer/3045828?hl=it ).

In secondo luogo sarebbe la creazione di una funzione JavaScript per semplificare l'incorporamento di una mappa per ciascun commento e l'utilizzo di parametri (è solo un codice di esempio per indicare che la posizione non mostra la soluzione esatta)

function createMap(containerid, parameters) {
  var mymap = document.getElementById(containerid),
  map_options = {
    zoom: 13,
    scrollwheel: false,
    /* rest of options */
  },
  map = new google.maps.Map(mymap, map_options);

  /* 'rest of code' to take parameters into account */
}

8

C'è una soluzione fantastica e semplice.

Devi aggiungere una classe personalizzata nel tuo CSS che imposta gli eventi del puntatore per mappare la tela su nessuna:

.scrolloff{
   pointer-events: none;
}

Quindi, con jQuery, è possibile aggiungere e rimuovere quella classe in base a diversi eventi, ad esempio:

    $( document ).ready(function() {

    // you want to enable the pointer events only on click;

        $('#map_canvas').addClass('scrolloff'); // set the pointer events to none on doc ready
        $('#canvas').on('click', function() {
            $('#map_canvas').removeClass('scrolloff'); // set the pointer events true on click
        });

    // you want to disable pointer events when the mouse leave the canvas area;

     $( "#map_canvas" ).mouseleave(function() {
          $('#map_canvas').addClass('scrolloff'); // set the pointer events to none when mouse leaves the map area
     });    
});

Ho creato un esempio in jsfiddle , spero che mi aiuti!


1
Questo funziona anche con l'API di incorporamento di Google Maps: basta sostituire map_canvas con l'iframe di incorporamento. Si noti che l'evento click è sull'elemento esterno , ma scrolloff è sull'elemento interno (è corretto nella risposta / jsfiddle, nel caso in cui si stia trascrivendo anziché copiare / incollare)
Jxtps

8

Mi basta registrare un account su developers.google.com e ottenere un token per chiamare un'API di Maps e disabilitarlo in questo modo (scrollwheel: false):

    var map;
    function initMap() {
        map = new google.maps.Map(document.getElementById('container_google_maps'), {
            center: {lat: -34.397, lng: 150.644},
            zoom: 8,
            scrollwheel: false
        });
    }

Molto meglio degli hack di jQuery!
Dániel Kis-Nagy,

7

Questo è il mio approccio Trovo facile implementarlo su vari siti Web e utilizzarlo sempre

CSS e JavaScript:

<style type="text/css">
.scrolloff iframe   {
    pointer-events: none ;
}
</style>

<script type="text/javascript">
function scrollOn() {
    $('#map').removeClass('scrolloff'); // set the pointer events true on click

}

function scrollOff() {
    $('#map').addClass('scrolloff'); 

}
</script>

Nell'HTML, vorrai racchiudere l'iframe in un div. <div id="map" class="scrolloff" onclick="scrollOn()" onmouseleave="scrollOff()" >

function scrollOn() {
    $('#map').removeClass('scrolloff'); // set the pointer events true on click
   
}

function scrollOff() {
    $('#map').addClass('scrolloff'); // set the pointer events true on click
    
}
.scrolloff iframe   {
        pointer-events: none ;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="map" class="scrolloff" onclick="scrollOn()" onmouseleave="scrollOff()" ><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d23845.03946309692!2d-70.0451736316453!3d41.66373705082399!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89fb159980380d21%3A0x78c040f807017e30!2sChatham+Tides!5e0!3m2!1sen!2sus!4v1452964723177" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe></div>

Spero che questo aiuti chiunque cerchi una soluzione semplice.


5

Ecco una soluzione semplice. Basta impostare il pointer-events: noneCSS su <iframe>per disabilitare lo scorrimento del mouse.

<div id="gmap-holder">
    <iframe width="100%" height="400" frameborder="0" style="border:0; pointer-events:none"
            src="https://www.google.com/maps/embed/v1/place?q=XXX&key=YYY"></iframe>
</div>

Se si desidera che lo scorrimento del mouse venga attivato quando l'utente fa clic sulla mappa, utilizzare il seguente codice JS. Disabiliterà anche di nuovo lo scorrimento del mouse, quando il mouse si sposta dalla mappa.

$(function() {
    $('#gmap-holder').click(function(e) {
        $(this).find('iframe').css('pointer-events', 'all');
    }).mouseleave(function(e) {
        $(this).find('iframe').css('pointer-events', 'none');
    });
})

!!! Inoltre, gli eventi puntatore Imho disabilitati tutti gli eventi clic per questo Iframe.
Stephanfriedrich,

Gli eventi click sono disabilitati solo per l'iframe. Ma se stai usando il codice JS, non appena il mouse entra nel supporto div.gmap, gli eventi click verranno nuovamente attivati.
manish_s

Questo ha funzionato brillantemente per me! La maggior parte delle soluzioni erano incompatibili con WordPress: onclick è stato cancellato e talvolta l'ampiezza dell'iframe non è rispettata, ma ha funzionato come un fascino. Dopo aver messo via il codice JS, è sufficiente fare riferimento a id = "gmap-holder". Perfetto. Grazie Manish.
usonianhorizon,

4

Per disabilitare lo zoom della rotellina del mouse su Google Maps incorporato, devi solo impostare il puntatore-evento della proprietà CSS dell'iframe su nessuno:

<style>
#googlemap iframe {
    pointer-events:none;
}
</style>

Tutto qui .. Abbastanza pulito eh?

<div id="googlemap">
    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3648.6714814904954!2d90.40069809681577!3d23.865796688563787!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3755c425897f1f09%3A0x2bdfa71343f07395!2sArcadia+Green+Point%2C+Rd+No.+16%2C+Dhaka+1230%2C+Bangladesh!5e0!3m2!1sen!2sin!4v1442184916780" width="400" height="300" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>

2
Disabiliterà anche lo zoom doppio clic :)
w3debugger

Disabilita anche zoom-in, zoom-out, indicazioni ecc.
zanderwar,

4

Bene, per me la soluzione migliore era semplicemente usare così:

HTML:

<div id="google-maps">
<iframe frameborder="0" height="450" src="***embed-map***"  width="100"</iframe>
</div>

CSS:

#google-maps iframe { pointer-events:none; }

JS:

<script>
  $(function() {
    $('#google-maps').click(function(e) {
        $(this).find('iframe').css('pointer-events', 'auto');
    }).mouseleave(function(e) {
        $(this).find('iframe').css('pointer-events', 'none');
    });
  })
</script>

RISULTATO

considerazioni:

La cosa migliore sarebbe aggiungere un overlay con una trasparenza più scura con un testo: " Fai clic per sfogliare " quando la rotellina del mouse è disattivata Ma quando viene attivato (dopo aver fatto clic su di esso), la trasparenza con il testo scompare e l'utente può navigare la mappa come previsto. Qualche indizio su come farlo?


3

Aggiungi stile pointer-events:none;funzionando benissimo

<iframe style="pointer-events:none;" src=""></iframe>

3

Il modo più semplice per farlo è usare uno pseudo-elemento come :beforeo :after.
Questo metodo non richiede alcun elemento HTML aggiuntivo o jquery.
Se abbiamo ad esempio questa struttura html:

<div class="map_wraper">

    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d405689.7826944034!2d-122.04109805!3d37.40280355!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x808fb68ad0cfc739%3A0x7eb356b66bd4b50e!2sSilicon+Valley%2C+CA!5e0!3m2!1sen!2sro!4v1438864791455" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>

</div>

Quindi tutto ciò che dobbiamo fare è rendere il wrapper relativo allo pseudo-elemento che creeremo per impedire lo scorrimento

.map_wraper{
    position:relative;
}

Successivamente creeremo lo pseudo-elemento che verrà posizionato sulla mappa per impedire lo scorrimento:

.map_wraper:after{
    background: none;
    content: " ";
    display: inline-block;
    font-size: 0;
    height: 100%;
    left: 0;
    opacity: 0;
    position: absolute;
    top: 0;
    width: 100%;
    z-index: 9;
}

E il gioco è fatto, niente jquery né elementi html extra! Ecco un esempio di jsfiddle funzionante: http://jsfiddle.net/e6j4Lbe1/


Idea intelligente. Tuttavia, come alcune delle altre risposte, questo acquisisce tutto, non solo gli eventi della rotellina del mouse.
likeitlikeit

sono contento che ti abbia aiutato!
Andrei,

3

Ecco la mia soluzione semplice.

Metti il ​​tuo iframe in un div con una classe chiamata "mappe" per esempio.

Questo sarà il CSS per il tuo iframe

.maps iframe { pointer-events: none }

Ed ecco un po 'di javascript che imposterà la proprietà pointer-events dell'iframe su "auto" quando passi l'elemento div per almeno 1 secondo (funziona meglio per me - impostalo su quello che ti piace) e cancella il timeout / impostalo di nuovo su "none" quando il mouse lascia l'elemento.

var maptimer;

$(".maps").hover(function(){
    maptimer = setTimeout(function(){
        $(".maps").find("iframe").css("pointer-events", "auto");
    },1000);
},function(){
    clearTimeout(maptimer);
    $(".maps").find("iframe").css("pointer-events", "none");
});

Saluti.


3

Ho creato un plugin jQuery molto semplice per risolvere il problema. Controllalo su https://diazemiliano.github.io/googlemaps-scrollprevent

(function() {
  $(function() {
    $("#btn-start").click(function() {
      $("iframe[src*='google.com/maps']").scrollprevent({
        printLog: true
      }).start();
      return $("#btn-stop").click(function() {
        return $("iframe[src*='google.com/maps']").scrollprevent().stop();
      });
    });
    return $("#btn-start").trigger("click");
  });
}).call(this);
Edit in JSFiddle Result JavaScript HTML CSS .embed-container {
  position: relative !important;
  padding-bottom: 56.25% !important;
  height: 0 !important;
  overflow: hidden !important;
  max-width: 100% !important;
}
.embed-container iframe {
  position: absolute !important;
  top: 0 !important;
  left: 0 !important;
  width: 100% !important;
  height: 100% !important;
}
.mapscroll-wrap {
  position: static !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/diazemiliano/googlemaps-scrollprevent/v.0.6.5/dist/googlemaps-scrollprevent.min.js"></script>
<div class="embed-container">
  <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12087.746318586604!2d-71.64614110000001!3d-40.76341959999999!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x9610bf42e48faa93%3A0x205ebc786470b636!2sVilla+la+Angostura%2C+Neuqu%C3%A9n!5e0!3m2!1ses-419!2sar!4v1425058155802"
  width="400" height="300" frameborder="0" style="border:0"></iframe>
</div>
<p><a id="btn-start" href="#">"Start Scroll Prevent"</a>  <a id="btn-stop" href="#">"Stop Scroll Prevent"</a>
</p>


2

Utilizzando la risposta di @nathanielperales ho aggiunto la funzione hover perché per me funziona meglio quando l'utente perde la concentrazione sulla mappa per interrompere di nuovo lo scorrimento :)

$(function(){
    $('.mapa').hover(function(){
        stopScroll();},
                     function () {
    $('.mapa iframe').css("pointer-events", "none");
    });
});

function stopScroll(){
$('.mapa').click(function () {
    $('.mapa iframe').css("pointer-events", "auto");
});
}

Il fatto è che perdiamo la funzione di navigazione, per me è molto importante nei dispositivi mobili. Ho creato un plugin jQuery molto semplice che puoi modificare se vuoi. Controllalo su github.com/diazemiliano/mapScrollOff
Emiliano Díaz

2

Variazioni su un tema: una soluzione semplice con jQuery, nessuna modifica CSS necessaria.

// make iframe active on click, disable on mouseleave
$('iframe.google_map').each( function(i, iframe) {
    $(iframe).parent().hover( // make inactive on hover
        function() { $(iframe).css('pointer-events', 'none');
    }).click( // activate on click
        function() { $(iframe).css('pointer-events', 'auto');
    }).trigger('mouseover'); // make it inactive by default as well
});

Il listener al passaggio del mouse è collegato all'elemento genitore, quindi se l'attuale genitore è più grande, puoi semplicemente avvolgere l'iframe con un div prima della terza riga.

Spero che sia utile per qualcuno.


1

Mi sono imbattuto su questo problema da solo e ho usato alcune delle due risposte molto utili su questa domanda: la risposta di Czerasz e la risposta di Massa .

Entrambi hanno molta verità, ma da qualche parte nei miei test ho scoperto che uno non funzionava per i dispositivi mobili e aveva un supporto IE scarso (funziona solo su IE11). Questa è la soluzione di nathanielperales, quindi estesa da czerasz, che si basa su eventi-puntatore css e che non funziona su dispositivi mobili (non esiste alcun puntatore su dispositivi mobili) e non funziona su alcuna versione di IE che non sia v11 . Normalmente non mi importerebbe di meno, ma ci sono un sacco di utenti là fuori e vogliamo funzionalità coerenti, quindi sono andato con la soluzione overlay, usando un wrapper per rendere più facile la codifica.

Quindi, il mio markup è simile al seguente:

<div class="map embed-container">
  <div id="map-notice" style="display: block;"> {Tell your users what to do!} </div>
  <div class="map-overlay" style="display: block;"></div>
  <iframe style="width:100%" src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d3785.684302567802!2d-66.15578327375803!3d18.40721382009222!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x8c036a35d02b013f%3A0x5962cad95b9ec7f8!2sPlaza+Del+Sol!5e0!3m2!1sen!2spr!4v1415284687548" width="633" height="461" frameborder="0"></iframe>
</div>

Quindi gli stili sono così:

.map.embed-container {
  position:relative;
}

.map.embed-container #map-notice{
  position:absolute;
  right:0;
  top:0;
  background-color:rgb(100,100,100);/*for old IE browsers with no support for rgba()*/
  background-color: rgba(0,0,0,.50);
  color: #ccc;
  padding: 8px;
}
.map.embed-container .map-overlay{
  height:100%;
  width:100%;
  position:absolute;
  z-index:9999;
  background-color:rgba(0,0,0,0.10);/*should be transparent but this will help you see where the overlay is going in relation with the markup*/
}

Infine la sceneggiatura:

//using jquery...
var onMapMouseleaveHandler = function (event) {
  $('#map-notice').fadeIn(500);
  var elemento = $$(this);
  elemento.on('click', onMapClickHandler);
  elemento.off('mouseleave', onMapMouseleaveHandler);
  $('.map-overlay').fadeIn(500);
}

var onMapClickHandler = function (event) {
  $('#map-notice').fadeOut(500);
  var elemento = $$(this);
  elemento.off('click', onMapClickHandler);
  $('.map-overlay').fadeOut(500);
  elemento.on('mouseleave', onMapMouseleaveHandler);
}
$('.map.embed-container').on('click', onMapClickHandler);

Ho anche aggiunto la mia soluzione testata in una sintesi di GitHub , se ti piace ottenere cose da lì ...


1

Questa è una soluzione con CSS e Javascript (es. Jquery ma funziona anche con Javascript puro). Allo stesso tempo, la mappa è reattiva. Evita di ingrandire la mappa durante lo scorrimento, ma puoi attivarla facendo clic su di essa.

HTML / JQuery Javascript

<div id="map" onclick="$('#googlemap').css('pointerEvents','auto'); return true;"> 
    <iframe id="googlemap" src="http://your-embed-url" height="350"></iframe>
</div>

CSS

#map {
    position: relative; 
    padding-bottom: 36%; /* 16:9 ratio for responsive */ 
    height: 0; 
    overflow: hidden; 
    background:transparent; /* does the trick */
    z-index:98; /* does the trick */
}
#map iframe { 
    pointer-events:none; /* does the trick */
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100% !important; 
    height: 100% !important; 
    z-index:97; /* does the trick */
} 

Divertiti !


1

In Google Maps v3 ora puoi disabilitare lo scorrimento per ingrandire, il che porta a un'esperienza utente molto migliore. Le altre funzioni della mappa continueranno a funzionare e non avrai bisogno di ulteriori div. Ho anche pensato che ci dovrebbe essere un feedback per l'utente in modo che possano vedere quando lo scorrimento è abilitato, quindi ho aggiunto un bordo della mappa.

// map is the google maps object, '#map' is the jquery selector
preventAccidentalZoom(map, '#map'); 

// Disables and enables scroll to zoom as appropriate. Also
// gives the user a UI cue as to when scrolling is enabled.
function preventAccidentalZoom(map, mapSelector){
  var mapElement = $(mapSelector);

  // Disable the scroll wheel by default
  map.setOptions({ scrollwheel: false })

  // Enable scroll to zoom when there is a mouse down on the map.
  // This allows for a click and drag to also enable the map
  mapElement.on('mousedown', function () {
    map.setOptions({ scrollwheel: true });
    mapElement.css('border', '1px solid blue')
  });

  // Disable scroll to zoom when the mouse leaves the map.
  mapElement.mouseleave(function () {
    map.setOptions({ scrollwheel: false })
    mapElement.css('border', 'none')
  });
};

1

Questo ti darà una Google Map reattiva che interromperà lo scorrimento sull'iframe, ma una volta cliccato su ti permetterà di ingrandire.

Copia e incolla questo nel tuo html ma sostituisci il link iframe con il tuo. È un articolo su di esso con un esempio: disabilita lo zoom della rotellina del mouse sugli iframe di Google Map incorporati

<style>
    .overlay {
    background:transparent;
    position:relative;
    width:100%; /* your iframe width */
    height:480px; /* your iframe height */
    top:480px; /* your iframe height */
    margin-top:-480px; /* your iframe height */
    }
</style>
<div class="overlay" onClick="style.pointerEvents='none'"></div>
<iframe src="https://mapsengine.google.com/map/embed?mid=some_map_id" width="100%" height="480"></iframe>

0

Ecco il mio approccio a questo.

Inseriscilo nel mio file main.js o simile:

// Create an array of styles.
var styles = [
                {
                    stylers: [
                        { saturation: -300 }

                    ]
                },{
                    featureType: 'road',
                    elementType: 'geometry',
                    stylers: [
                        { hue: "#16a085" },
                        { visibility: 'simplified' }
                    ]
                },{
                    featureType: 'road',
                    elementType: 'labels',
                    stylers: [
                        { visibility: 'off' }
                    ]
                }
              ],

                // Lagitute and longitude for your location goes here
               lat = -7.79722,
               lng = 110.36880,

              // Create a new StyledMapType object, passing it the array of styles,
              // as well as the name to be displayed on the map type control.
              customMap = new google.maps.StyledMapType(styles,
                  {name: 'Styled Map'}),

            // Create a map object, and include the MapTypeId to add
            // to the map type control.
              mapOptions = {
                  zoom: 12,
                scrollwheel: false,
                  center: new google.maps.LatLng( lat, lng ),
                  mapTypeControlOptions: {
                      mapTypeIds: [google.maps.MapTypeId.ROADMAP],

                  }
              },
              map = new google.maps.Map(document.getElementById('map'), mapOptions),
              myLatlng = new google.maps.LatLng( lat, lng ),

              marker = new google.maps.Marker({
                position: myLatlng,
                map: map,
                icon: "images/marker.png"
              });

              //Associate the styled map with the MapTypeId and set it to display.
              map.mapTypes.set('map_style', customMap);
              map.setMapTypeId('map_style');

Quindi inserisci semplicemente un div vuoto nel punto in cui desideri che la mappa appaia sulla tua pagina.

<div id="map"></div>

Ovviamente dovrai chiamare anche l'API di Google Maps. Ho semplicemente creato un file chiamato mapi.js e l'ho lanciato nella mia cartella / js. Questo file deve essere chiamato prima del javascript sopra.

`window.google = window.google || {};
google.maps = google.maps || {};
(function() {

  function getScript(src) {
    document.write('<' + 'script src="' + src + '"' +
                   ' type="text/javascript"><' + '/script>');
  }

  var modules = google.maps.modules = {};
  google.maps.__gjsload__ = function(name, text) {
    modules[name] = text;
  };

  google.maps.Load = function(apiLoad) {
    delete google.maps.Load;
    apiLoad([0.009999999776482582,[[["http://mt0.googleapis.com/vt?lyrs=m@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=m@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"m@228000000"],[["http://khm0.googleapis.com/kh?v=135\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=135\u0026hl=en-US\u0026"],null,null,null,1,"135"],[["http://mt0.googleapis.com/vt?lyrs=h@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=h@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"h@228000000"],[["http://mt0.googleapis.com/vt?lyrs=t@131,r@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=t@131,r@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"t@131,r@228000000"],null,null,[["http://cbk0.googleapis.com/cbk?","http://cbk1.googleapis.com/cbk?"]],[["http://khm0.googleapis.com/kh?v=80\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=80\u0026hl=en-US\u0026"],null,null,null,null,"80"],[["http://mt0.googleapis.com/mapslt?hl=en-US\u0026","http://mt1.googleapis.com/mapslt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/ft?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/ft?hl=en-US\u0026"]],[["http://mt0.googleapis.com/vt?hl=en-US\u0026","http://mt1.googleapis.com/vt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/loom?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/loom?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt?hl=en-US\u0026","https://mts1.googleapis.com/mapslt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/ft?hl=en-US\u0026"]]],["en-US","US",null,0,null,null,"http://maps.gstatic.com/mapfiles/","http://csi.gstatic.com","https://maps.googleapis.com","http://maps.googleapis.com"],["http://maps.gstatic.com/intl/en_us/mapfiles/api-3/14/0","3.14.0"],[2635921922],1,null,null,null,null,0,"",null,null,0,"http://khm.googleapis.com/mz?v=135\u0026",null,"https://earthbuilder.googleapis.com","https://earthbuilder.googleapis.com",null,"http://mt.googleapis.com/vt/icon",[["http://mt0.googleapis.com/vt","http://mt1.googleapis.com/vt"],["https://mts0.googleapis.com/vt","https://mts1.googleapis.com/vt"],[null,[[0,"m",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],0],[null,[[0,"m",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],3],[null,[[0,"h",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],0],[null,[[0,"h",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],3],[null,[[4,"t",131],[0,"r",131000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],0],[null,[[4,"t",131],[0,"r",131000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],3],[null,null,[null,"en-US","US",null,18],0],[null,null,[null,"en-US","US",null,18],3],[null,null,[null,"en-US","US",null,18],6],[null,null,[null,"en-US","US",null,18],0]]], loadScriptTime);
  };
  var loadScriptTime = (new Date).getTime();
  getScript("http://maps.gstatic.com/intl/en_us/mapfiles/api-3/14/0/main.js");
})();`

Quando chiami il file mapi.js, assicurati di passarlo all'attributo false del sensore.

vale a dire: <script type="text/javascript" src="js/mapi.js?sensor=false"></script>

La nuova versione 3 dell'API richiede l'inclusione del sensore per qualche motivo. Assicurati di includere il file mapi.js prima del tuo file main.js.


0

Per google maps v2 - GMap2:

ar map = new GMap2(document.getElementById("google_map"));
map.disableScrollWheelZoom();

0

se hai un iframe che utilizza l'API integrata di Google map in questo modo:

 <iframe width="320" height="400" frameborder="0" src="https://www.google.com/maps/embed/v1/place?q=Cagli ... "></iframe>

puoi aggiungere questo stile css: pointer-event: none; ES.

<iframe width="320" height="400" frameborder="0" style="pointer-event:none;" src="https://www.google.com/maps/embed/v1/place?q=Cagli ... "></iframe>

0

Ecco la mia opinione sulla risposta @nathanielperales estesa da @chams, ora estesa di nuovo da me.

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'></iframe>
</div> 

jQuery

// we're doing so much with jQuery already, might as well set the initial state
$('.maps iframe').css("pointer-events", "none");

// as a safety, allow pointer events on click
$('.maps').click(function() {
  $(this).find('iframe').css("pointer-events", "auto");
});


$('.maps').mouseleave(function() {
  // set the default again on mouse out - disallow pointer events
  $(this).find('iframe').css("pointer-events", "none");
  // unset the comparison data so it doesn't effect things when you enter again
  $(this).removeData('oldmousepos');
});

$('.maps').bind('mousemove', function(e){
  $this = $(this);
  // check the current mouse X position
  $this.data('mousepos', e.pageX);
  // set the comparison data if it's null or undefined
  if ($this.data('oldmousepos') == null) {
    $this.data('oldmousepos', $this.data('mousepos'));
  }
  setTimeout(function(){
    // some left/right movement - allow pointer events
    if ($this.data('oldmousepos') != $this.data('mousepos')) {
      $this.find('iframe').css("pointer-events", "auto");
    }
    // set the compairison variable
    $this.data('oldmousepos', $this.data('mousepos'));
  }, 300);
  console.log($this.data('oldmousepos')+ ' ' + $this.data('mousepos'));
});

0

Il più semplice :

<div id="myIframe" style="width:640px; height:480px;">
   <div style="background:transparent; position:absolute; z-index:1; width:100%; height:100%; cursor:pointer;" onClick="style.pointerEvents='none'"></div>
   <iframe src="https://www.google.com/maps/d/embed?mid=XXXXXXXXXXXXXX" style="width:640px; height:480px;"></iframe>
</div>

0

Aggiungi questo al tuo script:

function initMap() {
    var uluru = {lat: -25.363, lng: 131.044};
    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 12,
        center: uluru,
        scrollwheel: false,
        disableDefaultUI: true,
        disableDoubleClickZoom: true
    });
    var marker = new google.maps.Marker({
        position: uluru,
        map: map
});
}

2
La domanda riguarda l'API di incorporamento (utilizzando un iframe), non l'API JavaScript.
GreatBlakes,

0

Ecco la mia soluzione al problema, stavo costruendo un sito WP, quindi qui c'è un piccolo codice php. Ma la chiave è scrollwheel: false,nell'oggetto mappa.

function initMap() {
        var uluru = {lat: <?php echo $latitude; ?>, lng: <?php echo $Longitude; ?>};
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 18,
            scrollwheel: false,
            center: uluru
        });
        var marker = new google.maps.Marker({
            position: uluru,
            map: map
        });
    }

Spero che questo possa aiutare. Saluti

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.