положение: исправлено, не работает на iPad и iPhone - PullRequest
128 голосов
/ 03 февраля 2011

Я некоторое время боролся с фиксированным позиционированием в iPad. Я знаю iScroll , и это не всегда работает (даже в их демонстрации). Я также знаю, что у Сенчи есть исправление для этого, но я не мог Ctrl + F исходный код для этого исправления.

Я надеюсь, что у кого-то может быть решение. Проблема в том, что элементы с фиксированным позиционированием не обновляются, когда пользователь перемещается вверх / вниз на мобильном Safari с iOS.

Ответы [ 12 ]

66 голосов
/ 03 февраля 2011

Многие мобильные браузеры сознательно не поддерживают position:fixed; на том основании, что фиксированные элементы могут мешать на маленьком экране.

На сайте Quirksmode.org есть очень хорошее сообщение в блоге, объясняющее проблему: http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html

Также см. На этой странице таблицу совместимости, показывающую, какие мобильные браузеры поддерживают position:fixed;: http://www.quirksmode.org/m/css.html

(но учтите, что мир мобильных браузеров движется очень быстро, поэтому подобные таблицы могут долго не обновляться!)

Обновление: Как сообщается, iOS 5 и Android 4 теперь имеют фиксированную поддержку.

Сегодня я тестировал iOS 5 в магазине Apple и могу подтвердить, что она работает с фиксированной позицией. Однако существуют проблемы с увеличением и панорамированием фиксированного элемента.

Я нашел эту таблицу совместимости гораздо более современной и полезной, чем таблица quirksmode: http://caniuse.com/#search=fixed

Он имеет актуальную информацию об Android, Opera (мини и мобильные) и iOS.

37 голосов
/ 03 февраля 2011

Фиксированное позиционирование не работает на iOS, как на компьютерах.

Представьте, что у вас есть лист бумаги (веб-страница) под увеличительным стеклом (окно просмотра), если вы переместите увеличительное стекло итвой глаз, ты видишь другую часть страницы.Вот как работает iOS.

Теперь есть лист прозрачного пластика с надписью на нем, этот лист пластика остается неподвижным, несмотря ни на что (позиция: фиксированные элементы).Поэтому при перемещении увеличительного стекла неподвижный элемент появляется для перемещения .

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

Так что в iOS видовой экрандвижется, в традиционном браузере движется веб-страница.В обоих случаях фиксированные элементы остаются в реальности;хотя в iOS фиксированные элементы кажутся движущимися.


Чтобы обойти это, нужно следовать последним нескольким абзацам в этой статье

(в основномвообще отключите прокрутку, поместите содержимое в отдельный прокручиваемый div (см. синее поле в верхней части связанной статьи), и фиксированный элемент расположен абсолютно)


«position: fixed» теперь работает каквы ожидаете в iOS5.

22 голосов
/ 02 марта 2012

положение: исправлено, работает на Android / iPhone для вертикальной прокрутки. Но вы должны убедиться, что ваши метатеги полностью установлены. * 1001 например *

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">

Также, если вы планируете, чтобы та же страница работала на Android до 4.0, вам также необходимо установить верхнюю позицию, или по какой-то причине будет добавлено небольшое поле.

20 голосов
/ 25 апреля 2012

теперь Apple поддерживает это

overflow:hidden;
-webkit-overflow-scrolling:touch;
15 голосов
/ 31 июля 2012

Фиксированный нижний колонтитул (здесь с jQuery):

if (navigator.platform == 'iPad' || navigator.platform == 'iPhone' || navigator.platform == 'iPod' || navigator.platform == 'Linux armv6l') 
{
    window.ontouchstart = function () 
    {
        $("#fixedDiv").css("display", "none");
    }

    window.onscroll = function() 
    { 
        var iPadPosition = window.innerHeight + window.pageYOffset-45; // 45 is the height of the Footer
         $("#fixedDiv").css("position", "absolute");
         $("#fixedDiv").css("top", iPadPosition);
         $("#fixedDiv").css("display", "block");
    }
}

// in the CSS file should stand:
#fixedDiv {position: fixed; bottom: 0; height: 45px;  whatever else}

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

10 голосов
/ 13 марта 2018

У меня была эта проблема в Safari (iOS 10.3.3) - браузер не перерисовывался, пока не произошло событие touchend.Фиксированные элементы не появлялись или были обрезаны.

Для меня было добавлено преобразование: translate3d (0,0,0);на мой элемент фиксированной позиции.

.fixed-position-on-mobile {
  position: fixed;
  transform: translate3d(0,0,0);
}

EDIT - теперь я знаю, почему преобразование решает проблему: аппаратное ускорение.Добавление 3D-преобразования запускает ускорение графического процессора для плавного перехода.Для больше на проверке аппаратного ускорения эта статья: http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css.

7 голосов
/ 04 июня 2014

Избегайте в том же окне, используя transform: --- и position: fixed. Элемент останется в положении: статический, если есть какое-либо преобразование.

6 голосов
/ 27 мая 2012

Я закончил с использованием нового jQuery Mobile v1.1: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

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

Самая крутая часть этого подхода заключается в том, что, в отличие от решений на основе JS, которые навязывают неестественную физику прокрутки на всех платформах, наша прокрутка выглядит на 100% нативной, потому что она есть .Это означает, что прокрутка чувствуется хорошо везде и работает с сенсорным, колесиком мыши и клавиатурным вводом пользователя.В качестве бонуса наше решение на основе CSS является очень легким и не влияет на совместимость или доступность.

