Scroll to Pin
Ich habe ein einfaches und kleines Script geschrieben, welches Elemente an einer Position fest pint. Wie das funktioniert könnt ihr euch in der Linken Spalte ansehen. Der Trigger - "scrollpin-trigger" gibt an welcher scroll Position sich das zu fixierende Element grade befindet. Über den Wrapper - "scrollpin-section" wird die Dauer und Position des zu Pinenden Elementes bestimmt, da das Element über css die Position fixed bekommt, müssen auch nich zusätzliche Werte gesetzt werden (left und width). Über "pinTopPosition" kann man nun bestimmen ab wo das Element fixiert werden soll.
Der HTML Code
<div class="scrollpin">
    <section class="scrollpin-section" style="height: 120vh">
        <div class="scrollpin-trigger"></div>
        <div class="scrollpin-item js-calendar-pin">
            <span class="scrollpin-item-month">Dezember</span>
            <span class="scrollpin-item-day">01</span>
        </div>
    </section>
</div>Der CSS Code
.scrollpin div {
    box-sizing: border-box;
}
.scrollpin-section{
    position: relative;
    border: 1px solid #000;
    width: 100%;
}
.scrollpin-section + .scrollpin-section{
    border-top: 0;
}
.scrollpin-item{
    position: absolute;
    left: 0;
    width: 100%;
    text-align: center;
    background-color: #ccc;
}
.scrollpin-item-month{
    font-size: 30px;
    line-height: 1;
    text-transform: uppercase;
    display: block;
}
.scrollpin-item-day{
    display: block;
    font-size: 100px;
    line-height: 1;
}Und der der jQuery Code
if($(".js-calendar-pin").length){
    function scrollToPin(scrollY){
        var pinTopPosition = 0;
        $(".js-calendar-pin").each(function(){
        var el = $(this),
            elHeight = el.outerHeight(true),
            wrapper = el.closest(".scrollpin-section"),
            triggerOffset = wrapper.find(".scrollpin-trigger").offset().top - pinTopPosition,
            wrapperOffset = wrapper.offset().top - pinTopPosition,
            wrapperOffsetBottom = wrapperOffset + wrapper.height();
            if(triggerOffset < scrollY){
                if(wrapperOffsetBottom - elHeight > scrollY){
                    //pin start
                    el.removeClass("uppin").addClass("pin");
                    el.css({
                        'position': 'fixed',
                        'top': Math.abs(pinTopPosition),
                        'left': wrapper[0].getBoundingClientRect().left + 1, //1px border left
                        'bottom': '',
                        'width': wrapper[0].getBoundingClientRect().width - 2, //-2px border left and right
                    });
                }else{
                    //pin end
                    el.removeClass("pin").addClass("uppin");
                    el.css({
                        'position': '',
                        'top': '',
                        'left': '',
                        'bottom': '0',
                        'width': '',
                    });
                }
            }else{
                //pin reset
                el.removeClass("pin uppin");
                el.css({
                    'position': '',
                    'top': '',
                    'left': '',
                    'bottom': '',
                    'width': '',
                });
            }
        });
    }
    $(window).on("scroll", function(){
        scrollToPin($(window).scrollTop());
    });
    $(window).on("resize", function(){
        scrollToPin($(window).scrollTop());
    });
}
                    Dezember
                    01
                
            
                    Dezember
                    02
                
            
                    Dezember
                    03
                
            
                    Dezember
                    04
                
            
                    Dezember
                    05