https://imgur.com/a/7zfRUHc
Настройка
Метатег области просмотра:
Код: Выделить всё
Код: Выделить всё
CSS (базовый уровень):
Код: Выделить всё
:root {
--safe-area-top: env(safe-area-inset-top, 0px);
--safe-area-bottom: env(safe-area-inset-bottom, 0px);
--safe-area-left: env(safe-area-inset-left, 0px);
--safe-area-right: env(safe-area-inset-right, 0px);
}
html {
overflow: hidden;
}
body {
padding-left: var(--safe-area-left);
padding-right: var(--safe-area-right);
overscroll-behavior: none;
overflow: hidden;
margin: 0;
}
Код: Выделить всё
Код: Выделить всё
.bottom-nav {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(12px);
border-top: 1px solid #e5e7eb;
display: flex;
justify-content: space-around;
align-items: center;
z-index: 30;
flex-shrink: 0;
padding-bottom: max(12px, env(safe-area-inset-bottom));
padding-top: 8px;
}
Проблема
В автономном PWA iOS (Добавить на главный экран) 100dvh, похоже, разрешается в области просмотра, исключая вставку нижней безопасной области (~34 пикселя). на iPhone с индикатором Home). Это означает, что весь гибкий макет, включая BottomNav и его заполнение безопасной области, содержится в блоке, который примерно на 34 пикселя короче физического экрана. В результате между нижней частью навигации и краем экрана появляется белый зазор.
Что я пробовал
- [/b] — Заполняет пробел между фоном основного текста, но теперь размер макета 100dvh превышает область содержимого основного текста, а добавление overflow:hidden обрезает его. Удаление переполнения позволяет прокручивать текст, что нарушает фиксированный заголовок.
Код: Выделить всё
body { padding-bottom: env(safe-area-inset-bottom) } - [/b] — В WebKit тело позиции: фиксированное по-прежнему разрешает высоту: 100% для области просмотра безопасной области, а не для всего физического экрана. Тот же разрыв.
Код: Выделить всё
body { position: fixed; inset: 0 } - [/b] в div-оболочке Nuxt (
Код: Выделить всё
position: fixed; inset: 0) — тот же результат.Код: Выделить всё
#__nuxt - [/b] непосредственно в корневом элементе div макета — это заполняет экран правильно, но затем высота в процентах (
Код: Выделить всё
position: fixed; inset: 0) на дочерних страницах не разрешается, поскольку Nuxt вставляет промежуточные оболочки (Suspense, router-view) без явных высот.Код: Выделить всё
h-full - [/b] на html/body — в автономном PWA эффекта нет.
Код: Выделить всё
height: -webkit-fill-available - вместо h-[100dvh][/b] в макете — 100vh на iOS имеет ту же проблему в автономном режиме. Также заставляет заголовки страниц прокручиваться вместе с содержимым, а не оставаться фиксированными.
Код: Выделить всё
min-h-screen
Приложение должно заполнять весь физический экран от края до края. Padding-bottom: max(12px, env(safe-area-inset-bottom)) элемента BottomNav должен расширять свой фон до области домашнего индикатора, чтобы не было видимого зазора. Заголовок должен оставаться фиксированным вверху, и прокручиваться должна только область содержимого между заголовком и навигацией.
Среда
- iOS 26 (iPhone с индикатором «Домой»)
- Safari → Добавить на главный экран (автономный PWA)
- Nuxt 4 () с @vite-pwa/nuxt
Код: Выделить всё
^4.3.0 - Tailwind CSS
Подробнее здесь: https://stackoverflow.com/questions/799 ... 00dvh-does
Мобильная версия