如何使 Slick Slider 的高度具有响应性?

4

我有一个可用的Slick Slider(http://kenwheeler.github.io/slick/),但是无法使高度响应。无论我将浏览器大小缩小到多大,图像始终保持相同的高度。我以为“mobileFirst”设置可以解决这个问题,但似乎不行。有没有人知道如何使幻灯片和其中的图像具有响应性?以下是我的代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <title>Bailey Miller</title>
        <link rel="stylesheet" href="css/normalize.min.css">
        <link rel="stylesheet" href="css/main.css">
        
        <link rel="stylesheet" type="text/css" href="slick/slick.css"/>
        <link rel="stylesheet" type="text/css" href="slick/slick-theme.css"/>
          <style>
              body{
                  background:black;
              }
          </style>
    </head>
    <body>
  

  <div class="variable-width">
   <div><img src="img/wedding/7.jpg"/></div>
   <div><img src="img/wedding/8.jpg"/></div>
   <div><img src="img/wedding/9.jpg"/></div>
   <div><img src="img/wedding/10.jpg"/></div>
   <div><img src="img/wedding/12.jpg"/></div>
   <div><img src="img/wedding/13.jpg"/></div>
   <div><img src="img/wedding/22.jpg"/></div>
   <div><img src="img/wedding/23.jpg"/></div>
   <div><img src="img/wedding/24.jpg"/></div>
   <div><img src="img/wedding/25.jpg"/></div>
   <div><img src="img/wedding/28.jpg"/></div>
   <div><img src="img/wedding/29.jpg"/></div>
   <div><img src="img/wedding/30.jpg"/></div>
  </div>
        
<!-- jQuery-->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        
<!--menu js-->
    <script src="menu/script.js"></script>
        
<!--    slick-->
  <script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
  <script type="text/javascript" src="slick/slick.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
        $('.variable-width').slick({
            mobileFirst: true,
          infinite: true,
          speed: 300,
          slidesToShow: 1,
          centerMode: false,
          variableWidth: true,
            focusOnSelect: true
            
        });
    });
  </script>
    
        
    </body>
</html>

这是我的 CSS:

/* Slider */
.slick-slider
{
    position: relative;
    display: block;

    -moz-box-sizing: border-box;
         box-sizing: border-box;

    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;

    -webkit-touch-callout: none;
    -khtml-user-select: none;
    -ms-touch-action: pan-y;
        touch-action: pan-y;
    -webkit-tap-highlight-color: transparent;
}

.slick-list
{
    position: relative;

    display: block;
    overflow: hidden;

    margin: 0 20px;
    padding: 0;
}
.slick-list:focus
{
    outline: none;
}
.slick-list.dragging
{
    cursor: pointer;
    cursor: hand;
}

.slick-slider .slick-track,
.slick-slider .slick-list
{
    -webkit-transform: translate3d(0, 0, 0);
       -moz-transform: translate3d(0, 0, 0);
        -ms-transform: translate3d(0, 0, 0);
         -o-transform: translate3d(0, 0, 0);
            transform: translate3d(0, 0, 0);
}

.slick-track
{
    position: relative;
    top: 0;
    left: 0;

    display: block;
}
.slick-track:before,
.slick-track:after
{
    display: table;

    content: '';
}
.slick-track:after
{
    clear: both;
}
.slick-loading .slick-track
{
    visibility: hidden;
}

.slick-slide
{
    display: none;
    float: left;

    min-height: 1px;
}
[dir='rtl'] .slick-slide
{
    float: right;
}
.slick-slide img
{
    display: block;
}
.slick-slide.slick-loading img
{
    display: none;
}
.slick-slide.dragging img
{
    pointer-events: none;
}
.slick-initialized .slick-slide
{
    display: block;
}
.slick-loading .slick-slide
{
    visibility: hidden;
}
.slick-vertical .slick-slide
{
    display: block;

    height: auto;

    border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
    display: none;
}


