Фонове зображення стрибає, коли адресний рядок приховує iOS / Android / Mobile Chrome


174

Зараз я розробляю чуйний сайт за допомогою Twitter Bootstrap.

Сайт має повноекранне фонове зображення у мобільному / планшетному / робочому столі. Ці зображення обертаються і зникають через кожне, використовуючи два діви.

Це майже ідеально, крім одного питання. За допомогою iOS Safari, Android Browser або Chrome на Android фон трохи підскакує, коли користувач прокручує сторінку вниз і спричиняє приховування адресного рядка.

Сайт тут: http://lt2.daveclarke.me/

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

Код, який я використовую для фону DIV, такий:

#bg1 {
    background-color: #3d3d3f;
    background-repeat:no-repeat;
    background-attachment:fixed;
    background-position:center center;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover; position:fixed;
    width:100%;
    height:100%;
    left:0px;
    top:0px;
    z-index:-1;
    display:none;
}

Всі пропозиції ласкаво просимо - цим займаюсь голову протягом певного часу !!


Ваше посилання вимагає auth ... також, покажіть нам кілька кодів pls!
Шон Тейлор

Додано нове посилання та показаний код для фонового розміщення тощо
Дейв Кларк

1
Якщо у вас виникає ця проблема, ви можете перевірити developers.google.com/web/updates/2016/12/url-bar-resizing . Це питання (свого роду) вирішувалось зараз, але все ще стосується елементів, які є position: fixed.
Адам Рейс

@AdamReis нарешті! Дякую за публікацію
Дейв Кларк

Відповіді:


106

Ця проблема викликана тим, що рядки URL-адреси скорочуються / ковзають із шляху та змінюють розмір диваків # bg1 та # bg2, оскільки вони на 100% зростають та "фіксуються". Оскільки фонове зображення встановлено на "прикриття", воно буде регулювати розмір / положення зображення, оскільки площа містить більше.

Виходячи з чуйного характеру сайту, фон повинен масштабуватися. Я розважаю два можливі рішення:

1) Встановіть висоту # bg1, # bg2 на 100vh. Теоретично це елегантне рішення. Однак у iOS є помилка vh ( http://thatemil.com/blog/2013/06/13/viewport-relative-unit-strangeness-in-ios-6/ ). Я намагався використовувати максимальну висоту, щоб запобігти проблемі, але це залишилось.

2) На розмір вікна перегляду, якщо він визначається Javascript, не впливає рядок URL. Тому Javascript можна використовувати для встановлення статичної висоти на # bg1 та # bg2 на основі розміру вікна перегляду. Це не найкраще рішення, оскільки це не чистий CSS і є невеликий стрибок зображення при завантаженні сторінки. Однак це єдине життєздатне рішення, яке я бачу, враховуючи помилки "vh" iOS (які, як видається, не виправлені в iOS 7).

var bg = $("#bg1, #bg2");

function resizeBackground() {
    bg.height($(window).height());
}

$(window).resize(resizeBackground);
resizeBackground();

Зі сторони, я бачив так багато проблем із цими розмірами URL-адрес в iOS та Android. Я розумію мету, але їм дійсно потрібно продумати дивну функціональність і хаос, який вони вносять на веб-сайти. Остання зміна: ви більше не можете "приховувати" рядок URL-адрес на завантаженні сторінки в iOS або Chrome, використовуючи підказки прокрутки.

EDIT: Хоча вищезазначений сценарій прекрасно працює для запобігання зміни розміру фону, він спричиняє помітний розрив, коли користувачі прокручують вниз. Це пояснюється тим, що він підтримує розмір фону до 100% від висоти екрану за вирахуванням URL-рядка. Якщо додати до висоти 60 пікс, як говорить швейцарський, ця проблема відходить. Це означає, що ми не бачимо нижнє 60px фонового зображення, коли присутній URL-рядок, але це заважає користувачам бачити пробіл.

function resizeBackground() {
    bg.height( $(window).height() + 60);
}

Дякую за це Я дам йому кружляння завтра, і я дам вам знати, як я дістаюся :)
Дейв Кларк

5
Це чудово. Я реалізував ваше друге рішення, яке майже прекрасно спрацювало лише з декількома піксельними розривами між колонтитулом та фоновим зображенням. Я змінив ваш четвертий рядок коду на: bg.height(jQuery(window).height() + 60);який прекрасно працює на всіх моїх пристроях! Дякую :)
Дейв Кларк

