AngularJS:使用 ng-animate & ng-view,如何制作 3D 立方体旋转效果?

Posted

技术标签:

【中文标题】AngularJS:使用 ng-animate & ng-view,如何制作 3D 立方体旋转效果?【英文标题】:AngularJS: with ng-animate & ng-view, how to make a 3D cube rotation effect? 【发布时间】:2013-07-10 23:05:37 【问题描述】:

我正在尝试使用 ng-animate 和 ng-view 获得 3D 立方体效果动画。

当我切换到另一个页面时,我想感觉自己在一个立方体上旋转。 当我单击“转到第 2 页”时,实际的“第 1 页”将离开并向左旋转,“第 2 页”将从右侧到达。

我有一些东西正在接近,但 CSS 过渡非常脏,当我切换页面时,它们并没有“粘”在一起。

代码示例:http://jsfiddle.net/bnyJ6/

我试过这样:

HTML:

<style ng-bind-html-unsafe="style"></style>

<div class="cube container">
    <div ng-view ng-animate="enter: 'animate-enter', leave: 'animate-leave'" ></div>
</div>

<script type="text/ng-template" id="page1.html">
   <div class="container " >
        <div class="masthead">
            <h1 class="muted">PAGE 1</h1>

        <button class="btn display-button" ng-click="direction('front');go('/two')">Go Page 2</button>
        </div>
   </div>
</script>

<script type="text/ng-template" id="page2.html">
   <div class="container " >
        <div class="masthead">
            <h1 class="muted">PAGE 1</h1>
        <button  class="btn display-button" ng-click="direction('back');go('/one')"  >Go page 1</button>
        </div>
   </div>
</script>

Angular JS:

var app = angular.module('demo', []);

app.config(function ($routeProvider) 
  $routeProvider
  .when('/one', 
    templateUrl:'page1.html'
  )
  .when('/two', 
    templateUrl:'page2.html'
  )
  .otherwise(
    redirectTo:'/one'
  );
);

app.controller('MainCtrl', function($scope, $rootScope, $location) 
  $scope.go = function(path) 
    $location.path(path);
  
);

CSS3-Dirty- 动画:

.animation


    -webkit-perspective:2000px;
    -moz-perspective:2000px;
    -o-perspective: 2000px;
    perspective: 2000px;


.cube 

    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
    position: relative;




.animate-enter, 
.animate-leave  

    -webkit-transition: 3000ms linear all;
    -moz-transition: 3000ms linear all;
    -ms-transition: 3000ms linear all;
    -o-transition: 3000ms linear all;
    transition: 3000ms linear all;
    position: absolute;



.animate-enter 
    background-color:green;
    -webkit-transform: rotateY(   90deg ) translateZ(600px ) translateX(585px) ;
    -moz-transform: rotateY(   90deg )  translateZ(600px ) translateX(585px);
    -o-transform: rotateY(   90deg )  translateZ( 600px ) translateX(585px);
    transform: rotateY(   90deg )   translateZ( 600px) translateX(585px);

    opacity: 0;


.animate-enter.animate-enter-active
    background-color:yellow;

    -webkit-transform: rotateY(  0deg ) translateX(250px) translateZ(400px );
    -moz-transform: rotateY(  0deg ) translateX(250px) translateZ(400px );
    -o-transform: rotateY(  0deg )translateX(250px) translateZ(401px );
    transform: rotateY(  0deg )  translateX(250px) translateZ( 400px );
    opacity: 1;


.animate-leave 
    background-color:gray;
    -webkit-transform: rotateY(  -90deg ) translateZ( 361px );
    -moz-transform: rotateY(  -90deg ) translateZ( 361px );
    -o-transform: rotateY( -90deg) translateZ( 361px );
    transform: rotateY( -90deg) translateZ( 361px );
    opacity: 0;

你知道如何获得这个 3D Cube 效果动画吗?

感谢您提供的各种帮助。