1
自适应高度:是的? - max
我不熟悉Slick,但您是否真的想在CSS中覆盖所有这些slick特定的样式?操作库的CSS很棘手,您很可能会无意中破坏Slick应该处理的自适应高度神奇效果。另外,您需要可变高度,对吗?而不是可变宽度?这正确吗? - Glen Selle
1
在页面的Slick标记中,有一个具有显式高度的div,这会防止图像缩放:<div aria-live="polite" class="slick-list draggable" style="height: 745px;"> 如果您删除此样式并推进滑块,则会重新添加显式高度。 - Glen Selle
5个回答

6
如果您知道图像的宽度和高度,请计算图像的宽高比并创建一个变量:
$aspectRatio: width / height;

那么您可以使用这个简单的解决方案:
.slick-slider{ max-width: calc(100vh * #{$aspectRatio});}

这将使滑块的宽度根据视口高度改变,而滑块的高度将成比例地改变。只需根据需要更改值即可。

1
被低估的答案 - Rick Davies

1
我曾经遇到同样的问题-移除变量宽度解决了这个问题,内容可以缩放到浏览器窗口大小。通过响应式选项,您可以为不同的断点设置插件的不同选项。因此,在需要响应式时,您可以保留大屏幕的可变宽度,并相应地进行更改。
$(document).ready(function(){
    $('.variable-width').slick({
          mobileFirst: true,
          infinite: true,
          speed: 300,
          slidesToShow: 1,
          centerMode: false,
          variableWidth: false,
          focusOnSelect: true,
          responsive: [
                {
                  breakpoint: 1024,
                  settings: {
                      mobileFirst: true,
                      infinite: true,
                      speed: 300,
                      slidesToShow: 1,
                      centerMode: false,
                      variableWidth: true,
                      focusOnSelect: true

                  }
                }
              ]
    });
});

我在以下页面找到了相关问题:https://github.com/kenwheeler/slick/issues/1024

0

我使用了

.slick-slide img{max-width: 60vw;}

调整最大宽度以找到适合您特定项目的良好平衡。

与Slick的响应式断点一起使用可获得更好的结果。


0

我不太确定Slick Slider是如何处理它的标记的,但当我使用类似的js插件时,我不得不添加另一个函数来强制浏览器在窗口调整大小时重新绘制图像。

这是我使用的函数:

var debounceTimeout;
$(window).on("resize", function(){
    clearTimeout(debounceTimeout);
    debounceTimeout = setTimeout(function(){
        $(".ps-current img:visible").css("max-height","99.9%");
        setTimeout(function(){
            $(".ps-current img:visible").removeAttr("style");
        }, 10)
    }, 300);
});

图片的CSS只是:

.slider img {
    max-width: 100%;
    max-height: 100%;
}

请注意,要给元素设置相对高度(即以百分比表示的高度),其父元素必须有定义的高度。
如果要让一个元素占据浏览器的100%,那么该元素及其所有父元素,直到body和html,需要在其CSS样式中添加height:100%。

嗯,我仍然无法让它工作。我对这个插件文件中的CSS类来自哪里或哪些类执行什么操作感到困惑。 - Bailey
使用Chrome中的DOM检查器来确定哪些元素是哪些。右键单击一个元素,然后点击“检查元素”以在检查器中查看它。 - iain

0

尝试这些代码

$('.mySlides').slick({<br>
      autoplay:true,<br>
      dots: true,<br>
      infinite: true,<br>
      speed: 300,<br>
      slidesToShow: 1,<br>
      responsive: [{breakpoint:1024},{breakpoint:600}]<br>
      });<br><br>
 $('.mySlides').on('breakpoint', function(event, slick, breakpoint){<br>
    $('.slick-slide').css('height',$('.slick-current img').height());<br>
 });

2
欢迎来到StackOverflow!请考虑为您的答案添加简短的说明。StackOverflow 是一个帮助人们进一步提升技能的网站,而不仅仅是一个代码分享平台。留下说明可以帮助他们理解如何解决问题。 :) - Hasta Dhana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接