Исчезающий и исчезающий фон с помощью текстовой карусели начальной загрузки

#javascript #html #jquery #css #bootstrap-4

#javascript #HTML #jquery #css #bootstrap-4

Вопрос:

У меня есть три фоновых изображения, которые я хочу исчезать и исчезать с интервалом в 5 секунд. Я также использую собственный компонент начальной загрузки carousel для ввода и вывода текста с интервалом в 5 секунд, чтобы соответствовать и совпадать с изменяющимся и исчезающим фоновым изображением.

Сценарий

  • Проблема 1. Первое фоновое изображение будет фоновым изображением по умолчанию при загрузке страницы. Через 5 секунд второе фоновое изображение исчезает, что также совпадает с тем же временем, когда карусель переходит ко второму тексту. Еще через 5 секунд третье фоновое изображение исчезает, и карусель переходит к следующему тексту.

  • Проблема 2. Компоненты начальной загрузки carousel имеют индикатор, который при нажатии переключается и перемещает его на текст в этой части карусели. Я хочу, чтобы фоновое изображение менялось при нажатии на индикатор карусели. То есть, если щелкнуть индикатор карусели 1, фоновое изображение должно исчезнуть до первого фонового изображения. Это должно применяться ко второму и третьему индикатору карусели и их соответствующим фоновым изображениям. Фоновое изображение НЕ должно меняться и исчезать до щелкаемого, если в настоящее время оно является активным элементом карусели и фоновым изображением.

Текущая ситуация

  • Я смог добиться фонового изображения с эффектом затухания с помощью jquery с помощью решения, которое я также получил здесь, в stackoverflow. Я также создал текстовую карусель, используя компонент bootstrap carousel с опцией (data-interval =»5000″), которая устанавливает время переключения равным 5 секундам, чтобы соответствовать тому же временному интервалу, с которым фоновое изображение исчезает и исчезает, но все еще есть заметная небольшая задержка. Как можно устранить заметную задержку?

  • Изображение иногда мигает перед исчезновением. Есть ли лучший и более подходящий способ добиться эффекта затухания без мигания изображения?

  • Нажатие на индикатор карусели не переключает и не изменяет фоновое изображение на следующее, даже когда я запускал функцию по щелчку. Как это может быть достигнуто правильным способом?

Вот что я пробовал:

 var bgImageArray = ["1_ozdgvm.jpg", "2_vjtjfy.jpg", "3_oxpdx2.jpg"],
  base = "https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_",
  secs = 5;
bgImageArray.forEach(function(img) {
  new Image().src = base   img;
  // caches images, avoiding white flash between background replacements
});

function backgroundSequence() {
  window.clearTimeout();
  var k = 0;
  for (i = 0; i < bgImageArray.length; i  ) {
    setTimeout(function() {
      document.getElementById('animated-bg').style.backgroundImage = "url("   base   bgImageArray[k]   ")";
      // document.getElementById('animated-bg').style.backgroundSize ="cover";
      if ((k   1) === bgImageArray.length) {
        setTimeout(function() {
          backgroundSequence()
        }, (secs * 1000))
      } else {
        k  ;
      }
    }, (secs * 1000) * i)
  }
}

backgroundSequence();


$('.carousel-item').click(function() {
  backgroundSequence();
})  
 *,
*::before,
*::after {
  margin: 0;
  padding: 0;
}

html {
  box-sizing: border-box;
}

body {
  box-sizing: inherit;
  color: #fff !important;
}

.animated-bg {
  background-image: url("https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_1_ozdgvm.jpg");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  transition: background 1s;
  height: 694px;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.animated-bg:before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

.container {
  padding: 3rem;
  border-radius: 20px;
  width: 700px;
  background: rgba(0, 0, 0, 0.3);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}

.text-top p {
  width: 400px;
  margin: 30px auto;
  text-align: center;
}

h1 {
  margin-top: 0;
  text-align: center;
  font-weight: 600;
}

.carousel-item p {
  width: 330px;
  text-align: center;
}

.carousel-indicators {
  bottom: -50px !important;
}

@media only screen and (max-width: 800px) {
  .container {
    padding: 2rem;
    width: 90%;
  }
}

@media only screen and (max-width: 500px) {
  .text-top p {
    width: 80%;
  }
}  
 <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

<div class="animated-bg" id="animated-bg">
  <div class="container">
    <div class="text-top" id="texttop">
      <h1>Crossfade and Text Carousel</h1>
      <p>Fade background image and swipe text at the same time. Also fade the background image to the one that matches the carousel's text when the carousel's indicator is clicked</p>
    </div>
    <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel" data-interval="5000">
      <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
      </ol>
      <div class="carousel-inner">
        <div class="carousel-item active">
          <p>
            Carousel Text One
          </p>
        </div>
        <div class="carousel-item">
          <p>Carousel Text Two</p>
        </div>
        <div class="carousel-item">
          <p>Carousel Text Three</p>
        </div>
      </div>
    </div>
  </div>
</div>  

Ответ №1:

Вам не нужна вся логика создания изображений самостоятельно. Вы можете прослушивать смену слайдов с помощью API carousel on('slide.bs.carousel') и соответствующим образом переключать изображение.

 const bgImageArray = ["1_ozdgvm.jpg", "2_vjtjfy.jpg", "3_oxpdx2.jpg"],
  base = "https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_";
  
bgImageArray.forEach(function(img) {
  new Image().src = base   img;
  // caches images, avoiding white flash between background replacements
});
  
$('.carousel'). on('slide.bs.carousel', function(e) {
  $('.animated-bg').css({
    backgroundImage: `url(${base}${bgImageArray[e.to]})`
  });
});  
 *,
*::before,
*::after {
  margin: 0;
  padding: 0;
}

html {
  box-sizing: border-box;
}

body {
  box-sizing: inherit;
  color: #fff !important;
}

.animated-bg {
  background-image: url("https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_1_ozdgvm.jpg");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  transition: background 1s;
  height: 694px;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.animated-bg:before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

.container {
  padding: 3rem;
  border-radius: 20px;
  width: 700px;
  background: rgba(0, 0, 0, 0.3);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}

.text-top p {
  width: 400px;
  margin: 30px auto;
  text-align: center;
}

h1 {
  margin-top: 0;
  text-align: center;
  font-weight: 600;
}

.carousel-item p {
  width: 330px;
  text-align: center;
}

.carousel-indicators {
  bottom: -50px !important;
}

@media only screen and (max-width: 800px) {
  .container {
    padding: 2rem;
    width: 90%;
  }
}

@media only screen and (max-width: 500px) {
  .text-top p {
    width: 80%;
  }
}  
 <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

<div class="animated-bg" id="animated-bg">
  <div class="container">
    <div class="text-top" id="texttop">
      <h1>Crossfade and Text Carousel</h1>
      <p>Fade background image and swipe text at the same time. Also fade the background image to the one that matches the carousel's text when the carousel's indicator is clicked</p>
    </div>
    <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel" data-interval="5000">
      <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
      </ol>
      <div class="carousel-inner">
        <div class="carousel-item active">
          <p>
            Carousel Text One
          </p>
        </div>
        <div class="carousel-item">
          <p>Carousel Text Two</p>
        </div>
        <div class="carousel-item">
          <p>Carousel Text Three</p>
        </div>
      </div>
    </div>
  </div>
</div>  

https://jsbin.com/mewiwuv/edit?js , выходной