0

I am creating a full-stack application and for my hero page, I am working on adding a carousel that rotates images in the background.

So far I have created the HTML, CSS, and JavaScript files.

When the page loads, it rotates but then the carousel stops working and just stays on the first line.

I am not too sure if there is an error in my code but I would appreciate it if someone helped me out.

var slides = document.querySelectorAll('.slide');
var currentSlide = 0;

function changeSlide() {
  for (var i = 0; i < slides.length; i++) {
    slides[i].style.opacity = 0;
  }

  currentSlide = (currentSlide + 1) % slides.length;
  slides[currentSlide].style.opacity = 1;
}

setInterval(changeSlide, 3000);
*{
    margin: 0%;
    padding: 0%;
}
/*------------------------------Hero Page---------------------------------*/
.carousel {
    width: 100%;
    height: 700px;
    position: relative;
    overflow: hidden;
  }
  
  .slide {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
    opacity: 0;
    transition: opacity 1s ease-in-out;
  }
  
  .slide:first-child {
    opacity: 1;
  }
  
  .slide-content {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    text-align: center;
    color: white;
  }
  .slide-1 {
    background-image: url(Images/derek-baumgartner-A7sfB4yKS7s-unsplash.jpg);
  }
  
  .slide-2 {
    background-image: url(Images/andrew-bain-jO_Q3EY_T0E-unsplash.jpg);
  }
  
  .slide-3 {
    background-image: url(Images/aaron-dowd-N7PDwky8doM-unsplash.jpg);
  }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <script src="practice.js"></script>
     <!-- Bootstrap CSS -->
     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
     <link rel="stylesheet" href="practice.css">
    <title>Welcome to Washington State - Home Page</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script> 
    <!------------Hero Page-------------->
    <header>
        <div class="carousel">
            <div class="slide slide-1">
              <div class="slide-content">Slide 1</div>
            </div>
            <div class="slide slide-2">
              <div class="slide-content">Slide 2</div>
            </div>
            <div class="slide slide-3">
              <div class="slide-content">Slide 3</div>
            </div>
        </div>
    </header>
</body>
PeterJames
  • 1,137
  • 1
  • 9
  • 17
xRGx901x
  • 41
  • 4

1 Answers1

1

The problem is that you are loading your script before the page has been created and the script is running as soon as it is loaded.

You can add defer to the script, like so:

<script src="practice.js" defer></script>

Or you can move the script to the end of the HTML.

Script Tag - async & defer would be a good source of information to read for this problem.

To make it easier to see your problem, I removed your images and simply set a background-color, height, and width in the CSS to see the slides and I reduced the delay in setInterval to 1500.

var slides = document.querySelectorAll('.slide');
var currentSlide = 0;

function changeSlide() {
  for (var i = 0; i < slides.length; i++) {
    slides[i].style.opacity = 0;
  }

  currentSlide = (currentSlide + 1) % slides.length;
  slides[currentSlide].style.opacity = 1;
}

setInterval(changeSlide, 1500);
* {
  margin: 0%;
  padding: 0%;
}


/*------------------------------Hero Page---------------------------------*/

.carousel {
  width: 100%;
  height: 700px;
  position: relative;
  overflow: hidden;
}

.slide {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  background-repeat: no-repeat;
  background-position: center;
  background-size: cover;
  opacity: 0;
  transition: opacity 1s ease-in-out;
}

.slide:first-child {
  opacity: 1;
}

.slide-content {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
  color: white;
}

.slide-1 {
  background-color: red;
  height: 150px;
  width: 200px;
}

.slide-2 {
  background-color: green;
  height: 150px;
  width: 200px;
}

.slide-3 {
  background-color: blue;
  height: 150px;
  width: 200px;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="practice.js" defer></script>
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  <link rel="stylesheet" href="practice.css">
  <title>Welcome to Washington State - Home Page</title>
</head>

<body>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script>
  <!------------Hero Page-------------->
  <header>
    <div class="carousel">
      <div class="slide slide-1">
        <div class="slide-content">Slide 1</div>
      </div>
      <div class="slide slide-2">
        <div class="slide-content">Slide 2</div>
      </div>
      <div class="slide slide-3">
        <div class="slide-content">Slide 3</div>
      </div>
    </div>
  </header>
</body>
PeterJames
  • 1,137
  • 1
  • 9
  • 17