I took a different approach to your problem. I calculate the absolute height required inside the window.scroll
event handler and then set the height to the appropriate article based on the scroll height.
Check the demo http://jsfiddle.net/eh3sT/ and let me know if it works for you.
Edit: You did fix most part of the issue yourself. Thanks :)
I don't think there is much to optimize, but I just modified a little to improve the readability. Check the full demo at http://jsfiddle.net/eh3sT/3/embedded/result/
Full Code:
var etPos = []
var $articles = $("article");
$articles.each(function () {
var tPos = $(this).offset();
etPos.push([tPos.top, tPos.top + $(this).height(), $(this).find('.entry-thumbnail').height()]);
});
$(window).scroll(function () {
var scrollHeight = $(document).scrollTop();
var cssProp = {};
for (var i = 0; i < etPos.length; i++) {
var $atricle = $articles.eq(i);
if (scrollHeight >= (etPos[i][0]) && scrollHeight <= (etPos[i][1] - etPos[i][2] - 20)) {
cssProp.top = scrollHeight - etPos[i][0] + 10;
cssProp.bottome = "auto";
} else if (scrollHeight > (etPos[i][1] - etPos[i][2] - 20) && $atricle.height() > ($atricle.find('.entry-thumbnail').height() + 10)) {
/*
Remove the second condition if the article height is always > respective thumbnail + 10. we don't want set bottom 10, if the thumbnail has no space to scroll.
*/
cssProp.top = "auto";
cssProp.bottom = 10;
}else {
cssProp.top = 10;
cssProp.bottom = "auto";
}
$atricle.find('.entry-thumbnail').css(cssProp);
}
});
Notes: Added article
class to all article tags.