У меня очень странная проблема ... в каждом браузере и мобильной версии я сталкивался с таким поведением:
- у всех браузеров есть верхнее меню при загрузке страницы (например, с адресной строкой), которое сдвигается вверх, когда вы начинаете прокручивать страницу.
- 100vh иногда рассчитывается только для видимой части области просмотра, поэтому при увеличении полосы браузера 100vh увеличивается (в пикселях)
- все макеты перекрасить и заново отрегулировать, так как размеры изменились
- плохой эффект для пользователя
Как можно избежать этой проблемы? Когда я впервые услышал о viewport-height, я был взволнован и подумал, что смогу использовать его для блоков с фиксированной высотой вместо javascript, но теперь я думаю, что единственный способ сделать это - фактически javascript с некоторым событием resize ...
Вы можете увидеть проблему по адресу: образец сайта
Может кто-нибудь помочь мне / предложить решение CSS?
простой тестовый код:
html
css
viewport-units
Nereo Costacurta
источник
источник
transition: 0.5s
или сделать так, чтобы изменение было менее резким?Ответы:
К сожалению, это намеренно ...
Это хорошо известная проблема (по крайней мере, в Safari Mobile), которая является намеренной, поскольку предотвращает другие проблемы. Бенджамин Пулен ответил на ошибку веб-набора :
Николя Хойзи исследовал это совсем немного: https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile -browsers.html
Исправление не запланировано
На данный момент вы ничего не можете сделать, кроме как отказаться от использования высоты области просмотра на мобильных устройствах. Chrome изменился и в 2016 году:
источник
$(window).height()
эта ошибка не затрагивается, поэтому я пойду таким образом. Спасибо!position:fixed
. Это похоже на реализацию в Safari. Подробнее: developers.google.com/web/updates/2016/12/url-bar-resizingvh
или<html> 100%
высоту после начальной загрузки. Это на самом деле замечательно - поскольку раскрутка / перекомпоновка макета, когда скрывается панель URL, может выглядеть ужасно.Firefox
иEdge
Mobile
все еще динамически обновляетvh
и<html>
высоту, вызывая много разрывов и изменения размера всех компонентов при прокрутке, особенно плохо при использовании SVG для фоновых изображенийВы можете попробовать
min-height: -webkit-fill-available;
в своем CSS вместо100vh
. Должно быть решеноисточник
min-height: 100vh;
в качестве запасного варианта, где-webkit-fill-available
не поддерживается.min-height: 100vh;
этого, так как в противном случае он будет работать в браузерах, таких как Firefox (по крайней мере, на настольных компьютерах iOS использует webkit независимо от того, какой браузер).в моем приложении я делаю это так (машинопись и вложенный postcss, поэтому измените код соответствующим образом):
в вашем css:
это работает по крайней мере на Chrome Mobile и Ipad. Что не работает, так это когда вы добавляете свое приложение на домашний экран на iOS и меняете ориентацию несколько раз - каким-то образом уровни масштабирования портятся со значением innerHeight, я могу опубликовать обновление, если найду решение для него.
демонстрация
источник
Для многих сайтов, которые я создаю, клиент будет запрашивать 100-вольтовый баннер, и, как вы уже нашли, это приводит к плохому «нервному» впечатлению на мобильном телефоне, когда вы начинаете прокручивать. Вот как я решаю проблему для бесперебойного согласованного взаимодействия на всех устройствах:
Сначала я установил свой элемент баннера CSS на
height:100vh
Затем я использую jQuery для получения высоты в пикселях элемента баннера и применяю встроенный стиль, используя эту высоту.
Это решает проблему на мобильных устройствах, так как при загрузке страницы элемент баннера устанавливается на 100vh с использованием CSS, а затем jQuery переопределяет это, помещая встроенный CSS в мой элемент баннера, который останавливает его изменение размера, когда пользователь начинает прокручивать.
Однако на рабочем столе, если пользователь изменяет размер своего окна браузера, размер элемента баннера не изменится, потому что теперь он имеет фиксированную высоту, заданную в пикселях из-за вышеупомянутого jQuery. Для решения этой проблемы я использую Mobile Detect, чтобы добавить «мобильный» класс в тело моего документа. А затем я оборачиваю вышеупомянутый jQuery в оператор if:
В результате, если пользователь находится на мобильном устройстве, класс «mobile» присутствует в теле моей страницы, и выполняется вышеуказанный jQuery. Таким образом, мой баннерный элемент будет применять только встроенный CSS на мобильных устройствах, в то время как на рабочем столе оригинальное правило CSS 100vh остается в силе.
источник
$('.banner').css({ height: window.innerHeight });
вместо этого, что является «реальной» высотой области просмотра. Пример того, как работает innerHeightdocument.querySelector('.banner').style.height = window.innerHeight;
для людей, пишущих настоящий JavaScript.Посмотрите на этот ответ: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
источник
Я придумал компонент React - проверьте его, если вы используете React, или просмотрите исходный код, если вы этого не сделаете, чтобы вы могли адаптировать его к вашей среде.
Он устанавливает высоту полноэкранного div
window.innerHeight
и затем обновляет его при изменении размера окна.источник
Поскольку я искал решение несколько дней, вот мое решение для всех, кто использует VueJS с Vuetify (мое решение использует v-app-bar, v-navigation-box и v-footer): я создал App.scss (используется в App. vue) со следующим содержанием:
источник
Для меня такой трюк сделал работу:
источник
@nils объяснил это ясно.
Что дальше?
Я просто вернулся, чтобы использовать относительный «классический»
%
(процент) в CSS.Зачастую для реализации чего-то требуется больше, чем для использования
vh
, но, по крайней мере, у вас есть довольно стабильное решение, которое работает на разных устройствах и в разных браузерах без странных сбоев пользовательского интерфейса.источник
Я только что обнаружил, что разработанное мной веб-приложение имеет эту проблему с iPhone и iPad, и нашел статью, в которой предлагается решить эту проблему, используя медиазапросы, предназначенные для определенных устройств Apple.
Я не знаю, могу ли я поделиться кодом из этой статьи здесь, но адрес таков: http://webdesignerwall.com/tutorials/css-fix-for-ios-vh-unit-bug
Цитирую статью: «просто сопоставьте высоту элемента с высотой устройства, используя медиазапросы, предназначенные для более старых версий iPhone и iPad».
Они добавили всего 6 медиа-запросов, чтобы адаптировать элементы полной высоты, и это должно работать, поскольку это полностью реализовано CSS.
Ожидание редактирования: я не могу проверить это прямо сейчас, но я вернусь и сообщу о своих результатах.
источник
Поскольку я новичок, я не могу комментировать другие ответы.
Если кто-то ищет ответ, чтобы сделать эту работу (и может использовать javascript - поскольку, кажется, требуется сделать эту работу в данный момент), этот подход сработал довольно хорошо для меня, и он также учитывает изменение ориентации мобильного устройства. Я использую Jquery для примера кода, но должен быть выполним с vanillaJS.
Во-первых, я использую скрипт, чтобы определить, является ли устройство сенсорным или зависшим. Пример голой кости:
Это добавляет класс к элементу body в соответствии с типом устройства (указатель мыши или касание), который можно использовать позже для сценария высоты.
-Далее используйте этот код для установки высоты устройства под нагрузкой и при изменении ориентации:
-Timeout установлен так, чтобы устройство правильно рассчитывало новую высоту при изменении ориентации. Если тайм-аут не установлен, по моему опыту, высота не будет правильной. 500 мс может быть переусердствовать, но у меня сработало
-100vh на hover-устройствах - это запасной вариант, если браузер переопределяет CSS 100vh.
источник
Следующий код решил проблему (с jQuery).
А остальные элементы используют
%
как единое целое для заменыvh
.источник
Вот обходной путь, который я использовал для своего приложения React.
iPhone 11 Pro и iPhone Pro Max - 120 пикселей
iPhone 8 - 80px
Это компромиссное, но относительно простое решение
источник
У меня сработало следующее:
body
Будет принимать видимую высоту окна просмотра и#your-app-container
сheight: 100%
сделает этот контейнер принять видимую высоту окна просмотра.источник
Надеемся, что это будет переменная среды CSS, определенная UA, как предлагается здесь: https://github.com/w3c/csswg-drafts/issues/2630#issuecomment-397536046
источник
Поскольку это не будет исправлено, вы можете сделать что-то вроде:
Для меня это было самое быстрое и более чистое решение, чем игра с JavaScript, который не мог работать на многих устройствах и браузерах.
Просто используйте правильное значение,
vh
которое соответствует вашим потребностям.источник
Использование vh на мобильных устройствах не будет работать с 100vh, из-за их выбора дизайна, используя всю высоту устройства, не включая адресные строки и т. Д.
Если вы ищете макет, включающий высоты div, пропорциональные истинной высоте просмотра, я использую следующее чистое решение CSS:
У вас есть два варианта установки высоты области просмотра, вручную установите --devHeight на высоту, которая работает (но вам нужно будет ввести это значение для каждого типа устройства, для которого вы кодируете)
или
Используйте javascript, чтобы получить высоту окна, а затем обновите --devheight при загрузке и обновлении области просмотра (однако это требует использования javascript и не является чистым решением css)
Как только вы получите правильную высоту просмотра, вы можете создать несколько элементов div с точным процентом от общей высоты области просмотра, просто изменив множитель в каждом элементе div, которому вы назначаете высоту.
0,10 = 10% высоты обзора 0,57 = 57% высоты обзора
Надеюсь, это может кому-то помочь;)
источник
Вы можете сделать это, добавив следующий скрипт и стиль
Стиль
источник
Попробуйте
html, body { height: 100% }
что-нибудь с эффектом 100vh на мобильных устройствах.источник
Вы можете попробовать задать
position: fixed; top: 0; bottom: 0;
свойства для вашего контейнера.источник