на jquery
$(function(){
$(window).scroll(function() {
var heightBlock = $(".left").outerHeight(true);
var footerTop = $("#footer").offset().top;
var top = $(document).scrollTop();
var summ = top + heightBlock;
if (top < 150) $(".left").css({top: '0', position: 'relative'});
else $(".left").css({top: top - 150+ 'px', position: 'relative'});
if(footerTop < summ) $(".left").css({top: footerTop - heightBlock - 300 + 'px', position: 'relative'});
});
});
где 150 - расстояние до меню от начала
300 - высота footera
можно с помощью js конечно посчитать эти параметры, но это уже сами)