6
Помилка ih vh виправлена ​​в iOS8, але проблема в Android не є. Я використовую vhодиниці і, звичайно 100vh, більше, коли адресний рядок приховано. Дурно, що цей стрибок відбувається після припинення прокрутки. Це просто виглядає баггі. Я в кінцевому підсумку використовував перехід на висоту, щоб це здалося навмисним.
ProblemsOfSumit

1
Мені вдалося вирішити цю проблему, перемістивши тло з bodyобгортки на обгортку <div>всього вмісту сторінки. Немає стрибаючих фонів на iOS чи Android!
Маріус Шульц

2
Рішення JS не працює для мене (Android). Підтверджено, що сценарій встановлює висоту, але проблема зберігається.
jwinn

61

Я виявив, що відповідь Джейсона не дуже працює для мене, і я все одно отримую стрибок. Javascript гарантував, що у верхній частині сторінки не було розривів, але фон все ще стрибав, коли адресна панель зникала / з'являлася знову. Так само як і виправлення Javascript, я застосував transition: height 999999sдо div. Це створює перехід тривалістю настільки довгою, що практично застигає елемент.


23
Ви, сер, заслуговуєте +1 на справжнє нестандартне мислення. На жаль, це запобігає пристосуванню розміру div до будь-яких змін розміру екрана, включаючи приклади, викликані обертанням екрана.
tobik

+1 для творчості! Можливо, доведеться зараз використовувати це як з'єднання для видачі, якщо ви використовуєте vwабо vhвстановлюєте розмір шрифту всередині цього батьківського контейнера.
робі

6
@tobik Ще можна зменшити стрибок, спричинений зміною вікна перегляду, встановивши перехід 0,5 секунди або близько того
бінарний

7
спробуйте повернути телефон зараз
cuddlecheek

1
@tobik це насправді робить його більше функцією, ніж помилкою;) хороше мислення
dimitrieh

23

У мене є аналогічна проблема у заголовку нашого веб-сайту.

html, body {
    height:100%;
}
.header {
    height:100%;
}

Це в кінцевому підсумку стане стрибковим прокруткою на андроїд-хромі, оскільки контейнер .header змінить масштаб після того, як панель url ховається, і палець буде вилучений із екрана.

CSS-рішення:

Додавання наступних двох рядків перешкоджає тому, що смужка URL-адреси ховається та вертикальна прокрутка все ще можлива:

html {
    overflow: hidden;
}
body {
    overflow-y: scroll;
    -webkit-overflow-scrolling:touch;
}

4
Так, це вирішує це так, як ти кажеш, але це гадно, що наві-бар завжди показується. На деяких телефонах це може зайняти цілий кутовий простір!
Дейв Кларк

1
Це правда, щоб запобігти цьому, ви можете додатково використовувати JavaScript-вирішення. Але цей приклад взагалі працює без JS.
мат

3
Прокрутка повністю відключена, коли я спробував це рішення.
Nithin Baby

1
Дякую, що спрацювало чудово для моєї ситуації! Слід зазначити, що хтось інший може пропустити, що html та теги body повинні бути встановлені на 100% висоти, щоб це працювало (я спочатку просто прокинув вашу відповідь спочатку і перейшов до першої згадки про "рішення").
запікання

-webkit-overflow-scrolling не слід використовувати на виробничих майданчиках. developer.mozilla.org/en-US/docs/Web/CSS/…
Фредрік Вестерлунд

16

Проблему можна вирішити за допомогою медіа-запиту та певної математики. Ось рішення для орієнтації на портат:

@media (max-device-aspect-ratio: 3/4) {
  height: calc(100vw * 1.333 - 9%);
}
@media (max-device-aspect-ratio: 2/3) {
  height: calc(100vw * 1.5 - 9%);
}
@media (max-device-aspect-ratio: 10/16) {
  height: calc(100vw * 1.6 - 9%);
}
@media (max-device-aspect-ratio: 9/16) {
  height: calc(100vw * 1.778 - 9%);
}

