Created
February 26, 2013 18:16
-
-
Save timsalazar/5040733 to your computer and use it in GitHub Desktop.
A CodePen by Hakim El Hattab. Kontext - A context-shift transition inspired by iOS.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <article class="kontext"> | |
| <div class="layer one show"> | |
| <h2>Kontext</h2> | |
| <p>A context-shift transition. Use the dots below or your keyoard arrows.</p> | |
| </div> | |
| <div class="layer two"> | |
| <h2>Layer Two</h2> | |
| </div> | |
| <div class="layer three"> | |
| <h2>Layer Three</h2> | |
| </div> | |
| </article> | |
| <ul class="bullets"></ul> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Create a new instance of kontext | |
| var k = kontext( document.querySelector( '.kontext' ) ); | |
| // Demo page JS | |
| var bulletsContainer = document.body.querySelector( '.bullets' ); | |
| // Create one bullet per layer | |
| for( var i = 0, len = k.getTotal(); i < len; i++ ) { | |
| var bullet = document.createElement( 'li' ); | |
| bullet.className = i === 0 ? 'active' : ''; | |
| bullet.setAttribute( 'index', i ); | |
| bullet.onclick = function( event ) { k.show( event.target.getAttribute( 'index' ) ) }; | |
| bullet.ontouchstart = function( event ) { k.show( event.target.getAttribute( 'index' ) ) }; | |
| bulletsContainer.appendChild( bullet ); | |
| } | |
| // Update the bullets when the layer changes | |
| k.changed.add( function( layer, index ) { | |
| var bullets = document.body.querySelectorAll( '.bullets li' ); | |
| for( var i = 0, len = bullets.length; i < len; i++ ) { | |
| bullets[i].className = i === index ? 'active' : ''; | |
| } | |
| } ); | |
| document.addEventListener( 'keyup', function( event ) { | |
| if( event.keyCode === 37 ) k.prev(); | |
| if( event.keyCode === 39 ) k.next(); | |
| }, false ); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| .kontext { | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .kontext .layer { | |
| position: absolute; | |
| width: 100%; | |
| height: 100%; | |
| top: 0; | |
| left: 0; | |
| visibility: hidden; | |
| /*box-shadow: 0px 0px 120px rgba( 0, 0, 0, 0.8 );*/ | |
| } | |
| .kontext .layer.show { | |
| visibility: visible; | |
| } | |
| .kontext.capable { | |
| -webkit-perspective: 1000px; | |
| -moz-perspective: 1000px; | |
| perspective: 1000px; | |
| -webkit-transform-style: preserve-3d; | |
| -moz-transform-style: preserve-3d; | |
| transform-style: preserve-3d; | |
| } | |
| .kontext.capable .layer { | |
| -webkit-transform: translateZ( -100px ); | |
| -moz-transform: translateZ( -100px ); | |
| transform: translateZ( -100px ); | |
| } | |
| .kontext.capable .layer.show { | |
| -webkit-transform: translateZ( 0px ); | |
| -moz-transform: translateZ( 0px ); | |
| transform: translateZ( 0px ); | |
| } | |
| .kontext.capable.animate .layer.show.right { | |
| -webkit-animation: show-right 1s forwards ease; | |
| -moz-animation: show-right 1s forwards ease; | |
| animation: show-right 1s forwards ease; | |
| } | |
| .kontext.capable.animate .layer.hide.right { | |
| -webkit-animation: hide-right 1s forwards ease; | |
| -moz-animation: hide-right 1s forwards ease; | |
| animation: hide-right 1s forwards ease; | |
| } | |
| .kontext.capable.animate .layer.show.left { | |
| -webkit-animation: show-left 1s forwards ease; | |
| -moz-animation: show-left 1s forwards ease; | |
| animation: show-left 1s forwards ease; | |
| } | |
| .kontext.capable.animate .layer.hide.left { | |
| -webkit-animation: hide-left 1s forwards ease; | |
| -moz-animation: hide-left 1s forwards ease; | |
| animation: hide-left 1s forwards ease; | |
| } | |
| /* CSS animation keyframes */ | |
| @-webkit-keyframes show-right { | |
| 0% { -webkit-transform: translateZ( -200px ); } | |
| 40% { -webkit-transform: translate( 40%, 0 ) scale( 0.8 ) rotateY( -20deg ); } | |
| 100% { -webkit-transform: translateZ( 0px ); } | |
| } | |
| @-webkit-keyframes hide-right { | |
| 0% { -webkit-transform: translateZ( 0px ); visibility: visible; } | |
| 40% { -webkit-transform: translate( -40%, 0 ) scale( 0.8 ) rotateY( 20deg ); } | |
| 100% { -webkit-transform: translateZ( -200px ); visibility: hidden; } | |
| } | |
| @-moz-keyframes show-right { | |
| 0% { -moz-transform: translateZ( -200px ); } | |
| 40% { -moz-transform: translate( 40%, 0 ) scale( 0.8 ) rotateY( -20deg ); } | |
| 100% { -moz-transform: translateZ( 0px ); } | |
| } | |
| @-moz-keyframes hide-right { | |
| 0% { -moz-transform: translateZ( 0px ); visibility: visible; } | |
| 40% { -moz-transform: translate( -40%, 0 ) scale( 0.8 ) rotateY( 20deg ); } | |
| 100% { -moz-transform: translateZ( -200px ); visibility: hidden; } | |
| } | |
| @keyframes show-right { | |
| 0% { transform: translateZ( -200px ); } | |
| 40% { transform: translate( 40%, 0 ) scale( 0.8 ) rotateY( -20deg ); } | |
| 100% { transform: translateZ( 0px ); } | |
| } | |
| @keyframes hide-right { | |
| 0% { transform: translateZ( 0px ); visibility: visible; } | |
| 40% { transform: translate( -40%, 0 ) scale( 0.8 ) rotateY( 20deg ); } | |
| 100% { transform: translateZ( -200px ); visibility: hidden; } | |
| } | |
| @-webkit-keyframes show-left { | |
| 0% { -webkit-transform: translateZ( -200px ); } | |
| 40% { -webkit-transform: translate( -40%, 0 ) scale( 0.8 ) rotateY( 20deg ); } | |
| 100% { -webkit-transform: translateZ( 0px ); } | |
| } | |
| @-webkit-keyframes hide-left { | |
| 0% { -webkit-transform: translateZ( 0px ); visibility: visible; } | |
| 40% { -webkit-transform: translate( 40%, 0 ) scale( 0.8 ) rotateY( -20deg ); } | |
| 100% { -webkit-transform: translateZ( -200px ); visibility: hidden; } | |
| } | |
| @-moz-keyframes show-left { | |
| 0% { -moz-transform: translateZ( -200px ); } | |
| 40% { -moz-transform: translate( -40%, 0 ) scale( 0.8 ) rotateY( 20deg ); } | |
| 100% { -moz-transform: translateZ( 0px ); } | |
| } | |
| @-moz-keyframes hide-left { | |
| 0% { -moz-transform: translateZ( 0px ); visibility: visible; } | |
| 40% { -moz-transform: translate( 40%, 0 ) scale( 0.8 ) rotateY( -20deg ); } | |
| 100% { -moz-transform: translateZ( -200px ); visibility: hidden; } | |
| } | |
| @keyframes show-left { | |
| 0% { transform: translateZ( -200px ); } | |
| 40% { transform: translate( -40%, 0 ) scale( 0.8 ) rotateY( 20deg ); } | |
| 100% { transform: translateZ( 0px ); } | |
| } | |
| @keyframes hide-left { | |
| 0% { transform: translateZ( 0px ); visibility: visible; } | |
| 40% { transform: translate( 40%, 0 ) scale( 0.8 ) rotateY( -20deg ); } | |
| 100% { transform: translateZ( -200px ); visibility: hidden; } | |
| } | |
| /* Dimmer */ | |
| .kontext .layer .dimmer { | |
| display: block; | |
| position: absolute; | |
| width: 100%; | |
| height: 100%; | |
| top: 0; | |
| left: 0; | |
| visibility: hidden; | |
| background: transparent; | |
| } | |
| .kontext.capable.animate .layer .dimmer { | |
| -webkit-transition: background 1s ease; | |
| -moz-transition: background 1s ease; | |
| transition: background 1s ease; | |
| } | |
| .kontext.capable.animate .layer.hide .dimmer { | |
| visibility: visible; | |
| background: rgba( 0, 0, 0, 0.7 ); | |
| } | |
| /* Styles for the demo */ | |
| html, | |
| body { | |
| width: 100%; | |
| height: 100%; | |
| padding: 0; | |
| margin: 0; | |
| overflow: hidden; | |
| } | |
| body { | |
| background-color: #222; | |
| background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGklEQVQIW2NkYGD4D8SMQAwGcAY2AbBKDBUAVuYCBQPd34sAAAAASUVORK5CYII=); | |
| background-repeat: repeat; | |
| font-family: Helvetica, sans-serif; | |
| font-size: 16px; | |
| color: #fff; | |
| } | |
| .layer { | |
| text-align: center; | |
| text-shadow: 1px 1px 0px rgba( 0, 0, 0, 0.1 ); | |
| } | |
| .layer h2 { | |
| position: relative; | |
| top: 20%; | |
| margin: 0; | |
| font-size: 6.25em; | |
| } | |
| .layer p { | |
| position: relative; | |
| top: 20%; | |
| margin: 0; | |
| } | |
| .layer.one { | |
| background: #dc6c5f; | |
| } | |
| .layer.two { | |
| background: #95dc84; | |
| } | |
| .layer.three { | |
| background: #64b9d2; | |
| } | |
| .bullets { | |
| position: absolute; | |
| width: 100%; | |
| bottom: 20px; | |
| padding: 0; | |
| margin: 0; | |
| text-align: center; | |
| } | |
| .bullets li { | |
| display: inline-block; | |
| width: 20px; | |
| height: 20px; | |
| border-radius: 50%; | |
| margin: 0 3px; | |
| background: rgba( 255, 255, 255, 0.5 ); | |
| box-shadow: 0px 0px 4px rgba( 0, 0, 0, 0.2 ); | |
| cursor: pointer; | |
| -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); | |
| } | |
| .bullets li:hover { | |
| background: rgba( 255, 255, 255, 0.8 ); | |
| } | |
| .bullets li.active { | |
| cursor: default; | |
| background: #fff; | |
| } | |
| @media screen and (max-width: 400px) { | |
| body { | |
| font-size: 12px; | |
| } | |
| .layer h2 { | |
| font-size: 5em; | |
| } | |
| .bullets li { | |
| margin: 0 6px; | |
| } | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment