Масштабируемое/прокручиваемое HTML-окно в мобильных браузерах

Я пытаюсь создать окно <div> с внутренними элементами, чтобы иметь возможность прокручивать/масштабировать на мобильном устройстве с его содержимым, как здесь:

http://jsfiddle.net/hk1jfp4z/

Я хотел бы иметь возможность делать следующее:

  • Загрузка страницы: Масштабировать #scrollable_zoomable_background, чтобы соответствовать #window.
  • Чтобы увеличить масштаб с помощью двух жестов пальца, прокрутите с помощью сенсорного экрана, коснитесь
  • Остальная часть страницы не должна масштабироваться или горизонтально (с <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"/>)
  • #window не должен быть iframe, он должен быть частью структуры документа.

Ответы

Ответ 1

Во-первых, вы должны настроить viewport, чтобы отключить масштабирование страницы для пользователя. Затем вам нужно использовать библиотеку сенсорных событий, например hammer.js.

Это стандартное окно просмотра:

<meta name="viewport" content="width=device-width, initial-scale=1">

Взгляните на документацию на молот - вы можете увидеть пример распознавателя pinch - именно то, что вам нужно!

Ответ 2

В ответ на ответ от AleshaOleg, вот как вы можете использовать HammerJS для реализации щепотки для увеличения → см. ручку в http://codepen.io/sheinzle/pen/mebBEd

Очевидно, что еще многое предстоит улучшить - event.originalEvent.gesture.scale сбрасывается до 1 при повторном повторении жестов. Поэтому вам нужно будет отслеживать текущий масштаб.

function attachPinch(imgID)
{
    var image = $(imgID);
    $(imgID).hammer().on("pinch", function(event) {
        var el = $(this);
        scale = event.originalEvent.gesture.scale;
        el.css('-webkit-transform', "scale3d("+scale+", "+scale+", 1)");   
   });
}

attachPinch('.pinch-object')
.pinch-object {
  width: 5000px;
  height: 5000px;
  
  background-color:#269;
  background-image: linear-gradient(white 2px, transparent 2px),
  linear-gradient(90deg, white 2px, transparent 2px),
  linear-gradient(rgba(255,255,255,.3) 1px, transparent 1px),
  linear-gradient(90deg, rgba(255,255,255,.3) 1px, transparent 1px);
  background-size:100px 100px, 100px 100px, 20px 20px, 20px 20px;
  background-position:-2px -2px, -2px -2px, -1px -1px, -1px -1px;
  
}
 <script src="//cdnjs.cloudflare.com/ajax/libs/hammer.js/1.0.5/hammer.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://raw.githubusercontent.com/hammerjs/jquery.hammer.js/master/jquery.hammer.js"></script>

<div class="pinch-object"></div>