其他代码

基于CSS3和GSAP的超酷盒子爆炸动画特效

阿里云


这是一款使用 GSAP 的 TweenMax.js 和 CSS3 来制作的效果炫酷的盒子爆炸动画特效。该爆炸动画在用户点击页面中的一个弹跳的盒子的时候,盒子会爆炸为烟雾,然后会出现 SVG Logo,整个效果非常连贯逼真。

HTML 结构

该盒子爆炸效果的 HTML 结构如下:div.-box 是一个立方体盒子,div.explode 用于制作爆炸的烟雾效果。svg.icon 则是最后出现的 SVG Logo。

也想出现在这里?联系我们
创客主机
  1. <div class="-content -index">
  2.   <div>
  3.     <div class="bounce-wrap">
  4.       <div class="bounce">
  5.         <div class="-shadow"></div>
  6.         <div class="-box-wrap js-box-wrap">
  7.           <div class="-box">
  8.             <div class="front wall"></div>
  9.             <div class="back wall"></div>
  10.             <div class="right wall"></div>
  11.             <div class="left wall"></div>
  12.  
  13.             <div class="front-right wall"></div>
  14.             <div class="front-left wall"></div>
  15.             <div class="back-right wall"></div>
  16.             <div class="back-left wall"></div>  
  17.           </div>
  18.         </div>
  19.         <div id="emitter"></div>
  20.         <div class="explode">
  21.           <span class="cloud -one js-cloud-1"></span>
  22.           <span class="cloud -two js-cloud-2"></span>
  23.           <span class="cloud -three js-cloud-3"></span>
  24.         </div>
  25.         <svg class="icon js-icon-logo" viewBox="0 0 162.5 47">
  26.           <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#logo_technology"></use>
  27.         </svg>
  28.       </div>
  29.     </div>
  30.       </div>
  31. </div>

CSS 样式

在 CSS 样式中,主要是制作盒子的立方体效果,以及使用 CSS3 帧动画来制作盒子的弹性和阴影动画效果。盒子的弹性和阴影动画效果。

  1. @-webkit-keyframes bounce {
  2.   0% {
  3.     -webkit-transform: translateY(0);
  4.             transform: translateY(0);
  5.   }
  6.   100% {
  7.     -webkit-transform: translateY(-25px);
  8.             transform: translateY(-25px);
  9.   }
  10. }
  11. @keyframes bounce {
  12.   0% {
  13.     -webkit-transform: translateY(0);
  14.             transform: translateY(0);
  15.   }
  16.   100% {
  17.     -webkit-transform: translateY(-25px);
  18.             transform: translateY(-25px);
  19.   }
  20. }
  21. @-webkit-keyframes shadow {
  22.   0% {
  23.     background: rgba(0, 0, 0, 0.5);
  24.     -webkit-transform: scale(0.75) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  25.             transform: scale(0.75) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  26.     box-shadow: 0 0 0px rgba(0, 0, 0, 0.6);
  27.   }
  28.   100% {
  29.     background: rgba(0, 0, 0, 0.15);
  30.     -webkit-transform: scale(1) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  31.             transform: scale(1) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  32.     box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
  33.   }
  34. }
  35. @keyframes shadow {
  36.   0% {
  37.     background: rgba(0, 0, 0, 0.5);
  38.     -webkit-transform: scale(0.75) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  39.             transform: scale(0.75) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  40.     box-shadow: 0 0 0px rgba(0, 0, 0, 0.6);
  41.   }
  42.   100% {
  43.     background: rgba(0, 0, 0, 0.15);
  44.     -webkit-transform: scale(1) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  45.             transform: scale(1) rotateX(75deg) rotateY(0deg) rotateZ(-45deg);
  46.     box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
  47.   }
  48. }

