A hover effect using the gooey tricks (thanks to http://tympanus.net/codrops/2015/03/10/creative-gooey-effects/). Built for dribbble shot here https://dribbble.com/shots/2544738-Not-your-average-button
A Pen by Adrien Grsmto on CodePen.
| <div> | |
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="goo"> | |
| <defs> | |
| <filter id="goo"> | |
| <feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur" /> | |
| <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9" result="goo" /> | |
| <feComposite in="SourceGraphic" in2="goo"/> | |
| </filter> | |
| </defs> | |
| </svg> | |
| <span class="button--bubble__container"> | |
| <a href="#campaign" class="button button--bubble"> | |
| Hover me | |
| </a> | |
| <span class="button--bubble__effect-container"> | |
| <span class="circle top-left"></span> | |
| <span class="circle top-left"></span> | |
| <span class="circle top-left"></span> | |
| <span class="button effect-button"></span> | |
| <span class="circle bottom-right"></span> | |
| <span class="circle bottom-right"></span> | |
| <span class="circle bottom-right"></span> | |
| </span> | |
| </span> | |
| </div> |
| $('.button--bubble').each(function() { | |
| var $circlesTopLeft = $(this).parent().find('.circle.top-left'); | |
| var $circlesBottomRight = $(this).parent().find('.circle.bottom-right'); | |
| var tl = new TimelineLite(); | |
| var tl2 = new TimelineLite(); | |
| var btTl = new TimelineLite({ paused: true }); | |
| tl.to($circlesTopLeft, 1.2, { x: -25, y: -25, scaleY: 2, ease: SlowMo.ease.config(0.1, 0.7, false) }); | |
| tl.to($circlesTopLeft.eq(0), 0.1, { scale: 0.2, x: '+=6', y: '-=2' }); | |
| tl.to($circlesTopLeft.eq(1), 0.1, { scaleX: 1, scaleY: 0.8, x: '-=10', y: '-=7' }, '-=0.1'); | |
| tl.to($circlesTopLeft.eq(2), 0.1, { scale: 0.2, x: '-=15', y: '+=6' }, '-=0.1'); | |
| tl.to($circlesTopLeft.eq(0), 1, { scale: 0, x: '-=5', y: '-=15', opacity: 0 }); | |
| tl.to($circlesTopLeft.eq(1), 1, { scaleX: 0.4, scaleY: 0.4, x: '-=10', y: '-=10', opacity: 0 }, '-=1'); | |
| tl.to($circlesTopLeft.eq(2), 1, { scale: 0, x: '-=15', y: '+=5', opacity: 0 }, '-=1'); | |
| var tlBt1 = new TimelineLite(); | |
| var tlBt2 = new TimelineLite(); | |
| tlBt1.set($circlesTopLeft, { x: 0, y: 0, rotation: -45 }); | |
| tlBt1.add(tl); | |
| tl2.set($circlesBottomRight, { x: 0, y: 0 }); | |
| tl2.to($circlesBottomRight, 1.1, { x: 30, y: 30, ease: SlowMo.ease.config(0.1, 0.7, false) }); | |
| tl2.to($circlesBottomRight.eq(0), 0.1, { scale: 0.2, x: '-=6', y: '+=3' }); | |
| tl2.to($circlesBottomRight.eq(1), 0.1, { scale: 0.8, x: '+=7', y: '+=3' }, '-=0.1'); | |
| tl2.to($circlesBottomRight.eq(2), 0.1, { scale: 0.2, x: '+=15', y: '-=6' }, '-=0.2'); | |
| tl2.to($circlesBottomRight.eq(0), 1, { scale: 0, x: '+=5', y: '+=15', opacity: 0 }); | |
| tl2.to($circlesBottomRight.eq(1), 1, { scale: 0.4, x: '+=7', y: '+=7', opacity: 0 }, '-=1'); | |
| tl2.to($circlesBottomRight.eq(2), 1, { scale: 0, x: '+=15', y: '-=5', opacity: 0 }, '-=1'); | |
| tlBt2.set($circlesBottomRight, { x: 0, y: 0, rotation: 45 }); | |
| tlBt2.add(tl2); | |
| btTl.add(tlBt1); | |
| btTl.to($(this).parent().find('.button.effect-button'), 0.8, { scaleY: 1.1 }, 0.1); | |
| btTl.add(tlBt2, 0.2); | |
| btTl.to($(this).parent().find('.button.effect-button'), 1.8, { scale: 1, ease: Elastic.easeOut.config(1.2, 0.4) }, 1.2); | |
| btTl.timeScale(2.6); | |
| $(this).on('mouseover', function() { | |
| btTl.restart(); | |
| }); | |
| }); |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/CSSPlugin.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/easing/EasePack.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenLite.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TimelineLite.min.js"></script> |
| $dark-blue: #222; | |
| $green: #90feb5; | |
| $action-color: $green; | |
| * { | |
| box-sizing: border-box; | |
| } | |
| div{ | |
| display: block; | |
| height: 100%; | |
| animation: hue-rotate 10s linear infinite; | |
| } | |
| .button { | |
| -webkit-font-smoothing: antialiased; | |
| background-color: $dark-blue; | |
| border: none; | |
| color: #fff; | |
| display: inline-block; | |
| font-family: 'Montserrat', sans-serif; | |
| font-size: 14px; | |
| font-weight: 100; | |
| text-decoration: none; | |
| user-select: none; | |
| letter-spacing: 1px; | |
| color: white; | |
| padding: 20px 40px; | |
| text-transform: uppercase; | |
| transition: all 0.1s ease-out; | |
| &:hover { | |
| background-color: $action-color; | |
| color: #fff; | |
| } | |
| &:active { | |
| transform: scale(0.95); | |
| } | |
| &--bubble { | |
| position: relative; | |
| z-index: 2; | |
| color: white; | |
| background: none; | |
| &:hover { | |
| background: none; | |
| } | |
| &:hover + .button--bubble__effect-container .circle { | |
| background: darken($action-color, 15%); | |
| } | |
| &:hover + .button--bubble__effect-container .button { | |
| background: darken($action-color, 15%); | |
| } | |
| &:active + .button--bubble__effect-container { | |
| transform: scale(0.95); | |
| } | |
| &__container { | |
| position: relative; | |
| display: inline-block; | |
| .effect-button { | |
| position: absolute; | |
| width: 50%; | |
| height: 25%; | |
| top: 50%; | |
| left: 25%; | |
| z-index: 1; | |
| transform: translateY(-50%); | |
| background: $dark-blue; | |
| transition: background 0.1s ease-out; | |
| } | |
| } | |
| } | |
| } | |
| .button--bubble__effect-container { | |
| position: absolute; | |
| display: block; | |
| width: 200%; | |
| height: 400%; | |
| top: -150%; | |
| left: -50%; | |
| -webkit-filter: url("#goo"); | |
| filter: url("#goo"); | |
| transition: all 0.1s ease-out; | |
| pointer-events: none; | |
| .circle { | |
| position: absolute; | |
| width: 25px; | |
| height: 25px; | |
| border-radius: 15px; | |
| background: $dark-blue; | |
| transition: background 0.1s ease-out; | |
| &.top-left { | |
| top: 40%; | |
| left: 27%; | |
| } | |
| &.bottom-right { | |
| bottom: 40%; | |
| right: 27%; | |
| } | |
| } | |
| } | |
| .goo { | |
| position: absolute; | |
| visibility: hidden; | |
| width: 1px; | |
| height: 1px; | |
| } | |
| html, body { | |
| width: 100%; | |
| height: 100%; | |
| text-align: center; | |
| } | |
| .button--bubble__container { | |
| top: 50%; | |
| margin-top: -25px; | |
| } | |
| @keyframes hue-rotate { | |
| from { | |
| -webkit-filter: hue-rotate(0); | |
| -moz-filter: hue-rotate(0); | |
| -ms-filter: hue-rotate(0); | |
| filter: hue-rotate(0); | |
| } | |
| to { | |
| -webkit-filter: hue-rotate(360deg); | |
| -moz-filter: hue-rotate(360deg); | |
| -ms-filter: hue-rotate(360deg); | |
| filter: hue-rotate(360deg); | |
| } | |
| } |