2012-04-26 3 views
24

He estado construyendo un efecto de rotación de prisma usando transformaciones 3D. La propiedad transform-origin-z parecía ser la mejor para transformar las caras del prisma, pero Safari 5 y Mobile Safari inexplicablemente aumentan mi elemento, incluso cuando no se aplica ninguna transformación. Firefox 12 y Chrome 18 funcionan correctamente.¿Por qué se distorsiona el origen de transformación en Safari, iOS?

Live Demo

Full Prism Demo

estoy interesada en comprender por qué sucede esto. ¿Debo evitar por completo el transform-origin-z, o hay alguna solución alternativa para Safari y Mobile Safari?

Screen shot

<style> 
    /* other browser prefixes omitted for brevity */ 
    .container { 
    margin: 50px; 
    border: 2px solid #00f; 
    height: 50px; 
    -webkit-perspective: 500px; 
    } 
    .face { 
    height: 50px; 
    background-color: rgba(255,0,0,0.5); 
    -webkit-transform-origin: center center -25px; 
    -webkit-transform: translate3d(0,0,0); 
    } 
</style> 

<div class="container"> 
    <div class="face"></div> 
</div>​ 
+0

Solo para estar seguro de lo que quiere decir: es la pregunta, ¿qué hace el último '-25px' del valor en realidad? – Daniel

+1

No, entiendo lo que hace. No entiendo por qué se comporta incorrectamente en Safari o cómo solucionarlo. 'transform-origin' no debería tener ningún efecto cuando no se aplica transformación, de acuerdo con [la especificación] (http: // www.w3.org/TR/css3-3d-transforms/#transform-origin-property). – Matthew

+0

Al ver el mismo error con algunas transformaciones css 3d. – Gleno

Respuesta

11

Parece que esto es un error en Safari. Chrome mueve el centro de transformación sobre el eje Z, Safari abandona este centro tal como era, pero mueve el objeto sobre el eje Z. Por lo tanto, el objeto se amplió en Safari y parece más grande.

Evitaría el origen de la transformación (en el eje Z) por ahora y trabajaré con translate-Z para producir el mismo efecto.

Ejemplo:

http://jsfiddle.net/willemvb/GuhcC/3/

+1

Me encontré con el mismo problema. Tu ejemplo me ayudó mucho. Gracias. – Mathias

+4

El error ha sido reportado aquí: https://bugs.webkit.org/show_bug.cgi?id=88587 –

2

Creo que la siguiente explicación contesta el "por qué" Safari está haciendo lo que es

no tengo acceso a Safari para las pruebas, pero al leer las especificaciones para la perspective propiedad (the same spec page you point to), se indica:

los 'Perspectiv La propiedad e 'aplica la misma transformación que la función de transformación perspectiva(), excepto que solo aplica a los elementos secundarios del elemento posicionados o transformados, no a la transformación en el elemento mismo.


Actualización sobre la forma en que leí la especificación anterior

La propiedad 'perspectiva' se aplica la misma transformación como la perspectiva() función de transformación

Esto me dice una transformación de perspectiva se hará de la misma manera que si se aplicara transform: perspective(500px) en este caso.

excepto que se aplica sólo a los niños colocados o transformados del elemento

Esto me dice que la perspectiva de transformación se va a aplicar a elementos secundarios, en este caso .face. Aquí, parece haber algo de ambigüedad. ¿Esto significa que la perspectiva solo debe aplicarse si se realiza otra transformación en el elemento secundario? Y, ¿la propiedad tranform-origin cuenta como una transformación que se realiza al niño (especialmente dado que es este valor el que se relaciona directamente con la transformación perspective)? Es en este punto de ambigüedad donde los navegadores parecen diferir. Safari está haciendo la transformación perspective porque el elemento hijo tiene tranform-origin establecido en -25px, mientras que los demás aparentemente no (al menos, no hasta que el otro transform haga otra cosa al .face durante la animación).

no

a la transformación en el propio elemento

Esto me dice que la z=0 de .container es irrelevante, porque la transformación de esta propiedad no está afectando .container, sino más bien .container 's hijos (es decir .face)


Así Safari parece estar tomando la posición de que su .facesiempre tiene una transformación aplicada porque se ha configurado .container tener -webkit-perspective: 500px;, por lo que no es siempre una perspective transformar de ser aplicada a los elementos secundarios (.face en Tu caso).

Tenga en cuenta que si quita la animación y aplica un transform: perspective(500px) real al .face, tendrá see the same result in Firefox or Chrome as what you experience in Safari con su código.

Creo que en realidad, Safari puede estar haciéndolo correctamente, y quizás Firefox y Chrome no lo son. La especificación tiene cierta ambigüedad. Los otros dos navegadores tal vez deberían seguir aplicando la transformación de perspectiva basada en .container como lo hace Safari, pero parece que no lo es, mientras que Safari parece estarlo.

Para eliminar el problema (no tiene que "pegue" cuando "en reposo"), es probable que necesite

  1. Animación de la transform-origin sí al comienzo de la animación (y restablece a 0 después) , O ...
  2. animar el valor perspective a sí misma como 0 cuando "en reposo" y 500px cuando se animan.

Mi conjetura es # 1 será más fácil de implementar, pero no estoy seguro.

+0

No creo que sea eso. "Perspectiva" describe cómo la traducción a lo largo del eje Z sesga un elemento. No debería tener impacto si el elemento está sentado en el plano donde 'z = 0'. Una gran "perspectiva" es análoga a un teleobjetivo. – Matthew

+0

@ Matthew - Creo que no entendiste mi punto. No está sentado en un plano de 'z = 0' (estoy de acuerdo contigo en eso), está en un plano de' z = -25px' basado en '-webkit-transform-origin' en' .face', así que la llamada 'perspective' del elemento padre' 500px' está causando que '.face' se transforme en función de eso. El 'contenedor' puede estar en' z = 0' pero la 'perspectiva' no afecta al' contenedor' sino a los hijos del contenedor según la especificación. Y el niño tiene un valor 'z' distinto de cero. – ScottS

+0

@ Matthew - lo que es un poco ambiguo para mí con respecto a la especificación (y cuál puede ser el motivo de la diferencia en los navegadores) es si la 'perspectiva' debería aplicarse solo si hay otra transformación presente, o si de hecho debería hacer la 'perspective' transform en un elemento child si no hay otra transformación presente que no sea' z' shift. – ScottS

0

No sé por qué esto funcionó para mí. Parece que funciona en todos los navegadores. Básicamente, creo que estoy cancelando el efecto declaraciones css.

.container { 
    perspective: 500px; 
    transform-origin: 50% 50% 25px; 
} 
Cuestiones relacionadas