盒子的立方体效果:由于 IE 浏览器不支持 transform-style: preserve-3d;属性,所以在 IE 浏览器中看不到盒子的立体效果。

  1. .bounce .-box {
  2.   width: 32px;
  3.   height: 32px;
  4.   position: relative;
  5.   -webkit-transform-style: preserve-3d;
  6.           transform-style: preserve-3d;
  7.   -webkit-transform: rotateX(-14deg) rotateY(-45deg) rotateZ(0deg);
  8.           transform: rotateX(-14deg) rotateY(-45deg) rotateZ(0deg);
  9. }
  10. .bounce .-box .wall {
  11.   width: 32px;
  12.   height: 32px;
  13.   position: absolute;
  14.   -webkit-transition: all 1s ease-out;
  15.   transition: all 1s ease-out;
  16.   -webkit-backface-visibility: hidden;
  17.           backface-visibility: hidden;
  18. }
  19. .bounce .-box .front {
  20.   background: #f8f8fc;
  21.   -webkit-transform: rotateX(0deg) rotateY(0deg) translateZ(16px) rotateX(90deg);
  22.           transform: rotateX(0deg) rotateY(0deg) translateZ(16px) rotateX(90deg);
  23.   -webkit-transform-origin: 50% 100%;
  24.           transform-origin: 50% 100%;
  25.   height: 50%;
  26.   z-index: 1;
  27. }
  28. .bounce .-box .right {
  29.   height: 32px;
  30.   background: #f8f8fc;
  31.   -webkit-transform-style: preserve-3d;
  32.           transform-style: preserve-3d;
  33.   -webkit-transform: translateX(16px) rotateY(90deg) rotateX(90deg);
  34.           transform: translateX(16px) rotateY(90deg) rotateX(90deg);
  35.   -webkit-transform-origin: 50% 100%;
  36.           transform-origin: 50% 100%;
  37.   height: 50%;
  38.   z-index: 1;
  39. }
  40. .bounce .-box .back {
  41.   background: #f8f8fc;
  42.   -webkit-transform: rotateY(180deg) translateZ(16px) rotateX(90deg);
  43.           transform: rotateY(180deg) translateZ(16px) rotateX(90deg);
  44.   -webkit-transform-origin: 50% 100%;
  45.           transform-origin: 50% 100%;
  46.   height: 50%;
  47. }
  48. .bounce .-box .left {
  49.   background: #f8f8fc;
  50.   -webkit-transform: translateX(-16px) rotateY(-90deg) rotateX(90deg);
  51.           transform: translateX(-16px) rotateY(-90deg) rotateX(90deg);
  52.   -webkit-transform-origin: 50% 100%;
  53.           transform-origin: 50% 100%;
  54.   height: 50%;
  55. }
  56. .bounce .-box .front-left {
  57.   background: #d1d5e9;
  58.   height: 32px;
  59.   -webkit-transform: rotateX(0deg) rotateY(0deg) translateZ(16px) translateY(16px);
  60.           transform: rotateX(0deg) rotateY(0deg) translateZ(16px) translateY(16px);
  61.   -webkit-transform-origin: 50% 100%;
  62.           transform-origin: 50% 100%;
  63. }
  64. .bounce .-box .front-right {
  65.   background: #96a0ce;
  66.   height: 32px;
  67.   -webkit-transform: translateX(16px) rotateY(90deg) translateY(16px);
  68.           transform: translateX(16px) rotateY(90deg) translateY(16px);
  69.   -webkit-transform-origin: 50% 100%;
  70.           transform-origin: 50% 100%;
  71. }
  72. .bounce .-box .back-left {
  73.   background: #b0c2d6;
  74.   height: 32px;
  75.   -webkit-transform: rotateX(0deg) translateX(-16px) rotateY(-90deg) translateY(16px);
  76.           transform: rotateX(0deg) translateX(-16px) rotateY(-90deg) translateY(16px);
  77.   -webkit-transform-origin: 50% 100%;
  78.           transform-origin: 50% 100%;
  79. }
  80. .bounce .-box .back-right {
  81.   background: #8a9fb4;
  82.   height: 32px;
  83.   -webkit-transform: rotateX(0deg) rotateY(180deg) translateZ(16px) translateY(16px);
  84.           transform: rotateX(0deg) rotateY(180deg) translateZ(16px) translateY(16px);
  85.   -webkit-transform-origin: 50% 100%;
  86.           transform-origin: 50% 100%;
  87. }

JavaScript

该特性依赖于 GSAP 的 TweenMax.js,使用时需要将其引入。

  1. <script src="js/jquery.min.js"></script>
  2. <script src='http://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js'></script>

