Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CSS3 - 3D Flip Animation - IE10 transform-origin: preserve-3d workaround

After looking through IE10's developer blog I have found that they do not support the preserve-3d setting.

They do offer a workaround, but I can not seem to get it working. My example below works in Safari, Chrome and Firefox but not IE10. If anyone could help me achieve this I would be very thankful.

The boxes should rotate around the Y axis on click to show some text and a green background color. This is not the case in IE10

My example: http://codepen.io/2ne/pen/zEpge

Part of code:

HTML

<div class="flip-wrapper">     <div class="front"></div>     <div class="back">IE10 SUCKS</div> </div> 

CSS

.flip-wrapper {     cursor: pointer;     height: 100%;     -moz-perspective: 1000;     -webkit-perspective: 1000;     -ms-perspective: 1000;     perspective: 1000;     -moz-transform-style: preserve-3d;     -webkit-transform-style: preserve-3d;     -ms-transform-style: preserve-3d;     transform-style: preserve-3d;     width: 100%; }  .flip-wrapper .front, .flip-wrapper .back {     -moz-backface-visibility: hidden;     -webkit-backface-visibility: hidden;     -ms-backface-visibility: hidden;     backface-visibility: hidden;     height: 100%;     position: absolute;     width: 100%; }  .flip-wrapper .back {   background: none repeat scroll 0 0 #298F68;     -webkit-transform: rotateY(180deg);     -moz-transform: rotateY(180deg);     transform: rotateY(180deg); }  .flip-wrapper.flipped {   cursor: default;   -webkit-animation: flip 500ms 1;     -moz-animation: flip 500ms 1;     animation: flip 500ms 1;     -webkit-animation-fill-mode: forwards;     -moz-animation-fill-mode: forwards;     -o-animation-fill-mode: forwards;     -ms-animation-fill-mode: forwards;     animation-fill-mode: forwards; } 

2ne

like image 625
2ne Avatar asked Nov 20 '12 13:11

2ne


2 Answers

I also couldn't seem to find a good example of this anywhere, so I spent some way too much time making my own.

This one works on all browsers, does not have that weird 360deg IE flip, and includes provision for static content (that lives on both sides of the card - which I needed to put a 'flip' button at the top right of both sides).

--I tested on latest versions of Chrome, Firefox, Safari, Opera, and IE.

http://jsfiddle.net/Tinclon/2ega7yLt/7/

Edit: Also works with transparent backgrounds: http://jsfiddle.net/Tinclon/2ega7yLt/8/

The css (of course) includes IE hacks, so it's a bit long, but the html is quite straightforward:

<div class="card">   <div class="content">     <div class="cardFront">FRONT CONTENT</div>     <div class="cardBack">BACK CONTENT</div>     <div class="cardStatic">STATIC CONTENT</div>   </div> </div> 

$('.card').hover(function(){$('.card').toggleClass('applyflip');}.bind(this)); 

.card {     perspective: 1000px;     -webkit-perspective: 1000px;     -moz-perspective: 1000px;     -o-perspective: 1000px;     -ms-perspective: 1000px;     margin:80px 150px;     width:320px;     height:243px;     vertical-align:top;     position:absolute;     display:block;     font-size:25px;     font-weight:bold; }  .card .content {     transition: 0.5s ease-out;     -webkit-transition: 0.5s ease-out;     -moz-transition: 0.5s ease-out;     -o-transition: 0.5s ease-out;     -ms-transition: 0.5s ease-out;     transform-style: preserve-3d;     -webkit-transform-style: preserve-3d;     -moz-transform-style: preserve-3d;     -o-transform-style: preserve-3d;     -ms-transform-style: preserve-3d;      /* content backface is visible so that static content still appears */     backface-visibility: visible;     -webkit-backface-visibility: visible;     -moz-backface-visibility: visible;     -o-backface-visibility: visible;     -ms-backface-visibility: visible;       border: 1px solid grey;     border-radius: 15px;     position:relative;     width: 100%;     height: 100%;  } .card.applyflip .content {     transform: rotateY(180deg);     -webkit-transform: rotateY(180deg);     -moz-transform: rotateY(180deg);     -o-transform: rotateY(180deg);     -ms-transform: rotateY(180deg); }   .card .content .cardStatic {     /* Half way through the card flip, rotate static content to 0 degrees */     transition: 0s linear 0.17s;     -webkit-transition: 0s linear 0.17s;     -moz-transition: 0s linear 0.17s;     -o-transition: 0s linear 0.17s;     -ms-transition: 0s linear 0.17s;     transform: rotateY(0deg);     -webkit-transform: rotateY(0deg);     -moz-transform: rotateY(0deg);     -o-transform: rotateY(0deg);     -ms-transform: rotateY(0deg);      text-align: center;     position: absolute;     top: 0;     left: 0;     height: 0;     width: 100%;     line-height:100px; }  .card.applyflip .content .cardStatic {     /* Half way through the card flip, rotate static content to -180 degrees -- to negate the flip and unmirror the static content */     transition: 0s linear 0.17s;     -webkit-transition: 0s linear 0.17s;     -moz-transition: 0s linear 0.17s;     -o-transition: 0s linear 0.17s;     -ms-transition: 0s linear 0.17s;     transform: rotateY(-180deg);     -webkit-transform: rotateY(-180deg);     -moz-transform: rotateY(-180deg);     -o-transform: rotateY(-180deg);     -ms-transform: rotateY(-180deg); }  .card .content .cardFront {     background-color: skyblue;     color: tomato; }  .card .content .cardBack {     background-color: tomato;     color: skyblue; }  .card .content .cardFront, .card .content .cardBack {     /* Backface visibility works great for all but IE. As such, we mark the backface visible in IE and manage visibility ourselves */     backface-visibility: hidden;     -webkit-backface-visibility: hidden;     -moz-backface-visibility: hidden;     -o-backface-visibility: hidden;     -ms-backface-visibility: visible;     position: absolute;     top: 0;     left: 0;     height: 100%;     width: 100%;     text-align: center;     line-height:200px;     border-radius: 14px; } .card .content .cardFront, .card.applyflip .content .cardFront {     transform: rotateY(0deg);     -webkit-transform: rotateY(0deg);     -moz-transform: rotateY(0deg);     -o-transform: rotateY(0deg);     -ms-transform: rotateY(0deg); }  .card .content .cardBack, .card.applyflip .content .cardBack {     transform: rotateY(-180deg);     -webkit-transform: rotateY(-180deg);     -moz-transform: rotateY(-180deg);     -o-transform: rotateY(-180deg);     -ms-transform: rotateY(-180deg); }  .card .content .cardFront, .card.applyflip .content .cardBack {     /* IE Hack. Halfway through the card flip, set visibility. Keep other browsers visible throughout the card flip. */     animation: stayvisible 0.5s both;     -webkit-animation: stayvisible 0.5s both;     -moz-animation: stayvisible 0.5s both;     -o-animation: stayvisible 0.5s both;     -ms-animation: donothing 0.5s;     -ms-transition: visibility 0s linear 0.17s;     visibility: visible; } .card.applyflip .content .cardFront, .card .content .cardBack {     /* IE Hack. Halfway through the card flip, set visibility. Keep other browsers visible throughout the card flip. */     animation: stayvisible 0.5s both;     -webkit-animation: stayvisible 0.5s both;     -moz-animation: stayvisible 0.5s both;     -o-animation: stayvisible 0.5s both;     -ms-animation: donothing 0.5s;     -ms-transition: visibility 0s linear 0.17s;     visibility: hidden; } @keyframes stayvisible { from { visibility: visible; } to { visibility: visible; } } @-webkit-keyframes stayvisible { from { visibility: visible; } to { visibility: visible; } } @-moz-keyframes stayvisible { from { visibility: visible; } to { visibility: visible; } } @-o-keyframes stayvisible { from { visibility: visible; } to { visibility: visible; } } @-ms-keyframes donothing { 0% { } 100% { } } 
like image 193
Tinclon Avatar answered Oct 09 '22 17:10

Tinclon


Here is a far simpler flip algorithm, which will also work in IE. https://jsfiddle.net/mff4jzd2/8/

JAVASCRIPT:

        var state = 0;          $('.container').on('click',function(){             if(state == 0){                  state = 1;                 $('.front').addClass('flip-front');                 $('.back').addClass('flip-back');              }             else{                  state = 0;                 $('.front').removeClass('flip-front');                 $('.back').removeClass('flip-back');              }            }); 

CSS:

    .container{          width:170px;         height:280px;         display:inline-block;         position:relative;         transform: perspective(400px);         cursor:pointer;      }     .front{          position:absolute;         top:0;         left:0;         width:100%;         height:100%;         background-color:blue;                 transform: perspective(400px) rotateY(0deg);                 backface-visibility: hidden;         transition: 1.0s;         opacity:1;         box-shadow: 0 8px 6px -6px black;     }     .back{          position:absolute;         top:0;         left:0;         width:100%;         height:100%;         background-color:green;                transform: perspective(400px) rotateY(-180deg);                  backface-visibility: hidden;         transition: 1.0s;         opacity:0;         box-shadow: 0 8px 6px -6px black;     }            .flip-front{         opacity:0;         transform: perspective(400px) rotateY(180deg);      }     .flip-back{          opacity:1;            transform: perspective(400px) rotateY(0deg);     }    

HTML:

<div class="container">      <div class="back"></div>     <div class="front"></div>  </div> 
like image 41
MarzSocks Avatar answered Oct 09 '22 16:10

MarzSocks