次の説明は、Safariが「なぜ」それが何であるかを実行している理由に答えると思います
テストのためにSafariにアクセスすることはできませんが、perspective
プロパティの仕様(あなたが指しているのと同じ仕様ページ)を読んでいると、次のように述べられています。
'perspective'プロパティは、perspective()変換関数と同じ変換を適用しますが、要素自体の変換ではなく、要素の配置または変換された子にのみ適用される点が異なります。
上記の仕様の読み方に関する最新情報
'perspective'プロパティは、perspective()変換関数と同じ変換を適用します
transform: perspective(500px)
これは、この場合に適用されたかのように、パースペクティブ変換が実行されることを示しています。
ただし、要素の配置または変換された子にのみ適用されます
これは、パースペクティブ変換が子要素(この場合)に適用されることを示しています.face
。ここでは、あいまいさがいくつかあるようです。これは、子要素で別の変換が行われた場合にのみパースペクティブを適用する必要があるということですか?また、tranform-origin
プロパティは子に対して実行されている変換としてカウントされますか(特に、perspective
変換に直接関連するのはこの値であるため)?ブラウザが異なっているように見えるのは、このあいまいな点です。子要素がに設定されているため、 Safariはperspective
変換を実行していますが、他の要素は明らかにそうではありません(少なくとも、実際の他の要素がアニメーション中に何か他のことを行うまでは)。tranform-origin
-25px
transform
.face
要素自体の変換ではありません
これは、このプロパティからの変換がに影響を与えるのではなく、の子(つまり)に影響を与えるため、z=0
の.container
は無関係であることを示しています。.container
.container
.face
したがって、Safariは、を設定しているため、.face
常に変換が適用されているように見えます。したがって、子要素(この場合)には常に変換が適用されています。.container
-webkit-perspective: 500px;
perspective
.face
transform: perspective(500px)
アニメーションを削除して実際に適用すると、FirefoxまたはChromeで、Safariでコードを使用した.face
場合と同じ結果が表示されることに注意してください。
ですから、実際には、Safariは正しく機能している可能性がありますが、FirefoxとChromeはおそらくそうではありません。仕様にはあいまいさがあります。他の2つのブラウザは、Safariのようにベースのパースペクティブ変換をまだ適用しているはずです.container
が、確かにそうではないように見えますが、Safariは明らかにそうであるように見えます。
この問題を解消するには(「静止」時に「突き出て」いないようにするため)、おそらく次のことを行う必要があります。
- アニメーションの最初に自分自身をアニメーション化する(そして後で
transform-origin
リセットする)、または...0
- 「静止」時とアニメート時の
perspective
値自体をアニメートします。0
500px
私の推測では、#1の方が実装が簡単ですが、はっきりとはわかりません。