Проблема может быть решена с помощью медиа-запроса и некоторой математики. Вот решение для ориентации портрета:
@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) Создайте серию медиазапросов для соотношений сторон, на которые вы хотите ориентироваться.
используйте device-aspect-ratio вместо aspect-ratio, так как последнее изменится при исчезновении панели URL
Я добавил «max» в device-aspect-ratio, чтобы нацелить любые соотношения сторон, которые оказываются между самыми популярными. Они не будут такими точными, но они будут только для меньшинства пользователей и все еще будут довольно близки к правильному vh.
запомните медиа-запрос, используя горизонтальный / вертикальный, поэтому для переноса вам нужно будет перевернуть цифры
2) для каждого медиазапроса умножьте любой процент вертикальной высоты, в котором вы хотите, чтобы элемент был в vw, на обратную пропорцию.
- Поскольку вы знаете ширину и отношение ширины к высоте, вы просто умножаете нужный вам% (100% в вашем случае) на отношение высоты / ширины.
3) Вы должны определить высоту URL-бара, а затем минус это от высоты. Я не нашел точных измерений, но я использую 9% для мобильных устройств в альбомной ориентации, и это, кажется, работает довольно хорошо.
Это не очень элегантное решение, но другие варианты тоже не очень хороши, учитывая, что они:
Ваш сайт кажется глючным для пользователя,
имеющие элементы неправильного размера, или
Использование JavaScript для некоторых основных стилей,
Недостатком является то, что некоторые устройства могут иметь разную высоту или соотношение сторон по URL-адресу, чем самые популярные. Однако, используя этот метод, если только небольшое количество устройств переносит / вычитает несколько пикселей, мне кажется, что это намного лучше, чем всем, у кого размер веб-сайта изменяется при перелистывании.
Чтобы сделать это проще, я также создал миксин SASS:
@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%);
}
}