Аналогов я так и не нашел, вот решение, которое написал за вчера сам:
var blackCoeff = 1.25; // Коэффициент затемнения
var sectionList;
var blackList;
var counter;
function buildStyles() {
var styles = 'body {' +
'height: ' + ($("body").height() + 'px;') +
'position: relative;' +
'}' +
'.black {' +
'position: absolute;' +
'top: 0;' +
'left: 0;' +
'background: black;' +
'opacity: 0.8;' +
'}' +
'section {' +
'position: relative;' +
'top: 0;' +
'}' +
'section.fixed {' +
'position: fixed;' +
'top: 0;' +
'}';
$('head').append('<style id="sticky-stack-styles" type="text/css">' + styles + '</style>');
}
$(window).on('scroll', function() {
var windowScrollPos = $(window).scrollTop();
var tmpCounter = counter;
counter = 0;
for (var i = 0; i < sectionList.length; i++) {
if (windowScrollPos >= $(sectionList[i]).offset().top) {
counter++;
}
}
if (counter > 1) {
$(blackList[counter - 2]).css("opacity", (windowScrollPos / $(sectionList[counter < sectionList.length ? counter : counter - 1]).offset().top - 1) * (-counter * blackCoeff));
}
if (counter != tmpCounter) {
for (var i = 0; i < sectionList.length; i++) {
$(sectionList[i]).removeClass("fixed");
}
if ((tmpCounter == 2 && counter <= 1)) {
return;
}
$(sectionList[counter - 1]).addClass("fixed");
}
});
$(function () {
$("footer").append("<section/>");
sectionList = $("section");
for (var i = 0; i < sectionList.length; i++) {
var zIndex = (sectionList.length - i) * 2;
$(sectionList[i]).css("z-index", zIndex);
if (i == 0) {
continue;
}
$(sectionList[i]).prepend('<div class="black" style="width: ' + $(sectionList[i]).width() + 'px; height: ' + $(sectionList[i]).height() + 'px; z-index: ' + (zIndex + 1) + '"></div>');
}
blackList = $(".black");
buildStyles();
});
Полностью соответствует требованиям задачи ТЗ заказчика, не затрагивает структуру оригинальной верстки и стили, генерит что ему надо на лету, подключается в одну строку.