光滑的轮播 JS 库在第一张幻灯片上堆叠所有内容

Posted

技术标签:

【中文标题】光滑的轮播 JS 库在第一张幻灯片上堆叠所有内容【英文标题】:Slick carousel JS library stacking all content on the first slide 【发布时间】:2020-01-11 16:34:25 【问题描述】:

用于轮播和滑块的 Slick JS 库对我来说一直运行良好,除了一个令人讨厌的、错误的实例。我的四张幻灯片的滑块(删除了无限循环,因此它更像是一个滑块而不是轮播)是在 Bootstrap 模式中实现的。单击按钮以调出模态框后,很明显所有 Slick 幻灯片的所有内容都在第一张幻灯片上堆叠并相互重叠。奇怪的是,一个修复似乎正在调整浏览器窗口的大小。窗口调整大小事件似乎会适当地调整滑块,以便第一张幻灯片仅显示其内容。我相信我将能够实现窗口调整大小事件的触发,但这个解决方案似乎......janky。是否有任何看起来更合适的解决方案的想法,例如将一个 init 对象传递给从源头解决问题的灵活初始化方法?

我在 Stack Overflow 和 GitHub 上看到过类似的问题,但提供的解决方案似乎都不适合我。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Slick Demo</title>
    <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">    
    <link rel="stylesheet" href="slick-1.8.1/slick/slick.css"/>
    <link rel="stylesheet" href="slick-1.8.1/slick/slick-theme.css"/>    
</head>
<body>    

  <button type="button" id="questionnaire-modal" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
    Launch demo modal
  </button>

  <!-- Modal -->
  <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">Questionnaire</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body px-5 bg-light">                  
          <div class="questionnaire" style="padding: 20px;">
            <div>1</div>
            <div>2</div>
            <div>3</div>
            <div>4</div>
          </div> 
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary" id="submit" style="background-color: #fbb03b; border: black;">Submit</button>
        </div>  
      </div>
    </div>
  </div>
  <script src="node_modules/jquery/dist/jquery.min.js"></script>
  <script src="node_modules/popper.js/dist/popper.min.js"></script>
  <script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
  <script type="text/javascript" src="slick-1.8.1/slick/slick.min.js"></script>  
  <script>
    $(document).ready(() =>    

      // Initialize slick slider
      let slickSlider = $('.questionnaire');  
      slickSlider.slick();          

      // Grab references to controls
      let submitButton = $('#submit');
      let prevButton = $('.slick-prev');
      let nextButton = $('.slick-next');                  

      // Disable 'previous' arrow and 'submit' button when modal is activated   
      $('#questionnaire-modal').one('click', (event) =>             
        prevButton.hide();
        submitButton.attr('disabled', true);
      );

      // React to changes in slider
      slickSlider.on('afterChange', (event, slick, currentSlide, nextSlide) => 

        // Immediately blur focus on 'previous' and 'next' arrow buttons
        prevButton.blur(); nextButton.blur();

        // Hide 'previous' button on first slide and show 'previous' button on all other slides
        (currentSlide === 0) ? prevButton.hide() : prevButton.show();

        // Hide 'next' button on last slide and show 'next' button on all other slides
        // Also show 'submit' button on last slide
        if (currentSlide === 3) 
          nextButton.hide();
          submitButton.attr('disabled', false);
         else 
          nextButton.show();  
          submitButton.attr('disabled', true);
        

      );      

    );                  
  </script>
</body>
</html>

【问题讨论】:

您可以使用slickSlider.slick('setPosition') 强制轮播重新计算其大小(我相信这是在调整窗口大小时在内部触发的,正如您所发现的)。以我的经验,这个问题总是由轮播在隐藏时被初始化引起的,所以你的选择是手动刷新提到的大小,或者在打开模式时初始化轮播。 谢谢,这绝对是答案。 【参考方案1】:

感谢有用的评论,我能够找到合适的解决方案。将div.modal-contentvisibility 样式更改为hidden。然后将以下事件处理程序添加到脚本中:

      $('#exampleModal').on('shown.bs.modal', (event) =>                          
        $slickSlider.slick('setPosition');
        $('.modal-content').css('visibility', 'visible');
      );   

这允许.slick('setPosition') 在内容不可见时运行,从而避免用户看到滑块在模式中自行调整大小。然后再次使内容可见。

【讨论】:

以上是关于光滑的轮播 JS 库在第一张幻灯片上堆叠所有内容的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap v4:轮播在第一张幻灯片后消失:(

我正在尝试将 Vue 数据实现到 Bootstrap 轮播中

使用流畅的轮播在选项卡之间移动

Slick.js:滑动滑块未正确拖动(快速回到第一张幻灯片)

Slick Carousel - 设置第一张幻灯片

React 光滑的轮播项目变得模糊