Получение фиксированных заголовков, которые останутся внутри контейнера с jquery

#jquery

#jquery — jquery — запрос #jquery

Вопрос:

Я пытаюсь заставить div получать фиксированное позиционирование, когда его родительский элемент попадает в верхнюю часть окна, и терять его, когда он попадает в нижнюю часть … по какой-то причине я могу заставить его получить фиксированное позиционирование, но не потерять его. занимаюсь этим уже некоторое время, и я просто не могу в этом разобраться…

Вот мой код на данный момент. Кто-нибудь может увидеть, что я чего-то не хватает или облажался?

     $(window).bind('scroll',function(event) {
    $('.posthead').each(function(e) {
        var y = $(window).scrollTop();
        var windowHeightS = $('body').height();

        var postheadh = $(this).height()   30;
        var top = $(this).offset().top - parseFloat($(this).css('margin-top').replace('auto', 0));

        var postheight = $(this).parent('.type-post').height();
        var windowHeight = windowHeightS - top;

        //var top = getposition.top;

        var postTop = top - y;
        var postBottom = postheight   top - y;


        $(this).parent('.type-post').children('.debug').html('Position from top: <span>'   y   "</span> bottom: <span>"   postBottom   "</span>");


        if(postTop <= 0) { $(this).addClass('fixed'); }
        else if(postTop >= 0) { $(this).removeClass('fixed'); }

        if(postBottom <= 0) { $(this).removeClass('fixed'); }       
    });
});
  

Ответ №1:

Я точно не знаю, что за безумие вы хотите сотворить, но я должен создать div, который возвращается наверх после достижения нижней части страницы на основе вашего кода. Надеюсь, это именно то, чего вы пытались достичь.

Я прокомментировал ваш код, чтобы вы, возможно, сами разобрались в проблеме.

Это тестовая страница, которую я создал. У меня также есть своего рода цветовая маркировка, чтобы упростить понимание.

http://www.ferociouscoder.com/test.html

<тип стиля="текст / css">
html { 
 цвет фона:#FFF;
 высота: 100%;
}
тело { 
 цвет фона:#CCC;
 высота: 1600 пикселей;
} 
.posthead { 
 цвет фона: #0FF;
 верхнее поле: автоматически;
}
.тип-post { 
 цвет фона:#FF0;
 высота: 500 пикселей;
}
.исправлено { 
 положение: исправлено;
 цвет:#F00;
}
</style>

<скрипт>
$(window).bind('scroll',функция(событие) {
 $('.posthead').each(функция(e) { 
 var y = $ (window).scrollTop(); // Насколько полоса прокрутки справа переместилась сверху. Зависит от размера полосы прокрутки.
 var windowHeightS = $('body').height(); //600 пикселей;

 var postheadh = $(this).height ()   30; //postheadh = высота ДОЧЕРНЕГО элемента   30 (я не знаю, почему это так, но нормально)
 var top = $(this).offset().top;// - parseFloat($(this).css('margin-top').replace('auto', 0)); //Как далеко дочерний div находится от верха страницы.


 var postheight = $(this).parent('.type-post').height(); //Высота родительского элемента 
 var windowHeight = windowHeightS - top; //Как далеко находится верхняя часть родительского div-файла от нижней части тега body

 //var top = getposition.top;

 var postTop = top - y; //Поскольку позиция родительского div фиксирована. Это никогда не меняется. Это будет значение верхнего поля тега body.
 var postBottom = postheight   top - y; //Поскольку позиция родительского div фиксирована. Это также никогда не меняется. Это будет значение высоты родительского div   константа выше.

 $(this).parent('.type-post').children('.debug').html('Позиция сверху: '   y   "снизу: "   (windowHeightS-postheight)   "");

 if(y > = 0) { $(this).parent().addClass('fixed');} //postTop никогда не меняется! Я полагаю, что вам нужно y. Также вы хотите, чтобы они оставались фиксированными, пока не достигнут дна.

 //else if (y > = 0) { $ (this).removeClass('исправлено'); } Я прокомментировал это, потому что это удалило фиксированное позиционирование, как только вы не находитесь в верхней части экрана. Когда он доходит до дна, он снова пытается удалить class fixed (но вы уже это сделали!)

 if(y > = (windowHeightS - postheight)) { $(this).parent().removeClass('fixed');}//postBottom никогда не меняется! что вам нужно увидеть, так это то, что вы прокрутили больше (или равно) высоты родительского контейнера
 });
});
</script>
</head>
<тело>
 <div class="type-post"><br>
 РОДИТЕЛЬСКИЙ DIV 'TYPE-POST'<br>
 <div class="posthead debug">
 ДОЧЕРНИЙ DIV 'POSTHEAD'<br>
 </div>
 </div>
</body>
</html>