Comment désactiver la mise à l'échelle de la roue de défilement de la souris avec L'API GoogleMaps

j'utilise L'API GoogleMaps (v3) pour dessiner quelques cartes sur une page. Une chose que j'aimerais faire est de désactiver le zoom lorsque vous faites défiler la roue de la souris sur la carte, mais je ne sais pas comment.

j'ai désactivé le scaleControl (i.e. supprimé L'élément scaling UI), mais cela n'empêche pas le scroll wheel scaling.

Voici une partie de ma fonction (c'est un simple plugin jQuery):

$.fn.showMap = function(options, addr){
  options = $.extend({
    navigationControl: false,
    mapTypeControl: false,
    scaleControl: false,
    draggable: false,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }, options);
  var map = new google.maps.Map(document.getElementById($(this).attr('id')), options);

  // Code cut from this example as not relevant
};
543
demandé sur Peter Mortensen 2010-02-25 01:39:35

14 réponses

dans la version 3 de L'API Maps, vous pouvez simplement définir l'option scrollwheel à false dans les MapOptions propriétés:

options = $.extend({
    scrollwheel: false,
    navigationControl: false,
    mapTypeControl: false,
    scaleControl: false,
    draggable: false,
    mapTypeId: google.maps.MapTypeId.ROADMAP
}, options);

si vous utilisiez la version 2 de L'API Maps, vous auriez dû utiliser le disableScrollWheelZoom () appel API comme suit:

map.disableScrollWheelZoom();

le zoom scrollwheel est activé par défaut dans la version 3 de L'API Maps, mais dans la version 2 Il est désactivé sauf si explicitement activé avec l'appel de L'API enableScrollWheelZoom() .

966
répondu Daniel Vassallo 2014-10-09 17:53:07

le code de Daniel fait le travail (merci un tas!). Mais je voulais désactiver complètement le zoom. J'ai trouvé que je devais utiliser les quatre options pour le faire:

{
  zoom: 14,                        // Set the zoom level manually
  zoomControl: false,
  scaleControl: false,
  scrollwheel: false,
  disableDoubleClickZoom: true,
  ...
}

Voir: MapOptions spécification des objets

100
répondu Simon East 2017-05-23 10:31:37

Juste au cas où vous souhaitez le faire dynamiquement;

function enableScrollwheel(map) {
    if(map) map.setOptions({ scrollwheel: true });
}

function disableScrollwheel(map) {
    if(map) map.setOptions({ scrollwheel: false });
}

parfois vous devez montrer quelque chose de" complexe " sur la carte (ou la carte est une petite partie de la mise en page), et ce zoom sur le rouleau se trouve au milieu, mais une fois que vous avez une carte propre, cette façon de zoomer est agréable.

29
répondu Felipe Pereira 2016-12-14 17:21:34

keep it simple! Variable originale de Google maps, aucun des éléments supplémentaires.

 var mapOptions = {
     zoom: 16,
     center: myLatlng,
     scrollwheel: false

}
26
répondu Creatif_IV 2015-03-02 20:33:32

dans mon cas, la chose cruciale était de fixer 'scrollwheel':false dans init. Remarque: j'utilise jQuery UI Map . Ci-dessous est mon CoffeeScript titre de la fonction init:

 $("#map_canvas").gmap({'scrollwheel':false}).bind "init", (evt, map) ->
6
répondu Andrzej Kostański 2016-12-14 17:19:35

juste au cas où, vous utilisez le GMaps.js Bibliothèque, ce qui rend un peu plus simple à faire des choses comme le géocodage et des pins personnalisés, voici comment vous résoudre ce problème en utilisant les techniques apprises des réponses précédentes.

var Gmap = new GMaps({
  div: '#main-map', // FYI, this setting property used to be 'el'. It didn't need the '#' in older versions
  lat: 51.044308,
  lng: -114.0630914,
  zoom: 15
});

// To access the Native Google Maps object use the .map property
if(Gmap.map) {
  // Disabling mouse wheel scroll zooming
  Gmap.map.setOptions({ scrollwheel: false });
}
6
répondu racl101 2016-12-14 17:23:23

j'ai créé un plugin jQuery plus développé qui vous permet de verrouiller ou déverrouiller la carte avec un joli bouton.

ce plugin désactive Google Maps iframe avec un div transparent overlay et ajoute un bouton pour débloquer. Vous devez appuyer sur 650 millisecondes pour le déverrouiller.

vous pouvez changer toutes les options pour votre commodité. Vérifiez à https://github.com/diazemiliano/googlemaps-scrollprevent

voici un exemple.

(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);
.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>
6
répondu Emiliano Díaz 2017-02-21 16:51:38

à partir de Maintenant (octobre 2017) Google a mis en œuvre une propriété spécifique pour gérer le zoom/défilement, appelé gestureHandling . Son but est de gérer le fonctionnement des appareils mobiles, mais il modifie également le comportement des navigateurs de bureau. Ici, il est de documentation officielle :

function initMap() {
  var locationRio = {lat: -22.915, lng: -43.197};
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 13,
    center: locationRio,
    gestureHandling: 'none'
});

