0% found this document useful (0 votes)
61 views17 pages

Animated "I Love You" SVG Design

The document contains HTML, CSS, and JavaScript code for a web animation that displays the phrase 'I LOVE YOU' with animated letters and sound effects. It utilizes SVG for graphics and Mo.js for animations, creating a visually engaging experience. The CSS styles define the layout and appearance, while the JavaScript controls the animation logic and sound playback.

Uploaded by

anfiniqueen
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
61 views17 pages

Animated "I Love You" SVG Design

The document contains HTML, CSS, and JavaScript code for a web animation that displays the phrase 'I LOVE YOU' with animated letters and sound effects. It utilizes SVG for graphics and Mo.js for animations, creating a visually engaging experience. The CSS styles define the layout and appearance, while the JavaScript controls the animation logic and sound playback.

Uploaded by

anfiniqueen
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd

HTML

<div class="container">

<svg class="svg-container" version="1.1" xmlns="[Link] viewBox="0 0 500


200">

<line class="line line--left" x1="10" y1="17" x2="10" y2="183"> </line>

<line class="line line--rght" x1="490" y1="17" x2="490" y2="183"> </line>

<g>

<path class="lttr lttr--I" d="M42.2,73.9h11.4v52.1H42.2V73.9z"></path>

<path class="lttr lttr--L" d="M85.1,73.9h11.4v42.1h22.8v10H85.1V73.9z"></path>

<path class="lttr lttr--O" d="M123.9,100c0-15.2,11.7-26.9,27.2-26.9s27.2,11.7,27.2,26.9s-11.7,26.9-


27.2,26.9S123.9,115.2,123.9,100zM166.9,100c0-9.2-6.8-16.5-15.8-16.5c-9,0-15.8,7.3-
15.8,16.5s6.8,16.5,15.8,16.5C160.1,116.5,166.9,109.2,166.9,100z"> </path>

<path class="lttr lttr--V" d="M180.7,73.9H193l8.4,22.9c1.7,4.7,3.5,9.5,5,14.2h0.1c1.7-4.8,3.4-9.4,5.2-


14.3l8.6-22.8h11.7l-19.9,52.1h-11.5L180.7,73.9z"></path>

<path class="lttr lttr--E" d="M239.1,73.9h32.2v10h-20.7v10.2h17.9v9.5h-17.9v12.4H272v10h-


33V73.9z"></path>

<path class="lttr lttr--Y" d="M315.8,102.5l-20.1-28.6H309l6.3,9.4c2,3,4.2,6.4,6.3,9.6h0.1c2-3.2,4.1-


6.4,6.3-9.6l6.3-9.4h12.9l-19.9,28.5v23.6h-11.4V102.5z"></path>

<path class="lttr lttr--O2" d="M348.8,100c0-15.2,11.7-26.9,27.2-26.9c15.5,0,27.2,11.7,27.2,26.9s-


11.7,26.9-27.2,26.9C360.5,126.9,348.8,115.2,348.8,100z M391.8,100c0-9.2-6.8-16.5-15.8-16.5c-9,0-
15.8,7.3-15.8,16.5s6.8,16.5,15.8,16.5C385,116.5,391.8,109.2,391.8,100z"></path>

<path class="lttr lttr--U" d="M412.4,101.1V73.9h11.4v26.7c0,10.9,2.4,15.9,11.5,15.9c8.4,0,11.4-


4.6,11.4-15.8V73.9h11v26.9c0,7.8-1.1,13.5-4,17.7c-3.7,5.3-10.4,8.4-18.7,8.4c-8.4,0-15.1-3.1-18.8-
8.5C413.4,114.2,412.4,108.5,412.4,101.1z"></path>

</g>

</svg>

<div class="mo-container"> </div>

</div>

<audio class="blup" style="display: none">


<source src="[Link]
type="audio/ogg">

</audio >

<audio class="blop" style="display: none">

<source src="[Link]
type="audio/ogg">

</audio>

<div class="sound">sound</div>

CSS

