html - 如何在比例动画中将原点保持在图像的中心?

标签 html css css-animations css-transforms

我有类似的情况fiddle ,其中我有一个 CSS3 动画,它缩放绝对定位在另一个元素中心的元素。然而,当动画发生时它是偏离中心的,如示例中相对于蓝色的红色方 block 所示。我该如何居中呢?我尝试了一些围绕 transform-origin 属性的配置,但这并没有产生正确的结果。

@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>

最佳答案

问题是您正在覆盖 translate 转换。

当您指定一个新的转换(动画中的那个)时,它会覆盖第一个。在您的情况下,您正在删除修复中心对齐的翻译

您需要将它们添加到相同的 transform 属性并注意顺序,因为它很重要 ( Why does order of transforms matter? rotate/scale doesn't give the same result as scale/rotate )

@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>

更新

如评论所述,最好使用另一种方法使元素居中而不是平移以避免更改动画,因为这可以与其他元素一起使用。

例子:

@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;
  transform-origin:center;
}

.to-animate {
  position: absolute;
  top: 0;
  left: 0;
  bottom:0;
  right:0;
  margin:auto;
  border: 1px solid red;
  height: 5vmax;
  width: 5vmax;
}

.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>

关于html - 如何在比例动画中将原点保持在图像的中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47820827/

相关文章:

javascript - 获取某行checkbox选中值对应的label值

javascript - 如何在 Angular Material 中的 md-backdrop 后面接收 ng-click 事件

jquery - Susy 响应式网格和 jQuery Masonry

CSS 延续浏览器属性

CSS 动画波浪线无法在 Chrome 中正确显示

css - 如何为 `a` 元素添加边框颜色动画?

html - 如何检查在失去焦点时从 DOM 中消失的 html 元素?

html - 增加整个表格高度时,使表格行高不变

html - IE 忽略 flex 容器最小高度

html - 我的侧边栏滚动条不工作