【问题标题】:CSS perspective with rotate & translate issue具有旋转和翻译问题的 CSS 透视图
【发布时间】:2014-01-19 04:45:07
【问题描述】:

我正在尝试制作一种仅使用 CSS 的幻灯片从一个内容部分到另一个内容部分的过渡。为了以一种有趣的方式这样做,我使用 CSS 的 perspectiverotateX 来实质上放置页面内容。然后我尝试使用translateY将内容滑向屏幕底部

另外,无论perspective 是什么,translateYrotateX 都可以完美运行。但是,当结合使用时,它仅适用于基于窗口大小和rotateY 值的某些perspectives

this jsFiddle 中,它可以在我尝试过的窗口大小中正常工作。问题是我希望perspective 的值更低,在250px 附近,但如果不破坏动画,我就无法这样做。

我尝试使用更高的rotateY 度而不是使perspective 更低,但出现了同样的问题

@keyframes slide {
  0% { transform: perspective(450px); }
  25% { transform: perspective(450px) rotateX(30deg); }
  50%,100% { transform: perspective(450px) rotateX(30deg) translateY(100%);  }
}

我已经在 FireFox 和 Chrome 中的 CSS Deck 和 jsFiddle 上对此进行了测试,这似乎是一个一致的问题

谁能告诉我发生这种情况的原因并提供解决方法?

【问题讨论】:

    标签: css rotation transform perspective


    【解决方案1】:

    仅比 myajouri 答案略有改进。

    至少在 Chrome 中,你可以写

    @-webkit-keyframes slide {
      0% { -webkit-transform: perspective(50vh); }
      10%,15% { -webkit-transform: perspective(50vh) rotateX(30deg) translateY(0%); }
      50%,100% { -webkit-transform: perspective(50vh) rotateX(30deg) translateY(100%);  }
    }
    

    将视角设置为视口高度应该比当前设置更具响应性

    demo

    (未在其他浏览器中测试)

    【讨论】:

    • 我一直在努力使用“vw”获得响应式 3D 形状的透视图,将其更改为“vh”是一个神奇的解决方案,所以如果其他人有类似的问题,因为出于某种原因,在响应式 3d 方面 vh 比 vw 效果更好!
    【解决方案2】:

    尝试将perspective 设置为父元素上的单独规则(而不是作为animationtransform 的一部分)。

    .parent {
        perspective: 250px;
    }
    
    @keyframes slide {
        25% { transform: rotateX(30deg); }
        50%, 100% { transform: rotateX(30deg) translateY(100%); }
    }
    

    更新小提琴: http://jsfiddle.net/myajouri/DYpnU/

    我的推理:

    1. perspective 在动画期间不会更改,因此将其作为动画的一部分毫无意义。

    2. 由于您的元素占据了父元素的 100% 区域,因此在父元素上设置 perspective 应该会产生与在元素本身(在 transform 内)设置相同的结果。

      李>
    3. 它似乎解决了你的问题(见上面的小提琴)。

    更新:经过更多的实验,我发现在动画中显式设置translateY(0)初始值也可以解决问题。

    @keyframes slide {
        0% { transform: perspective(150px); }
        25% { transform: perspective(150px) rotateX(30deg) translateY(0); }
        50%, 100% { transform: perspective(150px) rotateX(30deg) translateY(100%); }
    }
    

    更新小提琴: http://jsfiddle.net/myajouri/YJS3v/

    【讨论】:

    • 精彩的工作,+1!我能够使用这种方法获得the effect I want。我仍然很好奇为什么原始方法不起作用。有什么想法吗?
    • 我的想法是因为您的perspective 附加到元素本身,并且由于您的元素在动画期间改变了它的形状和位置,perspective-origin 也在移动并导致动画播放不同超出预期,尤其是当透视值太小时,这会加剧 3D 变换。
    • 但是为什么透视原点会跳到这么远的值,本质上是颠倒了动画的显示方式呢?我不明白它怎么会有这种能力
    • 刚刚用另一个解决方案更新了答案。我正在推理:P,很快就会更新。
    • 所以我没有明确的答案来解释为什么动画会这样播放。似乎在这方面起作用的事情是 1. 您的 translateY(100%) 可能是一个非常大的数字,具体取决于您的窗口大小,以及 2. 您使用的透视值很小,这意味着透视消失点离观察者很近,这意味着 CSS 变换效果会被加强。您可以尝试将框架/窗口尺寸减小到非常小的尺寸(这意味着较小的translateY(100%) 值),问题就会消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多