Оскільки vh зміниться, коли панель url зникне, вам потрібно визначити висоту іншим способом. На щастя, ширина вікна перегляду є постійною, а мобільні пристрої мають лише декілька співвідношень сторін; якщо ви можете визначити ширину і співвідношення сторін, трохи математики дасть вам висоту огляду точно так, як слід vh працювати . Ось процес

1) Створіть ряд медіа-запитів для пропорцій, на які потрібно націлити.

  • використовуйте співвідношення сторін-пристроїв замість співвідношення сторін, оскільки остання змінять розмір, коли панель URL-адреси відпадає

  • Я додав "max" до співвідношення сторін між пристроєм, щоб націлити будь-які співвідношення сторін, які, як правило, дотримуються між найпопулярнішими. Вони не будуть настільки точними, але вони будуть лише для меншості користувачів і все ще будуть досить близькими до належного vh.

  • запам’ятайте медіа-запит, використовуючи горизонтальну / вертикальну, тому для перенесення потрібно перегорнути номери

2) для кожного медіа-запиту помножте будь-який відсоток вертикальної висоти, на який потрібно, щоб елемент знаходився в vw на зворотній частині співвідношення сторін.

  • Оскільки ви знаєте ширину та відношення ширини до висоти, ви просто помножите потрібний% (у вашому випадку 100%) на співвідношення висота / ширина.

3) Ви повинні визначити висоту смуги URL, а потім мінус висоту. Я не знайшов точних вимірів, але я використовую 9% для мобільних пристроїв у пейзажі, і це, здається, працює досить добре.

Це не дуже елегантне рішення, але інші варіанти теж не дуже хороші, враховуючи, що вони:

  • Оскільки ваш веб-сайт здається користувачеві баггі,

  • які мають елементи неправильного розміру, або

  • Використовуючи javascript для деяких базових стилів,

Недолік - деякі пристрої можуть мати різну висоту смуги URL або співвідношення сторін, ніж найпопулярніші. Однак, використовуючи цей метод, якщо додавання / віднімання кількох пікселів страждає лише невеликій кількості пристроїв, це здається мені набагато кращим, ніж всі, хто має веб-сайт при зміні розміру.

Щоб зробити це простіше, я також створив SASS mixin:

@mixin vh-fix {
  @media (max-device-aspect-ratio: 3/4) {
    height: calc(100vw * 1.333 - 9%);
  }
  @media (max-device-aspect-ratio: 2/3) {
    height: calc(100vw * 1.5 - 9%);
  }
  @media (max-device-aspect-ratio: 10/16) {
    height: calc(100vw * 1.6 - 9%);
  }
  @media (max-device-aspect-ratio: 9/16) {
    height: calc(100vw * 1.778 - 9%);
  }
}

2
Дуже креативно! Не любитель 9% здогадки.
w00t

1
Дуже просто і розумно! Ви можете додати параметр vh-fix, щоб імітувати вихідну поведінку: @mixin vh-fix($vh: 100)=>height: calc(100vw * (1.333 * $vh / 100) - 9%)
mjsarfatti

