Slick carousel - 强制幻灯片具有相同的高度
Slick carousel - force slides to have the same height
我在使用多个 slidesToShow 具有不同高度的 Slick carousel JS 插件时遇到问题。
我需要幻灯片具有 相同的高度,但是使用 CSS 弹性框它不起作用,因为幻灯片有冲突 CSS定义。
此外,我没有在论坛和网络上找到任何有用的信息。
HTML
<div class="slider">
<div class="slide">
<p>Lorem ipsum.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua</p>
</div>
<div class="slide">
<p>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.</p>
</div>
</div>
JS
$('.slider')
.slick({
autoplay: false,
dots: false,
infinite: false,
arrows: false,
slidesToShow: 2,
slidesToScroll: 2,
rows: 0
});
CSS
.slide {
height: 100%;
background-color: #ccc;
padding: 10px;
}
好的,伙计们,我找到了一个简单的解决方案。只需添加一个 setPosition 回调函数(在 position/size 更改后触发),将幻灯片的高度设置为滑块 (slideTrack) 的高度:
JS
$('.slider').slick({
autoplay: false,
dots: false,
infinite: false,
arrows: false,
slidesToShow: 2,
slidesToScroll: 2,
rows: 0
})
.on('setPosition', function (event, slick) {
slick.$slides.css('height', slick.$slideTrack.height() + 'px');
});
别忘了您的幻灯片需要全高:
CSS
.slide {
height: 100%;
}
这里有一个小的jsFiddle来演示:
https://jsfiddle.net/JJaun/o29a4q45/
我有另一个 css-only 解决方案。您可以使用 table/table-cell
.
覆盖浮动元素
$(function() {
$('.slider')
.slick({
autoplay: false,
dots: false,
infinite: false,
arrows: false,
slidesToShow: 2,
slidesToScroll: 2,
rows: 0
});
})
.slide {
background-color: #ccc;
padding: 10px;
display: table-cell !important;
float: none !important;
}
.slick-track {
display: table !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script>
<div class="slider">
<div class="slide">
<p>Lorem ipsum.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua</p>
</div>
<div class="slide">
<p>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.</p>
</div>
</div>
我写了一个快速的 JS hack 来制作具有不同图像高度的画廊,看起来更整洁。
它执行以下操作:
- 获取滑块实例
- 找出它的高度 - 图像高度将设置为该高度
- 获取每个图像的 src 属性并隐藏它
将 src attr 设置为图像的父级作为背景图像以及一些 CSS。
function equalizeImagesHeight(slider) {
const slides = slider.find('.slick-slide');
const imgHeight = $(slider)[0].clientHeight;
slides.each(function(slide){
const src = $(this).find('img').hide().attr('src');
$(this).css({
backgroundImage:'url('+src+')',
minHeight: imgHeight,
backgroundSize: "cover",
backgroundPosition: "center"
});
});
};
equalizeImagesHeight($('.my-slider'));
添加几个 CSS 样式即可:
.slick-track
{
display: flex !important;
}
.slick-slide
{
height: inherit !important;
}
尽情享受吧! :-)
来自@JJaun 的 js 解决方案并不完美,因为如果您为幻灯片使用背景图像,您会看到高度跳跃。这对我有用:
.slick-track {
display: flex !important;
}
.slick-slide {
height: auto;
}
如果您可以使用 object-fit
:
,这里有一个仅支持 SCSS 的解决方案
.slick {
.slick-track {
display: flex;
.slick-slide {
display: flex;
height: auto;
img {
height: 100%;
object-fit: cover;
object-position: center;
}
}
}
}
以上建议对我没有用。我的滑块图像都是纵向的,但可能有不同的 h/w 纵横比。我用js修复了它。虽然感觉很难看,但愿我能找到更清洁的东西。
$carousel.on('setPosition', function (event, slick) {
const $slideImages = slick.$slideTrack.find('.slick-slide-img');
if($slideImages.first()[0].clientHeight >= $slideImages.first()[0].naturalHeight) return;
$slideImages.height('auto');
$slideImages.width('100%');
const imgHeights = $slideImages.map(function(){
return this.clientHeight;
}).get();
const maxHeight = Math.max.apply(null, imgHeights);
$slideImages.height(maxHeight);
$slideImages.width('auto');
}
我不得不使用 setPosition
事件,尽管代码只需要在初始化 slick 后执行一次。 init
事件不起作用,因为 init 上的图像高度偏离了。前一个或两个 setPosition 事件相同 - 因此 if($slideImages.first()[0].clientHeight >= $slideImages.first()[0].naturalHeight) return;
.
对于未来的搜索:
您可以简单地使用:
$('.slick').slick({
/* your config */
}).on('setPosition', function (event, slick) {
slick.$slides.css('height', slick.$slideTrack.height() + 'px');
});
如回答above.works光滑的滑块很好
.slick-track
{
display: flex !important;
}
.slick-slide
{
height: inherit !important;
}
但是,我在使用 slick 同步导航时遇到问题
简单的放在下面css来覆盖它。
.slick-slide {
margin-bottom: 0;
object-fit: cover;
}
.slick-track { display: flex; align-items: stretch; }
.slick-slide { height: auto; flex: 1; }
而且,如果你想把最后一个元素放在块的底部,添加 display: flex
包装器和 margin-top: auto;
最后一个元素
给我 2021 年最新版本的 slick
光滑地用额外的 div
包裹我的物品
我也是:
.slick-track
{
display: flex !important;
height: 100%;
}
.slick-slide
{
height: auto;
.slick-slide> div
{
height: 100%;
.myItemClass
{
height: 100%;
}
}
}
.slick-track {
display: flex;
}
.slick-track .slick-slide {
display: flex;
height: auto;
}
.slick-slide img {
height: 100%;
object-fit: contain;
object-position: center;
}
我在使用多个 slidesToShow 具有不同高度的 Slick carousel JS 插件时遇到问题。
我需要幻灯片具有 相同的高度,但是使用 CSS 弹性框它不起作用,因为幻灯片有冲突 CSS定义。
此外,我没有在论坛和网络上找到任何有用的信息。
HTML
<div class="slider">
<div class="slide">
<p>Lorem ipsum.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua</p>
</div>
<div class="slide">
<p>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.</p>
</div>
</div>
JS
$('.slider')
.slick({
autoplay: false,
dots: false,
infinite: false,
arrows: false,
slidesToShow: 2,
slidesToScroll: 2,
rows: 0
});
CSS
.slide {
height: 100%;
background-color: #ccc;
padding: 10px;
}
好的,伙计们,我找到了一个简单的解决方案。只需添加一个 setPosition 回调函数(在 position/size 更改后触发),将幻灯片的高度设置为滑块 (slideTrack) 的高度:
JS
$('.slider').slick({
autoplay: false,
dots: false,
infinite: false,
arrows: false,
slidesToShow: 2,
slidesToScroll: 2,
rows: 0
})
.on('setPosition', function (event, slick) {
slick.$slides.css('height', slick.$slideTrack.height() + 'px');
});
别忘了您的幻灯片需要全高:
CSS
.slide {
height: 100%;
}
这里有一个小的jsFiddle来演示: https://jsfiddle.net/JJaun/o29a4q45/
我有另一个 css-only 解决方案。您可以使用 table/table-cell
.
$(function() {
$('.slider')
.slick({
autoplay: false,
dots: false,
infinite: false,
arrows: false,
slidesToShow: 2,
slidesToScroll: 2,
rows: 0
});
})
.slide {
background-color: #ccc;
padding: 10px;
display: table-cell !important;
float: none !important;
}
.slick-track {
display: table !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script>
<div class="slider">
<div class="slide">
<p>Lorem ipsum.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua</p>
</div>
<div class="slide">
<p>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
<div class="slide">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.</p>
</div>
</div>
我写了一个快速的 JS hack 来制作具有不同图像高度的画廊,看起来更整洁。
它执行以下操作:
- 获取滑块实例
- 找出它的高度 - 图像高度将设置为该高度
- 获取每个图像的 src 属性并隐藏它
将 src attr 设置为图像的父级作为背景图像以及一些 CSS。
function equalizeImagesHeight(slider) { const slides = slider.find('.slick-slide'); const imgHeight = $(slider)[0].clientHeight; slides.each(function(slide){ const src = $(this).find('img').hide().attr('src'); $(this).css({ backgroundImage:'url('+src+')', minHeight: imgHeight, backgroundSize: "cover", backgroundPosition: "center" }); }); };
equalizeImagesHeight($('.my-slider'));
添加几个 CSS 样式即可:
.slick-track
{
display: flex !important;
}
.slick-slide
{
height: inherit !important;
}
尽情享受吧! :-)
来自@JJaun 的 js 解决方案并不完美,因为如果您为幻灯片使用背景图像,您会看到高度跳跃。这对我有用:
.slick-track {
display: flex !important;
}
.slick-slide {
height: auto;
}
如果您可以使用 object-fit
:
.slick {
.slick-track {
display: flex;
.slick-slide {
display: flex;
height: auto;
img {
height: 100%;
object-fit: cover;
object-position: center;
}
}
}
}
以上建议对我没有用。我的滑块图像都是纵向的,但可能有不同的 h/w 纵横比。我用js修复了它。虽然感觉很难看,但愿我能找到更清洁的东西。
$carousel.on('setPosition', function (event, slick) {
const $slideImages = slick.$slideTrack.find('.slick-slide-img');
if($slideImages.first()[0].clientHeight >= $slideImages.first()[0].naturalHeight) return;
$slideImages.height('auto');
$slideImages.width('100%');
const imgHeights = $slideImages.map(function(){
return this.clientHeight;
}).get();
const maxHeight = Math.max.apply(null, imgHeights);
$slideImages.height(maxHeight);
$slideImages.width('auto');
}
我不得不使用 setPosition
事件,尽管代码只需要在初始化 slick 后执行一次。 init
事件不起作用,因为 init 上的图像高度偏离了。前一个或两个 setPosition 事件相同 - 因此 if($slideImages.first()[0].clientHeight >= $slideImages.first()[0].naturalHeight) return;
.
对于未来的搜索:
您可以简单地使用:
$('.slick').slick({
/* your config */
}).on('setPosition', function (event, slick) {
slick.$slides.css('height', slick.$slideTrack.height() + 'px');
});
如回答above.works光滑的滑块很好
.slick-track
{
display: flex !important;
}
.slick-slide
{
height: inherit !important;
}
但是,我在使用 slick 同步导航时遇到问题
简单的放在下面css来覆盖它。
.slick-slide {
margin-bottom: 0;
object-fit: cover;
}
.slick-track { display: flex; align-items: stretch; }
.slick-slide { height: auto; flex: 1; }
而且,如果你想把最后一个元素放在块的底部,添加
display: flex
包装器和margin-top: auto;
最后一个元素
给我 2021 年最新版本的 slick 光滑地用额外的 div
包裹我的物品我也是:
.slick-track
{
display: flex !important;
height: 100%;
}
.slick-slide
{
height: auto;
.slick-slide> div
{
height: 100%;
.myItemClass
{
height: 100%;
}
}
}
.slick-track {
display: flex;
}
.slick-track .slick-slide {
display: flex;
height: auto;
}
.slick-slide img {
height: 100%;
object-fit: contain;
object-position: center;
}