はい!みなさんこんにちは。
今日はタイトルの通り特定の要素が可視範囲から消えたら
別の要素を表示する方法をご紹介します。
これ、何かよくあるパターンと違うかというと
よくあるパターンは
・1つの要素をスクロール量によって表示したり、非表示にしたりするパターン
・特定の要素が可視範囲に入ったら、アニメーションをするパターン
がブログなどでよく紹介されています。
ただ、今回は
Aというブロックが最初から表示されていて
そのAブロックが可視範囲から削除されると
べつのBというブロックを表示する
ということです。
で最初は私もいろんな方のブログを見てまわって、いろいろ
やってみたんですけど全然うまくいかない!
ということで、エンジニアさんに相談してソースを提供してみました!
それが下記になります。
まずはHTMLから…
<section class="mainContents"> <div id="btnBlock"> <p>[Aブロック]ここに最初から表示するコンテンツ</p> </div> </section> <div id="FormBtn"> <p>Bブロック]Aブロックが可視範囲から消えたらfiexdで横から表示されるコンテンツ</p> </div>
という感じ。
CSSはもっと簡単。
あとは好きなように装飾してください。
#btnBlock { width: 100%; margin-top: 20px; } #formBtn { position: fixed; right: 0; top: 50%; z-index: 999; }
問題のJSです。
分岐は、最初からBブロックを表示させる必要があるかどうかで
わけます。Bブロックが最初から出ている場合は下記の分岐は不要です!
<script> $(document).ready(function() { $("#formBtn").hide(); var top = $("#btnBlock").offset().top; // ターゲットの位置取得 if($(window).height() < top) { // 最初に#btnBlockが見えてない場合 $("#formBtn").show(); } }); $(window).scroll(function(){ var top = $("#btnBlock").offset().top; // ターゲットの位置取得 if($(window).height() > top) { // 最初に#btnBlockが見えている場合 if($(window).scrollTop() > top){ $("#formBtn").fadeIn(); }else{ $("#formBtn").fadeOut(); } }else{ // 最初に#btnBlockが見えていない場合 if($(window).scrollTop() + $(window).height() > top && $(window).scrollTop() < top){ $("#formBtn").fadeOut(); }else{ $("#formBtn").fadeIn(); } } }); </script>
以上です!エンジニアさんありがとうございます!
みなさんのお役に立てれば幸いです。