Ошибка с липким меню, которое скрыто в середине - PullRequest
0 голосов
/ 29 января 2019

У меня есть <header>, который в свою очередь содержит два div, как показано на следующем рисунке:

Fig 07 В верхней половине div A и в нижней половине div B. Ну,то, что я хочу сделать, это липкое меню, которое, когда верхняя часть нижнего div (красный) равна нулю, тогда весь заголовок имеет фиксированную позицию, скрывая верхний div (синий) с окном браузера.То есть: Fig 07-02 Это мой код:

    $(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>

Проблема в том, что при выполнении прокрутки полный заголовок покидает окно (вверх) и застревает там, пока я не прокручиваю вниз.

1 Ответ

0 голосов
/ 29 января 2019

У вас есть ряд проблем с вашим CSS и JavaScript.Во-первых, в CSS использование position: fixed внутри элементов со свойством transform устранит «фиксированное» поведение. Проверьте этот ответ в Stackoverflow

В вашем JS вы оцениваете смещение для каждого события прокрутки.Это приведет к путанице, так как класс, применяемый к вашему divB «с фиксированным меню», изменит offset (). Top и вызовет событие прокрутки для чтения нового верхнего смещения каждый раз.Итак, как я сделал в приведенном ниже коде, держите верхнее смещение вне события прокрутки.Это сохранит ссылку на исходное верхнее смещение вместо обновления каждого события, которое вызовет нежелательный эффект.

$(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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...