позиція: фіксований не працює на iPad та iPhone


132

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

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


2
Схоже, jQuery Mobile 1.1 вирішив цю проблему: jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
Вежа


Можливий дублікат декількох запитань ТА Докладніше див. На gist.github.com/avesus/… .
Брайан Хаак

Відповіді:


66

Багато мобільних браузерів навмисно не підтримують 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 і можу підтвердити, що він працює з фіксованим положенням. Існують проблеми із збільшенням масштабу та переміщенням навколо нерухомого елемента.

Я знайшов цю таблицю сумісності набагато актуальнішою та кориснішою, ніж першокласна: http://caniuse.com/#search=fixed

У ньому є актуальна інформація про Android, Opera (міні та мобільний) та iOS.


position:device-fixedбуло б виправданим. position:fixedповинен просто працювати зі специфікаціями W3C.
Талві Ватія

@TalviWatia - device-fixedрішення не було частиною моєї відповіді. Це може бути, а може і не мати переваги як пропозиція, але причиною посилання було пояснення питання, а не запропоноване його рішення. У будь-якому випадку, з моменту опублікування цієї відповіді все змінилося дуже сильно, і багато нових пристроїв підтримують багато fixed. Вам все ще потрібно мати справу зі старими пристроями, які цього не роблять.
Спудлі

54
Тож мені цікаво, яке саме ваше вирішення проблеми? Посилання, які ви надали, хоча можливо корисні, не вирішують проблему. Не зациклюватися, але люди, як правило, отримують відповіді, які насправді не є відповідями тут.
Талві Ватія

1
@TalviWatia: На той момент, коли я писав відповідь, насправді не було вдалого вирішення питання. Посилання, яке я дав, - це найкраща дискусія, яку я знав, щоб пояснити, чому все так, як вони були, що за відсутності рішення було настільки добре, наскільки я міг запропонувати. Речі змінилися в проміжний період, тому обговорення у посиланні вже не актуальне, і зараз є рішення, але саме так було в той час.
Спудлі

Власне положення: фіксований працює для масштабу 1, але коли користувач збільшує масштаб ipad, він не працює нормально. положення: фіксований пристрій існує ?? Чи дійсний атрибут css для safari ios?
ccsakuweb

37

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

Уявіть, що ви маєте аркуш паперу (веб-сторінку) під лупою (вікно перегляду), якщо ви переміщуєте збільшувальне скло і оком, ви бачите іншу частину сторінки. Так працює iOS.

Тепер є аркуш прозорого пластику з написом на ньому, цей лист пластику залишається нерухомим незалежно від того (положення: нерухомі елементи). Тож при переміщенні лупи нерухомий елемент здається, рухається.

Крім того, замість того, щоб переміщувати збільшувальне скло, ви переміщуєте папір (веб-сторінку), зберігаючи лист пластику та збільшувальне скло. У цьому випадку слово на пластиковому аркуші буде залишатися незмінним, а решта вмісту буде переміщуватися (бо він насправді є) Це традиційний настільний браузер.

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


Шляхом подолання цього є слідування останніх кількох абзаців цієї статті

(в основному взагалі вимкнути прокрутку, вміст міститься в окремому прокручуваному розділенні (див. синє поле у ​​верхній частині пов’язаної статті), а фіксований елемент розташований абсолютно)


"position: fix" зараз працює так, як ви очікували в iOS5.


Є деякі дивні речі, які трапляються із положенням: виправлено під час збільшення IOS. Дивіться stackoverflow.com/questions/52085998/…
Пітер Холлінгсворт

23

положення: фіксований працює на android / iphone для вертикальної прокрутки. Але вам потрібно переконатися, що ваші метатеги повністю налаштовані. напр

<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 pre 4.0, вам також потрібно встановити верхню позицію, інакше чомусь буде додано невеликий запас.


Це насправді спрацювало для мене. Раніше позиція: фіксований на прихованому вхідному елементі (див. Чисту програму css off screen) спричинив збій браузера на iphone ios 8.3, але не на планшеті. Після це прекрасно працює.
Стівен Сміт

Не працював на iPad iOS 10.3, горизонтальний у квадратній підставці. Зазначений автор каже, що такий підхід призначений для "телефонів".
SushiGuy

2
Відключення користувача до збільшення масштабу user-scalable=0, minimum-scale=1.0, maximum-scale=1.0може зробити сторінку менш доступною для багатьох користувачів. Було б корисно додати попередження про це у своїй відповіді
neiya

22

тепер яблуко це підтримує

overflow:hidden;
-webkit-overflow-scrolling:touch;

Саме це я і вирішив вирішити background-size: coverі fixedвипустити на iPad
andyb

Це працює на мобільному Safari в iOS 7. Примітка. Він не працюватиме для користувачів, які ще не оновили цю версію.
Ніл Монро

