web関連
【jQuery】「position:sticky」をjqueryを使って再現してみた
cssのposition:sticky
を使えず、jQueryで似たような挙動を実装したときの備忘録
「position:sticky」は親要素に「overflow:hidden」があると使えない
まず、position:sticky
は親要素でoverflow:hidden
を使用している正常に動かない。
なので、親要素からoverflow:hidden
を外せばposition:sticky
は動く。
以下は、どうしても親要素からoverflow:hidden
を外せない時にjQueryを使って実装する方法。
「position:sticky」をjQueryで再現してみた
以下、サンプル。
See the Pen
【jQuery】「position:sticky」が効かない理由、jqueryを使って再現してみた by twotone (@twotone-me)
on CodePen.
以下は必要最低限必要なコード。
<style>
.sticky-area{
position: relative;
}
</style>
<div class="sticky-area">
<div class="sticky"></div>
</div>
<script>
jQuery(function($){
const windowHeight = $(window).height();// ウィンドウサイズを取得
const sticky = $('.sticky');// stickyさせたい要素
const targetArea = $('.sticky-area');// この要素内でstickyさせる
const stickySize = sticky.innerHeight();// stickyさせる要素の高さを取得
const stickyMargin = sticky.position().top;// 親要素の中の要素の座標を取得
const targetAreaStart = targetArea.offset().top;// stickyさせる範囲の開始の座標を取得
const stickyPos = targetAreaStart + stickyMargin;// stickyさせる要素の座標を取得
const targetAreaEnd = targetAreaStart + targetArea.innerHeight();// stickyさせる範囲の終わりの座標を取得
$(document).scroll(function() {
const currentPos = $(window).scrollTop();//現在位置の座標取得
// ↓ 現在位置がstickyさせる要素を過ぎてる
// ↓ かつ
// ↓ 現在位置がstickyさせる要素の範囲内の座標のとき
if(currentPos >= stickyPos && currentPos <= targetAreaEnd - stickySize ){
console.log("In");
sticky.css({
position:"fixed",
top:0,
bottom:"auto"
});
}else{
console.log("Out");
if(currentPos <= stickyPos ){// stickyさせる範囲の外(上部)の時
sticky.css({
position:"absolute",
top:stickyMargin,
bottom:"auto"
});
}else{// stickyさせる範囲の外(下部)の時
sticky.css({
position:"absolute",
top:"auto",
bottom:"0"
});
}
}
});
});
</script>
これでposition:sticky
と同じような動作を実装することができた。
しかし、やってみて思ったが親要素のoverflow:hidden
を外してposition:sticky
が正常に動くようにした方が早い。