Google Maps API(v3)を使用して、ページにいくつかの地図を描きます。私がやりたいことの1つは、地図上でマウスホイールをスクロールしたときにズーミングを無効にすることですが、私はどうしたらよいかわかりません。
私はscaleControlを無効にしました(すなわちスケーリングUI要素を削除しました)、しかしこれはスクロールホイールのスケーリングを妨げません。
これが私の関数の一部です(これは単純な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
};
Maps APIのバージョン3では、 MapOptions properties内でscrollwheel
オプションをfalseに設定するだけです。
options = $.extend({
scrollwheel: false,
navigationControl: false,
mapTypeControl: false,
scaleControl: false,
draggable: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}, options);
Maps APIのバージョン2を使用している場合は、次のように disableScrollWheelZoom() API呼び出しを使用する必要があります。
map.disableScrollWheelZoom();
scrollwheel
ズームは、Maps APIのバージョン3ではデフォルトで有効になっていますが、バージョン2ではenableScrollWheelZoom()
API呼び出しで明示的に有効にしない限り無効になっています。
ダニエルのコード 仕事をする(ヒープをありがとう!)しかし、私はズームを完全に無効にしたかったのです。そのためには、これら4つのオプションすべてを使用する必要があることがわかりました。
{
zoom: 14, // Set the zoom level manually
zoomControl: false,
scaleControl: false,
scrollwheel: false,
disableDoubleClickZoom: true,
...
}
念のために、これを動的に行いたいのです。
function enableScrollwheel(map) {
if(map) map.setOptions({ scrollwheel: true });
}
function disableScrollwheel(map) {
if(map) map.setOptions({ scrollwheel: false });
}
地図の上に「複雑な」ものを表示しなければならないこともあります(または地図がレイアウトのほんの一部になっています)が、いったんきれいな地図になったら、このズーム方法はいいです。
複雑にしないでおく!オリジナルのGoogleマップは可変で、その他のものはありません。
var mapOptions = {
zoom: 16,
center: myLatlng,
scrollwheel: false
}
現在(2017年10月)、Googleではズーム/スクロールを処理するためのgestureHandling
という特定のプロパティを実装しています。その目的はモバイルデバイスの操作を処理することですが、デスクトップブラウザの動作も変更します。これは 公式ドキュメント :からのものです。
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' });
GestureHandlingに使用可能な値は次のとおりです。
'greedy'
:ユーザーが画面をスワイプ(ドラッグ)すると、マップは常にパン(上下左右)します。つまり、1本指のスワイプと2本指のスワイプの両方で地図がパンします。'cooperative'
:ユーザーは、ページをスクロールするには1本の指で、マップをパンするには2本の指でスワイプする必要があります。ユーザーが1本の指で地図をスワイプすると、地図上にオーバーレイが表示され、2本の指を使って地図を移動するようにユーザーに指示します。デスクトップアプリケーションでは、ユーザーは修飾キー(Ctrlキーまたは⌘キー)を押しながらスクロールすることで地図をズームまたはパンすることができます。'none'
:このオプションは、モバイルデバイスのマップ上でのパンとピンチ、およびデスクトップデバイス上でのマップのドラッグを無効にします。'auto'
(デフォルト):ページがスクロール可能かどうかに応じて、Google Maps JavaScript APIはgestureHandlingプロパティを'cooperative'
または'greedy'
に設定します。
つまり、設定を「常にズーム可能」('greedy'
)、「常にズーム不可能」('none'
)、または「ユーザーがズームを有効にするにはCRTL /⌘キーを押す必要がある」('cooperative'
)に簡単に強制できます。
私はあなたがNiceボタンでマップをロックまたはロック解除することを可能にするより開発されたjQueryプラグインを作成しました。
このプラグインは、透明なオーバーレイdivを持つGoogleマップのiframeを無効にし、ロック解除のためのボタンを追加します。ロックを解除するには、650ミリ秒間押す必要があります。
あなたはあなたの便利のためにすべてのオプションを変更することができます。 https://github.com/diazemiliano/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);
.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>
念のため、 GMaps.js ライブラリを使用しています。これにより、ジオコーディングやカスタムピンなどの作業が少し簡単になります。ここでは、前の回答から学んだ手法を使用してこの問題を解決します。
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 });
}
私の場合、重要なことはinitの'scrollwheel':false
に設定することでした。 Notice: jQuery UI Map
を使用しています。以下は私の CoffeeScript init関数の見出しです。
$("#map_canvas").gmap({'scrollwheel':false}).bind "init", (evt, map) ->
マップオプションを追加するだけです。
scrollwheel: false
Javascript Google Map APIを無効にする方法を疑問に思う人のために
地図を1回クリックすると、ズームスクロールが有効されます。そしてマウスがdivを抜けた後に無効を押します。
これはいくつかの例です
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>
簡単な解決策:
// 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>
ただ誰かがこれのための純粋なcssソリューションに興味を持っているだけの場合。次のコードは、透明のdivを地図の上にオーバーレイし、クリックされると透明のdivを地図の後ろに移動します。オーバーレイはズーミングを防ぎ、一度クリックされると、ズームが有効になります。
その動作についての説明は私のブログ投稿 GoogleマップとCSSの切り替え 、そして実用的なデモについてはpen codepen.io/daveybrown/pen/yVryMr をご覧ください。
免責事項:これは主に学習のためのものであり、おそらくプロダクション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;
}
私はこの簡単な例でそれをします
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;
}
あるいはgmapオプションを使う
function init() {
var mapOptions = {
scrollwheel: false,
そのコードを使用すると、Googleマップのすべての色とズームの制御ができます。 ( scaleControl:false および /scrollwheel:false は、マウスホイールが上下に動かないようにします)
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'
});
}