Я сделал слайд-шоу с анимацией затухания изображений в div. Однако, когда отображается следующее изображение, div становится меньше/больше в соответствии с изображением, и страница автоматически прокручивается, а я этого не хочу. Как я могу этого избежать?
Я написал функцию, которая после загрузки страницы находит самое большое изображение и устанавливает для div высоту этого изображения, чтобы всякий раз, когда отображается новое изображение, высота div не менялась. Однако проблема заключается в том, что когда браузер становится меньше/больше, значение высоты div не меняется, даже если я переустанавливаю его каждый раз, когда браузер меняет размер, используя прослушиватель изменения размера (переменная "biggestImage").
JQuery
var slideIndex = 0;
showSlides();
divResizeIssue();
function showSlides() {
var slides = $(".images");
slides.each(function(){
$(this).fadeOut(500).delay(490);
});
slideIndex++;
if (slideIndex > slides.length) {
slideIndex = 1;
}
slides.each(function(index){
if (index == slideIndex-1){
$(this).fadeIn(500).delay(490);
}
});
setTimeout(showSlides, 5000);
}
function divResizeIssue(){
var biggestImage;
var object;
var slides = $(".images");
var firstLoad = true;
if (firstLoad){
slides.each(function(index){
if (index == 0 || $(this).outerHeight() > biggestImage){
biggestImage = $(this).outerHeight();
object = $(this)[0]
}
});
slides.each(function(){
if ($(this)[0] != object){
$(this).outerHeight(biggestImage);
}
});
firstLoad = false;
}
$(window).on('resize', function(){
biggestImage = 0;
object = null;
slides.each(function(index){
if (index == 0 || $(this).outerHeight() > biggestImage){
biggestImage = $(this).outerHeight();
object = $(this)[0];
}
});
slides.each(function(){
if ($(this)[0] != object){
$(this).outerHeight(biggestImage);
}
});
});
}
HTML
<div id = "top-div" class = "row">
<div class = "row">
<h1 class = "col-sm-12">Activities</h1>
<span class = "col-sm-2"><!-- <button class = "leftButton"></button> --></span>
<div class = "col-sm-12 col-lg-8">
<figure class = "images">
<figcaption class = "caption">Outdoor</figcaption>
<img class = "img-fluid" id = "Outdoor" src = ".\src\Hiking.jpg">
</figure>
<figure class = "images">
<figcaption class = "caption">Indoor</figcaption>
<img class = "img-fluid" id = "Indoor" src = ".\src\indoor.jpg">
</figure>
<figure class = "images">
<figcaption class = "caption">Join Us!</figcaption>
<img class = "img-fluid" id = "Member" src = ".\src\member.png">
</figure>
</div>
<span class = "col-sm-2"><!-- <button class = "rightButton"> --></button></span>
</div>
</div>
CSS
#top-div {
width: 100%;
margin-top:90vh;
background: #AB3F05;
text-align: center;
height: auto;
}
figure img{
padding-left: 5vh;
padding-right: 5vh;
padding-top: 0;
padding-bottom: 0;
margin: 0;
}
.images{
position: relative;
}
Если у вас есть лучшее предложение, пожалуйста, предложите, или если вы можете сказать мне, что не так с моим кодом, это было бы здорово.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вообще говоря, при создании слайд-шоу это намного проще и выглядит лучше, когда вы просто вручную изменяете размер изображений до того же разрешения, используя gimp или photoshop.
Однако, если по какой-либо причине вы не можете этого сделать, вы можете использовать проценты в CSS для создания динамической длины.
Вот что я придумал
//changed '.images' to '.image-container' also removed the divResizeIssue //function because we don't need it
var slideIndex = 0;
showSlides();
function showSlides() {
var slides = $(".image-container"); //here
slides.each(function(){
$(this).fadeOut(500).delay(490);
});
slideIndex++;
if (slideIndex > slides.length) {
slideIndex = 1;
}
slides.each(function(index){
if (index == slideIndex-1){
$(this).fadeIn(500).delay(490);
}
});
setTimeout(showSlides, 5000);
}
#top-div {
width: 100%;
margin-top:90vh;
background: #AB3F05;
text-align: center;
height: auto;
}
figure img{
padding-left: 5vh;
padding-right: 5vh;
padding-top: 0;
padding-bottom: 0;
margin: 0;
}
/*Changed Below*/
.image-container {
width: 50%;
margin: 0 auto;
}
.image {
width: 100%;
height: 400px;
}
width: 50% делает так, что .image-контейнер изменяет размер, когда окно просмотра браузера меняет ширину. margin: 0 auto центрирует контейнер .image внутри своего родителя.
width: 100% растягивает тег img до ширины его родителя (контейнера .image).
фиксированный height: 400px не позволяет высоким изображениям увеличивать высоту родителя.
<div id = "top-div" class = "row">
<div class = "row">
<h1 class = "col-sm-12">Activities</h1>
<span class = "col-sm-2"><!-- <button class = "leftButton"></button> --></span>
<div class = "col-sm-12 col-lg-8">
<figure class = "image-container">
<figcaption class = "caption">Outdoor</figcaption>
<img class = "image img-fluid" id = "Outdoor" src = "https://picsum.photos/200/300">
</figure>
<figure class = "image-container">
<figcaption class = "caption">Indoor</figcaption>
<img class = "image img-fluid" id = "Indoor" src = "https://picsum.photos/300/300">
</figure>
<figure class = "image-container">
<figcaption class = "caption">Join Us!</figcaption>
<img class = "image img-fluid" id = "Member" src = "https://picsum.photos/400/300">
</figure>
</div>
<span class = "col-sm-2"><!-- <button class = "rightButton"> --></button></span>
</div>
</div>
Я просто переименовал class="images" в class="image-container" и добавил класс изображения к элементам img, а также изменил src для изображений, чтобы использовать picsum, так что вы, возможно, захотите изменить их обратно.
Решением, которое я сделал, было жесткое кодирование значений высоты при изменении размера экрана, мне не очень нравится жестко кодировать это, но это единственный способ, который я могу придумать прямо сейчас.
CSS
@media only screen and (min-width: 576px) {
/*Change slides height to 950px when at sm (576px)*/
#top-div{
height: 950px;
}
}
@media only screen and (max-width: 576px) {
/*Change slides height to 440px when greater than sm*/
#top-div{
height: 440px;
}
}
Спасибо за помощь, но установка фиксированной высоты для изображений заставляет их сжиматься, когда браузер становится меньше.