【问题讨论】:

【参考方案1】:

我想把它扔进擂台:

http://jsfiddle.net/bnyJ6/1/

.animation
    -webkit-perspective:2000px;
    -moz-perspective:2000px;
    -o-perspective: 2000px;
    perspective: 2000px;


.cube 
    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
    position: relative;


.animate-enter, 
.animate-leave  
    -webkit-transition: 3000ms linear -webkit-transform, 3000ms linear opacity, 3000ms linear background-color;
    -moz-transition: 3000ms linear -moz-transform, 3000ms linear opacity, 3000ms linear background-color;
    -o-transition: 3000ms linear -o-transform, 3000ms linear opacity, 3000ms linear background-color;
    transition: 3000ms linear transform, 3000ms linear opacity, 3000ms linear background-color;
    position: absolute;


.animate-enter 
    background-color: green;

    -webkit-transform-origin: 0% 50%;
    -moz-transform-origin: 0% 50%;
    -o-transform-origin: 0% 50%;
    transform-origin: 0% 50%;

    -webkit-transform: translateX(100%) rotateY(90deg);
    -moz-transform: translateX(100%) rotateY(90deg);
    -o-transform: translateX(100%) rotateY(90deg);
    transform: translateX(100%) rotateY(90deg);

    opacity: 0;

.animate-enter.animate-enter-active 
    background-color: yellow;

    -webkit-transform: translateX(0%) rotateY(0deg);
    -moz-transform: translateX(0%) rotateY(0deg);
    -o-transform: translateX(0%) rotateY(0deg);
    transform: translateX(0%) rotateY(0deg);

    opacity: 1;


.animate-leave 
    -webkit-transform-origin: 100% 50%;
    -moz-transform-origin: 100% 50%;
    -o-transform-origin: 100% 50%;
    transform-origin: 100% 50%;

.animate-leave.animate-leave-active 
    background-color: gray;

    -webkit-transform: translateX(-100%) rotateY(-90deg);
    -moz-transform: translateX(-100%) rotateY(-90deg);
    -o-transform: translateX(-100%) rotateY(-90deg);
    transform: translateX(-100%) rotateY(-90deg);

    opacity: 0;

诀窍是将第一个元素的transform-origin 向右移动,第二个元素向左移动,这样两个元素都围绕同一个点进行变换,看起来好像它们是连接的。

为了让它最终工作,需要单独定位转换属性,否则它也会为transform-origin 属性设置动画,这看起来很时髦。有人会认为正确使用 setupactive 类为 NgAnimate 会阻止这种行为,但不幸的是它不会。我猜 Angular 在添加 active 类之前使用的延迟(当前为 1 毫秒)太短了。

ps。我猜你已经知道了,但这不兼容 IE。

【讨论】:

哇!!棒极了 !太感谢了 !!您的 cmets 非常有帮助!我找不到技巧和你解释它的方式,一切都变得清晰了!!【参考方案2】:

我刚刚修改了你的css...看看它是否看起来更好...可以进一步改进

http://jsfiddle.net/ctdrY/

修改类

    .animate-enter.animate-enter-active
    background-color:yellow;

    -webkit-transform: rotateY(  0deg ) translateX(50px) translateZ(400px );
    -moz-transform: rotateY(  0deg ) translateX(50px) translateZ(400px );
    -o-transform: rotateY(  0deg )translateX(50px) translateZ(401px );
    transform: rotateY(  0deg )  translateX(50px) translateZ( 400px );
    opacity: 1;

【讨论】:

以上是关于AngularJS:使用 ng-animate & ng-view,如何制作 3D 立方体旋转效果?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS ng-show 自动动画?

动画 ng-repeat 没有 ng-animate

带有 ng-class 指令的 ng-animate

Angular ng-animate 仅对数据更改进行动画处理

带有 Angular 1.x 和 ES5 的 Webpack

AngularJS 工具方法以及AngularJS中使用jQuery