1
Сказане повинно бути:height: calc(100vw * (1.333 * #{$vh} / 100) - 9%)
mjsarfatti

Для мого використання це спрацювало дуже добре, а ще краще, коли я видалив -9%.
Бен Флемінг

12

Усі відповіді тут використовують windowвисоту, на яку впливає рядок URL. Всі забули про screenвисоту?

Ось моє рішення jQuery:

$(function(){

  var $w = $(window),
      $background = $('#background');

  // Fix background image jump on mobile
  if ((/Android|iPhone|iPad|iPod|BlackBerry/i).test(navigator.userAgent || navigator.vendor || window.opera)) {
    $background.css({'top': 'auto', 'bottom': 0});

    $w.resize(sizeBackground);
    sizeBackground();
  }

  function sizeBackground() {
     $background.height(screen.height);
  }
});

Додавання .css() деталі неминуче змінює абсолютний розміщений верхній елемент на вирівняний знизу, так що стрибків взагалі немає. Хоча, я думаю, немає причин не просто додати це до звичайного CSS.

Нам потрібен нюховий агент користувача, оскільки висота екрана на робочих столах не буде корисною.

Також це все припускають #background , що елемент з фіксованим положенням заповнює вікно.

Для пуристів JavaScript (попередження - не перевірено):

var background = document.getElementById('background');

// Fix background image jump on mobile
if ((/Android|iPhone|iPad|iPod|BlackBerry/i).test(navigator.userAgent || navigator.vendor || window.opera)) {
  background.style.top = 'auto';
  background.style.bottom = 0;

  window.onresize = sizeBackground;
  sizeBackground();
}

function sizeBackground() {
  background.style.height = screen.height;
}

EDIT: Вибачте, що це не відповідає безпосередньо вашій конкретній проблемі з більш ніж одним фоном. Але це один з перших результатів при пошуку цієї проблеми фіксованих фонів, що стрибають на мобільний.


2
Я спробував мільйон цих відповідей, і це, безумовно, найкраще. Я спочатку намагався використати це лише на <body>, оскільки це мало передумови. Використання div для загортання всієї сторінки спричинило інші проблеми. Використання порожнього діва з z-індексом: -1 як фон здався найкращим рішенням у поєднанні з вищезазначеним. Я вийняв мобільне виявлення, оскільки це робиться на робочому столі, не шкодить моєму сайту. Немає математики (яка може вгадати розмір вкладок неправильно), не потрібен обробник для зміни розміру. Фон - це лише весь екран, прикріплений донизу. Зроблено. Любіть це!
Еван Ланглуа

9

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

1) Елементи з встановленою висотою, що дозволяють 100vhзмінювати розмір кожного разу, коли розмір вікна перегляду змінюється, включаючи випадки, коли це викликано (не) появою рядка URL.

2) на $(window).height()значення, що повертаються, також впливає розмір рядка URL.

Одне рішення - "заморозити" елемент, використовуючи, transition: height 999999sяк запропоновано у відповіді AlexKempton . Недоліком є ​​те, що це ефективно вимикає адаптацію до всіх змін розміру вікна перегляду, включаючи ті, що викликані обертанням екрана.

Тому моє рішення - керувати змінами вікна перегляду вручну за допомогою JavaScript. Це дозволяє мені ігнорувати невеликі зміни, які можуть бути викликані URL-адресою і реагувати лише на великі.

function greedyJumbotron() {
    var HEIGHT_CHANGE_TOLERANCE = 100; // Approximately URL bar height in Chrome on tablet

    var jumbotron = $(this);
    var viewportHeight = $(window).height();

    $(window).resize(function () {
        if (Math.abs(viewportHeight - $(window).height()) > HEIGHT_CHANGE_TOLERANCE) {
            viewportHeight = $(window).height();
            update();
        }
    });

    function update() {
        jumbotron.css('height', viewportHeight + 'px');
    }

    update();
}

$('.greedy-jumbotron').each(greedyJumbotron);

EDIT: Я фактично використовую цю техніку разом із height: 100vh. Сторінка візуалізується належним чином з самого початку, а потім запускається javascript і починає керувати висотою вручну. Таким чином, мерехтіння не відбувається взагалі, коли сторінка завантажується (або навіть згодом).


1
Я використовував щось подібне, але замість встановлення height: 100vhв початковому CSS, я встановлюю, min-height:100vhа потім у розмірі вікна я обчислюю min-heightі встановлюю його на висоту порту перегляду. Це зручно, коли ваш сайт переглядається на крихітних екранах, а вміст занадто великий, щоб вмістити його у вікно перегляду. Час виходу / вимкнення дроселя на час події зміни розміру допомагає покращити ефективність роботи деяких браузерів (розмір має тенденцію до запуску дуже часто)
Troy Morehouse

Я думаю, що в певний момент я також спробував використовувати min-heightнатомість, але тоді я зіткнувся з проблемою, коли мені потрібно було вертикально зосереджувати внутрішній вміст. Якесь вертикальне центрування може стати складним, коли зовнішній елемент heightвстановлений на auto. Тому я придумав фіксовану мінімальну висоту, яка повинна бути достатньою для вмісту будь-якого можливого вмісту та встановити її в початковій CSS. Оскільки min-heightмає більший пріоритет, ніж heightвін працює досить добре.
tobik

Ах да, я мав ту ж саму проблему, але фіксоване, змінивши JumboTron до display: tableі потім встановити внутрішній контейнер display: table-cellз vertical-align: middle. Працював як шарм.
Трой Морхаус

