備忘録6〜背景を動かしたい〜

この動画のように、背景画像がスクロールに合わせて動くようにしたい・・・

PCサイトだけだったら、CSSだけでいけるんですが、スマホサイトはCSSだけでは動かないです。

まずは、HTMLです。

<div class="parallax bg-01" id="parallax-01">
<!--1枚目の背景画像-->
</div>
<div class="back scrollbox2 content text-dark text-center">
<h2 class="border-0">なんかタイトルっぽいの</h2>
<p>テキスト
</p>
<div>

<div class="parallax bg-02" id="parallax-02">
<!--2枚目の背景画像-->
</div>
<div class="back scrollbox3 content text-dark text-center">
<h2 class="border-0">なんかタイトルっぽいの</h2>
<p>テキスト
</p>
<div>

<div class="parallax bg-03" id="parallax-03">
<!--3枚目の背景画像-->
</div>
<div class="back scrollbox4 content text-dark text-center">
<h2 class="border-0">なんかタイトルっぽいの</h2>
<p>テキスト
</p>
<div>

次にCSSです。

.parallax {
    min-height: 20vh;
    background-position: center top;
    background-repeat: no-repeat;
    background-size: cover;    
}
.parallax.bg-01 {
 background-image: url(https://www.peop.jp/wp-content/uploads/2021/02/para_01-min.jpg);height: 80vh;}

次にJavaScript部分

 //表示位置にあるかのフラグを用意
 var flag_target1 = false;
 var flag_target2 = false;
 var flag_target3 = false;

//指定IDの指定
  var target1 = $("#parallax-01");
 //指定IDの位置取得
  var targetPosOT1 = target1.offset().top;
	
  var target2 = $("#parallax-02");
  var targetPosOT2 = target2.offset().top;
	
  var target3 = $("#parallax-03");
  var targetPosOT3 = target3.offset().top;

//どのくらい画像を動かすか?
  var targetFactor = 0.5;
 
 //ウインドウの高さを取得
  var windowH = $(window).height();

//対象の位置を計算
  var scrollYStart1 = targetPosOT1 - windowH;
  var scrollYStart2 = targetPosOT2 - windowH;
  var scrollYStart3 = targetPosOT3 - windowH;

//指定要素が見えたら、再計算
$("#bg-01img").on('inview', function(event, isInView) {
        if(isInView) { 
           targetPosOT2 = target2.offset().top;
           scrollYStart2 = targetPosOT2 - windowH;
        }
    });


$("#bg-02img").on('inview', function(event, isInView) {
        if(isInView) { 
           targetPosOT3 = target3.offset().top;
           scrollYStart3 = targetPosOT3 - windowH;
        }
    });
    
    //要素が見えたら、フラグをON
$(target1).on('inview', function(event, isInView) {
        if(isInView) { 
           flag_target1 = true;
        }else{
           flag_target1 = false;

}
          console.log("flag_target1: " + flag_target1);

    });
    
$(target2).on('inview', function(event, isInView) {
        if(isInView) { 
           flag_target2 = true;
        }else{
           flag_target2 = false;

}
          console.log("flag_target2: " + flag_target2);

    });
 $(target3).on('inview', function(event, isInView) {
        if(isInView) { 
           flag_target3 = true;
        }else{
           flag_target3 = false;

}
          console.log("flag_target3: " + flag_target3);

    });
    
    //スクロールで都度計算
  $(window).on('scroll',function(){

    var scrollY = $(this).scrollTop();

//要素が見えている時に動くようにしてます
    if(scrollY > scrollYStart1&&flag_target1 == true){
      target1.css('background-position-y', (scrollY - targetPosOT1) * targetFactor + 'px');
    }else{
      target1.css('background-position','center top');
    }



    if(scrollY > scrollYStart2&&flag_target2 == true){
      target2.css('background-position-y', (scrollY - targetPosOT2) * targetFactor+ 'px');
    }else{
      target2.css('background-position','center top');
    }



   if(scrollY > scrollYStart3&&flag_target3 == true){

      target3.css('background-position-y', (scrollY - targetPosOT3) * targetFactor + 'px');

    }else{
      target3.css('background-position','center top');
    }

  });
});

指定された要素が見えているか判別するのに下記を読み込みます。

<script src="/js/jquery.inview.min.js"></script>

アニメーションように、紹介されておりました。無駄な位置計算を止めたいので流用します。

これで、スマホもPCも背景画像が固定されてスクロールすると動くようになったと思います。

初め、inviewを使わずに設定してましたが、途中でスクロールがカクカクするようになってしまい、

見るに耐えない状態になってしまいました。

背景画像が出るところが見えるまで、計算させないようにしてみたところ、まあなんとか見映えがするものになったかと思います。

実際のページで動きを確認して頂けると嬉しいです。

スポンサーリンク