Вам не нужно вычислять ширину чего-либо. Используя CSS, вы можете размещать элементы подряд с помощью Flexbox. Оберните все ваши слайды внутри другого элемента, в этом примере мы называем этот элемент imageSlideRails
, который перемещает все слайды вместе, а не перемещает их по отдельности.
Я бы рекомендовал вместо этого использовать свойство CSS transform
поля для перемещения слайдера. Это повысит производительность и предотвратит нежелательное поведение, например, когда элементы отталкивают друг друга.
Величина, которую вы скользите, может совпадать со значением flex-basis
на слайде. Скажем, слайд 33.3%
. Если вы переместите рельсы на -33.3%
, то первый слайд переместится из поля зрения, а следующий слайд появится в поле зрения. Таким образом, расчет всегда будет точным.
Оформить фрагмент ниже.
var index = 1;
var slideWidth = 33.3;
var slidesLength = $('.slideIt').length;
var $rails = $('.imageSlideRails');
setInterval(function() {
$rails.css('transform', `translate3d(${index * -slideWidth}%, 0, 0)`);
if (index === slidesLength - 1) {
index = 0;
} else {
index++;
}
}, 2000);
.imageSlideHolder {
margin: 0 auto;
width: 100%;
overflow: hidden;
position: relative;
}
.imageSlideRails {
display: flex;
flex-flow: row nowrap;
transition: transform 1s ease-in-out;
}
.slideIt {
box-sizing: border-box;
position: relative;
width: 33.3%;
flex-grow: 0;
flex-shrink: 0;
flex-basis: 33.3%;
padding: 15px;
overflow: hidden;
}
.slideIt img {
position: relative;
width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Image Slideshow</h1>
<div class='imageSlideHolder'>
<div class="imageSlideRails">
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
</div>
</div>