私が持っている<header>
、以下の画像のように順番に、2つのdivを含んでいること:
上半分のdivAと下半分のdivBです。私がやりたいのはスティッキーメニューです。下のdivの上部(赤)がゼロの場合、ヘッダー全体の位置が固定されます。 、ブラウザウィンドウで上部のdiv(青)を非表示にします。つまり:これは私のコードです:
$(document).ready(function(){
let smenu = $('.divB');
stickyMenu(smenu);
function stickyMenu(menu){
$(window).on('scroll', function(){
if($(this).scrollTop() > menu.offset().top) menu.addClass('menu-fixed');
else menu.removeClass('menu-fixed');
});
}
});
body {
height: 8000px;
}
header{
background-color: transparent;
width: 95%;
margin: auto;
overflow: hidden;
transform: translateY(20px);
}
header .divA{
width: 100%;
background-color: #FFF;
z-index: 1;
overflow: hidden;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
height: 40px;
width: 100%;
background-color: red;
}
header .divB{
width: 100%;
background-color: #FFF;
z-index: 1;
overflow: hidden;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
height: 40px;
width: 100%;
background-color: green;
}
/*This class is to "stick" the menu on the top*/
.menu-fixed{
position: fixed;
z-index: 999;
width: 100%;
top: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<header>
<div class="divA">
divA
</div>
<div class="divB">
divB
</div>
</header>
問題は、スクロールを実行すると、ヘッダー全体がウィンドウを離れ(上向き)、下にスクロールするまでそこに留まるということです。
あなたはあなたのcssとjavascriptに多くの問題を抱えています。最初にCSSでposition: fixed
、transformプロパティを持つ内部要素を使用すると、「修正された」動作がなくなります。Stackoverflowでこの回答を確認してください
JSでは、すべてのスクロールイベントでオフセットを評価します。これにより、divBの「menu-fixed」に適用されているクラスがoffset()。topを変更し、scrollイベントが毎回新しいトップオフセットを読み取るため、混乱が生じます。したがって、以下のコードで行ったように、上部オフセットをスクロールイベントから除外します。これにより、望ましくない影響を引き起こすすべてのイベントを更新するのではなく、元のトップオフセットへの参照が保持されます。
$(document).ready(function() {
let smenu = $('.divB');
stickyMenu(smenu);
function stickyMenu(menu) {
// Keep offset value out of scroll event
var top = menu.offset().top;
$(window).on('scroll', function() {
var hasMoved = $(this).scrollTop() > top;
(hasMoved == true) ? menu.addClass('menu-fixed'): menu.removeClass('menu-fixed');
});
}
});
body {
height: 8000px;
}
header {
background-color: transparent;
width: 95%;
margin: auto;
/* Transform will act as a containing block for fixed position elemenets
transform: translateY(20px);*/
position: relative;
top: 20px;
overflow: hidden;
}
header .divA {
width: 100%;
background-color: #FFF;
z-index: 1;
overflow: hidden;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
height: 40px;
width: 100%;
background-color: red;
}
header .divB {
width: 100%;
background-color: #FFF;
z-index: 1;
overflow: hidden;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
height: 40px;
width: 100%;
background-color: green;
}
/*This class is to "stick" the menu on the top*/
.menu-fixed {
position: fixed;
z-index: 999;
width: 100%;
top: 0;
left: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<header>
<div class="divA">
divA
</div>
<div class="divB">
divB
</div>
</header>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加