Skip to content

Instantly share code, notes, and snippets.

@uhlhosting
Created January 17, 2022 07:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uhlhosting/992fbe8452176aab89ec9440eeeeaa6a to your computer and use it in GitHub Desktop.
Save uhlhosting/992fbe8452176aab89ec9440eeeeaa6a to your computer and use it in GitHub Desktop.
Mask animation with GSAP & SVG
<div id="home-animation-wrapper" style="opacity: 0">
<div class="slides">
<div class="slide" count="0" data-1="WE ARE" data-2="thinkers" data-3="+Doers"></div>
<div class="slide" count="1" data-1="WE ARE" data-2="optimists" data-3="+realists"></div>
<div class="slide" count="2" data-1="WE ARE" data-2="willing" data-3="+able"></div>
</div>
<svg version="1.1" id="home-animation" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="2371.2px" height="841.1px" viewBox="0 0 2371.2 841.1" xml:space="preserve">
<!-- <defs>
<filter id="text-filter" filterUnits="userSpaceOnUse" x="-273" y="-353.2" width="3011.9" height="1453">
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
</filter>
</defs>-->
<!-- TEXTS -->
<mask maskUnits="userSpaceOnUse" x="-273" y="-353.2" width="3011.9" height="1453" id="bubbles-1">
<g id="svg-texts" >
<text transform="matrix(1 0 0 1 62.9893 251.1275)" style="fill:#FFFFFF; font-family:'Source Sans Pro';font-weight: 900; font-size:379.144px;">WE ARE</text>
<text transform="matrix(1 0 0 1 62.9893 544.8433)" style="fill:#FFFFFF; font-family:'Source Sans Pro';font-weight: 900; font-size:379.144px;">WE ARE</text>
<text transform="matrix(1 0 0 1 62.9893 838.5591)" style="fill:#FFFFFF; font-family:'Source Sans Pro';font-weight: 900; font-size:379.144px;">WE ARE</text>
</g>
</mask>
<!-- BUBBLES -->
<g id="bubbles" style="mask:url(#bubbles-1);">
<path d="M1915.1-195.3c-87.9,90.4-16.3,268,122.9,331.9S2339,73.2,2365.6,15.3
c26.6-57.8-59-269.3-108-291.9C2208.5-299.1,2068.2-352.9,1915.1-195.3z"/>
<path d="M1933.8,671.4c90.4,87.9,268,16.3,331.9-122.9s-63.4-301.1-121.3-327.6
c-57.8-26.6-15.9,174-91.5,266.5C1982.4,573.6,1776.2,518.2,1933.8,671.4z"/>
<path d="M1258.7-42c70.5-34.1-46.1-157.7-140.5-170.6
C1024-225.4,918.9-146,884.9-93.2C836.2-17.5,895.4,45,928.6,49.5S1167.6,2,1258.7-42z"/>
<path d="M-189.2-4.9c-113.8,54.3-108.3,245.6,0,353.9s304.4,45,349.4,0
s38.1-273.1,0-311.2S9.1-99.5-189.2-4.9z"/>
<path d="M1503.8,882.5c42.1-118.8-97.1-250.3-250.3-250.3s-247,183.4-247,247
s166.1,220.1,220.1,220.1C1280.5,1099.3,1430.4,1089.6,1503.8,882.5z"/>
<path d="M1124.8,102.8C1006,60.8,874.5,199.9,874.5,353.1s183.4,247,247,247
c63.6,0-58.2-164.8-28.2-280.3C1121.4,212,1331.9,176.2,1124.8,102.8z"/>
<path d="M1695.5,1061.4c101.8,74.3,189.1-184.9,135.9-328.6
c-53.2-143.7-245.5-232.8-346.2-241.1c-144.5-11.9-188.4,119.6-169.7,170.2C1334.3,712.5,1564,965.3,1695.5,1061.4z"/>
<path d="M1570.8,113.5c-78.3,1.5-24,162.6,56.4,213.6s209,22.8,261.9-11
c75.9-48.5,48.2-130,19.9-148C1880.7,150.2,1672,111.6,1570.8,113.5z"/>
<path d="M1751.5,747c-78.3,1.5-24,162.6,56.4,213.6c80.3,51.1,209,22.8,261.9-11
c75.9-48.5,48.2-130,19.9-148C2061.4,783.7,1852.8,745.1,1751.5,747z"/>
<path d="M410.4,530.7c-113.8,54.3-108.3,245.6,0,353.9s304.4,45,349.4,0
c45-45,38.1-273.1,0-311.2C721.6,535.3,608.7,436.1,410.4,530.7z"/>
<path d="M518-226.9c-113.8,54.3-108.3,245.6,0,353.9s304.4,45,349.4,0
c45-45,38.1-273.1,0-311.2C829.2-222.3,716.3-321.5,518-226.9z"/>
<path d="M234.7,592.4c54.3,113.8,245.6,108.3,353.9,0s45-304.4,0-349.4
s-75.3,157.7-178.3,218.1C314.2,517.6,140.1,394.1,234.7,592.4z"/>
<path d="M510.5,282.4c15.7,125,224.6,72.7,332.9-35.6s78.8-147.2,33.8-192.3
s-109.1,0.6-212.1,61C569,172.1,493.7,148.7,510.5,282.4z"/>
<path d="M150.3,414.5c-125,15.7-72.7,224.6,35.6,332.9s147.2,78.8,192.3,33.8
s-0.6-109.1-61-212.1C260.6,472.9,284,397.7,150.3,414.5z"/>
<path d="M531.6,326.2c105-69.6-94-116.5-247.2-116.5s-317.3,24.4-360,115.9
C-136.9,457-28.8,543.8,25.1,543.8S395.8,416.2,531.6,326.2z"/>
<path d="M685,456.6c105-69.6-94-116.5-247.2-116.5c-153.2,0-317.3,24.4-360,115.9
c-61.3,131.4,46.8,218.2,100.7,218.2S549.2,546.6,685,456.6z"/>
<path d="M1142.7,463.6c105-69.6-94-116.5-247.2-116.5s-317.3,24.4-360,115.9
c-61.3,131.4,46.8,218.2,100.7,218.2C690.1,681.3,1006.9,553.6,1142.7,463.6z"/>
<path d="M374.8,360.6c69.6,105,241.5-107.8,241.5-261s-149.4-303.5-241-346.3
c-131.4-61.3-218.2,46.8-218.2,100.7S284.8,224.8,374.8,360.6z"/>
<path d="M-17.6,985.6c69.6,105,241.5-107.8,241.5-261S74.5,421.1-17,378.4
c-131.4-61.3-218.2,46.8-218.2,100.7S-107.6,849.8-17.6,985.6z"/>
<path d="M87.9-56.7C13.9-82.5,9,87.4,66.6,163.2s188.1,93.9,249.4,80.6
c88-19.1,90.3-105.2,70-131.9C365.7,85.3,183.5-23.4,87.9-56.7z"/>
<path d="M130.4,627.6c-74-25.8-78.9,144.1-21.3,219.9s188.1,93.9,249.4,80.6
c88-19.1,90.3-105.2,70-131.9C408.2,769.6,225.9,660.9,130.4,627.6z"/>
<path d="M1846.9,225.4c42.1-118.8-97.1-250.3-250.3-250.3s-247,183.4-247,247
s166.1,220.1,220.1,220.1C1623.6,442.3,1773.5,432.6,1846.9,225.4z"/>
<path d="M1044.2,270.7c42.1-118.8-97.1-250.3-250.3-250.3s-247,183.4-247,247
S713,487.6,766.9,487.6C820.9,487.6,970.8,477.9,1044.2,270.7z"/>
<path d="M1148.9,517c-99.5-77.3-210.2,107.4-210.2,260.5s48.4,159.8,112.1,159.8
s76.8-77.5,106.8-193.1C1185.6,636.4,1255.4,599.8,1148.9,517z"/>
<path d="M1310.3,169c77.3-99.5-107.4-210.2-260.5-210.2S889.9,7.2,889.9,70.8
s77.5,76.8,193.1,106.8C1190.9,205.7,1227.6,275.4,1310.3,169z"/>
<path d="M1103.1,501.1c-25,123.5,148.8,15.9,257.1-92.4S1567.3,167,1532.8,72.1
C1483.3-64.2,1345.5-49.1,1307.4-11S1135.4,341.4,1103.1,501.1z"/>
<path d="M902.4,517.3c-25,123.5,148.8,15.9,257.1-92.4s207.1-241.6,172.6-336.6
C1282.6-48,1144.8-32.9,1106.7,5.2C1068.5,43.3,934.8,357.6,902.4,517.3z"/>
<path d="M675.4,977.7c-25,123.5,148.8,15.9,257.1-92.4
c108.3-108.3,207.1-241.6,172.6-336.6c-49.5-136.2-187.3-121.2-225.5-83.1C841.6,503.8,707.8,818,675.4,977.7z"/>
<path d="M1189.6,365.8c-123.5-25-94.6,247,13.8,355.3s320.3,109,415.2,74.4
c136.2-49.5,121.2-187.3,83.1-225.5C1663.6,531.9,1349.3,398.2,1189.6,365.8z"/>
<path d="M1178.3-351.1c-123.5-25-94.6,247,13.8,355.3s320.3,109,415.2,74.4
c136.2-49.5,121.2-187.3,83.1-225.5S1338-318.8,1178.3-351.1z"/>
<path d="M1687.6,458c70.5-34.1-46.1-157.7-140.5-170.6
c-94.3-12.8-199.4,66.6-233.4,119.4c-48.7,75.7,10.5,138.2,43.7,142.8C1390.7,554.1,1596.5,502.1,1687.6,458z"/>
<path d="M1328.9,258.3c-87.9,90.4-16.3,268,122.9,331.9s301.1-63.4,327.6-121.3
c26.6-57.8-59-269.3-108-291.9S1482.1,100.8,1328.9,258.3z"/>
<path d="M2077.1,552.5c-87.9,90.4-16.3,268,122.9,331.9
c139.2,64,301.1-63.4,327.6-121.3c26.6-57.8-59-269.3-108-291.9C2370.6,448.7,2230.3,394.9,2077.1,552.5z"/>
<path d="M2084.8,284.9c58.1,111.8,235.9-9.7,299.8-148.9
c64-139.2,22.8-165.4-35.1-192c-57.8-26.6-102.1,38.4-177.7,130.8C2101.4,161.1,2022.7,165.3,2084.8,284.9z"/>
<path d="M1792.8,533.8c-111.8,58.1,9.7,235.9,148.9,299.8s165.4,22.8,192-35.1
s-38.4-102.1-130.8-177.7C1916.6,550.3,1912.5,471.6,1792.8,533.8z"/>
<path d="M2119.8,318.6c74.3-101.8-128.6-76.6-272.2-23.5s-289.1,133-297.4,233.7
c-11.9,144.5,119.6,188.4,170.2,169.7C1770.9,679.8,2023.7,450.1,2119.8,318.6z"/>
<path d="M2308.9,387.7c74.3-101.8-128.6-76.6-272.2-23.5s-289.1,133-297.4,233.7
c-11.9,144.5,119.6,188.4,170.2,169.7C1960,748.9,2212.8,519.3,2308.9,387.7z"/>
<path d="M2722.5,146.8c74.3-101.8-128.6-76.6-272.2-23.5
c-143.7,53.2-289.1,133-297.4,233.7c-11.9,144.5,119.6,188.4,170.2,169.7C2373.6,508,2626.4,278.3,2722.5,146.8z"/>
<path d="M1984.7,405.3c101.8,74.3,189.1-184.9,135.9-328.6S1875.1-156,1774.4-164.3
C1630-176.2,1586.1-44.8,1604.8,5.8C1623.5,56.4,1853.1,309.2,1984.7,405.3z"/>
</g>
</svg>
</div>
var TextSlider = function(){
this.container = $('#home-animation-wrapper');
this.currentSlide = 1;
this.slidesLength = this.container.find('.slide').length - 1; // To start at 0
this.content = { text1: '', text2: '', text3: ''};
this.allowChange = true;
this.init();
};
TextSlider.prototype = {
init: function(){
console.log('init');
this.bind();
this.initSvg();
},
bind: function(){
console.log('bind');
var self = this;
// Bind interval
var timerDuration = 5000,
timer = setInterval(function(){
self.resetSlide();
}, timerDuration);
// Bind restart on click with next slide
this.container.on('click', function(){
// Do not allow to change slide until last transition is complete
if(!self.allowChange){ return; }
self.allowChange = false;
setTimeout(function(){
self.allowChange = true;
}, 2000);
self.resetSlide();
clearInterval(timer);
timer = setInterval(function(){
self.resetSlide();
}, timerDuration);
});
},
initSvg: function(){
console.log('initSvg');
this.bubblesRandomColors();
this.setTexts();
this.bubblesMovement();
// Trigger First slide
this.triggerSlide();
},
setTexts: function(){
console.log('setTexts');
var texts = this.container.find('#svg-texts');
// Get texts
this.content.text1 = this.container.find('.slide[count="'+this.currentSlide+'"]').attr('data-1');
this.content.text2 = this.container.find('.slide[count="'+this.currentSlide+'"]').attr('data-2');
this.content.text3 = this.container.find('.slide[count="'+this.currentSlide+'"]').attr('data-3');
// UpperCase Texts
this.content.text1 = this.content.text1.toUpperCase();
this.content.text2 = this.content.text2.toUpperCase();
this.content.text3 = this.content.text3.toUpperCase();
// Append Texts
texts.find('text:nth-child(1)').html(this.content.text1);
texts.find('text:nth-child(2)').html(this.content.text2);
texts.find('text:nth-child(3)').html(this.content.text3);
},
bubblesRandomColors: function(){
console.log('bubblesRandomColors');
var bubblesGroup = this.container.find('#bubbles'),
// colors = ['#03ee93','#ff0700','#ffe700','#5306de'];
colors = ['#f5a147','#51cad8','#112b39'];
bubblesGroup.find('path').each(function(){
var rand = getRand(0,colors.length);
TweenMax.set(this, { fill: colors[rand], scale: 0, transformOrigin: 'center' });
})
},
triggerSlide: function(){
console.log('triggerSlide');
// Container loads invisible, needs this to be shown on the first iteration
TweenMax.set(this.container, { autoAlpha: 1 });
var bubbles = this.container.find('#bubbles path');
bubbles.each(function(){
var rotateRand = getRand(-30,30);
TweenMax.to(this,1.5, { scale: 1.2, rotation: rotateRand, ease: Power2.easeInOut});
})
},
resetSlide: function(){
console.log('hideSlide');
var self = this;
this.currentSlide++;
if(this.currentSlide > this.slidesLength){ this.currentSlide = 0; };
var bubbles = this.container.find('#bubbles path');
TweenMax.to(bubbles,1.5, { scale: 0, ease: Power2.easeInOut, onComplete: triggerContinue });
// Workaround gsap onComplete
function triggerContinue(){
self.initSvg();
}
},
// non used function (performance) (remove the 'return' to enable)
bubblesMovement: function(){
return; // Yup, this one
var bubbles = this.container.find('#bubbles path'),
count = 500;
bubbles.each(function(index){
if(index > count ) { return; }
$(this).attr('data-rand', getRand(15, 25) );
});
this.container.on('mousemove', function(e){
bubbles.each(function(){
if(!$(this).attr('data-rand')){ return; };
var rand = $(this).attr('data-rand'),
cy = e.pageY,
cx = e.pageX,
py = Math.round($(this).offset().top),
px = Math.round($(this).offset().left),
x = Math.round(-(cx + px) / rand),
y = Math.round(-(cy + py) / rand);
TweenMax.to($(this), 0.2, { x: x, y: y, transformOrigin: 'center' });
});
})
}
}
function getRand(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
window.LLOS = window.LLOS || {};
if($('#home-animation-wrapper').length){
window.LLOS.TextSlider = new TextSlider();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.1/js/swiper.min.js"></script>
@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:700,900');
body {
margin: 0;
}
#home-animation-wrapper {
width: 100%;
height: 100vh;
position: relative;
float: left;
cursor: pointer;
svg{
width: 100%;
max-height: 90%;
height: auto;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
#bubbles {
path {
// background-blend-mode: multiply;
}
}
}
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.1/css/swiper.min.css" rel="stylesheet" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment