Как исправить проблему с резиновым ротатором баннеров?

Добрый день. На сайте есть простенький ротатор баннеров, написанный с помощью jQuery. Структура имеет следующий вид:
<div class="banners">
    <img src="/images/{{ info.banners[0].image_name }}" alt="{{ info.banners[0].name }}">
	<div class="hidden_banners">
		{% for banner in info.banners %}
			<img src="/images/{{ banner.image_name }}" alt="{{ banner.name }}">
		{% endfor %}
	</div>
</div>


Понятно, что из базы выводятся все баннеры в скрытый див, а первый баннер показывается.
jQuery код, сменяющий эти баннеры:
function changeBanner() {
    var $banner = $('.banners > img'),
	  background = $banner.attr('src'),
	  $nextBanner = $('.hidden_banners img[src="' + background + '"]').next(),
	  $firstBanner = $('.hidden_banners img:first'),
	  src = $nextBanner.attr('src') || $firstBanner.attr('src'),
	  alt = $nextBanner.attr('alt') || $firstBanner.attr('alt');
	  $('.banners').css({'background': 'url(' + background + ')', 'background-size': '100%'});
	  $banner.fadeOut(100, function() {
	      $(this).attr({'src': src, 'alt': alt}).fadeIn(800);
	  });
}
window.setInterval(changeBanner, 5000);


Тоже вроде бы все понятно. Теперь о проблеме: ротатор должен быть резиновый, получается, что высоту для .banners нам задавать не нужно. И все бы ничего, но только если высота не задана и мы находимся на странице ниже ротатора, то при смене баннеров у нас страница "подпрыгивает" вверх, так как получается, что после fadeOut изображения нет на долю секунды и этого хватает, чтобы наблюдать такой неприятный баг. А если задать высоту, то, соответственно, не получится масштабировать данный блок. Пробовал перед скрытием баннера выставлять у .banners высоту, равную высоте изображения, а после появления сбрасывать, но почему-то проблема остается. Собственно, как можно выйти из положения?
  • Вопрос задан
  • 2617 просмотров
Пригласить эксперта
Ответы на вопрос 3
iiil
@iiil
Инженер и вэб-дизайнер, рисую.
Киньте ссылку на сайт, где наблюдается проблема. В общем-то проблема ясна, но на живом примере легче смотреть.
Ответ написан
У вас будет постоянная проблема с прыгающим контентом, который находится ниже баннеров, раз в 5 секунд высота блока будет меняться. Даже если профиксить схлопывание блока после fadeout, то при изображениях с разной высотой, все что находится ниже баннеров будет переодически прыгать на разницу высоты изображений.
Решить проблему можно задав постоянную высоту блоку баннеров, и масштабировать изображения, подгонять их под высоту блока с баннерами, если они больше по высоте блока с баннерами
Ответ написан
Lisonok
@Lisonok
Сделайте вот так, должно работать)
$banner.fadeOut(100);
setTimeout(function(){
    $(this).attr({'src': src, 'alt': alt}).fadeIn(800);
},99)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы