¿Cómo mantener el origen en el centro de la imagen en la animación a escala?
Tengo una situación similar a esta violín , donde tengo una animación CSS3 que escala un elemento en posición absoluta en el centro de otro elemento. Sin embargo, cuando se produce la animación, está descentrada, como se ve en los cuadrados rojos en relación con el azul en el ejemplo. ¿Cómo lo centro? Probé un par de configuraciones en la transform-origin
propiedad, pero no produjo los resultados correctos.
@keyframes ripple_large {
0% {transform:scale(1); }
75% {transform:scale(3); opacity:0.4;}
100% {transform:scale(4); opacity:0;}
}
.container {
position: relative;
display: inline-block;
margin: 10vmax;
}
.cat {
height: 20vmax;
}
.center-point {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 10px;
width: 10px;
background: blue;
}
.to-animate {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid red;
height: 5vmax;
width: 5vmax;
transform-origin:center;
}
.one {
animation: ripple_large 2s linear 0s infinite;
}
.two {
animation: ripple_large 2s linear 1s infinite;
}
<div class='container'>
<img src='http://www.catster.com/wp-content/uploads/2017/08/Pixiebob-cat.jpg' class='cat'>
<div class='center-point'>
</div>
<div class='to-animate one'></div>
<div class='to-animate two'></div>
</div>
El problema es que estás anulando la translate
transformación.
Cuando especificas una nueva transformación (la que está dentro de la animación), anula la primera. En su caso, está eliminando la traducción que está arreglando la alineación central .
Debe agregarlos a la misma transform
propiedad y prestar atención al orden porque es importante (¿ Por qué importa el orden de las transformaciones? rotar/escalar no da el mismo resultado que escalar/rotar )
@keyframes ripple_large {
0% {
transform: translate(-50%, -50%) scale(1);
}
75% {
transform: translate(-50%, -50%) scale(3);
opacity: 0.4;
}
100% {
transform: translate(-50%, -50%) scale(4);
opacity: 0;
}
}
.container {
position: relative;
display: inline-block;
margin: 10vmax;
}
.cat {
height: 20vmax;
}
.center-point {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 10px;
width: 10px;
background: blue;
transform-origin: center;
}
.to-animate {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid red;
height: 5vmax;
width: 5vmax;
}
.one {
-webkit-animation: ripple_large 2s linear 0s infinite;
animation: ripple_large 2s linear 0s infinite;
}
.two {
-webkit-animation: ripple_large 2s linear 1s infinite;
animation: ripple_large 2s linear 1s infinite;
}
<div class='container'>
<img src='http://www.catster.com/wp-content/uploads/2017/08/Pixiebob-cat.jpg' class='cat'>
<div class='center-point'>
</div>
<div class='to-animate one'></div>
<div class='to-animate two'></div>
</div>
ACTUALIZAR
Como se comentó, es mejor centrar su elemento usando otro método que no sea la traducción para evitar cambiar la animación, ya que se puede usar con otros elementos.
Ejemplo:
Mostrar fragmento de código
Al utilizar una propiedad de transformacióntransform: scale(1);
ya definida, perderá (anulará) la traducción solo con escala .transform: translate(-50%, -50%);
Cualquiera
- repetir el me gusta deseado
transform: translate(-50%, -50%) scale(1);
o mejor dicho: - use CSS3
scale:
ytranslate:
propiedades por su cuenta:
@keyframes ripple_large {
0% {
scale: 1; /* CHANGED THIS */
}
75% {
scale: 3; /* CHANGED THIS */
opacity: 0.4;
}
100% {
scale: 4; /* CHANGED THIS */
opacity: 0;
}
}
.container {
position: relative;
display: inline-block;
margin: 10vmax;
}
.cat {
height: 20vmax;
}
.center-point {
position: absolute;
top: 50%;
left: 50%;
translate: -50% -50%; /* CHANGED THIS */
height: 10px;
width: 10px;
background: blue;
}
.to-animate {
position: absolute;
top: 50%;
left: 50%;
translate: -50% -50%; /* CHANGED THIS */
border: 1px solid red;
height: 5vmax;
width: 5vmax;
transform-origin: center;
}
.one {
animation: ripple_large 2s linear 0s infinite;
}
.two {
animation: ripple_large 2s linear 1s infinite;
}
<div class="container">
<img src="https://i.stack.imgur.com/LBCIk.jpg" class="cat">
<div class="center-point">
</div>
<div class="to-animate one"></div>
<div class="to-animate two"></div>
</div>