该盒子爆炸动画特性的主要 JS 代码如下:

  1. function init() {
  2.   var emitter = document.getElementById("emitter"),
  3.     container = document.createElement("div"),
  4.     emitterSize = 100,
  5.     dotQuantity = 50,
  6.     dotSizeMax = 100,
  7.     dotSizeMin = 10,
  8.     speed = 1,
  9.     gravity = 1;
  10.  
  11.   container.setAttribute("id", "emit-wrap");
  12.   //setup the container with the appropriate styles
  13.     container.style.cssText = "position:absolute; left:0; top:0; overflow:visible; z-index:5000; pointer-events:none;";
  14.   document.body.appendChild(container);
  15.  
  16.   function createExplosion(container) {
  17.     var tl = new TimelineLite({
  18.       onComplete: function() {
  19.         $('#emit-wrap').remove();
  20.       }
  21.     }),
  22.       angle, length, dot, i, size;
  23.     //create all the dots
  24.     for (i = 0; i < dotQuantity; i++) {
  25.       dot = document.createElement("div");
  26.       dot.className = "emitter-dot";
  27.       size = getRandom(dotSizeMin, dotSizeMax);
  28.       container.appendChild(dot);
  29.       angle = Math.random() * Math.PI * 2; 
  30.       length = Math.random() * (emitterSize / 2 - size / 2);
  31.       TweenLite.set(dot, {
  32.         x: Math.cos(angle) * length,
  33.         y: Math.sin(angle) * length,
  34.         width: size,
  35.         height: size,
  36.         xPercent: -50,
  37.         yPercent: -50,
  38.         force3D: true
  39.       });
  40.       //this is where we do the animation...
  41.       tl.to(dot, 1 + Math.random(), {
  42.         opacity: 0,
  43.         x: Math.cos(angle) * length * 24,
  44.         y: Math.sin(angle) * length * 24
  45.       }, 0);
  46.     }
  47.     return tl;
  48.   }
  49.  
  50.   function explode(element) {
  51.     var explosion = createExplosion(container);
  52.     // var bounds = element.getBoundingClientRect();
  53.  
  54.     var offset = $(element).offset();
  55.     var width = $(element).width();
  56.     var height = $(element).height();
  57.  
  58.     // TweenLite.set(container, {
  59.     //     x: bounds.left + bounds.width / 2,
  60.     //     y: bounds.top + bounds.height / 2
  61.     // });
  62.     TweenLite.set(container, {
  63.       x: offset.left + width / 2,
  64.       y: offset.top + height / 2
  65.     });
  66.     explosion.restart();
  67.   }
  68.  
  69.   function getRandom(min, max) {
  70.     return min + Math.random() * (max - min);
  71.   }
  72.  
  73.   emitter.onmousedown = emitter.ontouchstart = function() {
  74.     explode(emitter);
  75.     $(emitter).hide();
  76.  
  77.     $('.-shadow').hide();
  78.     $('.js-box-wrap').hide();
  79.     setTimeout(function(){
  80.       $('.js-trigger-reset').css({
  81.         'display': 'inline-block'
  82.       });
  83.     }, 2000);
  84.  
  85.  
  86.     var tl = new TimelineMax();
  87.     tl.add("logo")
  88.     .add(logoReveal,"logo");
  89.   }
  90. }
  91.  
  92. function logoReveal() {
  93.   var logoReveal = new TimelineMax();
  94.  
  95.     logoReveal.to('.js-icon-logo', 1, {autoAlpha: 1, ease: Power4.easeOut});
  96.  
  97.     return logoReveal;
  98. }
  99.  
  100. function reset() {
  101.   $('.-shadow').attr('style', '');
  102.   $('.js-box-wrap').attr('style', '');
  103.   $('.js-icon-logo').attr('style', '');
  104.   $('#emitter').attr('style', '');
  105.   $('.js-trigger-reset').hide();
  106. }
  107.  
  108. $(document).ready(function () {
  109.   init();
  110.   $('.js-trigger-reset').click(function() {
  111.     reset();
  112.     init();
  113.   });
  114. });

基于 CSS3 和 GSAP 的超酷盒子爆炸动画特效

已有 596 人购买
查看演示升级 VIP立刻购买

演示地址 下载地址
收藏
(1)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!