Shape Shifting Animation
Shape Shifting Animation
You can use Shape Shifting Animation to animate a Section, Background, etc. and create user attractive UI components.
So if you are a person who wishes to develop a website, you have to know how to create 3D animations properly. Check out our tutorial and you can learn this techniques and use it on your web development. Below sections shows how to develop this animations.
How to create Shape Shifting Animation? We are here to solve your problem. In this article we discuss how to create a hover effect animations. Before we start please read the below articles which easier you to understand the process, if you are new to development.
Step 1 – Add HTML
It’s too easy and simple. Just copy and paste below code in your HTML editor between <body> </body> tag as below.
<section>
<canvas class="canvas"></canvas>
<div class="help">?</div>
<div class="ui">
<input class="ui-input" type="text" />
<span class="ui-return">↵</span>
</div>
<div class="overlay">
<div class="tabs">
<div class="tabs-labels">
<span class="tabs-label">Commands</span>
</div>
<div class="tabs-panels">
<ul class="tabs-panel commands">
<li class="commands-item"><span class="commands-item-title">Text</span><span class="commands-item-info" data-demo="Hello :)">Type anything</span><span class="commands-item-action">Demo</span></li>
<li class="commands-item"><span class="commands-item-title">Countdown</span><span class="commands-item-info" data-demo="#countdown 10">#countdown<span class="commands-item-mode">number</span></span><span class="commands-item-action">Demo</span></li>
<li class="commands-item"><span class="commands-item-title">Time</span><span class="commands-item-info" data-demo="#time">#time</span><span class="commands-item-action">Demo</span></li>
<li class="commands-item"><span class="commands-item-title">Rectangle</span><span class="commands-item-info" data-demo="#rectangle 30x15">#rectangle<span class="commands-item-mode">width x height</span></span><span class="commands-item-action">Demo</span></li>
<li class="commands-item"><span class="commands-item-title">Circle</span><span class="commands-item-info" data-demo="#circle 25">#circle<span class="commands-item-mode">diameter</span></span><span class="commands-item-action">Demo</span></li>
<li class="commands-item commands-item--gap"><span class="commands-item-title">Animate</span><span class="commands-item-info" data-demo="The time is|#time|#countdown 3|#icon thumbs-up"><span class="commands-item-mode">command1</span> |<span class="commands-item-mode">command2</span></span><span class="commands-item-action">Demo</span></li>
</ul>
</div>
</div>
</div>
</section>
Step 2 – Add CSS
Copy and paste below code in your HTML editor between <style></style> tag as below.
<style>
body {
color: #453c3c;
font-size: 16px;
line-height: 1.5em;
}
h1 {
margin: 0 0 12px 0;
font-size: 24px;
line-height: 1.5em;
}
p {
margin: 0 0 10px 0;
}
a {
color: #888;
text-decoration: none;
border-bottom: 1px solid #ccc;
}
a:hover {
border-bottom-color: #888;
}
body,
.overlay {
-webkit-perspective: 1000;
-webkit-perspective-origin-y: 25%;
}
.body--ready {
background: -webkit-linear-gradient(top, rgb(117 139 128) 0%, rgb(29 33 35) 120%);
background: -moz-linear-gradient(top, rgb(117 139 128) 0%, rgb(29 33 35) 120%);
background: -o-linear-gradient(top, rgb(117 139 128) 0%, rgb(29 33 35) 120%);
background: -ms-linear-gradient(top, rgb(117 139 128) 0%, rgb(29 33 35) 120%);
background: linear-gradient(top, rgb(117 139 128) 0%, rgb(29 33 35) 120%);
}
.body--ready .overlay {
-webkit-transition: -webkit-transform 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1);
-moz-transition: -moz-transform 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1);
-ms-transition: -ms-transform 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1);
-o-transition: -o-transform 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1);
transition: transform 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1);
}
.ui {
position: absolute;
left: 50%;
bottom: 5%;
width: 300px;
margin-left: -150px;
}
.ui-input {
width: 100%;
height: 50px;
background: none;
font-size: 24px;
font-weight: bold;
color: #fff;
text-align: center;
border: none;
border-bottom: 2px solid white;
}
.ui-input:focus {
outline: none;
border: none;
border-bottom: 2px solid white;
}
.ui-return {
display: none;
position: absolute;
top: 20px;
right: 0;
padding: 3px 2px 0 2px;
font-size: 10px;
line-height: 10px;
color: #fff;
border: 1px solid #fff;
}
.ui--enter .ui-return {
display: block;
}
.ui--wide {
width: 76%;
margin-left: 12%;
left: 0;
}
.ui--wide .ui-return {
right: -20px;
}
.help {
position: absolute;
top: 40px;
right: 40px;
width: 25px;
height: 25px;
text-align: center;
font-size: 13px;
line-height: 27px;
font-weight: bold;
cursor: pointer;
background: #fff;
color: #79a8ae;
opacity: .9;
-webkit-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-moz-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-ms-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-o-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
}
.help:hover {
opacity: 1;
}
.overlay {
position: absolute;
top: 50%;
left: 50%;
width: 550px;
height: 490px;
margin: -260px 0 0 -275px;
opacity: 0;
-webkit-transform: rotateY(90deg);
-moz-transform: rotateY(90deg);
-ms-transform: rotateY(90deg);
-o-transform: rotateY(90deg);
transform: rotateY(90deg);
}
.overlay--visible {
opacity: 1;
-webkit-transform: rotateY(0);
-moz-transform: rotateY(0);
-ms-transform: rotateY(0);
-o-transform: rotateY(0);
transform: rotateY(0);
}
.ui-share,
.ui-details {
opacity: .9;
background: #fff;
z-index: 2;
}
.ui-details-content,
.ui-share-content {
padding: 100px 50px;
}
.commands {
margin: 0;
padding: 0;
list-style: none;
cursor: pointer;
}
.commands-item {
font-size: 12px;
line-height: 22px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
padding: 20px;
background: #fff;
margin-top: 1px;
color: #333;
opacity: .9;
-webkit-transition: -webkit-transform 0.7s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-moz-transition: -moz-transform 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-ms-transition: -ms-transform 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-o-transition: -o-transform 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
transition: transform 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1),
opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
}
.commands-item--gap {
margin-top: 9px;
}
.commands-item:hover {
opacity: 1;
}
.commands-item:hover .commands-item-action {
background: #333;
}
.commands-item a {
display: inline-block;
}
.commands-item-mode {
display: inline-block;
margin-left: 3px;
font-style: italic;
color: #ccc;
}
.commands-item-title {
display: inline-block;
width: 150px;
}
.commands-item-info {
display: inline-block;
width: 300px;
font-size: 14px;
text-transform: none;
letter-spacing: 0;
font-weight: normal;
color: #aaa;
}
.commands-item-action {
display: inline-block;
float: right;
margin-top: 3px;
text-transform: uppercase;
font-size: 10px;
line-height: 10px;
color: #fff;
background: #90c9d1;
padding: 5px 10px 4px 10px;
border-radius: 3px;
}
.commands-item:first-child {
margin-top: 0;
}
.twitter-share {
position: absolute;
top: 4px;
right: 20px;
}
.tabs-labels {
margin-bottom: 9px;
}
.tabs-label {
display: inline-block;
background: #fff;
padding: 10px 20px;
font-size: 12px;
line-height: 22px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
color: #333;
opacity: .5;
cursor: pointer;
margin-right: 2px;
-webkit-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-moz-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-ms-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
-o-transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
transition: opacity 0.1s cubic-bezier(0.694, 0.0482, 0.335, 1);
}
.tabs-label:hover {
opacity: .9;
}
.tabs-label--active {
opacity: .9;
}
.tabs-panel {
display: none;
}
.tabs-panel--active {
display: block;
}
.tab-panel {
position: absolute;
top: 0;
left: 0;
width: 100%;
}
.touch .ui-input {
display: none;
}
</style>
At the end we will have something like this. You can change fonts, colors, backgrounds and all things that you want. Enjoy it.
Step 3 – Add JavaScript
Copy and paste below code in your HTML editor between <script></script> tag.
<script>
var S = {
init: function() {
var action = window.location.href,
i = action.indexOf('?a=');
S.Drawing.init('.canvas');
document.body.classList.add('body--ready');
if (i !== -1) {
S.UI.simulate(decodeURI(action).substring(i + 3));
} else {
S.UI.simulate('Shape|Shifter|Type|to start|#rectangle|#countdown 3||');
}
S.Drawing.loop(function() {
S.Shape.render();
});
}
};
S.Drawing = (function() {
var canvas,
context,
renderFn
requestFrame = window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
return {
init: function(el) {
canvas = document.querySelector(el);
context = canvas.getContext('2d');
this.adjustCanvas();
window.addEventListener('resize', function(e) {
S.Drawing.adjustCanvas();
});
},
loop: function(fn) {
renderFn = !renderFn ? fn : renderFn;
this.clearFrame();
renderFn();
requestFrame.call(window, this.loop.bind(this));
},
adjustCanvas: function() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
},
clearFrame: function() {
context.clearRect(0, 0, canvas.width, canvas.height);
},
getArea: function() {
return {
w: canvas.width,
h: canvas.height
};
},
drawCircle: function(p, c) {
context.fillStyle = c.render();
context.beginPath();
context.arc(p.x, p.y, p.z, 0, 2 * Math.PI, true);
context.closePath();
context.fill();
}
}
}());
S.UI = (function() {
var input = document.querySelector('.ui-input'),
ui = document.querySelector('.ui'),
help = document.querySelector('.help'),
commands = document.querySelector('.commands'),
overlay = document.querySelector('.overlay'),
canvas = document.querySelector('.canvas'),
interval,
isTouch = false, //('ontouchstart' in window || navigator.msMaxTouchPoints),
currentAction,
resizeTimer,
time,
maxShapeSize = 30,
firstAction = true,
sequence = [],
cmd = '#';
function formatTime(date) {
var h = date.getHours(),
m = date.getMinutes(),
m = m < 10 ? '0' + m : m;
return h + ':' + m;
}
function getValue(value) {
return value && value.split(' ')[1];
}
function getAction(value) {
value = value && value.split(' ')[0];
return value && value[0] === cmd && value.substring(1);
}
function timedAction(fn, delay, max, reverse) {
clearInterval(interval);
currentAction = reverse ? max : 1;
fn(currentAction);
if (!max || (!reverse && currentAction < max) || (reverse && currentAction > 0)) {
interval = setInterval(function() {
currentAction = reverse ? currentAction - 1 : currentAction + 1;
fn(currentAction);
if ((!reverse && max && currentAction === max) || (reverse && currentAction === 0)) {
clearInterval(interval);
}
}, delay);
}
}
function reset(destroy) {
clearInterval(interval);
sequence = [];
time = null;
destroy && S.Shape.switchShape(S.ShapeBuilder.letter(''));
}
function performAction(value) {
var action,
value,
current;
overlay.classList.remove('overlay--visible');
sequence = typeof(value) === 'object' ? value : sequence.concat(value.split('|'));
input.value = '';
checkInputWidth();
timedAction(function(index) {
current = sequence.shift();
action = getAction(current);
value = getValue(current);
switch (action) {
case 'countdown':
value = parseInt(value) || 10;
value = value > 0 ? value : 10;
timedAction(function(index) {
if (index === 0) {
if (sequence.length === 0) {
S.Shape.switchShape(S.ShapeBuilder.letter(''));
} else {
performAction(sequence);
}
} else {
S.Shape.switchShape(S.ShapeBuilder.letter(index), true);
}
}, 1000, value, true);
break;
case 'rectangle':
value = value && value.split('x');
value = (value && value.length === 2) ? value : [maxShapeSize, maxShapeSize / 2];
S.Shape.switchShape(S.ShapeBuilder.rectangle(Math.min(maxShapeSize, parseInt(value[0])), Math.min(maxShapeSize, parseInt(value[1]))));
break;
case 'circle':
value = parseInt(value) || maxShapeSize;
value = Math.min(value, maxShapeSize);
S.Shape.switchShape(S.ShapeBuilder.circle(value));
break;
case 'time':
var t = formatTime(new Date());
if (sequence.length > 0) {
S.Shape.switchShape(S.ShapeBuilder.letter(t));
} else {
timedAction(function() {
t = formatTime(new Date());
if (t !== time) {
time = t;
S.Shape.switchShape(S.ShapeBuilder.letter(time));
}
}, 1000);
}
break;
default:
S.Shape.switchShape(S.ShapeBuilder.letter(current[0] === cmd ? 'What?' : current));
}
}, 2000, sequence.length);
}
function checkInputWidth(e) {
if (input.value.length > 18) {
ui.classList.add('ui--wide');
} else {
ui.classList.remove('ui--wide');
}
if (firstAction && input.value.length > 0) {
ui.classList.add('ui--enter');
} else {
ui.classList.remove('ui--enter');
}
}
function bindEvents() {
document.body.addEventListener('keydown', function(e) {
input.focus();
if (e.keyCode === 13) {
firstAction = false;
reset();
performAction(input.value);
}
});
input.addEventListener('input', checkInputWidth);
input.addEventListener('change', checkInputWidth);
input.addEventListener('focus', checkInputWidth);
help.addEventListener('click', function(e) {
overlay.classList.toggle('overlay--visible');
overlay.classList.contains('overlay--visible') && reset(true);
});
commands.addEventListener('click', function(e) {
var el,
info,
demo,
tab,
active,
url;
if (e.target.classList.contains('commands-item')) {
el = e.target;
} else {
el = e.target.parentNode.classList.contains('commands-item') ? e.target.parentNode : e.target.parentNode.parentNode;
}
info = el && el.querySelector('.commands-item-info');
demo = el && info.getAttribute('data-demo');
url = el && info.getAttribute('data-url');
if (info) {
overlay.classList.remove('overlay--visible');
if (demo) {
input.value = demo;
if (isTouch) {
reset();
performAction(input.value);
} else {
input.focus();
}
} else if (url) {
//window.location = url;
}
}
});
canvas.addEventListener('click', function(e) {
overlay.classList.remove('overlay--visible');
});
}
function init() {
bindEvents();
input.focus();
isTouch && document.body.classList.add('touch');
}
// Init
init();
return {
simulate: function(action) {
performAction(action);
}
}
}());
S.UI.Tabs = (function() {
var tabs = document.querySelector('.tabs'),
labels = document.querySelector('.tabs-labels'),
triggers = document.querySelectorAll('.tabs-label'),
panels = document.querySelectorAll('.tabs-panel');
function activate(i) {
triggers[i].classList.add('tabs-label--active');
panels[i].classList.add('tabs-panel--active');
}
function bindEvents() {
labels.addEventListener('click', function(e) {
var el = e.target,
index;
if (el.classList.contains('tabs-label')) {
for (var t = 0; t < triggers.length; t++) {
triggers[t].classList.remove('tabs-label--active');
panels[t].classList.remove('tabs-panel--active');
if (el === triggers[t]) {
index = t;
}
}
activate(index);
}
});
}
function init() {
activate(0);
bindEvents();
}
// Init
init();
}());
S.Point = function(args) {
this.x = args.x;
this.y = args.y;
this.z = args.z;
this.a = args.a;
this.h = args.h;
};
S.Color = function(r, g, b, a) {
this.r = r;
this.g = g;
this.b = b;
this.a = a;
};
S.Color.prototype = {
render: function() {
return 'rgba(' + this.r + ',' + +this.g + ',' + this.b + ',' + this.a + ')';
}
};
S.Dot = function(x, y) {
this.p = new S.Point({
x: x,
y: y,
z: 5,
a: 1,
h: 0
});
this.e = 0.07;
this.s = true;
this.c = new S.Color(255, 255, 255, this.p.a);
this.t = this.clone();
this.q = [];
};
S.Dot.prototype = {
clone: function() {
return new S.Point({
x: this.x,
y: this.y,
z: this.z,
a: this.a,
h: this.h
});
},
_draw: function() {
this.c.a = this.p.a;
S.Drawing.drawCircle(this.p, this.c);
},
_moveTowards: function(n) {
var details = this.distanceTo(n, true),
dx = details[0],
dy = details[1],
d = details[2],
e = this.e * d;
if (this.p.h === -1) {
this.p.x = n.x;
this.p.y = n.y;
return true;
}
if (d > 1) {
this.p.x -= ((dx / d) * e);
this.p.y -= ((dy / d) * e);
} else {
if (this.p.h > 0) {
this.p.h--;
} else {
return true;
}
}
return false;
},
_update: function() {
if (this._moveTowards(this.t)) {
var p = this.q.shift();
if (p) {
this.t.x = p.x || this.p.x;
this.t.y = p.y || this.p.y;
this.t.z = p.z || this.p.z;
this.t.a = p.a || this.p.a;
this.p.h = p.h || 0;
} else {
if (this.s) {
this.p.x -= Math.sin(Math.random() * 3.142);
this.p.y -= Math.sin(Math.random() * 3.142);
} else {
this.move(new S.Point({
x: this.p.x + (Math.random() * 50) - 25,
y: this.p.y + (Math.random() * 50) - 25,
}));
}
}
}
d = this.p.a - this.t.a;
this.p.a = Math.max(0.1, this.p.a - (d * 0.05));
d = this.p.z - this.t.z;
this.p.z = Math.max(1, this.p.z - (d * 0.05));
},
distanceTo: function(n, details) {
var dx = this.p.x - n.x,
dy = this.p.y - n.y,
d = Math.sqrt(dx * dx + dy * dy);
return details ? [dx, dy, d] : d;
},
move: function(p, avoidStatic) {
if (!avoidStatic || (avoidStatic && this.distanceTo(p) > 1)) {
this.q.push(p);
}
},
render: function() {
this._update();
this._draw();
}
}
S.ShapeBuilder = (function() {
var gap = 13,
shapeCanvas = document.createElement('canvas'),
shapeContext = shapeCanvas.getContext('2d'),
fontSize = 500,
fontFamily = 'Avenir, Helvetica Neue, Helvetica, Arial, sans-serif';
function fit() {
shapeCanvas.width = Math.floor(window.innerWidth / gap) * gap;
shapeCanvas.height = Math.floor(window.innerHeight / gap) * gap;
shapeContext.fillStyle = 'red';
shapeContext.textBaseline = 'middle';
shapeContext.textAlign = 'center';
}
function processCanvas() {
var pixels = shapeContext.getImageData(0, 0, shapeCanvas.width, shapeCanvas.height).data;
dots = [],
pixels,
x = 0,
y = 0,
fx = shapeCanvas.width,
fy = shapeCanvas.height,
w = 0,
h = 0;
for (var p = 0; p < pixels.length; p += (4 * gap)) {
if (pixels[p + 3] > 0) {
dots.push(new S.Point({
x: x,
y: y
}));
w = x > w ? x : w;
h = y > h ? y : h;
fx = x < fx ? x : fx;
fy = y < fy ? y : fy;
}
x += gap;
if (x >= shapeCanvas.width) {
x = 0;
y += gap;
p += gap * 4 * shapeCanvas.width;
}
}
return {
dots: dots,
w: w + fx,
h: h + fy
};
}
function setFontSize(s) {
shapeContext.font = 'bold ' + s + 'px ' + fontFamily;
}
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
function init() {
fit();
window.addEventListener('resize', fit);
}
// Init
init();
return {
imageFile: function(url, callback) {
var image = new Image(),
a = S.Drawing.getArea();
image.onload = function() {
shapeContext.clearRect(0, 0, shapeCanvas.width, shapeCanvas.height);
shapeContext.drawImage(this, 0, 0, a.h * 0.6, a.h * 0.6);
callback(processCanvas());
};
image.onerror = function() {
callback(S.ShapeBuilder.letter('What?'));
}
image.src = url;
},
circle: function(d) {
var r = Math.max(0, d) / 2;
shapeContext.clearRect(0, 0, shapeCanvas.width, shapeCanvas.height);
shapeContext.beginPath();
shapeContext.arc(r * gap, r * gap, r * gap, 0, 2 * Math.PI, false);
shapeContext.fill();
shapeContext.closePath();
return processCanvas();
},
letter: function(l) {
var s = 0;
setFontSize(fontSize);
s = Math.min(fontSize,
(shapeCanvas.width / shapeContext.measureText(l).width) * 0.8 * fontSize,
(shapeCanvas.height / fontSize) * (isNumber(l) ? 1 : 0.45) * fontSize);
setFontSize(s);
shapeContext.clearRect(0, 0, shapeCanvas.width, shapeCanvas.height);
shapeContext.fillText(l, shapeCanvas.width / 2, shapeCanvas.height / 2);
return processCanvas();
},
rectangle: function(w, h) {
var dots = [],
width = gap * w,
height = gap * h;
for (var y = 0; y < height; y += gap) {
for (var x = 0; x < width; x += gap) {
dots.push(new S.Point({
x: x,
y: y,
}));
}
}
return {
dots: dots,
w: width,
h: height
};
}
};
}());
S.Shape = (function() {
var dots = [],
width = 0,
height = 0,
cx = 0,
cy = 0;
function compensate() {
var a = S.Drawing.getArea();
cx = a.w / 2 - width / 2;
cy = a.h / 2 - height / 2;
}
return {
shuffleIdle: function() {
var a = S.Drawing.getArea();
for (var d = 0; d < dots.length; d++) {
if (!dots[d].s) {
dots[d].move({
x: Math.random() * a.w,
y: Math.random() * a.h
});
}
}
},
switchShape: function(n, fast) {
var size,
a = S.Drawing.getArea();
width = n.w;
height = n.h;
compensate();
if (n.dots.length > dots.length) {
size = n.dots.length - dots.length;
for (var d = 1; d <= size; d++) {
dots.push(new S.Dot(a.w / 2, a.h / 2));
}
}
var d = 0,
i = 0;
while (n.dots.length > 0) {
i = Math.floor(Math.random() * n.dots.length);
dots[d].e = fast ? 0.25 : (dots[d].s ? 0.14 : 0.11);
if (dots[d].s) {
dots[d].move(new S.Point({
z: Math.random() * 20 + 10,
a: Math.random(),
h: 18
}));
} else {
dots[d].move(new S.Point({
z: Math.random() * 5 + 5,
h: fast ? 18 : 30
}));
}
dots[d].s = true;
dots[d].move(new S.Point({
x: n.dots[i].x + cx,
y: n.dots[i].y + cy,
a: 1,
z: 5,
h: 0
}));
n.dots = n.dots.slice(0, i).concat(n.dots.slice(i + 1));
d++;
}
for (var i = d; i < dots.length; i++) {
if (dots[i].s) {
dots[i].move(new S.Point({
z: Math.random() * 20 + 10,
a: Math.random(),
h: 20
}));
dots[i].s = false;
dots[i].e = 0.04;
dots[i].move(new S.Point({
x: Math.random() * a.w,
y: Math.random() * a.h,
a: 0.3, //.4
z: Math.random() * 4,
h: 0
}));
}
}
},
render: function() {
for (var d = 0; d < dots.length; d++) {
dots[d].render();
}
}
}
}());
S.init();
</script>
Out Put
Video Tutorial
Please watch this video to better understand this tutorial and don’t forget to subscribe to our channel.
Help others to find out about this article on Social Media sites. If you have any doubt or any problem, don’t hesitate to contact us. Thereafter we will be able to help you and also make sure you bookmark our site on your browser.