Search code examples
jqueryscrollparallax

Center parallax image


I have this simplify code to add parallax to my image.

When I start scrolling, the top value is incorrect. The distance is too big and when I come back at the top of the website the picture is not centered like the beginning.

How do I calculate the right top value?

$(document).ready(function(){
	var scrolledDefault = $(window).height() / 2 - ($('.img__moi').height() / 2) + 25;
  	$('.img__moi').css('top', scrolledDefault);
	$(window).scroll(function(e){
  		parallax('.img__moi', '0.2');
	});

	function parallax(element, vitesse){
		var scrolled = $(window).scrollTop() + ($(window).height() / 2) - ($(element).height() / 2) + 25;
		console.info(scrolled*vitesse);
		$(element).css('top',-(scrolled*vitesse)+'px');
	}
});
body{
  background-color:#cccccc;
  height:3000px;
}
.align__text{
  position:absolute;
  top:calc(50% + 30px);
  left:calc(25% + 20px);
  width:70%;
  -webkit-transform:translateY(-50%);
  transform:translateY(-50%);
  z-index:2;
}
.header__top{
  background-color:$blanc;
  padding:5px 0px;
  height:50px;
  position:fixed;
  top:0;
  left:0;
  right:0;
  z-index:9999999;
}
.img__moi{
  float:left;
  width:25%;
  position:absolute;
  margin-left:50px;
  z-index:2;
  transition:all 300ms ease;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header>
  <div class="header__top"></div>
<img src="http://img15.hostingpics.net/pics/317625pexelsphoto.jpg" class="img__moi">
			<div class="align__text">
				<h1>The title here<br/> Two line</h1>
			</div>
</header>


Solution

  • Alternatively, if you rearrange your maths a little you have a set-up that's perhaps easier to apply to other divs without having to wrap them:

    var moi = '.img__moi'; // defining the key image classname here
    
    function scrollDef(el) {
        var scrolledDefault = $(window).height() - $(el).height(); // or use $('body).height() to center div relative to the scroll area
        scrolledDefault = scrolledDefault / 2;
        scrolledDefault += 25;
        return scrolledDefault;
      } // DRY: by calculating scroll top in this way we ensure its defined in one way for greater parity 
    
    function parallax(element, vitesse) {
      var scrolled = scrollDef(element) - ($(window).scrollTop() * vitesse); // have rearranged the maths slightly to make this work
      $(element).css('top', scrolled);
    }
    
    $('.img__moi').css('top', scrollDef(moi));
    // you could replace the above line with   parallax('.img__moi', 0.2); to set the same starting condition
    
    $(window).scroll(function() {
      parallax('.img__moi', 0.2);
    });
    body,
    html {
      background-color: #cccccc;
      height: 3000px;
    }
    .align__text {
      position: absolute;
      top: calc(50% + 30px);
      left: calc(25% + 20px);
      width: 70%;
      -webkit-transform: translateY(-50%);
      transform: translateY(-50%);
      z-index: 2;
    }
    .header__top {
      background-color: $blanc;
      padding: 5px 0px;
      height: 50px;
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      z-index: 9999999;
    }
    .img__moi {
      float: left;
      width: 25%;
      position: absolute;
      margin-left: 50px;
      z-index: 2;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <header>
      <div class="header__top"></div>
      <img src="http://img15.hostingpics.net/pics/317625pexelsphoto.jpg" class="img__moi">
      <div class="align__text">
        <h1>The title here<br/> Two line</h1>
      </div>
    </header>