お世話になっております。
jQueryでclassをつけはずしすることによって上からするっと降りてくるヘッダーについて、質問させてください。
コードは以下のようになっています。
html
1 <header id="header" class="js-float-header"> 2 ヘッダー 3</header><!-- /header --> 4<main> 5 <section class="section section1"></section> 6 <section class="section section2"></section> 7 <section class="section section3"></section> 8</main> 9 10 <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> 11
css
1#header { 2 background: pink; 3 position: absolute; 4 top: 0; 5 left: 0; 6 height: 100px; 7 width: 100%; 8 transition: none; 9 z-index: 100; 10 background: pink; 11/* この↓transitionを付けたいけど付けるとカクつく */ 12/* transition: transform .5s; */ 13} 14#header.standby { 15 position: fixed; 16 transform: translateY(-100%); 17} 18 19#header.fixed { 20 transform: translateY( 0 ); 21 box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.07); 22} 23 24.section { 25 height: 400px; 26} 27.section1 { 28 background: #ccc; 29} 30.section2 { 31 background: #ddd; 32} 33.section3 { 34 background: #fff; 35}
jQery
1 // ヘッダー固定切り替え 2var $header = jQuery('.js-float-header'); 3 //外部の高さをとる 4var headerH = $header.outerHeight(); 5 //ブラウザウィンドウの外側の幅 6var overplus = jQuery(window).outerWidth() * 0.1; 7jQuery(window).on('scroll', function() { 8 if (jQuery(window).scrollTop() > headerH + overplus) { 9 // ヘッダーfixed時 10 $header.css({ 'transition': 'transform .5s' }); 11 $header.addClass('standby').addClass('fixed'); 12 } else if (jQuery(window).scrollTop() > headerH) { 13 // ヘッダーstandby時 14 if ($header.hasClass('standby')) { 15 $header.css({ 'transition': 'transform .5s' }); 16 } else { 17 $header.css({ 'transition': '' }); 18 } 19 $header.addClass('standby').removeClass('fixed'); 20 } else { 21 // ヘッダーabsolute時 22 $header.css({ 'transition': '' }); 23 $header.removeClass('standby fixed'); 24 } 25 }); 26
上記コードで問題なくヘッダーは動作するのですが、
クリックでスライドするパーツとの兼ね合いで
どうしても #header に transition: transform .5s; を付与したいのです。
ですが、それをするとヘッダーの動きにカクつきが出てしまいます。
ヘッダーがカクつくのは
jQuery
1 else if (jQuery(window).scrollTop() > headerH) { 2// ヘッダーstandby時 3 if ($header.hasClass('standby')) { 4 $header.css({ 'transition': 'transform .5s' }); 5 } else { 6 $header.css({ 'transition': '' }); 7 } 8 $header.addClass('standby').removeClass('fixed'); 9 }
の部分なので、この部分をどうにかしたら #header に transition: transform .5s; を付与したまま
ヘッダーの動きを正常にできるのかな・・・と考えているのですが、
このコードの意味をきちんと理解していないためどこを触っても挙動がおかしくなってしまいます。
1:ページロード時はclassの付与・transition無し
2:ヘッダーの高さよりスクロールすると
.standby を持っていれば transition を付与
.standby を持ってなければ transition を消す
それに関わらず.standbyを付与、.fixedを消す
3:さらにスクロールすると
.standby .fixed transitionも付与
というところまでは理解しました(合っているが自信がありませんが・・・)。
前置きが長くなりましたが、
transitionをこんなにこまかく付け外しするのは何故でしょうか。
jQuery
1else { 2 $header.css({ 'transition': '' }); 3 }
の部分を削除してもヘッダーはちゃんとスライドダウンしますが、#header に transition を付けると
やはりカクついてしまいます。
上記jQueryのコードでやっていることの意味を教えていただけませんでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/17 00:17