Дійсно? Тому що я спробував той самий підхід, але не зміг. Я не дуже пам’ятаю, в чому проблема, але це може бути актуально: stackoverflow.com/questions/7790222/…
tobik

Просто переконайтеся, що ви уникаєте відсоткових прокладок або націнок. Викликали кілька дивних проблем із візуалізацією на IE8, хоча сучасні браузери були в порядку.
Трой Морхаус

8

Рішення , яке я зараз використовую, щоб перевірити userAgentна , $(document).readyщоб побачити , якщо це один з ображають браузерів. Якщо це так, виконайте наступні дії:

  1. Встановіть відповідні висоти на поточну висоту вікна перегляду, а не на 100%
  2. Збережіть поточне горизонтальне значення вікна перегляду
  3. Потім $(window).resizeоновіть відповідні значення висоти лише тоді, коли новий розмір горизонтального вікна перегляду відрізняється від початкового значення
  4. Зберігайте нові горизонтальні та вертикальні значення

Необов’язково, ви також можете перевірити дозвіл вертикальних розмірів лише тоді, коли вони перевищують висоту адресного рядка.

О, і адресний рядок впливає $(window).height. Див.: Адреса: рядок браузера мобільних веб-переглядачів (хром) змінює $ (window) .height (); створення розміру тла: розмір кришки кожного разу, коли JS "Вікно" ширина-висота проти "екран" ширина-висота?


Я не пробував цього, але чи не буде ваш перший пункт не працює для iOS? ( thatemil.com/blog/2013/06/13/… )
Дейв Кларк

Я фіксував, що він цінує на першому кроці, але я здивований, що ти знайшов відповідь Джейсона для вирішення проблеми. Як зазначалося, я виявив, що разом з іншим користувачем у попередньому питанні, яке я пов’язував, значення методу $ (window) .height () НЕ змінюється, коли адресний рядок у хромі на android є або його не видно. Я зібрав цей маленький веб-сайт, який просто виявляє результат $ (window) .height () в сповіщенні, і він, безумовно, надає різні значення на моєму Nexus 4 в хромі, коли адресний рядок є / не видно: stormy-meadow-5908 .herokuapp.com
mp

Це на 100% виправляє проблему на моєму пристрої Android, хоча я бачу подібну проблему на своєму iPad, яку, як видається, не можна виправити, яку я все ще шукаю.
Дейв Кларк

Чи можете ви надати якийсь код для свого рішення, і я спробую його випробувати?
Дейв Кларк

4

Я знайшов дійсно просте рішення без використання Javascript:

transition: height 1000000s ease;
-webkit-transition: height 1000000s ease;
-moz-transition: height 1000000s ease;
-o-transition: height 1000000s ease;

Все це - затримка руху, так що це неймовірно повільно, що це не помітно.


@ Tyguy7 Він відмінно працює , коли ваш зріст не встановлено на фіксоване значення, тобто 100%, 100vh. IE8 - єдиний головний браузер, який не підтримує переходи.
Пав Сидху

Чудове і просте рішення!
zdarsky.peter

3
Це чудово працює, поки ви не перебуваєте на пристрої, де ви можете переходити від портретного до пейзажного. Коли це трапляється, дизайн руйнується.
Nagy Nick

@NagyNick це не було для мене такою великою проблемою. Ви можете виявити зміну орієнтації у Javascript та коригувати фонове зображення.
Пав Сідху

3

Моє рішення включало трохи JavaScript. Зберігайте 100% або 100vh на діві (це дозволить уникнути появи div при початковому завантаженні сторінки). Потім, коли сторінка завантажується, захопіть висоту вікна та застосуйте її до відповідного елемента. Уникайте стрибка, тому що тепер у вас є статична висота на вашому діві.

var $hero = $('#hero-wrapper'),
    h     = window.innerHeight;

$hero.css('height', h);

3

Я створив рішення ванільного javascript для використання VH-одиниць. Використання VH майже в будь-якому місці відбувається за допомогою адресних рядків, що мінімізують прокрутку. Щоб виправити вимкнений файл, який відображається, коли сторінка перемальовується, у мене є цей js, який захопить всі ваші елементи за допомогою VH-одиниць (якщо ви даєте їм клас .vh-fix) та надасть їм окреслені висоти пікселів. По суті, заморожуючи їх на потрібній нам висоті. Ви можете зробити це під час обертання або зміни розміру вікна перегляду, щоб залишатися чутливими.

