Подтвердить что ты не робот

IPad Safari не соответствует прокрутке в RTL с широким контентом

Условие выглядит следующим образом:

  • Использование iPad Safari
  • Страница находится в режиме RTL (справа налево) (арабский язык)
  • Страница динамически загружает контент, который шире экрана
  • Появляется странное поведение прокрутки

Страница запускается, по-видимому, прокручивается слишком далеко влево (см. скриншот), поэтому правая часть (как правило, левая в режиме LTR) направлена ​​к середине, и вместо этого отображается отрицательное пространство.

Вы можете перетащить вправо, чтобы прокрутить влево, чтобы увидеть какое-то содержимое, которое начинается за кадром, но я могу прокручивать только часть, которая оставляет некоторый контент вдалеке слева, что невозможно.

Вот скриншот из дефекта, над которым я работаю:

Screenshot of the initial state

Вот простой HTML, который мог бы воспроизвести проблему:

<!DOCTYPE html>
<html dir="rtl">
<head>
<meta name="viewport" content="minimum-scale=0.25, maximum-scale=4.0, user-scalable=yes" />
</head>
<body style="background-color:grey">
<script src="http://code.jquery.com/jquery.js"></script>
<script>
    setTimeout(function(){
        $('<div style="width:2000px;background-color:red">test</div>').appendTo('body');
    },1000);
</script>
</body>
</html>

Действия, которые вы можете выполнить, чтобы воспроизвести проблему:

  • Скопируйте этот HTML-код в локальный файл
  • Откройте документ в Chrome, используя F12, вы можете включить эмуляцию iPad.

Chrome emulation

Нажмите кнопку для эмуляции - тогда вы заметите, что правый край красной рамки находится около середины страницы. Однако этого не должно быть. Этот красный ящик должен быть единственным контентом, и ничто не находится справа от него, поэтому оно должно совпадать с правым краем.

Эта проблема также возникает, когда вы динамически вставляете широкий контент после загрузки страницы, поэтому, если страница начинается с широкого содержимого, поведение прокрутки кажется нормальным. Следовательно, setTimeout() в коде.

Любые советы/способы решения проблемы?

EDIT: Вы также можете попробовать эту ссылку, чтобы воспроизвести проблему: http://www.codefactor.net/ipadissue.html

4b9b3361

Ответ 1

Это ошибка в WebKit и была разрешена https://bugs.webkit.org/show_bug.cgi?id=146872.

Смотрите журнал изменений здесь: https://bugs.webkit.org/attachment.cgi?id=256657&action=review

Однако я не знаю версию выпуска. Рассмотрим, что большинство iOS имеют обновления браузера с обновлением ОС, это будет исправлено в ближайшее время (исправлено как 2015-7-11).

Ответ 2

Единственное решение, которое я нашел до сих пор, заключается в размещении всего содержимого rtl внутри контейнера. Это заставило образец кода работать так, как ожидалось, и сделать это для всего содержимого для детей.

(я тестировал iPad, хром, рабочий стол для сафари и несколько других имитируемых устройств в hrome dev-tools)

Так просто поместите все в него:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="minimum-scale=0.25, maximum-scale=4.0, user-scalable=yes" />

</head>

<body style="background-color:grey">


    <div dir="rtl" id="container"></div>


<script src="http://code.jquery.com/jquery.js"></script>
<script>
    setTimeout(function(){
        $('<div style="width:2000px;background-color:red">test</div>').appendTo('#container');
    },1000);
</script>
</body>
</html>

iPad Safari rtl align issue


ПРИМЕЧАНИЕ. Вам также может потребоваться удалить поля и/или paddings из #container div, заставив их значения 0s, чтобы не нарушать ваш дизайн специально если он построен поверх рамки CSS.

ПРИМЕЧАНИЕ 2. Я думаю, что это ошибка iPad Safari, о которой нам, возможно, потребуется сообщить. Когда rtl тег html или body, текст выравнивается правильно, но divs выравниваются с неправильной стороной (например, если он находится внутри классической ltr веб-страницы) и это происходит только с iPad Safari, а не с настольной версией.

Ответ 3

'Мне кажется, что проблема заключается в метатеге вашего просмотра.

Попробуйте следующее:

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

или просто расширьте существующий метатег следующим образом:

<meta name="viewport" content="minimum-scale=0.25, maximum-scale=4.0, user-scalable=yes, width=device-width, initial-scale=1">

Ответ 4

Это связано с тем, что вы используете метод замены изображений, в котором используется text-indent с огромным отрицательным значением. Это не очень хорошо работает с RTL, браузер не понимает его, как мы относимся к нему в LTR. Убедитесь, что элемент имеет "переполнение: скрыто"; и это устранит проблему.