Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Css animation displaying 3 images at a time

I'm trying to show 3 images (out of currently 12) at a time using css animations. I would like to display image 1-3 first, then 4-6, then 7-9, and then 10-12.

I have this so far, but I can't get my head around how to use the :nth selectors to display the 3 next while hiding the rest.

This is more or less what I have so far:

#crossfade > img {
  max-width: 30%;
  height: auto;
  opacity: 0;
  z-index: 0;
  -webkit-backface-visibility: hidden;
  animation: imageAnimation 30s linear infinite 0s;
}

#crossfade > img:nth-child(n+3) {
  animation-delay: 6s;
}

@keyframes imageAnimation {
  0% {
    opacity: 0;
    animation-timing-function: ease-in;
  }
  8% {
    opacity: 1;
    animation-timing-function: ease-out;
  }
  17% {
    opacity: 1
  }
  25% {
    opacity: 0
  }
  100% {
    opacity: 0
  }
}

Example below [or click here for jsfiddle]

#crossfade {
  height: 185px;
  width: 100%;
  position: relative;
}

#crossfade > img {
  max-width: 30%;
  height: auto;
  opacity: 0;
  z-index: 0;
  -webkit-backface-visibility: hidden;
  -webkit-animation: imageAnimation 30s linear infinite 0s;
  -moz-animation: imageAnimation 30s linear infinite 0s;
  -o-animation: imageAnimation 30s linear infinite 0s;
  -ms-animation: imageAnimation 30s linear infinite 0s;
  animation: imageAnimation 30s linear infinite 0s;
}

#crossfade > img:nth-child(n+3) {
  -webkit-animation-delay: 6s;
  -moz-animation-delay: 6s;
  -o-animation-delay: 6s;
  -ms-animation-delay: 6s;
  animation-delay: 6s;
}

#crossfade > img:nth-child(n+3) {
  -webkit-animation-delay: 12s;
  -moz-animation-delay: 12s;
  -o-animation-delay: 12s;
  -ms-animation-delay: 12s;
  animation-delay: 12s;
}

#crossfade > img:nth-child(4) {
  -webkit-animation-delay: 18s;
  -moz-animation-delay: 18s;
  -o-animation-delay: 18s;
  -ms-animation-delay: 18s;
  animation-delay: 18s;
}

#crossfade > img:nth-child(5) {
  -webkit-animation-delay: 24s;
  -moz-animation-delay: 24s;
  -o-animation-delay: 24s;
  -ms-animation-delay: 24s;
  animation-delay: 24s;
}

@keyframes imageAnimation {
  0% {
    opacity: 0;
    animation-timing-function: ease-in;
  }
  8% {
    opacity: 1;
    animation-timing-function: ease-out;
  }
  17% {
    opacity: 1
  }
  25% {
    opacity: 0
  }
  100% {
    opacity: 0
  }
}
<div id="crossfade">
  <img src="http://dummyimage.com/120x185&text=Img 1" alt="Image 1">
  <img src="http://dummyimage.com/120x185&text=Img 2" alt="Image 2">
  <img src="http://dummyimage.com/120x185&text=Img 3" alt="Image 2">
  <img src="http://dummyimage.com/120x185&text=Img 4" alt="Image 4">
  <img src="http://dummyimage.com/120x185&text=Img 5" alt="Image 5">
  <img src="http://dummyimage.com/120x185&text=Img 6" alt="Image 6">
  <img src="http://dummyimage.com/120x185&text=Img 7" alt="Image 7">
  <img src="http://dummyimage.com/120x185&text=Img 8" alt="Image 8">
  <img src="http://dummyimage.com/120x185&text=Img 9" alt="Image 9">
  <img src="http://dummyimage.com/120x185&text=Img 10" alt="Image 10">
  <img src="http://dummyimage.com/120x185&text=Img 11" alt="Image 11">
  <img src="http://dummyimage.com/120x185&text=Img 12" alt="Image 12">
</div>
like image 335
Meek Avatar asked Jan 03 '17 11:01

Meek


People also ask

Can you have 2 animations in CSS?