les valeurs disponibles pour gestureHandling sont:

  • 'greedy' : la carte toujours les casseroles (haut ou bas, gauche ou droite) quand l'utilisateur glisse (traîne sur) l'écran. En d'autres termes, à la fois un balayage d'un doigt et un balayage de deux doigts font en sorte que la carte fonctionne.
  • 'cooperative' : l'utilisateur doit glisser d'un doigt pour faire défiler la page et de deux doigts pour parcourir la carte. Si l'utilisateur effectue la carte avec un doigt, une superposition apparaît sur la carte, avec un message indiquant à l'utilisateur d'utiliser deux doigts pour déplacer la carte. Sur les applications de bureau, les utilisateurs peuvent zoomer ou recadrer la carte en faisant défiler tout en appuyant sur une touche modificateur (la touche CTRL ou p i).
  • 'none' : cette option désactive le pointage et le pincement sur la carte pour les appareils mobiles, et le déplacement de la carte sur les appareils de bureau.
  • 'auto' (par défaut): L'API JavaScript de Google Maps définit la propriété gestureHandling à 'cooperative' ou 'greedy'

In en bref, vous pouvez facilement forcer le réglage à "toujours zoomable" ( 'greedy' ), "jamais zoomable" ( 'none' ), ou "l'utilisateur doit appuyer sur CRTL/ փ pour activer zoom" ( 'cooperative' ).

6
répondu Kar.ma 2017-10-10 15:24:21

pour quelqu'un qui se demande comment désactiver le JavaScript API GoogleMap

Il activer le zoom de défilement si vous cliquez sur la carte une fois. Et désactiver après votre souris quitter le div.

voici un exemple

var map;
var element = document.getElementById('map-canvas');
function initMaps() {
  map = new google.maps.Map(element , {
    zoom: 17,
    scrollwheel: false,
    center: {
      lat: parseFloat(-33.915916),
      lng: parseFloat(151.147159)
    },
  });
}


//START IMPORTANT part
//disable scrolling on a map (smoother UX)
jQuery('.map-container').on("mouseleave", function(){
  map.setOptions({ scrollwheel: false });
});
jQuery('.map-container').on("mousedown", function() {
  map.setOptions({ scrollwheel: true });
});
//END IMPORTANT part
.big-placeholder {
  background-color: #1da261;
  height: 300px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
  <body>
      <div class="big-placeholder">
      </div>
      
      
      <!-- START IMPORTANT part -->
      <div class="map-container">
        <div id="map-canvas" style="min-height: 400px;"></div>  
      </div>
      <!-- END IMPORTANT part-->
      
      
      
      <div class="big-placeholder">
      </div>
      <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAIjN23OujC_NdFfvX4_AuoGBbkx7aHMf0&callback=initMaps">
      </script>
  </body>
</html>
4
répondu AlbertSamuel 2017-05-10 05:40:27

vous avez juste besoin d'ajouter dans les options de carte:

scrollwheel: false
4
répondu Kiran Kanzar 2017-06-29 18:26:10

juste incase n'importe qui est intéressé par une solution CSS pure pour cela. Le code suivant se superpose à un div transparent sur la carte, et déplace le div transparent derrière la carte quand il est cliqué. La superposition empêche le zoom, une fois cliqué, et derrière la carte, le zoom est activé.

Voir mon blog post Google maps toggle zoom with css pour une explication comment cela fonctionne, et le stylo codepen.io / daveybrown / pen / yVryMr pour un travail de démonstration.

Avertissement: ceci est principalement pour l'apprentissage et ne sera probablement pas la meilleure solution pour la production de sites web.

HTML:

<div class="map-wrap small-11 medium-8 small-centered columns">
    <input id="map-input" type="checkbox" />
    <label class="map-overlay" for="map-input" class="label" onclick=""></label>
    <iframe src="https://www.google.com/maps/embed?pb=!1m14!1m12!1m3!1d19867.208601651986!2d-0.17101002911118332!3d51.50585742500925!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!5e0!3m2!1sen!2suk!4v1482355389969"></iframe>
</div>

CSS:

.map-wrap {
    position: relative;
    overflow: hidden;
    height: 180px;
    margin-bottom: 10px;
}

#map-input {
    opacity: 0;
}

.map-overlay {
    display: block;
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100% !important;
    height: 100% !important;
    overflow: hidden;
    z-index: 2;    
}

#map-input[type=checkbox]:checked ~ iframe {
    z-index: 3;
}

#map-input[type=checkbox]:checked ~ .map-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100% !important;
    height: 100% !important;
}


iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100% !important;
    height: 100% !important;
    z-index: 1;
    border: none;
}
2
répondu Davey 2017-02-01 21:27:56

une solution simple:

// DISABLE MOUSE SCROLL IN MAPS
// enable the pointer events only on click;
$('.gmap-wrapper').on('click', function () {
  $('.gmap-wrapper iframe').removeClass('scrolloff'); // set the pointer events true on click
});
// you want to disable pointer events when the mouse leave the canvas area;
$(".gmap-wrapper").mouseleave(function () {
  $('.gmap-wrapper iframe').addClass('scrolloff'); // set the pointer events to none when mouse leaves the map area
});
.scrolloff{ pointer-events: none; }
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="gmap-wrapper">
<iframe class="scrolloff" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d44754.55736493158!2d9.151166379101554!3d45.486726!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x4786bfca7e8fb1cb%3A0xee8d99c9d153be98!2sCorsidia!5e0!3m2!1sit!2sit!4v1496947992608" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>
</html>

Source: https://github.com/Corsidia/scrolloff

2
répondu Darme 2017-06-08 18:56:31

utilisez ce morceau de code, qui vous donnera toute la couleur et le contrôle de zoom de Google map. ( scaleControl: false, et molette de défilement: false, permettra d'éviter la molette de zoom vers le haut ou vers le bas)

function initMap() {
            // Styles a map in night mode.
            var map = new google.maps.Map(document.getElementById('map'), {
                center: {lat: 23.684994, lng: 90.356331},
                zoom: 8,
                scaleControl: false,
                scrollwheel: false,
              styles: [
                {elementType: 'geometry', stylers: [{color: 'F1F2EC'}]},
                {elementType: 'labels.text.stroke', stylers: [{color: '877F74'}]},
                {elementType: 'labels.text.fill', stylers: [{color: '877F74'}]},
                {
                  featureType: 'administrative.locality',
                  elementType: 'labels.text.fill',
                  stylers: [{color: '#d59563'}]
                },
                {
                  featureType: 'poi',
                  elementType: 'labels.text.fill',
                  stylers: [{color: '#d59563'}]
                },
                {
                  featureType: 'poi.park',
                  elementType: 'geometry',
                  stylers: [{color: '#263c3f'}]
                },
                {
                  featureType: 'poi.park',
                  elementType: 'labels.text.fill',
                  stylers: [{color: '#f77c2b'}]
                },
                {
                  featureType: 'road',
                  elementType: 'geometry',
                  stylers: [{color: 'F5DAA6'}]
                },
                {
                  featureType: 'road',
                  elementType: 'geometry.stroke',
                  stylers: [{color: '#212a37'}]
                },
                {
                  featureType: 'road',
                  elementType: 'labels.text.fill',
                  stylers: [{color: '#f77c2b'}]
                },
                {
                  featureType: 'road.highway',
                  elementType: 'geometry',
                  stylers: [{color: '#746855'}]
                },
                {
                  featureType: 'road.highway',
                  elementType: 'geometry.stroke',
                  stylers: [{color: 'F5DAA6'}]
                },
                {
                  featureType: 'road.highway',
                  elementType: 'labels.text.fill',
                  stylers: [{color: 'F5DAA6'}]
                },
                {
                  featureType: 'transit',
                  elementType: 'geometry',
                  stylers: [{color: '#2f3948'}]
                },
                {
                  featureType: 'transit.station',
                  elementType: 'labels.text.fill',
                  stylers: [{color: '#f77c2b3'}]
                },
                {
                  featureType: 'water',
                  elementType: 'geometry',
                  stylers: [{color: '#0676b6'}]
                },
                {
                  featureType: 'water',
                  elementType: 'labels.text.fill',
                  stylers: [{color: '#515c6d'}]
                },
                {
                  featureType: 'water',
                  elementType: 'labels.text.stroke',
                  stylers: [{color: '#17263c'}]
                }
              ]
            });
    
             var marker = new google.maps.Marker({
              position: {lat: 23.684994, lng: 90.356331},
              map: map,
              title: 'BANGLADESH'
            });
          }
0
répondu Chamon Roy 2017-06-18 12:12:53

je le fais avec ce simple exemple

jQuery

$('.map').click(function(){
    $(this).find('iframe').addClass('clicked')
    }).mouseleave(function(){
    $(this).find('iframe').removeClass('clicked')
});

CSS

.map {
    width: 100%; 
}
.map iframe {
    width: 100%;
    display: block;
    pointer-events: none;
    position: relative; /* IE needs a position other than static */
}
.map iframe.clicked {
    pointer-events: auto;
}

ou utiliser les options gmap

function init() { 
    var mapOptions = {  
        scrollwheel: false, 
0
répondu dimitar 2017-06-22 13:20:00