Home > Software design >  Making this carousel move automatically
Making this carousel move automatically

Time:01-10

I'm trying to get the following codepen to move automatically. Perhaps switching to the next card every 2-3seconds. The manual control is fine to stay as well, but I am unsure how to make this move automatically and look natural and smooth in the process.

<section id="slider">
  <input type="radio" name="slider" id="s1">
  <input type="radio" name="slider" id="s2">
  <input type="radio" name="slider" id="s3" checked>
  <input type="radio" name="slider" id="s4">
  <input type="radio" name="slider" id="s5">
  <label for="s1" id="slide1"></label>
  <label for="s2" id="slide2"></label>
  <label for="s3" id="slide3"></label>
  <label for="s4" id="slide4"></label>
  <label for="s5" id="slide5"></label>
</section>
[type=radio] {
  display: none;
}

#slider {
  height: 30rem;
  position: relative;
  perspective: 1500px;
  transform-style: preserve-3d;
}

#slider label {
  margin: auto;
  width: 20rem;
  height: 80%;
  border-radius: 4px;
  position: absolute;
  left: 0; right: 0;
  cursor: pointer;
  transition: transform 0.4s ease;
}

#s1:checked ~ #slide4, #s2:checked ~ #slide5,
#s3:checked ~ #slide1, #s4:checked ~ #slide2,
#s5:checked ~ #slide3 {
  box-shadow: 0 1px 4px 0 rgba(0,0,0,.37);
  transform: translate3d(-30%,0,-200px);
}

#s1:checked ~ #slide5, #s2:checked ~ #slide1,
#s3:checked ~ #slide2, #s4:checked ~ #slide3,
#s5:checked ~ #slide4 {
  box-shadow: 0 6px 10px 0 rgba(0,0,0,.3), 0 2px 2px 0 rgba(0,0,0,.2);
  transform: translate3d(-15%,0,-100px);
}

#s1:checked ~ #slide1, #s2:checked ~ #slide2,
#s3:checked ~ #slide3, #s4:checked ~ #slide4,
#s5:checked ~ #slide5 {
  box-shadow: 0 13px 25px 0 rgba(0,0,0,.3), 0 11px 7px 0 rgba(0,0,0,.19);
  transform: translate3d(0,0,0);
}

#s1:checked ~ #slide2, #s2:checked ~ #slide3,
#s3:checked ~ #slide4, #s4:checked ~ #slide5,
#s5:checked ~ #slide1 {
  box-shadow: 0 6px 10px 0 rgba(0,0,0,.3), 0 2px 2px 0 rgba(0,0,0,.2);
  transform: translate3d(15%,0,-100px);
}

#s1:checked ~ #slide3, #s2:checked ~ #slide4,
#s3:checked ~ #slide5, #s4:checked ~ #slide1,
#s5:checked ~ #slide2 {
  box-shadow: 0 1px 4px 0 rgba(0,0,0,.37);
  transform: translate3d(30%,0,-200px);
}

#slide1 { background: #00BCD4 }
#slide2 { background: #4CAF50 }
#slide3 { background: #CDDC39 }
#slide4 { background: #FFC107 }
#slide5 { background: #FF5722 }

https://codepen.io/mihacreanest/pen/QxKVZQ

CodePudding user response:

Add this script to your codepen. Details are commented on each line.

// Get all checkboxes first
const checkboxes = document.querySelectorAll("#slider input")

// find which one is checked at the beginning to start from there
const fistChecked = [...checkboxes].findIndex(e => e.checked)

// keep a variable for iteration
let index = fistChecked;

function slide() {
  // mark current checkbox as unchecked since next one is going to be active after this function call
  checkboxes[index].checked = false
  
  // increment for next iteration
  index  = 1

  // once we are at the end, the cycle needs to start from the beginning
  if (index >= checkboxes.length) {
    index = 0
  }
  
  // set next one as active
  checkboxes[index].checked = true
  
  // schedule another call of this function
  setTimeout(slide, 1000)
}

// run once, it will call itself again after 1000m
slide()

CodePudding user response:

add simple js interval

let current = 3 
const max = 5

setInterval(() => {
  const next = (current   1) % max;
  document.getElementById(`s${next 1}`).checked = "true";
  current = next;
},2000)
  •  Tags:  
  • Related