@mixin flex-center() {

display: flex;

justify-content: center;

align-items: center;

$col-bg: #FFC568;

$col-lttr: #763C8C;

$col-line: #FFFFFF;

$to-mobile: 520px;

*, *:before, *:after {
box-sizing: border-box;

margin: 0;

padding: 0;

html, body {

min-height: 100vh;

@include flex-center();

background-color: $col-bg;

font-size: 62.5%;

font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;

@media screen and (max-width: $to-mobile) {

/* don't know how to set default units to rem in mojs :(( */

.container {

width: 50rem;

height: 20rem;

position: relative;

.svg-container {

z-index: 2;

position: absolute;

}
.mo-container {

width: 100%;

height: 100%;

.line {

fill: none;

stroke: $col-line;

stroke-width: 8;

stroke-linecap: round;

stroke-miterlimit: 10;

.lttr {

fill: $col-lttr;

.sound {

position: fixed;

color: $col-lttr;

font-size: 1.6rem;

bottom: 1rem;

right: 1rem;

text-decoration: underline;

cursor: default;

&--off {

text-decoration: line-through;

}
}

Java Script

const qs = [Link](document);

const easingHeart = [Link]('M0,100C2.9,86.7,33.6-7.3,46-7.3s15.2,22.7,26,22.7S89,0,100,0');

const el = {

container: qs('.mo-container'),

i: qs('.lttr--I'),

l: qs('.lttr--L'),

o: qs('.lttr--O'),

v: qs('.lttr--V'),

e: qs('.lttr--E'),

y: qs('.lttr--Y'),

o2: qs('.lttr--O2'),

u: qs('.lttr--U'),

lineLeft: qs('.line--left'),

lineRight: qs('.line--rght'),
colTxt: "#763c8c",

colHeart: "#fa4843",

blup: qs('.blup'),

blop: qs('.blop'),

sound: qs('.sound')

};

class Heart extends [Link] {

getShape() {

return '<path d="M50,88.9C25.5,78.2,0.5,54.4,3.8,31.1S41.3,1.8,50,29.9c8.7-28.2,42.8-


22.2,46.2,1.2S74.5,78.2,50,88.9z"/>';

getLength () { return 200; }

[Link]('heart', Heart);

const crtBoom = (delay = 0, x = 0, rd = 46) => {

parent = [Link];

const crcl = new [Link]({

shape: 'circle',

fill: 'none',

stroke: [Link],

strokeWidth: { 5 : 0 },

radius: { [rd] : [rd + 20] },

easing: '[Link]',

duration: 500 / 3,

parent,
delay,

});

const brst = new [Link]({

radius: { [rd + 15] : 110 },

angle: 'rand(60, 180)',

count: 3,

timeline: { delay },

parent,

x,

children: {

radius: [5, 3, 7],

fill: [Link],

scale: { 1: 0, easing: '[Link]' },

pathScale: [ .8, null ],

degreeShift: [ 'rand(13, 60)', null ],

duration: 1000 / 3,

easing: '[Link]'

});

return [crcl, brst];

};

const crtLoveTl = () => {

const move = 1000;

const boom = 200;

const easing = '[Link]';


const easingBoom = '[Link]';

const easingOut = '[Link]';

const opts = { duration: move, easing, opacity: 1 };

const delta = 150;

return (new [Link]).add([

new [Link]({

duration: move,

onStart: () => {

[el.i, el.l, el.o, el.v, el.e, el.y, el.o2, el.u].forEach(el => {

[Link] = 1;

[Link] = 'transform: translate(0px, 0px) rotate(0deg) skew(0deg, 0deg) scale(1, 1); opacity: 1;'

})

},

onComplete: () => {

[el.l, el.o, el.v, el.e].forEach(el => [Link] = 0);

[Link]();

}),

new [Link]({

duration: move * 2 + boom,

onComplete: () => {

[el.y, el.o2].forEach(el => [Link] = 0);

[Link]();

}),

new [Link]({
duration: move * 3 + boom * 2 - delta,

onComplete: () => {

[Link] = 0;

[Link]();

}),

new [Link]({

duration: move * 3 + boom * 2,

onComplete: () => {

[Link] = 0;

[Link]();

}),

new [Link]({

duration: 50,

delay: 4050,

onUpdate: (progress) => {

[el.i, el.l, el.o, el.v, el.e, el.y, el.o2, el.u].forEach(el => {

[Link] = `transform: translate(0px, 0px) rotate(0deg) skew(0deg, 0deg) scale(1, 1); opacity: ${1 *
progress};`

})

},

onComplete: () => {

[el.i, el.l, el.o, el.v, el.e, el.y, el.o2, el.u].forEach(el => {

[Link] = 1;

[Link] = 'transform: translate(0px, 0px) rotate(0deg) skew(0deg, 0deg) scale(1, 1); opacity: 1;'

})
}

}),

new [Link]({

...opts,

el: [Link],

x: { 0 : 52 },

}).then({

duration: boom + move,

easing,

x: { to : 52 + 54 }

}).then({

duration: boom + move,

easing,

x: { to : 52 + 54 + 60 }

}).then({

duration: 150, // 3550

easing,

x: { to : 52 + 54 + 60 + 10 }

}).then({

duration: 300

}).then({

duration: 350,

x: { to : 0 },

easing: easingOut

}),

new [Link]({

...opts,
el: [Link],

x: { 0 : -52 },

}).then({

duration: boom + move,

easing,

x: { to : -52 - 54 }

}).then({

duration: boom + move,

easing,

x: { to : -52 - 54 - 60 }

}).then({

duration: 150,

easing,

x: { to : -52 - 54 - 60 - 10 }

}).then({

duration: 300

}).then({

duration: 350,

x: { to : 0 },

easing: easingOut,

}),

new [Link]({ // [I] LOVE YOU

...opts,

el: el.i,

x: { 0 : 34 },

}).then({

duration: boom,

easing: easingBoom,
x: { to : 34 + 19 }

}).then({

duration: move,

easing,

x: { to : 34 + 19 + 40 }

}).then({

duration: boom,

easing: easingBoom,

x: { to : 34 + 19 + 40 + 30 }

}).then({

duration: move,

easing,

x: { to : 34 + 19 + 40 + 30 + 30 }

}),

new [Link]({ // I [L]OVE YOU

...opts,

el: el.l,

x: { 0 : 15 },

}),

new [Link]({ // I L[O]VE YOU

...opts,

el: el.o,

x: { 0 : 11 },

}),

new [Link]({ // I LO[V]E YOU

...opts,
el: el.v,

x: { 0 : 3 },

}),

new [Link]({ // I LOV[E] YOU

...opts,

el: el.e,

x: { 0 : -3 },

}),

new [Link]({ // I LOVE [Y]OU

...opts,

el: el.y,

x: { 0 : -20 },

}).then({

duration: boom,

easing: easingBoom,

x: { to : -20 - 33}

}).then({

duration: move,

easing,

x: { to : -20 - 33 - 24 }

}),

new [Link]({ // I LOVE Y[O]U

...opts,

el: el.o2,

x: { 0 : -27 },

}).then({
duration: boom,

easing: easingBoom,

x: { to : -27 - 27}

}).then({

duration: move,

easing,

x: { to : -27 - 27 - 30 }

}),

new [Link]({ // I LOVE YO[U]

...opts,

el: el.u,

x: { 0 : -32 },

}).then({

duration: boom,

easing: easingBoom,

x: { to : -32 - 21}

}).then({

duration: move,

easing,

x: { to : -32 - 21 - 36 }

}).then({

duration: boom,

easing: easingBoom,

x: { to : -32 - 21 - 36 - 31 }

}).then({

duration: move,

easing,

x: { to : -32 - 21 - 36 - 31 - 27 }
}),

new [Link]({

parent: [Link],

shape: 'heart',

delay: move,

fill: [Link],

x: -64,

scale: { 0 : 0.95, easing: easingHeart },

duration: 500

}).then({

x: { to : -62, easing },

scale: { to : 0.65, easing },

duration: boom + move - 500,

}).then({

duration: boom - 50,

x: { to: -62 + 48 },

scale: { to : 0.90 },

easing: easingBoom

}).then({

duration: 125,

scale: { to : 0.8 },

easing: easingOut

}).then({

duration: 125,

scale: { to : 0.85 },

easing: easingOut

}).then({

duration: move - 200,


scale: { to : 0.45 },

easing

}).then({

delay: -75,

duration: 150,

x: { to: 0 },

scale: { to : 0.90 },

easing: easingBoom

}).then({

duration: 125,

scale: { to : 0.8 },

easing: easingOut

}).then({

duration: 125, // 3725

scale: { to : 0.85 },

easing: easingOut

}).then({

duration: 125, // 3850

}).then({

duration: 350,

scale: { to : 0 },

easing: easingOut

}),

...crtBoom(move, -64, 46),

...crtBoom(move * 2 + boom, 18, 34),

...crtBoom(move * 3 + boom * 2 - delta, -64, 34),

...crtBoom(move * 3 + boom * 2, 45, 34)

]);
};

const loveTl = crtLoveTl().play();

setInterval(() => { [Link]() }, 4300);

const volume = 0.2;

[Link] = volume;

[Link] = volume;

const toggleSound = () => {

let on = true;

return () => {

if (on) {

[Link] = 0.0;

[Link] = 0.0;

[Link]('sound--off')

else {

[Link] = volume;

[Link] = volume;

[Link]('sound--off')

on = !on;

[Link]('click', toggleSound());

You might also like