Использование Javascript для изменения размера экрана до высоты экрана вызывает мерцание при сокращении окна браузера
Фон:
Я попытался решить вопрос StackOverflow еще одну задачу компоновки HTML/CSS - боковую панель высочайшего уровня с липким нижним колонтитулом самостоятельно, используя jQuery. Поскольку боковая панель в моем случае может быть длиннее основного содержимого, она соответствует случаю комментарий 8128008. Это делает невозможным иметь боковую панель дольше, чем основное содержимое, и иметь липкий нижний колонтитул без проблем при сокращении окна браузера.
Статус-кво:
У меня есть html-страница с div
, которая автоматически растягивается, чтобы заполнить экран. Поэтому, если пустое пространство ниже элемента, я растягиваю его вниз:
![The div is stretched to fill the screen]()
Но если окно просмотра браузера меньше самого div
, растягивание не выполняется, но появляется полоса прокрутки:
![Small viewport: no resizing]()
Я подключил jQuery к событию изменения размера окна, чтобы изменить размер div
, если окно браузера не будет маленьким и удалит любое изменение размера в другом случае. Это делается путем проверки, что область просмотра больше или меньше, чем document
. Если область просмотра меньше, чем document
, кажется, что содержимое больше, чем окно браузера, почему изменение размера не выполняется; в другом случае мы изменим размер div
, чтобы заполнить страницу.
if ($(document).height() > $(window).height()) {
// Scrolling needed, page content extends browser window
// --> No need to resize the div
// --> Custom height is removed
// [...]
} else {
// Window is larger than the page content
// --> Div is resized using jQuery:
$('#div').height($(window).height());
}
Проблема:
До сих пор все работает хорошо. Но если я сокращаю окно браузера, бывают случаи, когда размер div
должен быть изменен, но document
больше высоты window
, почему мой script предполагает, что не требуется изменение размера и div
изменение размера.
Фактически, точка, если я проверяю высоту document
, используя Firebug после появления ошибки, высота имеет только значение, которое должно было иметь. Поэтому я подумал, что высота document
установлена с небольшой задержкой. Я попытался запустить код изменения размера немного, но это не помогло.
Я установил демонстрацию на jsFiddle. Просто медленно снимите окно браузера, и вы увидите мерцание div
. Также вы можете смотреть вывод console.log()
, и вы заметите, что в случае "мерцания" высота document
и высота window
различаются, а не равны.
Я заметил это поведение в Firefox 7, IE 9, Chrome 10 и Safari 5.1. Вы можете это подтвердить?
Знаете ли вы, есть ли исправление? Или это подход совершенно неправильный? Пожалуйста, помогите мне.
Ответы
Ответ 1
Ок - очистка моего старого ответа и замена...
Вот ваша проблема:
Вы берете и сравниваете высоту окна и документа, не принимая во внимание порядок событий здесь.
- Загрузка окна
- Div растет до высоты окна
- Окно сжимается
- Высота документа остается на высоте div
- Высота окна меньше высоты div
В этот момент ранее установленная высота div сохраняет высоту документа больше высоты окна, и эта логика неверно истолкована:
"Прокрутка необходима, нет необходимости расширять боковую панель", ошибочно
Следовательно, подергивание.
Чтобы предотвратить это, просто измените размер своего div вместе с окном перед проведением сравнения:
(function () {
var resizeContentWrapper = function () {
console.group('resizing');
var target = {
content: $('#resizeme')
};
//resize target content to window size, assuming that last time around it was set to document height, and might be pushing document height beyond window after resize
//TODO: for performance, insert flags to only do this if the window is shrinking, and the div has already been resized
target.content.css('height', $(window).height());
var height = {
document: $(document).height(),
window: $(window).height()
};
console.log('height: ', height);
if (height.document > height.window) {
// Scrolling needed, no need to externd the sidebar
target.content.css('height', '');
console.info('custom height removed');
} else {
// Set the new content height
height['content'] = height.window;
target.content.css('height', height['content']);
console.log('new height: ', height);
}
console.groupEnd();
}
resizeContentWrapper();
$(window).bind('resize orientationchange', resizeContentWrapper);
})(jQuery);
За комментарий pmvdb, я переименовал ваш $$ в "target"
Ответ 2
$(window).bind('resize',function(){
$("#resizeme").css("height","");
if($("#resizeme").outerHeight() < $(window).height()){
$("#resizeme").height($(window).height());
$("body").css("overflow-y","hidden");
}else{
$("body").css("overflow-y","scroll");
}
});
Ответ 3
Возможно, я неправильно понимаю проблему, но почему вы используете Javascript? Это похоже на проблему с макетом (CSS). Мое решение без JS: http://jsfiddle.net/2yKgQ/27/