Событие касания Javascript не работает в мобильном сафари - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь ограничить прокрутку пользователей, если они касаются фрейма.Так что, если они касаются тела, они могут прокручивать.

Хотите знать, почему приведенный ниже код отлично работает в Mobile Chrome, но не работает в Mobile Safari.Любой способ исправить это для сафари?

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
        <style>
            .overflowHidden {
                position:relative;
                overflow-y:hidden;
            }
            .overflowAuto {
                -webkit-overflow-scrolling: touch;
                overflow: auto;
            }
        </style>
    </head>
    <body>
        <section>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
            <iframe id="appSimulator" style="background: #000000;" width="189px" height="400px" frameborder="0" scrolling="no"></iframe>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
        </section>
        <script type="text/javascript">
            document.body.addEventListener('touchstart', function(){
                document.body.style.overflow="auto";
                $('body').removeClass('overflowHidden');
                $('body').addClass('overflowAuto');
            }, false)
            document.body.addEventListener('touchend', function(){
                document.body.style.overflow="hidden";
                $('body').removeClass('overflowAuto');
                $('body').addClass('overflowHidden');
            }, false)
        </script>
    </body>
</html>

EDIT

Пример для мобильного Chrome - это то, что я хочу в Safari mobile

enter image description here

Спасибо.

РЕДАКТИРОВАТЬ 2

Спасибо за помощь от muecas.

Вот текущий результат от Safari Mobile

enter image description here

Текущий код

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <style>
            body {
                -webkit-overflow-scrolling: touch;
            }
            .iframeContainer, iframe {
                width: 189px;
                height: 405px;
            }
            .iframeContainer {
                overflow: auto;
            }
        </style>
    </head>
    <body>
        <section>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
            <div class="iframeContainer">
                <iframe id="appSimulator" src="https://appetize.io/embed/keyyyyyyy?device=iphone5s&scale=50&autoplay=false&orientation=portrait&deviceColor=black&language=zh-Hant" frameborder="0" scrolling="no"></iframe>
            </div>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
        </section>
    </body>
</html>

, если я установлю .iframeContainer { overflow: hidden; }

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Основная проблема с Safari iOS заключается в том, что тег iframe рассматривается как некий адаптивный элемент и будет действовать странным образом по отношению к его размеру и размерам элементов (загруженного HTML).Я тестировал iframe с реальным контентом, поэтому он будет полностью прокручиваться.Используя тот же код, что и в вашем примере, Safari iOS показала iframe с полной высотой содержимого содержимого html с определенными width и height.

Для решения проблемы вам необходимо включитьiframe в block контейнере, затем установите размер контейнера блока (width и height) и overflow в auto, и добавьте атрибут vendor в тело, чтобы разрешить iframeпрокручиваться правильно.Кроме того, не забудьте установить iframe как прокручиваемый.

Вы можете отказаться от реализации js.

Я проверял это на всех браузерах настольных компьютеров, Safari iOS и Mobile Chrome.

Вы также можете проверить эту ссылку , когда обсуждается адаптивное содержимое внутри iframe.

Надеюсь, что это поможет.

Main html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <style>
        body {
            -webkit-overflow-scrolling: touch;
        }
        .iframeContainer, iframe {
            width: 200px;
            height: 200px;
        }
        .iframeContainer {
            overflow: auto;
        }
    </style>
</head>
<body>
    <section>
        <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
        <div class="iframeContainer">
            <iframe id="appSimulator" frameborder="0" src="scrolling.html" scrolling="yes"></iframe>
        </div>
        <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
    </section>
</body>
</html>

Загружен iframe:

    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <style>
        body {
            background-color: black;
            color: white;
        }
    </style>
</head>
<body>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
</body>
</html>
0 голосов
/ 15 мая 2018

Кажется, что сенсорное событие работает хорошо, но переполнение - нет.
Я не уверен, как выглядит ваш html, однако вы можете попробовать это:

  1. hidden:
    body { /* position can be fixed */ position:relative; overflow-y:hidden; }

  2. авто:
    body { -webkit-overflow-scrolling: touch; overflow: auto; }

...