var els = document.querySelectorAll('.vh-fix')
if (!els.length) return

for (var i = 0; i < els.length; i++) {
  var el = els[i]
  if (el.nodeName === 'IMG') {
    el.onload = function() {
      this.style.height = this.clientHeight + 'px'
    }
  } else {
    el.style.height = el.clientHeight + 'px'
  }
}

Це вирішило всі мої випадки використання, сподіваюся, це допомагає.


3

це моє рішення, щоб вирішити цю проблему, я додав коментарі безпосередньо до коду. Я перевірив це рішення і працює чудово. Сподіваюся, що ми будемо корисні для всіх, хто має однакові проблеми.

//remove height property from file css because we will set it to first run of page
//insert this snippet in a script after declarations of your scripts in your index

var setHeight = function() {    
  var h = $(window).height();   
  $('#bg1, #bg2').css('height', h);
};

setHeight(); // at first run of webpage we set css height with a fixed value

if(typeof window.orientation !== 'undefined') { // this is more smart to detect mobile devices because desktop doesn't support this property
  var query = window.matchMedia("(orientation:landscape)"); //this is is important to verify if we put 
  var changeHeight = function(query) {                      //mobile device in landscape mode
    if (query.matches) {                                    // if yes we set again height to occupy 100%
      setHeight(); // landscape mode
    } else {                                                //if we go back to portrait we set again
      setHeight(); // portrait mode
    }
  }
  query.addListener(changeHeight);                          //add a listner too this event
} 
else { //desktop mode                                       //this last part is only for non mobile
  $( window ).resize(function() {                           // so in this case we use resize to have
    setHeight();                                            // responsivity resisizing browser window
  }); 
};

1
Ви викликаєте setHeight () всередині методу changeHeight, якщо запит відповідає, а також якщо він не відповідає. Тому просто видаліть оператор if, оскільки це не потрібно.
Денніс Мейсснер

2

Це найкраще рішення (найпростіше) понад усе, що я спробував.

... І це не утримує рідного досвіду адресного рядка !

Наприклад, ви можете встановити висоту за допомогою CSS на 100%, а потім встановити висоту 0,9 * від висоти вікна в px за допомогою JavaScript, коли завантажується документ.

Наприклад, з jQuery:

$("#element").css("height", 0.9*$(window).height());

)

На жаль, не існує нічого, що працює з чистим CSS: P, але також будьте неповноцінними vhта vwє глючними на iPhone - використовуйте відсотки.


1

Я встановлюю свій елемент ширини, за допомогою JavaScript. Після того, як я встановив де vh.

html

<div id="gifimage"><img src="back_phone_back.png" style="width: 100%"></div>

css

#gifimage {
    position: absolute;
    height: 70vh;
}

javascript

imageHeight = document.getElementById('gifimage').clientHeight;

// if (isMobile)       
document.getElementById('gifimage').setAttribute("style","height:" + imageHeight + "px");

Це працює для мене. Я не використовую jquery ect. тому що я хочу, щоб він завантажився якомога швидше.


1

Минуло кілька годин, щоб зрозуміти всі деталі цієї проблеми та визначити найкраще виконання. Виявляється, станом на квітень 2016 року лише у iOS Chrome є ця проблема. Я спробував на Android Chrome і iOS Safari - обидва були добре без цього виправлення. Отже, виправлення для iOS Chrome, яке я використовую:

$(document).ready(function() {
   var screenHeight = $(window).height();
   $('div-with-background-image').css('height', screenHeight + 'px');
});

1

Проста відповідь, якщо ваш фон дозволяє, чому б не встановити розмір тла: на те, що просто покриває ширину пристрою медіа-запитами і використовувати поряд з позицією: after: fix; рубати тут .

IE: фоновий розмір: 901px; для будь-яких екранів <900px? Не ідеальний і не чуйний, але працював у чарівному режимі для мобільних пристроїв <480px, оскільки я використовую абстрактний BG.


0

Я використовую це вирішення: виправте висоту bg1 на завантаженні сторінки за:

var BG = document.getElementById('bg1');
BG.style.height = BG.parentElement.clientHeight;

