Want to get this as ready made template with just 1 CLICK INSTALL?
Code Snippet for Rotating Image Effect:
<style> [class^='mdw-rotating-image-effect'] .elementor-widget-image, [class*='mdw-rotating-image-effect'] .elementor-widget-image{ transition: none !important; } [class^='mdw-rotating-image-effect'] .mdw-rotating-images, [class*='mdw-rotating-image-effect'] .mdw-rotating-images{ perspective: 1000px; transition: none !important; } [class^='mdw-rotating-image-effect'] .elementor-widget-image img, [class*='mdw-rotating-image-effect'] .elementor-widget-image img, [class^='mdw-rotating-image-effect'] .elementor-widget-image a, [class*='mdw-rotating-image-effect'] .elementor-widget-image a{ max-width: unset; } [class^='mdw-rotating-image-effect'] .mdw-rotating-image-content, [class*='mdw-rotating-image-effect'] .mdw-rotating-image-content, [class^='mdw-rotating-image-effect'] .mdw-rotating-images, [class*='mdw-rotating-image-effect'] .mdw-rotating-images{ opacity: 0; } [class^='mdw-rotating-image-effect'].init .mdw-rotating-image-content, [class*='mdw-rotating-image-effect'].init .mdw-rotating-image-content, [class^='mdw-rotating-image-effect'].init .mdw-rotating-images, [class*='mdw-rotating-image-effect'].init .mdw-rotating-images, html.elementor-html .mdw-rotating-image-content, html.elementor-html .mdw-rotating-images{ opacity: 1; } </style> <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script> <script> if(!MDWNonce112){ var MDWNonce112 = true; (function($){ let selector = '[class^="mdw-rotating-image-effect"], [class*="mdw-rotating-image-effect"]', options = [], isImageLoad = [], isWindowLoaded = false, isAnimated = [], windowHeight, bottomView, topView function imageStackEntrance($this, i){ var breakPoint = '768px', media = gsap.matchMedia() media.add({ isDesktop: `(min-width: ${breakPoint})`, isMobile: `(max-width: ${breakPoint})`, }, (context) => { var { isDesktop } = context.conditions, imageContainer = $this.find('.mdw-rotating-images'), content = $this.find('.mdw-rotating-image-content'), images = $this.find('.elementor-widget-image'), imageHeight = images.eq(0).height(), count = images.length, sliceAngle = (2*Math.PI)/count, radius1 = options[i].initRadius + imageHeight/2, radius2 = isDesktop ? options[i].radiusDesktop : options[i].radiusMobile, cardFlip = options[i].flipCard radius2 -= options[i].initRadius $this.addClass('init') gsap .timeline() .from(images, { y: $this.find('.mdw-rotating-images').height()/2 + imageHeight * 1.5, rotateX: -180, stagger: 0.1, duration: 0.5, opacity: 0.8, scale: 3, }) .set(images, { transformOrigin: `center ${radius1 + imageHeight/2}px`, }) .set(imageContainer,{ transformStyle: 'preserve-3d', }) .to(images,{ y: -radius1, duration: 0.5, ease: 'power1.out', }) .to(images,{ rotation: (index) => index*360/count, rotateY: 15, duration: 1, ease: 'power1.out', }, '<') .to(images,{ rotation: (index) => (index+1) * (360 / count), x: (index) => radius2*Math.sin((180-(index+1)*360/count)*Math.PI/180), y: (index) => radius2*Math.cos((180-(index+1)*360/count)*Math.PI/180) - radius1 }) .to(images, { rotateY: 180, duration: 1, }, '<') .from(content, { opacity: 0, filter: 'blur(60px)', duration: 1, }, '<') .to(images, { repeat: -1, duration: 2, onRepeat: () => { if(cardFlip){ gsap.to(images[Math.floor(Math.random() * count)], { rotateY: '+=180', }); }}, }) .to(imageContainer, { rotation: 360, duration: 20, repeat: -1, ease: 'none', }, '<-=2') }) } function triggerAnimation(e){ if(e && e.type=='load') isWindowLoaded = true if(!isWindowLoaded) return $(selector).each(function(i){ var $this = $(this), offset = $this[0].getBoundingClientRect(), offsetTop = offset.top, offsetBottom = offset.bottom if(offsetTop < bottomView && offsetBottom > topView && !isAnimated[i] && isImageLoad[i] && isWindowLoaded){ isAnimated[i] = true imageStackEntrance($this, i) } }) } function getValues(){ $(selector).each(function(i){ let $this = $(this) className = $this.attr('class'), classNameIndex = className.indexOf('mdw-rotating-image-effect'), shortClass = className.substring(classNameIndex, className.indexOf(' ',classNameIndex)), values = shortClass.split('-') options[i] = { initRadius: 50, radiusDesktop : 170, radiusMobile: 90, flipCard: true } values.forEach(function(value, index){ if(value =='initradius' && values[index+1] && !isNaN(values[index+1])){ options[i].initRadius = parseFloat(values[index+1]) } if(value =='radius' && values[index+1] && !isNaN(values[index+1])){ options[i].radiusDesktop = parseFloat(values[index+1]) } if(value =='mobileradius' && values[index+1] && !isNaN(values[index+1])){ options[i].radiusMobile = parseFloat(values[index+1]) } if(value =='noflip'){ options[i].flipCard = false } }) }) } function init(){ $(selector).each(function(i){ isAnimated[i] = false isImageLoad[i] = false var imageCount = 0, img = $(this).find('.mdw-rotating-images img') img.each(function(){ $(this).on('load', function() { imageCount++ if(imageCount == img.length){ isImageLoad[i] = true triggerAnimation() } }) if(this.complete){ $(this).trigger('load') } }) getValues() }) } function setValues(){ windowHeight = $(window).height() bottomView = (windowHeight / 100) * 50 topView = (windowHeight / 100) * 50 } $(document).ready(init) $(window).on('load resize', setValues) $(window).on('load scroll', triggerAnimation) })(jQuery) } </script>