expanding image effect
question for stackoverflow
HTML
<p>Eos tota scripserit ex. No elitr quaeque oportere est, cum quis efficiendi ad. Cu usu eros probatus singulis, ei vel mundi voluptua lobortis. An pro aliquam dolorum, no idque omittantur duo. Eros brute dolore nec in. Mei audire aliquam delicatissimi te, tation posidonium at per, sed cu viris graeci assentior.</p>
<p>Eos tota scripserit ex. No elitr quaeque oportere est, cum quis efficiendi ad. Cu usu eros probatus singulis, ei vel mundi voluptua lobortis. An pro aliquam dolorum, no idque omittantur duo. Eros brute dolore nec in. Mei audire aliquam delicatissimi te, tation posidonium at per, sed cu viris graeci assentior.</p>
<p>Nam ex dico natum dissentiunt. Ut nostrud menandri conclusionemque ius, ut case tation tincidunt sea. Illud tamquam cu eos, cu mei quis aliquam. Ne partiendo repudiare ius, vim appareat eloquentiam no. Error quidam vim ne. Ex sea utinam voluptatibus, quidam putant definitiones vix ad.</p>
<p>Eos tota scripserit ex. No elitr quaeque oportere est, cum quis efficiendi ad. Cu usu eros probatus singulis, ei vel mundi voluptua lobortis. An pro aliquam dolorum, no idque omittantur duo. Eros brute dolore nec in. Mei audire aliquam delicatissimi te, tation posidonium at per, sed cu viris graeci assentior.</p>
<p>Eos tota scripserit ex. No elitr quaeque oportere est, cum quis efficiendi ad. Cu usu eros probatus singulis, ei vel mundi voluptua lobortis. An pro aliquam dolorum, no idque omittantur duo. Eros brute dolore nec in. Mei audire aliquam delicatissimi te, tation posidonium at per, sed cu viris graeci assentior.</p>
<p>Eos tota scripserit ex. No elitr quaeque oportere est, cum quis efficiendi ad. Cu usu eros probatus singulis, ei vel mundi voluptua lobortis. An pro aliquam dolorum, no idque omittantur duo. Eros brute dolore nec in. Mei audire aliquam delicatissimi te, tation posidonium at per, sed cu viris graeci assentior.</p>
<p>Eos tota scripserit ex. No elitr quaeque oportere est, cum quis efficiendi ad. Cu usu eros probatus singulis,...
CSS
body {
width: 380px;
border:1px solid red;
}
.parallax {
position: relative;
overflow: hidden;
height: 0px;
width: 100%;
transition: height .5s;
}
.pic-wrapper {
position: absolute;
left: 0;
right: 0;
margin: 0 auto;
width: 300px;
height: 250px;
}
.flickering {
border:1px solid blue;
}
JavaScript
var pic = {
selector: document.getElementsByClassName('parallax')[0],
width: 300,
height: 250,
tolerance: 100
};
var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
function expandPic(pic, newHeight) {
if (newHeight > pic.height) {
newHeight = pic.height;
}
pic.selector.style.height = newHeight + 'px';
}
/*
Since scroll events can fire at a high rate, the event handler shouldn't execute computationally expensive operations such as DOM modifications. Instead, it is recommended to throttle the event using requestAnimationFrame, setTimeout or customEvent, as follows:
*/
(function () {
var throttle = function (type, name, obj) {
var running = false;
var obj = obj || window;
var func = function () {
if (running) {
return;
}
running = true;
requestAnimationFrame(function () {
obj.dispatchEvent(new CustomEvent(name));
running = false;
});
};
obj.addEventListener(type, func);
};
/* init - you can init any event */
throttle("scroll", "optimizedScroll");
})();
// handle event
window.addEventListener("optimizedScroll", function (event) {
if (pic.selector.parentNode.scrollTop + viewportHeight > pic.selector.offsetTop + pic.tolerance) {
var newHeight = pic.selector.parentNode.scrollTop + viewportHeight - pic.selector.offsetTop - pic.tolerance;
expandPic(pic, newHeight);
} else {
expandPic(pic, 0);
}
});