This pen is a fork of a codrops article (http://tympanus.net/codrops/2014/12/15/elastic-svg-elements/) that I'm testing for the use in a current project.
A Pen by John Choura Jr. on CodePen.
| <div class="container"> | |
| <div class="main"> | |
| <div class="content"> | |
| <nav id="menu" class="menu"> | |
| <div class="morph-shape" data-morph-open="M158.5,0H0v53.1c0,0,19.6-4.6,66-0.2s60.5-3.8,92.5-0.1V0z" data-morph-trans="M158.5,0H0v53.1c0,0,35.4,15.4,82,13.8s76.5-14.1,76.5-14.1V0z"> | |
| <svg width="100%" height="100%" viewBox="0 0 158.5 61.2" preserveAspectRatio="none"> | |
| <path fill="none" d="M158.5,0H0v55.6c20.9-12.8,38.5,19.5,73.5-1.9s73.2-7.2,85,0V0z" /> | |
| </svg> | |
| </div> | |
| <button class="menu__label"><i class="fa fa-fw fa-bars"></i><span>Open Menu</span></button> | |
| <ul class="menu__inner"> | |
| <li><a href="#"><i class="fa fa-fw fa-bookmark-o"></i><span>Reading List</span></a></li> | |
| <li><a href="#"><i class="fa fa-fw fa-hdd-o"></i><span>Saved Items</span></a></li> | |
| <li><a href="#"><i class="fa fa-fw fa-image"></i><span>All Media</span></a></li> | |
| <li><a href="#"><i class="fa fa-fw fa-heart-o"></i><span>Favorites</span></a></li> | |
| <li><a href="#"><i class="fa fa-fw fa-envelope-o"></i><span>Messages</span></a></li> | |
| <li><a href="#"><i class="fa fa-fw fa-bell-o"></i><span>Notifications</span></a></li> | |
| </ul> | |
| </nav> | |
| </div> | |
| </div><!-- /main --> | |
| </div><!-- /container --> |
This pen is a fork of a codrops article (http://tympanus.net/codrops/2014/12/15/elastic-svg-elements/) that I'm testing for the use in a current project.
A Pen by John Choura Jr. on CodePen.
| (function() { | |
| function SVGDDMenu( el, options ) { | |
| this.el = el; | |
| this.init(); | |
| } | |
| SVGDDMenu.prototype.init = function() { | |
| this.shapeEl = this.el.querySelector( 'div.morph-shape' ); | |
| var s = Snap( this.shapeEl.querySelector( 'svg' ) ); | |
| this.pathEl = s.select( 'path' ); | |
| this.paths = { | |
| reset : this.pathEl.attr( 'd' ), | |
| trans : this.shapeEl.getAttribute( 'data-morph-trans' ), | |
| open : this.shapeEl.getAttribute( 'data-morph-open' ) | |
| }; | |
| this.isOpen = false; | |
| this.initEvents(); | |
| }; | |
| SVGDDMenu.prototype.initEvents = function() { | |
| this.el.addEventListener( 'click', this.toggle.bind(this) ); | |
| // For Demo purposes only | |
| [].slice.call( this.el.querySelectorAll('a') ).forEach( function(el) { | |
| el.onclick = function() { return false; } | |
| } ); | |
| }; | |
| SVGDDMenu.prototype.toggle = function() { | |
| var self = this; | |
| if( this.isOpen ) { | |
| classie.remove( self.el, 'menu--open' ); | |
| self.pathEl.stop().animate( { 'path' : this.paths.reset }, 3000, mina.elastic ); | |
| } | |
| else { | |
| classie.add( self.el, 'menu--open' ); | |
| this.pathEl.stop().animate( { 'path' : this.paths.trans }, 320, mina.easeinout, function() { | |
| self.pathEl.stop().animate( { 'path' : self.paths.open }, 2500, mina.elastic ); | |
| } ); | |
| } | |
| this.isOpen = !this.isOpen; | |
| }; | |
| new SVGDDMenu( document.getElementById( 'menu' ) ); | |
| })(); |
| <script src="http://tympanus.net/Development/ElasticSVGElements/js/classie.js"></script> | |
| <script src="http://tympanus.net/Development/ElasticSVGElements/js/snap.svg-min.js"></script> |
| .menu { | |
| width: 300px; | |
| height: 70px; | |
| margin: 2em auto; | |
| position: relative; | |
| text-align: left; | |
| cursor: pointer; | |
| z-index: 100; | |
| } | |
| .menu__label { | |
| display: block; | |
| background: none; | |
| border: none; | |
| width: 100%; | |
| height: 70px; | |
| padding: 0 1.25em; | |
| font-size: 1.3em; | |
| color: #fff; | |
| position: relative; | |
| outline: none; | |
| text-align: left; | |
| -webkit-tap-highlight-color: rgba(0,0,0,0); | |
| -webkit-tap-highlight-color: transparent; /* For some Androids */ | |
| } | |
| .menu__inner li a span, | |
| .menu__label span { | |
| font-size: 0.68em; | |
| font-family: 'helvetica' sans; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| line-height: 1.2; | |
| font-weight: 600; | |
| } | |
| .menu .fa { | |
| vertical-align: top; | |
| line-height: 1.25; | |
| margin-right: 0.65em; | |
| font-size: 1.15em; | |
| } | |
| .menu__inner { | |
| list-style: none; | |
| padding: 0 1.25em; | |
| font-size: 1.3em; | |
| margin: 0; | |
| position: absolute; | |
| overflow: hidden; | |
| height: 0; | |
| -webkit-transition: height 0.5s cubic-bezier(0.7, 0, 0.3, 1); | |
| transition: height 0.5s cubic-bezier(0.7, 0, 0.3, 1); | |
| } | |
| .menu.menu--open .menu__inner { | |
| height: 310px; | |
| } | |
| .menu__inner li a { | |
| display: block; | |
| padding: 0.53em 0; | |
| line-height: 1.2; | |
| opacity: 0; | |
| color: rgba(0,0,0,.25); | |
| text-decoration: none; | |
| pointer-events: none; | |
| outline: none; | |
| -webkit-transform: translate3d(0, -20px, 0); | |
| transform: translate3d(0, -20px, 0); | |
| -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; | |
| transition: opacity 0.3s, transform 0.3s; | |
| } | |
| .menu__inner li a:hover { | |
| color: rgba(0,0,0,.75); | |
| } | |
| .menu--open .menu__inner li a { | |
| opacity: 1; | |
| pointer-events: auto; | |
| -webkit-transform: translate3d(0, 0, 0); | |
| transform: translate3d(0, 0, 0); | |
| } | |
| .menu--open .menu__inner li:nth-child(2) a { | |
| -webkit-transition-delay: 0.04s; | |
| transition-delay: 0.04s; | |
| } | |
| .menu--open .menu__inner li:nth-child(3) a { | |
| -webkit-transition-delay: 0.08s; | |
| transition-delay: 0.08s; | |
| } | |
| .menu--open .menu__inner li:nth-child(4) a { | |
| -webkit-transition-delay: 0.12s; | |
| transition-delay: 0.12s; | |
| } | |
| .menu--open .menu__inner li:nth-child(5) a { | |
| -webkit-transition-delay: 0.16s; | |
| transition-delay: 0.16s; | |
| } | |
| .menu--open .menu__inner li:nth-child(6) a { | |
| -webkit-transition-delay: 0.2s; | |
| transition-delay: 0.2s; | |
| } | |
| .morph-shape, | |
| .morph-shape svg { | |
| position: absolute; | |
| width: 100%; | |
| top: 0; | |
| left: 0; | |
| } | |
| .morph-shape { | |
| height: 70px; | |
| -webkit-transition: height 0.5s cubic-bezier(0.7, 0, 0.3, 1); | |
| transition: height 0.5s cubic-bezier(0.7, 0, 0.3, 1); | |
| overflow: visible; | |
| } | |
| .morph-shape svg { | |
| height: 100%; | |
| overflow: visible; | |
| } | |
| .menu.menu--open .morph-shape { | |
| height: 500px; | |
| } | |
| .menu.menu--open .morph-shape svg path { | |
| fill: gray; | |
| } | |
| .morph-shape svg path { | |
| fill: #00c3ff; | |
| -webkit-transition: fill 0.5s cubic-bezier(0.7, 0, 0.3, 1); | |
| transition: fill 0.5s cubic-bezier(0.7, 0, 0.3, 1); | |
| } |