While it is true that you cannot play two transform animations at the same time (because one transform would overwrite the other), it is not correct to say "You cannot play two animations since the attribute can be defined only once." See the accepted answer about using comma-separated values with animations.

Can you animate images in CSS?

The CSS animation property helps animating many of the CSS properties. We can animate height , width , color , font , background-color , etc., where there are a few properties such as background-image that can not be animated. Here is the complete list of CSS properties can be animated using the animation property.


1 Answers

I appreciate this has been answered already but here is my jQuery solution if it helps anyone in the future.

I have heavily commented the JavaScript code so should be self explanatory but effectively you provide the function with the number of img/slides to show and how fast to show them and it does the rest. Its a dynamic and will adjust for odd numbers of slides etc.

Hope this helps someone anyway :)

http://jsfiddle.net/BradChelly/qjtcojfc/3/

function slideShow(currentSlide){
  // speed at which the slides change in miliseconds (1000 = 1sec)
  // must not exceed total time for the fade in/out animations
  var duration = 3000; 
  // how many slides to show at a time?
  var slidesPerShow = 3;
  
  // count the number of slides (imgs)
  slideCount = $( "#slideshow_images" ).children().length;

  // Array of next slides to be displayed
  slidesToShow = [];
  
  // add the defined number of slides "slidesPerShow" to the slidesToShow array
  var times = slidesPerShow;
  for(var i=0; i < times; i++){
    slidesToShow.push(currentSlide+i+1);
  }
  // set slides array
  slides = [];
	
  // add each slide to the slides array
  $.each( slidesToShow, function( i, val ) {
  		slide = $( "#slideshow_images img:nth-child(" + val + ")" ).clone();
      slides.push(slide);
  });
  
  // provided the current slideshow is not empty
  // fade out its contents, replace it with new slides and fade back in.
  if ( $("#slideshow").children().length > 0 ) {
    $("#slideshow").children().fadeOut("slow", function(){
      $("#slideshow").empty().append(slides)
      $("#slideshow").children().fadeIn(1000);
    });
  }
  // otherwise, if the current slideshow is empty
  // just load the slides straight away. 
	else {
  	$("#slideshow").append(slides);
    $("#slideshow").children().fadeIn(1000);
  }
  
	// set the current slide to the last slide shown or 0 if max slide count reached
  slidesToShow[(slidesPerShow-1)] >= slideCount ? currentSlide = 0 : currentSlide = slidesToShow[(slidesPerShow-1)];
  
  // repeat after set time (set the duration at the top of function)
  setTimeout( function(){ 
  	slideShow(currentSlide);
  }  , duration );
}

// call the slideshow
slideShow(0);
#slideshow img {display: none;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<div id="crossfade">
  <div id="slideshow_images" style="display:none;">
    <img src="http://dummyimage.com/120x185&text=Img 1" alt="Image 1">
    <img src="http://dummyimage.com/120x185&text=Img 2" alt="Image 2">
    <img src="http://dummyimage.com/120x185&text=Img 3" alt="Image 2">
    <img src="http://dummyimage.com/120x185&text=Img 4" alt="Image 4">
    <img src="http://dummyimage.com/120x185&text=Img 5" alt="Image 5">
    <img src="http://dummyimage.com/120x185&text=Img 6" alt="Image 6">
    <img src="http://dummyimage.com/120x185&text=Img 7" alt="Image 7">
    <img src="http://dummyimage.com/120x185&text=Img 8" alt="Image 8">
    <img src="http://dummyimage.com/120x185&text=Img 9" alt="Image 9">
    <img src="http://dummyimage.com/120x185&text=Img 10" alt="Image 10">
    <img src="http://dummyimage.com/120x185&text=Img 11" alt="Image 11">
    <img src="http://dummyimage.com/120x185&text=Img 12" alt="Image 12">
    <img src="http://dummyimage.com/120x185&text=Img 13" alt="Image 13">
    <img src="http://dummyimage.com/120x185&text=Img 14" alt="Image 14">
  </div>
  <div id="slideshow"></div>
</div>
like image 145
Brad Avatar answered Oct 01 '22 02:10

Brad