Random bubbles animated with CSS Keyframes, and generated/randomised using jQuery.
It's a massive CPU drain, but quite fun!
A Pen by Ben Hodgson on CodePen.
Random bubbles animated with CSS Keyframes, and generated/randomised using jQuery.
It's a massive CPU drain, but quite fun!
A Pen by Ben Hodgson on CodePen.
| <!-- | |
| This is a *MASSIVE* CPU drain and just a bit of fun. | |
| I wouldn't use it on anything serious, but see it in action here: http://beeroclock.in | |
| --> | |
| <div class="bubbles"></div> | |
| <a class="bubble-toggle" href="#">Bubbles Off</a> |
| var $bubbles = $('.bubbles'); | |
| function bubbles() { | |
| // Settings | |
| var min_bubble_count = 20, // Minimum number of bubbles | |
| max_bubble_count = 60, // Maximum number of bubbles | |
| min_bubble_size = 3, // Smallest possible bubble diameter (px) | |
| max_bubble_size = 12; // Maximum bubble blur amount (px) | |
| // Calculate a random number of bubbles based on our min/max | |
| var bubbleCount = min_bubble_count + Math.floor(Math.random() * (max_bubble_count + 1)); | |
| // Create the bubbles | |
| for (var i = 0; i < bubbleCount; i++) { | |
| $bubbles.append('<div class="bubble-container"><div class="bubble"></div></div>'); | |
| } | |
| // Now randomise the various bubble elements | |
| $bubbles.find('.bubble-container').each(function(){ | |
| // Randomise the bubble positions (0 - 100%) | |
| var pos_rand = Math.floor(Math.random() * 101); | |
| // Randomise their size | |
| var size_rand = min_bubble_size + Math.floor(Math.random() * (max_bubble_size + 1)); | |
| // Randomise the time they start rising (0-15s) | |
| var delay_rand = Math.floor(Math.random() * 16); | |
| // Randomise their speed (3-8s) | |
| var speed_rand = 3 + Math.floor(Math.random() * 9); | |
| // Random blur | |
| var blur_rand = Math.floor(Math.random() * 3); | |
| // Cache the this selector | |
| var $this = $(this); | |
| // Apply the new styles | |
| $this.css({ | |
| 'left' : pos_rand + '%', | |
| '-webkit-animation-duration' : speed_rand + 's', | |
| '-moz-animation-duration' : speed_rand + 's', | |
| '-ms-animation-duration' : speed_rand + 's', | |
| 'animation-duration' : speed_rand + 's', | |
| '-webkit-animation-delay' : delay_rand + 's', | |
| '-moz-animation-delay' : delay_rand + 's', | |
| '-ms-animation-delay' : delay_rand + 's', | |
| 'animation-delay' : delay_rand + 's', | |
| '-webkit-filter' : 'blur(' + blur_rand + 'px)', | |
| '-moz-filter' : 'blur(' + blur_rand + 'px)', | |
| '-ms-filter' : 'blur(' + blur_rand + 'px)', | |
| 'filter' : 'blur(' + blur_rand + 'px)', | |
| }); | |
| $this.children('.bubble').css({ | |
| 'width' : size_rand + 'px', | |
| 'height' : size_rand + 'px' | |
| }); | |
| }); | |
| } | |
| // In case users value their laptop battery life | |
| // Allow them to turn the bubbles off | |
| $('.bubble-toggle').click(function(){ | |
| if($bubbles.is(':empty')) { | |
| bubbles(); | |
| $bubbles.show(); | |
| $(this).text('Bubbles Off'); | |
| } else { | |
| $bubbles.fadeOut(function(){ | |
| $(this).empty(); | |
| }); | |
| $(this).text('Bubbles On'); | |
| } | |
| return false; | |
| }); | |
| bubbles(); |
| @import "compass/css3"; | |
| // Sass Mixins | |
| // Animation Mixin | |
| @mixin animate($animation, $duration, $repeat, $easing) { | |
| -webkit-animation: $animation $duration $repeat $easing; | |
| -moz-animation: $animation $duration $repeat $easing; | |
| -ms-animation: $animation $duration $repeat $easing; | |
| animation: $animation $duration $repeat $easing; | |
| } | |
| // Keyframes Mixin | |
| // https://gist.github.com/ericam/1607696 | |
| @mixin keyframes($name) { | |
| @-webkit-keyframes #{$name} { | |
| @content; | |
| } | |
| @-moz-keyframes #{$name} { | |
| @content; | |
| } | |
| @-ms-keyframes #{$name} { | |
| @content; | |
| } | |
| @keyframes #{$name} { | |
| @content; | |
| } | |
| } | |
| // Main Styles | |
| html, | |
| body { | |
| height: 100%; | |
| } | |
| body { | |
| background: #09f; | |
| @include background-image(linear-gradient(bottom, #09f, #45d1ff)); | |
| } | |
| .bubble-toggle { | |
| position: absolute; | |
| top: 10px; | |
| right: 10px; | |
| padding: 10px; | |
| background: rgba(255,255,255,0.5); | |
| font-family: sans-serif; | |
| font-size: 13px; | |
| color: #333; | |
| &:hover { | |
| background: rgba(255,255,255,0.75); | |
| } | |
| } | |
| // Bubble Styles | |
| .bubbles { | |
| position: relative; | |
| overflow: hidden; | |
| width: 100%; | |
| height: 100%; | |
| margin: 0 auto; | |
| } | |
| .bubble-container { | |
| position: absolute; | |
| bottom: 0; | |
| @include animate(bubblerise, 4s, infinite, ease-in); | |
| @include opacity(0); | |
| } | |
| .bubble { | |
| width: 6px; | |
| height: 6px; | |
| margin: 0 auto; | |
| border: 1px solid rgba(255,255,255,0.5); | |
| background: rgba(255,255,255,0.25); | |
| @include border-radius(10px); | |
| @include animate(bubblewobble, 0.4s, infinite, linear); | |
| } | |
| // Keyframe Animations | |
| @include keyframes(bubblerise) { | |
| 0% { | |
| bottom: 0; | |
| @include opacity(0); | |
| } | |
| 5% { | |
| bottom: 0; | |
| @include opacity(1); | |
| } | |
| 99% { | |
| @include opacity(1); | |
| } | |
| 100% { | |
| bottom: 100%; | |
| @include opacity(0); | |
| } | |
| } | |
| @include keyframes(bubblewobble) { | |
| 0% { | |
| margin-left: 0; | |
| } | |
| 50% { | |
| margin-left: 2px; | |
| } | |
| } |