Центрируйте элемент li с помощью javascript или jQuery на навигационной панели с горизонтальной прокруткой

#javascript #html #jquery #css #bootstrap-4

Вопрос:

Я использую bootstrap 4.6 для веб-страницы, поскольку встроенная навигационная панель не соответствует моим потребностям в мобильной навигации, я пытаюсь изменить ее, чтобы она работала как MODE_SCROLLABLE в Android, поэтому мне нужно, чтобы она активировала ссылку, когда родительский элемент находится в центре прокрутки, а активный элемент отображается в центре.

Чтобы прояснить ситуацию, я добавил рабочий образец (поскольку он предназначен для использования на мобильных устройствах с уменьшенной шириной, его необходимо проверить в chrome как мобильный), вы можете прокрутить его горизонтально, но для активации ссылки вам нужно нажать на нее, и она не центрируется на элементе, когда элемент активен (или нажат).

(Если вы хотите попробовать, просто используйте клавиши со стрелками клавиатуры влево и вправо)

 var lastScrollLeft = 0;
var anchoLi = $('#navegacion').width();
var anchoTotal = anchoLi * 4;
console.log(anchoLi);
console.log(anchoTotal);
$('#navegacion').scroll(function () {
  var documentScrollLeft = $('#navegacion').scrollLeft();
  if (lastScrollLeft != documentScrollLeft) {
    console.log('scroll x');
    lastScrollLeft = documentScrollLeft;
    console.log(lastScrollLeft);
     if (lastScrollLeft > anchoLi - 50 amp;amp; lastScrollLeft < anchoLi * 2   ){
      $('#navegacion li').removeClass('active');
      $('#what').addClass('active');
    } else if(lastScrollLeft > anchoLi * 2 - 50 amp;amp; lastScrollLeft < anchoLi * 3 ){
      $('#navegacion li').removeClass('active');
      $('#where').addClass('active');
    } else if (lastScrollLeft > anchoLi * 3  -25 amp;amp; lastScrollLeft < anchoLi * 4){
        $('#navegacion li').removeClass('active');
        $('#when').addClass('active');
    }
  }
}); 
     section#segunda-nav{
        background: blue;
    }
    #segunda-nav li {
    min-width: 100%;
    text-align: center;
    }
    #navegacion.nav-tabs {
  display: inline-flex;
  width: 100%;
  overflow-x: auto;
  -ms-overflow-style: none; /*// IE 10 */
  overflow: -moz-scrollbars-none;/*// Firefox*/}
  #navegacion.nav-tabs>li.active>a,
  #navegacion.nav-tabs>li.active>a:focus,
  #navegacion.nav-tabs>li.active>a:hover {
  border-width: 0;
}
#navegacion.nav-tabs>li>a {
  border: none;
  color: #FFF;
}
#navegacion.nav-tabs>li.active>a,
#navegacion.nav-tabs>li>a:hover {
  border-bottom: 1px solid cyan;     
  background: transparent;
}
#navegacion.nav-tabs>li>a::after {
  content: "";  
  height: 2px;
  position: absolute;
  width: 100%;
  left: 0px;
  bottom: 1px;
  transition: all 250ms ease 0s;
  transform: scale(0);
}
#navegacion.nav-tabs>li.active>a::after,
#navegacion.nav-tabs>li:hover>a::after {
  transform: scale(1);
}
#navegacion.tab-nav>li>a::after {
  background: #21527d none repeat scroll 0% 0%;
  color: #fff;
}
#navegacion.tab-pane {
  padding: 15px 0;
}
#navegacion.tab-content {
  padding: 20px
}

#navegacion.nav-tabs::-webkit-scrollbar {
  display: none; /*Safari and Chrome*/
}
.card {
  background: #FFF none repeat scroll 0% 0%;
  box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
  margin-bottom: 30px;
  display: block;
}

#navegacion.nav>li>a {
    position: relative;
    display: block;
    padding: 10px 15px;
}
#navegacion.nav{
    flex-wrap: inherit; 
}
li.active a{
  color: red!important;
  font-weight: bold;
}
li.active{
  background: cyan;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1 K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2 l" crossorigin="anonymous">

<section id="segunda-nav">
    <div class="container">
        <div class="row">
            <div class="col">
                <ul id="navegacion" class="nav nav-tabs" role="tablist">
                    <li id="description" role="presentation" class="active"><a data-target="" aria-controls="home" role="tab" data-toggle="tab">DESCRIPTION</a></li>
                    <li id="what" role="presentation"><a data-target="#informacion-programa" data-slide-to="1" aria-controls="profile" role="tab" data-toggle="tab" class="active">WHAT?</a></li>
                    <li id="where" role="presentation"><a data-target="#informacion-programa" data-slide-to="2" aria-controls="messages" role="tab" data-toggle="tab">WHERE?</a></li>
                    <li id="when" role="presentation"><a data-target="#informacion-programa" data-slide-to="3" aria-controls="settings" role="tab" data-toggle="tab">WHEN?</a></li>
                </ul>
            </div>
        </div>
    </div>
</section> 

Ответ №1:

Классы начальной загрузки работают таким образом, что их нельзя перезаписать.

Bootstrap не обеспечивает большой гибкости компонентов, возможно, вы можете создать навигационную панель с нуля и добавить свои собственные функции, или вы можете выбрать другие CSS-фреймворки, такие как Tailwind и MaterialUI(если вы используете ReactJS).

Комментарии:

1. Я знаю, что встроенные функции так не работают, поэтому я переопределяю функциональность, как вы можете видеть (если вы просматриваете как мобильное устройство с chrome, вы можете свободно прокручивать), но она не сосредоточена на li и не вызывает «действие» на элементе li a. Это можно сделать с помощью javascript.