-3

I want to scroll down,
see #div1 ...
see #div2 ...
When #div2 is not visible anymore, I want #div1 to slide down to the top of the window and stay fixed.
If I reach/hit the footer div, I don't want #div1 to stay sticky anymore.

If possible it should work when scrolling page up, too (backwards). There are no fixed heights at all. Is this possible? Maybe using jQuery?

Live example the jsFiddle

$(document).scroll(function() {
  var y = $(this).scrollTop();
  var div3 = $('#div3').offset().top;
  if (y > div3) {
    $('#div1').addClass('sticky');
  } else {
    $('#div1').removeClass('sticky');
  }
});
#test1 {
  margin-right: 300px;
  background: #00ff00;
}
#test2 {
  width: 300px;
  float: right;
  background: #9FF;
}
#div1 {
  margin: 10px 0 0 0;
  background: #ff00ff;
  border: 2px solid #000;
}
#div2 {
  margin: 10px 0 0 0;
  background: #FF6;
  border: 2px solid #000;
}
#div3 {
  height: 1px;
}
.sticky {
  position: fixed;
  top: 0;
  z-index: 999;
  -webkit-box-shadow: 0 8px 5px -6px #ccc;
  -moz-box-shadow: 0 8px 5px -6px #ccc;
  box-shadow: 0 8px 5px -6px #ccc;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="box">
  <div id="test2">

    <div style="background: #0000ff;">Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget,
      arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.</div>
    <div style="background: #ff0000;">Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget,
      arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.</div>
    <div style="background: #0000ff;">Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget,
      arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.</div>
    <div style="background: #ff0000;">Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget,
      arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.</div>
    <div style="background: #0000ff;">Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget,
      arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.</div>

    <div id="div1">DIV 1 - <strong>I want to slide down and be a sticky div after #div2 is gone. If I "hit" the footer div I don't want to be sticky anymore.</strong> - Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
      ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis
      pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium
      quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus.
      Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.</div>

    <div id="div2">DIV 2 - <strong>If I am gone #div1 should slide down and be sticky</strong> - Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat
      massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper
      nisi. Aenean vulputate eleifend tellus.</div>

    <div id="div3"></div>

  </div>
  <div id="test1">Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. Hi mindless mortuis soulless creaturas,
    imo evil stalking monstra adventus resi dentevil vultus comedat cerebella viventium. Qui animated corpse, cricket bat max brucks terribilem incessu zomby. The voodoo sacerdos flesh eater, suscitat mortuos comedere carnem virus. Zonbi tattered for
    solum oculi eorum defunctis go lum cerebro. Nescio brains an Undead zombies. Sicut malus putrid voodoo horror. Nigh tofth eliv ingdead. Cum horribilem walking dead resurgere de crazed sepulcris creaturis, zombie sicutde grave feeding iride et serpens.
    Pestilentia, shaun ofthe dead scythe animated corpses ipsa screams. Pestilentia est plague haec decaying ambulabat mortuos. Sicut zeder apathetic malus voodoo. Aenean a dolor plan et terror soulless vulnerum contagium accedunt, mortui iam vivam unlife.
    Qui tardius moveri, brid eof reanimator sed in magna copia sint terribiles undeath legionis. Alii missing oculis aliorum sicut serpere crabs nostram. Putridi braindead odores kill and infect, aere implent left four dead. Lucio fulci tremor est dark
    vivos magna. Expansis creepy arm yof darkness ulnis witchcraft missing carnem armis Kirkman Moore and Adlard caeruleum in locis. Romero morbo Congress amarus in auras. Nihil horum sagittis tincidunt, zombie slack-jawed gelida survival portenta. The
    unleashed virus est, et iam zombie mortui ambulabunt super terram. Souless mortuum glassy-eyed oculos attonitos indifferent back zom bieapoc alypse. An hoc dead snow braaaiiiins sociopathic incipere Clairvius Narcisse, an ante? Is bello mundi z? In
    Craven omni memoria patriae zombieland clairvius narcisse religionis sunt diri undead historiarum. Golums, zombies unrelenting et Raimi fascinati beheading. Maleficia! Vel cemetery man a modern bursting eyeballs perhsaps morbi. A terrenti flesh contagium.
    Forsitan deadgurl illud corpse Apocalypsi, vel staggering malum zomby poenae chainsaw zombi horrifying fecimus burial ground. Indeflexus shotgun coup de poudre monstra per plateas currere. Fit de decay nostra carne undead. Poenitentiam violent zom
    biehig hway agite RE:dead pœnitentiam! Vivens mortua sunt apud nos night of the living dead. Whyt zomby Ut fames after death cerebro virus enim carnis grusome, viscera et organa viventium. Sicut spargit virus ad impetum, qui supersumus flesh eating.
    Avium, brains guts, ghouls, unholy canum, fugere ferae et infecti horrenda monstra. Videmus twenty-eight deformis pale, horrenda daemonum. Panduntur brains portae rotting inferi. Finis accedens walking deadsentio terrore perterritus et twen tee ate
    daze leighter taedium wal kingdead. The horror, monstra epidemic significant finem. Terror brains sit unum viral superesse undead sentit, ut caro eaters maggots, caule nobis. Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De
    carne lumbering animata corpora quaeritis. Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. Hi mindless mortuis soulless creaturas, imo evil stalking monstra adventus resi dentevil vultus comedat
    cerebella viventium. Qui animated corpse, cricket bat max brucks terribilem incessu zomby. The voodoo sacerdos flesh eater, suscitat mortuos comedere carnem virus. Zonbi tattered for solum oculi eorum defunctis go lum cerebro. Nescio brains an Undead
    zombies. Sicut malus putrid voodoo horror. Nigh tofth eliv ingdead. Cum horribilem walking dead resurgere de crazed sepulcris creaturis, zombie sicut de grave feeding iride et serpens. Pestilentia, shaun ofthe dead scythe animated corpses ipsa screams.
    Pestilentia est plague haec decaying ambulabat mortuos. Sicut zeder apathetic malus voodoo. Aenean a dolor plan et terror soulless vulnerum contagium accedunt, mortui iam vivam unlife. Qui tardius moveri, brid eof reanimator sed in magna copia sint
    terribiles undeath legionis. Alii missing oculis aliorum sicut serpere crabs nostram. Putridi braindead odores kill and infect, aere implent left four dead.Lucio fulci tremor est dark vivos magna. Expansis creepy arm yof darkness ulnis witchcraft
    missing carnem armis Kirkman Moore and Adlard caeruleum in locis. Romero morbo Congress amarus in auras. Nihil horum sagittis tincidunt, zombie slack-jawed gelida survival portenta. The unleashed virus est, et iam zombie mortui ambulabunt super terram.
    Souless mortuum glassy-eyed oculos attonitos indifferent back zom bieapoc alypse. An hoc dead snow braaaiiiins sociopathic incipere Clairvius Narcisse, an ante? Is bello mundi z? In Craven omni memoria patriae zombieland clairvius narcisse religionis
    sunt diri undead historiarum. Golums, zombies unrelenting et Raimi fascinati beheading. Maleficia! Vel cemetery man a modern bursting eyeballs perhsaps morbi. A terrenti flesh contagium. Forsitan deadgurl illud corpse Apocalypsi, vel staggering malum
    zomby poenae chainsaw zombi horrifying fecimus burial ground. Indeflexus shotgun coup de poudre monstra per plateas currere. Fit de decay nostra carne undead. Poenitentiam violent zom biehig hway agite RE:dead pœnitentiam! Vivens mortua sunt apud
    nos night of the living dead. Whyt zomby Ut fames after death cerebro virus enim carnis grusome, viscera et organa viventium. Sicut spargit virus ad impetum, qui supersumus flesh eating. Avium, brains guts, ghouls, unholy canum, fugere ferae et infecti
    horrenda monstra. Videmus twenty-eight deformis pale, horrenda daemonum. Panduntur brains portae rotting inferi. Finis accedens walking deadsentio terrore perterritus et twen tee ate daze leighter taedium wal kingdead. The horror, monstra epidemic
    significant finem. Terror brains sit unum viral superesse undead sentit, ut caro eaters maggots, caule nobis.</div>
  <div style="clear: both; background: #999;">FOOTER, no fixed height - Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. Hi mindless
  </div>
</div>
Arno Nuehm
  • 17
  • 6
  • My answer here may give you a starting point: http://stackoverflow.com/a/15800696/1947286 – apaul Feb 03 '15 at 20:55
  • Thanks @apaul34208 - I tried my best: http://jsfiddle.net/p31k38yc/1/ ... But it is not as I need it. Could you help? – Arno Nuehm Feb 03 '15 at 21:27
  • @apaul34208 Sorry, I am totally new here at stackoverflow and in Javascript/jQuery programming. – Arno Nuehm Feb 03 '15 at 21:41
  • Is this a little closer? http://jsfiddle.net/apaul34208/p31k38yc/7/ – apaul Feb 03 '15 at 23:10
  • This is already great, @apaul34208, thank you! - I used #div3 as a trigger to get the bottom of #div2, is this okay or is it possible to get the bottom of #div2 in a better way? - When scrolling down #div1 should slide down, so it's not suddenly just there. - When scrolling up #div1 should slide up again as soon as we reach the bottom of #div2 (or using the "trigger" #div3) - When we reach the footer #div1 shouldn't just disapear but be unsticky and scroll up with the rest of the content. Again, thank you so much! - I would have never figured that out on my own. – Arno Nuehm Feb 04 '15 at 06:32
  • Sorry, I guess my English is not good enough :) ... When I say "should slide up" (or "down") I mean the position change should be animated. And when I say "when reach the footer [...] unsticky" I mean, that the div should just stay above the footer and scroll up normally like the rest of the page. – Arno Nuehm Feb 04 '15 at 07:48