Тоді в роботі повинні бути деякі інші змінні. Я тестував на iOS 6 і він не працював, потім на iOS 7 і так було.
Ніл Монро

@NeilMonroe Хм, можливо. я впевнений, що я це зробив на iOS 6 без проблем, але, можливо, я використав іншу змінну. не пам’ятайте
Uğur Özpınar

це було дуже корисно, але, здається, overflowмає бути встановленоscroll

19

У мене була ця проблема на Safari (iOS 10.3.3) - браузер не перемальовувався, поки не відбулася подія доторкань. Виправлені елементи не з’являлися або були відрізані.

Трюком для мене було додавання перетворення: 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 .


Це фактично вирішило мою проблему прокрутки, під час використання підстрибуючи на пристроях iOS fixed, додав transformі це було виправлено.
vonUbisch

17

Виправлений колонтитул (тут з 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}

Сподіваюся, це допомагає.


7

Уникайте у тому ж полі, використовуючи перетворення: --- та положення: фіксовано. Елемент залишиться в положенні: статичний, якщо є якесь перетворення.


6

Я в кінцевому підсумку користувався новим jQuery Mobile v1.1: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

Зараз у нас є ґрунтовна переписування, яка забезпечує справжню фіксовану панель інструментів на багатьох популярних платформах і безпечно повертається до статичного позиціонування панелі інструментів в інших браузерах.

Найкрутіша частина цього підходу полягає в тому, що на відміну від рішень на основі JS, які нав'язують неприродну фізику прокрутки на всіх платформах, наша прокрутка відчуває себе на 100% рідною, бо вона є . Це означає, що прокрутка відчуває себе скрізь і працює з дотиком, мишачим колесом та клавіатурою користувачів. Як бонус, наше рішення на основі CSS надзвичайно легке і не впливає на сумісність чи доступність.


Також досить елегантним (але, безумовно, вирішенням) є цей спосіб дозволу фіксованих об'єктів на iOS без використання jQuery або JavaScript (використовує лише CSS). Це досить універсально. Якщо ви хочете, щоб "плаваючий" position:fixedелемент з'явився перед вашою сторінкою прокрутки, вам просто потрібно буде надати йому більш високе z-indexзначення, щоб він залишався попереду.
Slink

це однозначно не відповідає на питання.
Густаво Сікейра

1

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

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>

ЖИТТЯ

<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 у ландшафтному чи портретному режимі відповідно

<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>

1

Навіть незважаючи на те, що атрибут 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>

По суті, це призведе до того, що BODY буде розміром вікна перегляду та не прокручується. Прокручуваний DIV, вкладений всередину, буде прокручуватися так, як зазвичай BODY (мінус ефект повороту, тому прокрутка припиняється на дотик.) Фіксований DIV залишається нерухомим без перешкод.

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

Якщо все інше не вдасться, наведений вище код також буде працювати з фіксованими та прокручуваними DIV, встановленими на {position:absolute;}.


1

Простий спосіб вирішити цю проблему - просто ввести властивість перетворення для вашого елемента. і це буде виправлено. Щасливе кодування :-)

.classname{
  position: fixed;
  transform: translate3d(0,0,0);
}

Також ви можете спробувати його так само, це теж добре працює.

.classname{
      position: -webkit-sticky;
    }

0

Це може застосовуватися не у всіх сценаріях, але я виявив, що position: sticky(те саме, що position: fixed) працює лише на старих айфонах, коли контейнер прокрутки - це не тіло, а всередині чогось іншого.

Приклад псевдо html:

body                         <- scrollbar
   relative div
       sticky div

Клейкий дів буде липким на настільних браузерах, але на певних пристроях, протестованих: Chromium: dev tools: емультування пристрою: iPhone 6/7/8 та Android 4 Firefox, це не буде.

Що, однак, буде працювати

body
    div overflow=auto       <- scrollbar
        relative div
            sticky div

0

У моєму випадку це було тому, що фіксований елемент демонструвався за допомогою анімації. Як зазначено в цьому посиланні :

у Safari 9.1, що має положення: фіксований елемент всередині анімованого елемента, може спричинити появу позиції: фіксований елемент.


-2

ось моє рішення цього ...

CSS

#bgimg_top {
    background: url(images/bg.jpg) no-repeat 50% 0%; 
    position: fixed; 
    top:0; 
    left: 0; 
    right:0 ; 
    bottom:0;
}

HTML

<body>
<div id="bgimg_top"></div>
....
</body>

Пояснення полягає в тому, що положення, встановлене для div, буде постійно зберігати div на задньому плані, тоді ми розтягуємо div, щоб перейти на всі кути браузера (за умови, що поле тіла = 0), використовуючи (лівий, правий, верхній, нижній ) одночасно.

Будь ласка, переконайтеся, що ви не використовуєте ширину та висоту, оскільки це перекриє верхній, лівий, правий, нижній параметри.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.