This code basically generates a random number of bubbles that animate from bottom of the screen to the top and repeats. When the mouse is in a certain distance (proximity) of the bubbles it scales those bubble and changes their background color. This Demo can explain better, how it works.
Now the problem is that whenever this code is running my macbook fan starts making noise and battery runs down quickly but when i close the page everything cools down. That's what I mean by maximising CPU usage.
I am pretty new at this, so I'd be glad if someone could review the code and criticize and suggest better solution to reduce the usage of my CPU.
Here is a live demo of what this code does: DEMO
$(document).ready(function() {
// Animate loader off screen
$(".preloader").fadeOut("slow");;
});
var bubbles = $('.bubbles');
function renderBubbles() {
// bubble properties
var max_bubbles = 30,
min_bubbles = 50,
max_bubbleSize = 10,
min_bubbleSize = 18,
total_bubbles = max_bubbles + Math.floor(Math.random() * min_bubbles + 1);
for (var i = 0; i < total_bubbles; i++) {
bubbles.append("<div class='bubble-container'><div class='bubble'></div></div>");
}
//set css property of .bubbble and .bubble-container
bubbles.find('.bubble-container').each(function() {
var bubble_size = max_bubbleSize + Math.floor(Math.random() * min_bubbleSize + 1);
var bubble_pos = Math.floor(Math.random() * 100 + 1);
var blur_size = 0 + Math.floor(Math.random() * 3 + 1);
var animation_delay = 10 + Math.floor(Math.random() * 18);
var random_margin = 50 + Math.floor(Math.random() * 100)
var $this = $(this);
var mX, mY, distance, mX_stored, mY_stored;
function calculateDistance(elem, mouseX, mouseY) {
return Math.floor(Math.sqrt(Math.pow(mouseX - (elem.offset().left + (elem.width() / 2)), 2) + Math.pow(mouseY - (elem.offset().top + (elem.height() / 2)), 2)));
}
$(document).mousemove(function(e) {
mX = e.pageX
mY = e.pageY;
distance = calculateDistance($this, mX, mY);
if (distance < 50) {
console.log('yes');
$this.children('.bubble').css({
'background': 'rgb(255, 214, 153)',
});
} else if (distance > 70) {
$this.children('.bubble').css({
'background': 'rgba(255,255,255,0.25)',
'transform': 'scale(1)'
});
}
});
$this.css({
'left': bubble_pos + "%",
'-webkit-filter': 'blur(' + blur_size + 'px)',
'-moz-filter': 'blur(' + blur_size + 'px)',
'filter': 'blur(' + blur_size + 'px)',
'-webkit-animation-duration': animation_delay + 's',
'-moz-animation-duration': animation_delay + 's',
'animation-duration': animation_delay + 's',
});
$this.children('.bubble').css({
'width': bubble_size + 'px',
'height': bubble_size + 'px'
});
});
}
renderBubbles();
.preloader {
width: 100%;
height: 100%;
background: #000;
position: absolute;
top: 0;
left: 0;
z-index: 999;
}
.content {
width: 100%;
height: 100vh;
background: -webkit-linear-gradient(#1A3742, #9EA183);
}
.bubbles {
width: 100%;
height: 100%;
overflow: hidden;
}
.bubble {
width: 6px;
height: 6px;
border-radius: 50%;
border: 1px solid rgba(255, 255, 255, 0.5);
background: rgba(255, 255, 255, 0.25);
will-change: transform;
transition: 2s;
&: hover {
transform: scale(2);
background: #ffbf80;
}
}
.bubble-container {
position: absolute;
bottom: 0;
animation: bubbleRise 10s infinite ease-in;
will-change: transform;
}
@keyframes bubbleRise {
0% {
opacity: 0;
bottom: 0;
}
15% {
bottom: 0;
opacity: 0.1;
margin-left: 0px;
}
25% {
opacity: 0.5;
}
50% {
opacity: 1;
margin-left: 50px;
}
100% {
bottom: 100%;
opacity: 0;
}
}
.spinner-2 {
width: 100px;
height: 100px;
border-radius: 50%;
position: relative;
margin: 50px auto;
display: inline-block;
border: 3px solid transparent;
border-top-color: orange;
animation: spinall 2s linear infinite;
&: after, &: before {
content: '';
display: block;
width: 85px;
height: 85px;
border-radius: 50%;
}
}
.spinner4:after {
position: absolute;
top: 3%;
left: 3.5%;
border: 3px solid transparent;
border-top-color: orange;
animation: spinall 3s linear infinite;
}
.spinner4:before {
width: 75px;
height: 75px;
position: absolute;
top: 10%;
left: 10%;
border: 3px solid transparent;
border-top-color: orange;
animation: spinall 2s linear infinite;
}
@keyframes spinall {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(90deg);
}
100% {
transform: rotate(360deg);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="preloader">
<div class="spinner-2 spinner4"></div>
</div>
<div class="content">
<div class="bubbles"></div>
</div>
<!--https://codepen.io/bh/pen/JBlCc?editors=1010-->