1 Answers1

0

It's a little messy, but I think this may work for you:

Working Example

$(function () {
    $('#test2').height($('#test1').height());
    $(document).scroll(function () {
        //stick nav to top of page
        var y = $(this).scrollTop(),
            div3 = $('#div3').offset().top,
            foot = $('#footer').offset().top,
            div1Height = $('#div1').height() + 10;
        if (y > div3 && y < foot - div1Height) {
            $('#div1').addClass('sticky slider').removeClass('bottom');

        } else if (y > foot - div1Height) {
            $('#div1').addClass('bottom').removeClass('sticky');
        } else {
            $('#div1').removeClass('sticky bottom slider');

        }
    });
});

#test1 {
    margin-right: 300px;
    background: #00ff00;
}
#test2 {
    position: relative;
    width: 300px;
    float: right;
    background: #9FF;
}
#div1 {
    margin: 10px 0 0 0;
    background: #ff00ff;
    border: 2px solid #000;
}
#div2 {
    margin: 10px 0 0 0;
    background: #FF6;
    border: 2px solid #000;
}
#div3 {
    height: 1px;
}
.sticky {
    position: fixed;
    top: 0;
    z-index: 999;
    transition: all .3s;
    -webkit-box-shadow: 0 8px 5px -6px #ccc;
    -moz-box-shadow: 0 8px 5px -6px #ccc;
    box-shadow: 0 8px 5px -6px #ccc;
}
.slider {
    animation: slider .5s; /* you'll need to add -webkit- browser prefix for chrome */
}
@keyframes slider {
    from {
        top: -100px;
    }
    to {
        top: 0px;
    }
}
.bottom {
    position: absolute;
    bottom:0;
}

Related docs:

apaul
  • 16,092
  • 8
  • 47
  • 82
  • This is nearly perfect, thank you so much! If it would somehow slide up a bit earlier if you scroll up it would be perfect at all. So just before you see the bottom of div2 while scrolling up, it should either slide up animated or just disapear to its old position. Would that be possible? – Arno Nuehm Feb 04 '15 at 17:37
  • and do we need this div3 at all? or could we somehow get the dynamic height of div2, so we know when to stick div1? – Arno Nuehm Feb 04 '15 at 17:40
  • Thank you again, @apaul34208. Update 11 was better / more smooth. If scrolling down, Div1 should slide down as soon as (the bottom of) Div2 is not visible anymore. At Update 12 it is sliding down before and i overlapping Div2. And when you scroll up, Div1 should slide up as soon as (the bottom of) Div2 is visible again. Thanks for all the work you are doing for me, thanks! – Arno Nuehm Feb 04 '15 at 21:53