CSS 3D:rotateY translateX使元素在Firefox中闪烁

前端之家收集整理的这篇文章主要介绍了CSS 3D:rotateY translateX使元素在Firefox中闪烁前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在一些元素上实现“房间”三维旋转;实现它变换:translateX(-100%)rotateY(90deg)和它的相反过渡使用.它在Chrome中运行良好,但在Firefox(最高版本为34)中,元素在转换过程中会闪烁.他们可以暂时这样做,已经走了一半,或完全消失.

我注意到的是:如果父级的透视CSS值高于所讨论元素的计算宽度 – 过渡进展顺利.如果观点真的是罪魁祸首,那么我不理解这种行为的本质;规范说,如果所有点的Z轴值低于透视值,则不绘制元素.在过渡期间,至少应该至少部分可见.

应该注意的是,只有rotateY似乎有问题 – 而不是rorateX.

这是代码示例. html:

  1. <div class="cont">
  2. <div id="bg-club" class="background club"></div>
  3. <div id="bg-cafe" class="background cafe active"></div>
  4. <div id="bg-fitness" class="background fitness"></div>
  5. <div id="bg-resto" class="background resto"></div>
  6. <div id="bg-lady" class="background lady"></div>
  7. </div>

CSS(为方便起见,删除了前缀规则):

  1. .cont{
  2. position:absolute;
  3. top:0;
  4. right:0;
  5. bottom:0;
  6. left:0;
  7. z-index:1;
  8. overflow:hidden;
  9.  
  10. perspective:1000px;
  11. transform-style:preserve-3d;
  12. }
  13. .background.active{
  14. visibility:visible;
  15. z-index:1;
  16. }
  17. .background{
  18. position:absolute;
  19. top:50px;
  20. right:50px;
  21. bottom:50px;
  22. left:50px;
  23. z-index:10;
  24.  
  25. backface-visibility: hidden;
  26. transform: translate3d(0,0);
  27. transform-style: preserve-3d;
  28.  
  29. visibility:hidden;
  30. overflow:hidden;
  31.  
  32. background-repeat:no-repeat;
  33. background-position:center center;
  34. background-size:cover;
  35. }
  36. .background.cafe{background-color:#987071;}
  37. .background.club{background-color:#a3367f}
  38. .background.fitness{background-color:#79728b;}
  39. .background.lady{background-color:#a6160e;}
  40. .background.resto{background-color:#712912;}
  41. .rotateRoomLeftOut {
  42. transform-origin: 100% 50%;
  43. animation: rotateRoomLeftOut 4s both ease;
  44. }
  45. .rotateRoomLeftIn {
  46. transform-origin: 0% 50%;
  47. animation: rotateRoomLeftIn 4s both ease;
  48. }
  49.  
  50. @keyframes rotateRoomLeftOut {
  51. to { opacity: .3; transform: translateX(-100%) rotateY(90deg); }
  52. }
  53. @keyframes rotateRoomLeftIn {
  54. from { opacity: .3; transform: translateX(100%) rotateY(-90deg); }
  55. }

这里是the fiddle.按1-5黄色框我们激活相应的背景动画.这里的透视图是1000px,因此可以通过调整窗口大小来实现不希望的效果.

另一个例子是this great set of page 3D transitions.只需导航到Rotate-> Room-> Room to Left或Right.

编辑

似乎Firefox只使那些元素闪烁,其相应的维度(RotateY的宽度或rotateX的高度)大于父级的透视图.我还没想到,为什么会发生这种情况,但到目前为止最简单,最直接的解决方案是将上述视角设置得大于元素的维度.在我的情况下,对于FF 19或其他方式,它将是100vw(或覆盖两个旋转尺寸的100vmax).

更新的代码段:

  1. $(document).ready(function(){
  2. var generalEvtAffix = '.hotdot',bodyEl = $('body'),pageContents = $('.sidebar,.center-block'),tabsSel = $('.areas [data-toggle="tab"]');
  3. // Анимация фонов на главной
  4. var bgs = $('.background');
  5. $('.areas [data-toggle="tab"]').on('click'+generalEvtAffix,function(event){
  6. event.preventDefault();
  7. var thisLink = $(this);
  8. /* Если уже активен или анимация всё ещё не закончена,ничего не делаем */
  9. if(thisLink.parent().hasClass('active') || bgs.hasClass('animated'))
  10. return;
  11. var bg = $('#bg-'+this.getAttribute('data-bg')),bgActive = $('.background.active');
  12. /* Случайным образом определяем направление анимации. */
  13. var animationDirs = ["Left"/*,"Top","Right","Bottom" */],animationDirection = animationDirs[Math.floor(Math.random() * (animationDirs.length) + 0)];
  14. /* - отключаем клик по ссылке на направлении - чтобы временно заблокировать переключение вкладок */
  15. tabsSel.on('click'+generalEvtAffix+'.clicked',function(e){
  16. e.preventDefault();
  17. return false;
  18. });
  19. bgActive.addClass('animated rotateRoom'+animationDirection+'Out')
  20. .on('animationend.homepage-area-click webkitAnimationEnd.homepage-area-click',function(){
  21. /* По окончании анимации "Прочь" прошлого активного элемента скрываем его */
  22. $(this).removeClass('animated active rotateRoom'+animationDirection+'Out')
  23. .off('animationend.homepage-area-click webkitAnimationEnd.homepage-area-click');
  24. });
  25. bg.addClass('animated active rotateRoom'+animationDirection+'In')
  26. .on('animationend.homepage-area-click webkitAnimationEnd.homepage-area-click',function(event){
  27. /* По окончании анимации обратно включаем клик. */
  28. console.log(event);
  29. $(this).removeClass('animated rotateRoom'+animationDirection+'In')
  30. .off('animationend.homepage-area-click webkitAnimationEnd.homepage-area-click');;
  31. tabsSel.off('click'+generalEvtAffix+'.clicked');
  32. });
  33. });
  34. });
  1. .cont{
  2. position:absolute;
  3. top:0;
  4. right:0;
  5. bottom:0;
  6. left:0;
  7. z-index:1;
  8. overflow:hidden;
  9. -webkit-perspective:1000px;
  10. -moz-perspective:1000px;
  11. perspective:1000px;
  12. -webkit-transform-style:preserve-3d;
  13. -moz-transform-style:preserve-3d;
  14. transform-style:preserve-3d;
  15. }
  16. @-moz-document url-prefix(){
  17. .cont{
  18. perspective:100vw;
  19. }
  20. }
  21. .background.active{
  22. visibility:visible;
  23. z-index:1;
  24. }
  25. .background{
  26. position:absolute;
  27. top:50px;
  28. right:50px;
  29. bottom:50px;
  30. left:50px;
  31. z-index:10;
  32. -webkit-backface-visibility: hidden;
  33. -moz-backface-visibility: hidden;
  34. backface-visibility: hidden;
  35. -webkit-transform: translate3d(0,0);
  36. -moz-transform: translate3d(0,0);
  37. transform: translate3d(0,0);
  38. -webkit-transform-style: preserve-3d;
  39. -moz-transform-style: preserve-3d;
  40. transform-style: preserve-3d;
  41. visibility:hidden;
  42. overflow:hidden;
  43. background-repeat:no-repeat;
  44. background-position:center center;
  45. background-size:cover;
  46. }
  47. .background.cafe{
  48. background-color:#987071;
  49. }
  50. .background.club{
  51. background-color:#a3367f
  52. }
  53. .background.fitness{
  54. background-color:#79728b;
  55. }
  56. .background.lady{
  57. background-color:#a6160e;
  58. }
  59. .background.resto{
  60. background-color:#712912;
  61. }
  62. /* Классы анимации фона типа "Room" */
  63. .rotateRoomLeftOut {
  64. -webkit-transform-origin: 100% 50%;
  65. -webkit-animation: rotateRoomLeftOut 4s both ease;
  66. -moz-transform-origin: 100% 50%;
  67. -moz-animation: rotateRoomLeftOut 4s both ease;
  68. transform-origin: 100% 50%;
  69. animation: rotateRoomLeftOut 4s both ease;
  70. }
  71. .rotateRoomLeftIn {
  72. -webkit-transform-origin: 0% 50%;
  73. -webkit-animation: rotateRoomLeftIn 4s both ease;
  74. -moz-transform-origin: 0% 50%;
  75. -moz-animation: rotateRoomLeftIn 4s both ease;
  76. transform-origin: 0% 50%;
  77. animation: rotateRoomLeftIn 4s both ease;
  78. }
  79. /* Описание анимаций */
  80.  
  81. @-webkit-keyframes rotateRoomLeftOut {
  82. to { opacity: .3; -webkit-transform: translateX(-100%) rotateY(90deg); }
  83. }
  84. @-moz-keyframes rotateRoomLeftOut {
  85. to { opacity: .3; -moz-transform: translateX(-100%) rotateY(90deg); }
  86. }
  87. @keyframes rotateRoomLeftOut {
  88. to { opacity: .3; transform: translateX(-100%) rotateY(90deg); }
  89. }
  90.  
  91. @-webkit-keyframes rotateRoomLeftIn {
  92. from { opacity: .3; -webkit-transform: translateX(100%) rotateY(-90deg); }
  93. }
  94. @-moz-keyframes rotateRoomLeftIn {
  95. from { opacity: .3; -moz-transform: translateX(100%) rotateY(-90deg); }
  96. }
  97. @keyframes rotateRoomLeftIn {
  98. from { opacity: .3; transform: translateX(100%) rotateY(-90deg); }
  99. }
  100. .areas{
  101. list-style:none;
  102. position:relative;z-index:1000;
  103. }
  104. .areas li a{
  105. display:block;
  106. width:20px;
  107. height:20px;
  108. background:yellow;
  109. margin:5px;
  110. color:black;
  111. }
  1. <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  2. <div class="cont">
  3. <div id="bg-club" class="background club"></div>
  4. <div id="bg-cafe" class="background cafe active"></div>
  5. <div id="bg-fitness" class="background fitness"></div>
  6. <div id="bg-resto" class="background resto"></div>
  7. <div id="bg-lady" class="background lady"></div>
  8. </div>
  9.  
  10. <ul class="areas text-center content-section">
  11. <li><a href="#club" class="club" data-target="[data-tab='club']" data-bg="club" data-toggle="tab">1</a>
  12. </li><li class="active"><a href="#cafe" class="cafe" data-target="[data-tab='cafe']" data-bg="cafe" data-toggle="tab">2</a>
  13. </li><li><a href="#fitness" class="fitness" data-target="[data-tab='fitness']" data-bg="fitness" data-toggle="tab">3</a>
  14. </li><li><a href="#resto" class="resto" data-target="[data-tab='resto']" data-bg="resto" data-toggle="tab">4</a>
  15. </li><li><a href="#lady" class="lady" data-target="[data-tab='lady']" data-bg="lady" data-toggle="tab">5</a>
  16. </li>
  17. </ul>

仍然期待这种行为背后的原因.

解决方法

我相信它闪烁的原因是因为Mozilla正在检测对象是不可见的.
如果你的视角是1000px,宽度为1100px的东西旋转,那么元素的边缘将在你身后传递并离开视图,mozilla可能会将其视为“不渲染”

我能为一致视图提供的唯一解决方案是将视角设置为100vw,以确保您的视角总是在屏幕宽度范围内

猜你在找的CSS相关文章