Потім приєднайте слухач подій зміни розміру до Window, який робить це: якщо різниця у висоті після зміни розміру менше 60 пікселів (що-небудь більше, ніж висота смуги URL-адреси), тоді нічого не робіть, а якщо вона більша за 60 пікселів, то встановіть висоту bg1 знову на висоту свого батька! повний код:

window.addEventListener("resize", onResize, false);
var BG = document.getElementById('bg1');
BG.style.height = BG.parentElement.clientHeight;
var oldH = BG.parentElement.clientHeight;

function onResize() {
    if(Math.abs(oldH - BG.parentElement.clientHeight) > 60){
      BG.style.height = BG.parentElement.clientHeight + 'px';
      oldH = BG.parentElement.clientHeight;
    }
}

PS: Цей клоп так дратує!


0

Схожа на відповідь @AlexKempton (не можу прокоментувати вибачення)

Я використовую тривалі затримки переходу, щоб запобігти зміні розміру елемента.

наприклад:

transition: height 250ms 600s; /*10min delay*/

Компроміс із цим полягає в тому, що він запобігає зміні розміру елемента, включаючи обертання пристрою, однак, ви можете використовувати деякі JS для виявлення orientationchangeта скидання висоти, якщо це було проблемою.


0

Для тих, хто хотів би прослухати фактичну внутрішню висоту та вертикальну прокрутку вікна, коли браузер мобільних пристроїв Chrome переводить рядок URL із показаного на прихований та навпаки, єдине знайдене нами рішення - встановити функцію інтервалу, і вимірюють невідповідність window.innerHeightпопереднього значення.

Це вводить цей код:

var innerHeight = window.innerHeight;
window.setInterval(function ()
{
  var newInnerHeight = window.innerHeight;
  if (newInnerHeight !== innerHeight)
  {
    var newScrollY = window.scrollY + newInnerHeight - innerHeight;
    // ... do whatever you want with this new scrollY
    innerHeight = newInnerHeight;
  }
}, 1000 / 60);

Я сподіваюся, що це стане в нагоді. Хтось знає краще рішення?


0

Рішення, яке я придумав, коли виникли подібні проблеми, було встановити висоту елемента під window.innerHeightчас кожного запуску touchmoveподії.

var lastHeight = '';

$(window).on('resize', function () {
    // remove height when normal resize event is fired and content redrawn
    if (lastHeight) {
        $('#bg1').height(lastHeight = '');
    }
}).on('touchmove', function () {
    // when window height changes adjust height of the div
    if (lastHeight != window.innerHeight) {
        $('#bg1').height(lastHeight = window.innerHeight);
    }
});

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

Тим не менш, шкода, що нам доведеться придумати такі виправлення, де просто position: fixedповинні працювати.


0

Підтримуючи власні властивості (змінні) CSS в iOS, ви можете встановлювати їх за допомогою JS та використовувати їх лише на iOS.

const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
if (iOS) {
  document.body.classList.add('ios');
  const vh = window.innerHeight / 100;
  document.documentElement.style
    .setProperty('--ios-10-vh', `${10 * vh}px`);
  document.documentElement.style
    .setProperty('--ios-50-vh', `${50 * vh}px`);
  document.documentElement.style
    .setProperty('--ios-100-vh', `${100 * vh}px`);
}
body.ios {
    .side-nav {
        top: var(--ios-50-vh);
    }
    section {
        min-height: var(--ios-100-vh);
        .container {
            position: relative;
            padding-top: var(--ios-10-vh);
            padding-bottom: var(--ios-10-vh);
        }
    }
}

0

Моя відповідь - для всіх, хто заходить сюди (як і я), щоб знайти відповідь на помилку, викликану прихованою адресою голого / інтерфейсу браузера.

Прихований адресний рядок викликає подія зміни розміру. Але на відміну від інших подій розміру, наприклад переходу в ландшафтний режим, це не змінює ширину вікна. Тому моє рішення полягає в підключенні до події зміни розміру та перевірки, чи однакова ширина.

// Keep track of window width
let myWindowWidth = window.innerWidth;

window.addEventListener( 'resize', function(event) {

    // If width is the same, assume hiding address bar
    if( myWindowWidth == window.innerWidth ) {
         return;
    }

    // Update the window width
    myWindowWidth = window.innerWidth;

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