Mobile Safari $(window).height() Разница URL-адресов
Я пытаюсь установить фиксированный div, на 100% превышающий высоту окна. Но мобильное сафари не определяет правильную высоту окна. Он всегда считает, что строка URL является частью уравнения.
Это то, что я использую в настоящее время, но оно не учитывает строку 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'});
});
});
Ответы
Ответ 1
Это связано с ошибкой в методе jQuery.height().
Чтобы получить правильную высоту, вы можете использовать:
$('#right-sidebar').height(window.innerHeight);
Чтобы убедиться, что вы в основном совместимы с браузером, вы можете сделать это:
var height = window.innerHeight ? window.innerHeight : $(window).height();
$('#right-sidebar').height(height);
Я говорю в основном, поскольку это начнет вести себя смешно, если есть нижняя полоса прокрутки.
Ответ 2
TL;DR
Если вы просто хотите запросить высоту окна, кросс-браузер и сделать это, используйте jQuery.documentSize и вызовите $.windowHeight()
. Для реализации вашего собственного решения читайте дальше.
Когда использовать jQuery или clientHeight
документа
jQuery $(window).height()
является оберткой для document.documentElement.clientHeight
. Он дает вам высоту окна просмотра, исключая пространство, покрываемое полосами прокрутки браузера. Как правило, он отлично работает и пользуется почти универсальной поддержкой браузера. Но есть quirks на мобильных устройствах и в 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
Здесь вы узнаете, как определить размер (ширину) полос прокрутки для данного браузера. Вам нужно запустить тест для него. Это не особенно сложно - посмотрите мою реализацию здесь или оригинал Бен Альман, если хотите.
Если вы не хотите откатывать свои собственные, вы также можете использовать компонент моего - jQuery.documentSize - и делать это с помощью a $.windowHeight()
вызов.
Ответ 3
Вот как я это понял. Его двухэтапный процесс.
Шаг 1 - Проверьте, не является ли устройство iPhone или iPod.
Шаг 2 - Если он затем проверяет, является ли браузер сафари
// 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, когда это необходимо для выполнения специального кода для сафари для мобильных устройств.
Начиная с устройства, сначала исключаются iPads и настольные компьютеры и т.д., которые также могут запускать Safari. Затем второй шаг исключает Chrome и другие браузеры, которые могут потенциально запускаться на этих устройствах.
Здесь более подробно описывается, почему я сделал это таким образом - http://www.ethanhackett.com/?blog=window-height-100-on-mobile-safari-coding-solution
Ответ 4
Если мобильное сафари является единственным браузером, предоставляющим вам эту проблему, вы всегда можете настроить таргетинг на этот браузер и за вычетом высоты строки URL-адреса от вашей общей высоты. Вы можете найти высоту строки URL по следам и ошибкам, я не знаю, насколько высок это