Make this Rotating Image Effect with Flip Card Animation in Elementor

 

Want to get this as ready made template with just 1 CLICK INSTALL?

I want it as Ready Template

 

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>