Mobile Safari $(окно).height() несоответствие в строке URL
Я пытаюсь установить фиксированный div, который составляет 100% высоты окна. Но мобильное сафари не определяет правильную высоту окна. Он всегда думает, что строка URL является частью уравнения.
Это то, что я использую в настоящее время, но это не учитывает адресную строку.
$(function(){
$(document).ready(function(){ // On load
alert($.browser);
$('#right-sidebar').css({'height':(($(window).height()))+'px'});
});
$(window).resize(function(){ // On resize
$('#right-sidebar').css({'height':(($(window).height()))+'px'});
});
});
5 ответов
Tldr
Если вы просто хотите запросить высоту окна, кросс-браузер и покончить с этим, используйте jQuery.documentSize и вызовите $.windowHeight()
, Для реализации собственного решения читайте дальше.
Когда использовать jQuery или clientHeight
документа
JQuery-х $(window).height()
это обертка для document.documentElement.clientHeight
, Это дает вам высоту области просмотра, исключая пространство, покрытое полосами прокрутки браузера. Как правило, он работает нормально и пользуется почти универсальной поддержкой браузера. Но есть и причуды на мобильных устройствах, и в частности на iOS.
В iOS возвращаемое значение делает вид, что URL и панели вкладок видимы, даже если они не видны. Они скрываются, как только пользователь прокручивает браузер и переключается на минимальный пользовательский интерфейс. При этом высота окна увеличивается примерно на 60 пикселей, и это не отражается на
clientHeight
(или в jQuery).clientHeight
возвращает размер окна просмотра макета, а не визуального окна просмотра, и, следовательно, не отражает состояние масштабирования.
Так что... не совсем так здорово на мобильном телефоне.
Когда использовать window.innerHeight
Есть еще одно свойство, которое вы можете запросить: window.innerHeight
, Это
- возвращает высоту окна,
- основан на визуальном окне просмотра, т.е. отражает состояние масштабирования,
- обновляется, когда браузер вводит минимальный пользовательский интерфейс (мобильный Safari),
- но это включает область, покрытую полосами прокрутки.
Последний пункт означает, что вы не можете просто вставить его в качестве замены. Кроме того, он не поддерживается в IE8 и не работает в Firefox до FF25 (октябрь 2013 г.).
Но его можно использовать в качестве замены на мобильном устройстве, поскольку мобильные браузеры представляют полосы прокрутки как временное наложение, которое не занимает места в области просмотра - window.innerHeight
а также d.dE.clientHeight
вернуть то же значение в этом отношении.
Кросс-браузерное решение
Таким образом, кросс-браузерное решение для определения реальной высоты окна работает следующим образом (псевдокод):
IF the size of browser scroll bars is 0 (overlay)
RETURN window.innerHeight
ELSE
RETURN document.documentElement.clientHeight
Уловка здесь заключается в том, как определить размер (ширину) полос прокрутки для данного браузера. Вам нужно запустить тест для этого. Это не особенно сложно - взгляните на мою реализацию здесь или оригинальную версию Ben Alman, если хотите.
Если вы не хотите бросать свой собственный, вы также можете использовать мой компонент - jQuery.documentSize - и покончить с $.windowHeight()
звоните.
Это связано с ошибкой в методе jQuery.height().
Чтобы получить правильную высоту, вы можете использовать:
$('#right-sidebar').height(window.innerHeight);
Чтобы убедиться, что вы в основном совместимы с разными браузерами, вы можете сделать это:
var height = window.innerHeight ? window.innerHeight : $(window).height();
$('#right-sidebar').height(height);
Я говорю в основном, так как это начнет вести себя смешно, если есть нижняя полоса прокрутки.
Вот как я это понял. Это двухступенчатый процесс.
Шаг 1 - Проверьте, является ли устройство iPhone или iPod.
Шаг 2 - Если это так, проверьте, является ли браузер Safari
// On document ready set the div height to window
$(document).ready(function(){
// Assign a variable for the application being used
var nVer = navigator.appVersion;
// Assign a variable for the device being used
var nAgt = navigator.userAgent;
var nameOffset,verOffset,ix;
// First check to see if the platform is an iPhone or iPod
if(navigator.platform == 'iPhone' || navigator.platform == 'iPod'){
// In Safari, the true version is after "Safari"
if ((verOffset=nAgt.indexOf('Safari'))!=-1) {
// Set a variable to use later
var mobileSafari = 'Safari';
}
}
// If is mobile Safari set window height +60
if (mobileSafari == 'Safari') {
// Height + 60px
$('#right-sidebar').css('height',(($(window).height()) + 60)+'px');
} else {
// Else use the default window height
$('#right-sidebar, .profile').css({'height':(($(window).height()))+'px'});
};
});
// On window resize run through the sizing again
$(window).resize(function(){
// If is mobile Safari set window height +60
if (mobileSafari == 'Safari') {
// Height + 60px
$('#right-sidebar').css('height',(($(window).height()) + 60)+'px');
} else {
// Else use the default window height
$('#right-sidebar, .profile').css({'height':(($(window).height()))+'px'});
};
});
Затем используйте переменную mobileSafari всякий раз, когда необходимо выполнить код, специфичный для мобильного сафари.
Начиная с устройства, сначала исключите iPad, настольные компьютеры и т. Д., Которые также могут запускать Safari. Затем второй шаг исключает Chrome и другие браузеры, которые могут потенциально работать на этих устройствах.
Вот более подробная информация о том, почему я сделал это таким образом: http://www.ethanhackett.com/?blog=window-height-100-on-mobile-safari-coding-solution
Для этого есть совершенно новый изящный CSS-способ:dvh
единица видового экрана.
Вместоheight: 100%
(или100vh
), использоватьheight: 100dvh
, что означает «динамическая высота области просмотра». Вот хорошее объяснение того, как работают новые единицы измерения области просмотра: https://www.youtube.com/watch?v=Xy9ZXRRgpLk&t=977s.
Если мобильное сафари - единственный браузер, вызывающий проблему, вы всегда можете настроить таргетинг именно на этот браузер и минус высота строки URL-адреса от общей высоты. Вы можете найти высоту строки URL по следам и ошибкам, я понятия не имею, насколько он высокий