【问题标题】:Slick Slider zero width in hidden container (Bootstrap tab)隐藏容器中的 Slick Slider 零宽度(Bootstrap 选项卡)
【发布时间】:2018-01-23 11:12:22
【问题描述】:

我正在使用 Bootstrap 4 选项卡导航来查看选项卡面板内的不同滑块。

它适用于活动标签。但非活动选项卡中的滑块宽度为 0 (.slide-track)。所以在我开始浏览选项卡之前存在显示问题。之后,宽度设置好了,滑块看起来很好。

有什么办法可以把滑轨的宽度设置成正确的大小吗?

$('.slider-home').slick({
  dots: true,
  arrows: true,
});

$('.slider-profile').slick({
  dots: true,
  arrows: true,
});

$('.slider-contact').slick({
  dots: true,
  arrows: true,
});
.slick-prev:before,
.slick-next:before {
  color: blue;
}

.tab-pane {
  padding: 2rem 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="http://cdn.jsdelivr.net/jquery.slick/1.3.15/slick.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />
<link href="http://cdn.jsdelivr.net/jquery.slick/1.3.15/slick.css" rel="stylesheet" />
<link href="https://kenwheeler.github.io/slick/slick/slick-theme.css" rel="stylesheet" />

<div class="container">
  <ul class="nav nav-tabs" id="myTab" role="tablist">
    <li class="nav-item"><a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a></li>
    <li class="nav-item"><a class="nav-link" id="profile-tab" data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a></li>
    <li class="nav-item"><a class="nav-link" id="contact-tab" data-toggle="tab" href="#contact" role="tab" aria-controls="contact" aria-selected="false">Contact</a></li>
  </ul>
  <div class="tab-content" id="myTabContent">
    <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
      <div class="slider-home">
        <div>
          <p class="h1">home 1</p>
        </div>
        <div>
          <p class="h1">home 2</p>
        </div>
        <div>
          <p class="h1">home 3</p>
        </div>
        <div>
          <p class="h1">home 4</p>
        </div>
      </div>
    </div>
    <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
      <div class="slider-profile">
        <div>
          <p class="h1">profile 1</p>
        </div>
        <div>
          <p class="h1">profile 2</p>
        </div>
        <div>
          <p class="h1">profile 3</p>
        </div>
        <div>
          <p class="h1">profile 4</p>
        </div>
        <div>
          <p class="h1">profile 5</p>
        </div>
      </div>
    </div>
    <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
      <div class="slider-contact">
        <div>
          <p class="h1">contact 1</p>
        </div>
        <div>
          <p class="h1">contact 2</p>
        </div>
        <div>
          <p class="h1">contact 3</p>
        </div>
      </div>
    </div>
  </div>
</div>

View on JSFiddle

【问题讨论】:

    标签: javascript jquery css twitter-bootstrap slick.js


    【解决方案1】:

    另一种解决方案是在显示后手动刷新已初始化的滑块。
    这是一个演示:

    // Initialize sliders.
    $('.slider').slick({
      dots: true,
      arrows: true,
    });
    
    // When a tab is shown...
    $('.nav-link').on('shown.bs.tab', function() {
    
      // ... select the corresponding tab pane ...
      let $tabPane = $($(this).attr('href'));
    
      // ... and refresh its slider.
      $('.slider', $tabPane).slick('refresh');
    
    });
    .slick-prev:before,
    .slick-next:before {
      color: blue;
    }
    
    .tab-pane {
      padding: 2rem 0;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <script type="text/javascript" src="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.1/slick/slick.min.js"></script>
    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.1/slick/slick.css" />
    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.8.1/slick/slick-theme.css" />
    
    <div class="container">
      <ul class="nav nav-tabs" id="myTab" role="tablist">
        <li class="nav-item"><a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a></li>
        <li class="nav-item"><a class="nav-link" id="profile-tab" data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a></li>
        <li class="nav-item"><a class="nav-link" id="contact-tab" data-toggle="tab" href="#contact" role="tab" aria-controls="contact" aria-selected="false">Contact</a></li>
      </ul>
      <div class="tab-content" id="myTabContent">
        <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
          <div class="slider slider-home">
            <div>
              <p class="h1">home 1</p>
            </div>
            <div>
              <p class="h1">home 2</p>
            </div>
            <div>
              <p class="h1">home 3</p>
            </div>
            <div>
              <p class="h1">home 4</p>
            </div>
          </div>
        </div>
        <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
          <div class="slider slider-profile">
            <div>
              <p class="h1">profile 1</p>
            </div>
            <div>
              <p class="h1">profile 2</p>
            </div>
            <div>
              <p class="h1">profile 3</p>
            </div>
            <div>
              <p class="h1">profile 4</p>
            </div>
            <div>
              <p class="h1">profile 5</p>
            </div>
          </div>
        </div>
        <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
          <div class="slider slider-contact">
            <div>
              <p class="h1">contact 1</p>
            </div>
            <div>
              <p class="h1">contact 2</p>
            </div>
            <div>
              <p class="h1">contact 3</p>
            </div>
          </div>
        </div>
      </div>
    </div>

    参考见:

    • Bootstrap Nav Events

      shown.bs.tab
      显示选项卡后,此事件在选项卡显示时触发。使用 event.target 和 event.relatedTarget 分别定位活动选项卡和上一个活动选项卡(如果可用)。

    • 如果您使用的是Bootstrap's Collapse component,则它具有等效的events

      shown.bs.collapse
      当折叠元素对用户可见时触发此事件(将等待 CSS 转换完成)​​。

    【讨论】:

      【解决方案2】:

      问题在于,当容器被隐藏时,它的子元素无法计算它们的宽度。

      要解决这个问题,您可以在显示选项卡时实例化slick() 控件。然后可以计算宽度。试试这个:

      $('a[data-toggle="tab"]').on('shown.bs.tab', function() {   
        $($(this).attr('href')).find('.slider').slick({
          dots: true,
          arrows: true
        })
      }).first().trigger('shown.bs.tab');
      

      Working example

      【讨论】:

      • 对不起...又是我。我试图让它与多个标签内容区域一起工作。但在那之后,滑块再次断裂。这是我的例子:stackoverflow.com/questions/48403464/….first()argument 有关系吗?
      • 好的,如果我将.first() 更改为.eq(),两个滑块之间的导航/同步将再次起作用。如果我将两个滑块都放在一个选项卡面板中,不幸的是隐藏容器中的滑块仍然损坏。
      • 为了防止错误,最好使用这个:$($(this).attr('href')).find('.slider').not('.slick-initialized').slick({... 因为如果不添加这个你会看到:slick.min.js:1 Uncaught TypeError: Cannot read property 'add' of null
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2020-10-26
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多