1 голос
/ 21 июня 2012

Несмотря на то, что атрибут CSS {position:fixed;} кажется (в основном) работающим на новых устройствах iOS, возможно, что устройство изменится и откатится до {position:relative;} в некоторых случаях, без причины или причины. Обычно очистка кеша поможет, пока что-то не произойдет и не произойдет странная ошибка.

В частности, от самого Apple Подготовка вашего веб-контента для iPad :

Safari на iPad и Safari на iPhone не имеют изменяемых размеров окон. В Safari на iPhone и iPad, размер окна установлен на размер экран (за исключением элементов управления пользовательского интерфейса Safari), и не может быть изменен пользователем. Для перемещения по веб-странице пользователь изменяет уровень масштабирования и положение окна просмотра, когда они дважды нажмите или ущипнуть, чтобы увеличить или или касанием и перетаскиванием для перемещения по странице. Как пользователь меняет уровень масштабирования и положение области просмотра, которую они делают в пределах видимая область содержимого фиксированного размера (то есть окно). Это означает элементы веб-страницы, чье положение «зафиксировано» в окне просмотра может оказаться за пределами видимой области содержимого, вне экрана.

Что иронично, устройства Android, похоже, не имеют этой проблемы. Также вполне возможно использовать {position:absolute;}, когда речь идет о теге body, и не иметь проблем.

Я нашел причину этой причуды; что это событие прокрутки не играет хорошо, когда используется в сочетании с тегом HTML или BODY. Иногда ему не нравится запускать событие, или вам придется ждать, пока событие свитка свитка не закончится, чтобы получить событие. В частности, область просмотра перерисовывается в конце этого события, и фиксированные элементы можно переместить в другое место в области просмотра.

Вот что я делаю: ( избегайте использования окна просмотра и придерживайтесь DOM! )

<html>
  <style>
    .fixed{
      position:fixed;
      /*you can set your other static attributes here too*/
      /*like height and width, margin, etc.*/
      }
    .scrollableDiv{
      position:relative;
      overflow-y:scroll;
      /*all children will scroll within this like the body normally would.*/
      } 
    .viewportSizedBody{
      position:relative;
      overflow:hidden;
      /*this will prevent the body page itself from scrolling.*/
      } 
  </style>
  <body class="viewportSizedBody">
    <div id="myFixedContainer" class="fixed">
       This part is fixed.
    </div>
    <div id="myScrollableBody" class="scrollableDiv">
       This part is scrollable.
    </div>
  </body>
  <script type="text/javascript" src="{your path to jquery}/jquery-1.7.2.min.js"></script>
  <script>
    var theViewportHeight=$(window).height();
    $('.viewportSizedBody').css('height',theViewportHeight);
    $('#myScrollableBody').css('height',theViewportHeight);
  </script>
</html>

По сути, это приведет к тому, что тело будет иметь размер области просмотра и не будет прокручиваться. Прокручиваемый DIV, вложенный внутрь, будет прокручиваться как обычно, как ТЕЛО (минус эффект свинга, поэтому прокрутка останавливается при касании.) Фиксированный DIV остается фиксированным без помех.

Как примечание, высокое значение z-index на фиксированном DIV важно, чтобы прокручиваемый DIV, казалось, был позади него. Я обычно добавляю в окно изменения размера и прокрутки события также для кросс-браузерной и альтернативной совместимости разрешения экрана.

Если ничего не помогает, приведенный выше код также будет работать как с фиксированным, так и с прокручиваемым DIV, установленным на {position:absolute;}.

1 голос
/ 01 мая 2012

используя jquery, я могу придумать это.это не прокручивает гладко, но это делает трюк.Вы можете прокрутить вниз, и фиксированный div появится вверху.

CSS

<style type="text/css">
    .btn_cardDetailsPg {height:5px !important;margin-top:-20px;}
    html, body {overflow-x:hidden;overflow-y:auto;}
    #lockDiv {
  background-color: #fff;
  color: #000;
  float:left;
  -moz-box-shadow: 0px 4px 2px 2px #ccc;-webkit-box-shadow: 0px 4px 2px 2px #ccc;box-shadow:0px 4px 2px 2px #ccc;
  }
#lockDiv.stick {
  position: fixed;
  top: 0;
  z-index: 10000;
  margin-left:0px;
  }
</style>

HTML

<div id="lockSticky"></div>
<div id="lockDiv">fooo</div>

JQUERY

<script type="text/javascript">
    function sticky_relocate() {
        var window_top = $(window).scrollTop();
        var div_top = $('#lockSticky').offset().top;
        if (window_top > div_top)
            $('#lockDiv').addClass('stick')
        else
            $('#lockDiv').removeClass('stick');
    }
    $(function() {
        $(window).scroll(sticky_relocate);
        sticky_relocate();
    });
</script>

Наконец, мы хотим определить, будет ли ipod touch в альбомной или портретной ориентации отображаться соответственно

<script type="text/javascript">
    if (navigator.userAgent.match(/like Mac OS X/i)) {
        window.onscroll = function() {

        if (window.innerWidth > window.innerHeight) {
            //alert("landscape [ ]");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 268) + 'px';
        }

        if (window.innerHeight > window.innerWidth) {
            //alert("portrait ||");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 418) + 'px';
        }
        };
    }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...