html - 围绕中心 CSS 动画旋转的两个 div

标签 html css css-animations keyframe

我试图围绕一个中心以圆周运动“环绕”两个独立的 div,但是我无法让这两个 div 在我的 CSS 动画中遵循相同的圆周路径。

.container {
  width: 500px;
  height: 500px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.box {
  background-color: pink;
  width: 100px;
  height: 100px;
  animation: battle 6s linear infinite;
  position: absolute;
  margin: 10px;
}

@keyframes battle {
  from {
    transform: rotate(0deg) translateX(150px) rotate(0deg);
  }
  to {
    transform: rotate(360deg) translateX(150px) rotate(-360deg);
  }
}
<div class="container">
  <div class="box">
  </div>
  <div class="box">
  </div>
</div>

Jsfiddle

最佳答案

让您的父元素成为向导;

当目标是围绕中心以一致的间距旋转时(而不是说更像是椭圆形图案的“椭圆轨道”),最简单的技术是提供父级设置一致的边界并附加它里面的 child 使用它的位置作为他们的动画路径。目标是仅提供单个元素同步旋转的幻觉,而实际上只有一个元素以其默认的 transform-origin 中心旋转,作为 children 在其中“旋转”的指南。

在我们的例子中,我们取了一个父级,其周长大致等于“所需轨道”的大小,我们给它一个 50% 的 border-radius 来创建一个圆。这使得元素之间的距离小于或大于另一个点没有任何意义。我们将它设为 position: relative 元素,这样我们就可以将 position: absolute 应用于它的任何子元素。在此示例中,我们使用伪元素,但它们可以很容易地成为其他 DOM 节点元素,例如 div。

通过将我们的子项固定到父项上的特定点,我们创建了与我们希望的父项的 transform-origin 中心的 X/Y 相等的距离,并应用了 rotate transform 旋转父级。然而,如果我们只这样做,那么 children 也会沿着那条路走,而不是保持垂直(正如我们所期望的那样),所以我们简单地重复使用应用于父级的相同动画,但在 reverse 中抵消它的旋转。结果是父元素向一个方向旋转,子元素向另一个方向旋转,以创建示例中所见的效果。希望这对您有所帮助!

#rotator {
  position: relative;
  width: 7rem;
  height: 7rem;
  animation: rotations 6s linear infinite;
  border: 1px orange dashed;
  border-radius: 50%;
  margin: 3rem;
}

#rotator:before, #rotator:after {
  position: absolute;
  content: '';
  display: block;
  height: 3rem;
  width: 3rem;
  animation: inherit;
  animation-direction: reverse;
}

#rotator:before {
  background-color: red;
  top: -.25rem;
  left: -.25rem;
}

#rotator:after {
  background-color: green;
  bottom: -.25rem;
  right: -.25rem;
}


@keyframes rotations {
  to { transform: rotate(360deg) }
}
<div id="rotator"></div>

关于html - 围绕中心 CSS 动画旋转的两个 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58382716/

相关文章:

javascript - 为什么 Firefox 和 IE 会分解我的 div 框并放在彼此下面?

php - 通过搜索栏 php 查询数据库

html - 如何在同一行中对齐两个元素而不重叠

html - Flexbox:按比例增加或减少中间元素的高度

CSS Hierarchy在一个具体的例子中

javascript - 文本悬停时的滑动效果

javascript - 存储在变量中的 HTML 中的 jQuery 更改属性

php - 获取 2 个元素之间的 HTML 内容

jquery - css3 旋转动画——开始旋转,然后停在帧上

css - 为什么我的变换动画会覆盖我的原始变换?