Установили Яндекс.Карты на свой сайт? Использовали самую простую вставку - через iframe? При попадании мыши в данный фрейм (и при прокрутке с телефона) экран не будет прокручиваться как Вам хотелось бы. А будет меняться локация на карте. Яндекс уверяет, что исправить это невозможно, и рекомендует использовать JS API, что более сложно и не всегда целесообразно. Вот ответ из Яндекс.Блога от сотрудника Яндекса: "поведения Виджета Карт в iframe настраивать нельзя". Кстати, при использовании JS API в мобильной версии скролл карты всё равно остаётся, даже несмотря на рекомендуемый параметр scroll=false, который нужно использовать в параметре запроса, ведь по факту данный параметр отключает масштабирование колесом мыши, а у мобильных нет мыши и для них нужно использовать API и отключать поведение multiTouch.
В итоге, поняв масштаб данной проблемы, я написал несложный скрипт, с помощью которого Вы сможете не бояться за прокрутку внутри iframe, ни в мобильной, ни в десктопной версии Вашего сайта. Скрипт подходит как для Яндекс.Карт, так и для Google Maps.
Итак, как запретить скролл в <iframe> Яндекс.Карт и у Google Maps аналогично
❶Первым делом давайте оформим наш тег <iframe> внутрь другого <div> с идентификатором wrapMap:
<div id="wrapMap">
<iframe style="pointer-events: none;" src="ваш_src" width="100%" height="450" frameborder="0"></iframe>
</div>
В элемент <iframe> мы добавили инлайновый стиль с отключением кликов и прокрутки по карте (с помощью "pointer-events: none"). В данном случае это не является дурным тоном и необходимо для дальнейшей работы скрипта.
❷Затем давайте настроим активацию карты по клику на неё. Кстати, для удобства пользователей, давайте создадим интерактивную подсказку об этом и функционал для активации:
<script>
// создаём элемент <div>, который будем перемещать вместе с указателем мыши пользователя
var mapTitle = document.createElement('div'); mapTitle.className = 'mapTitle';
// вписываем нужный нам текст внутрь элемента
mapTitle.textContent = 'Для активации карты нажмите по ней';
// добавляем элемент с подсказкой последним элементов внутрь нашего <div> с id wrapMap
wrapMap.appendChild(mapTitle);
// по клику на карту
wrapMap.onclick = function() {
// убираем атрибут "style", в котором прописано свойство "pointer-events"
this.children[0].removeAttribute('style');
// удаляем элемент с интерактивной подсказкой
mapTitle.parentElement.removeChild(mapTitle);
}
// по движению мыши в области карты
wrapMap.onmousemove = function(event) {
// показываем подсказку
mapTitle.style.display = 'block';
// двигаем подсказку по области карты вместе с мышкой пользователя
if(event.offsetY > 10) mapTitle.style.top = event.offsetY + 20 + 'px';
if(event.offsetX > 10) mapTitle.style.left = event.offsetX + 20 + 'px';
}
// при уходе указателя мыши с области карты
wrapMap.onmouseleave = function() {
// прячем подсказку
mapTitle.style.display = 'none';
}
</script>
❸Добавим немного стилей для обёртки карты и интерактивного элемента подсказки:
<style>
#wrapMap {
position: relative;
cursor: help;
overflow: hidden;
border-width: 1px;
border-style: solid;
border-color: rgb(204, 204, 204);
border-image: initial;
}
.mapTitle {
position: absolute;
z-index: 1000;
box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 5px;
display: none;
padding: 5px 20px;
border-radius: 5px;
background: rgb(255, 255, 255);
border-width: 1px;
border-style: solid;
border-color: rgb(204, 204, 204);
border-image: initial;
}
</style>
Пример работы скрипта:
Приятного использования!
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
Web development blog!