【问题标题】:CSS spin animation doesn't start from centerCSS 旋转动画不是从中心开始的
【发布时间】:2016-01-16 19:38:57
【问题描述】:

我尝试使用这个 CSS 动画:http://tobiasahlin.com/spinkit/

但我希望圆圈以 40 像素的高度和宽度开始,而不是从 0 开始。

所以我试试这个:http://jsfiddle.net/Xroad/33ovfgeL/

问题是圆圈不是从他的中心开始的。我需要从顶部和左侧保持 100px 的位置。

@keyframes sk-scaleout {
    0% {
        width: 40px;
        height: 40px;
        -webkit-transform: scale(0);
        transform: scale(0);
    }
    100% {
        -webkit-transform: scale(1.0);
        transform: scale(1.0);
        opacity: 0;
    }
}

【问题讨论】:

  • 那就试试transform-origin: 50% 50%;

标签: css animation css-animations


【解决方案1】:

那是因为元素是用left 偏移量定位的。从规则中删除以下行,它应该从中心开始。

left: 100px;

设置transform-origin: 50% 50% is not required because that is anyway the default setting

.spinner {
  position: relative;
  top: 100px;
  width: 40px;
  height: 40px;
  margin: 10px auto;
  background-color: black;
  z-index: 2;
  border-radius: 100%;
  animation: sk-scaleout 2.5s infinite ease-in-out;
}
@keyframes sk-scaleout {
  0% {
    width: 40px;
    height: 40px;
  }
  100% {
    width: 540px;
    height: 540px;
    opacity: 0;
  }
}
<div class="spinner"></div>

如果您希望圆圈从中间中间(即垂直和水平中心)开始,那么您可以使用下面 sn-p 中看到的方法。这里实际的旋转圆是由伪元素通过定位和平移变换定位在父容器的水平和垂直中间产生的。

.spinner {
  position: relative;
  min-height: 100vh;
}
.spinner:after {
  position: absolute;
  content: '';
  top: 50%;
  left: 50%;
  width: 40px;
  height: 40px;
  margin: 0px auto;
  background-color: black;
  z-index: 2;
  border-radius: 100%;
  animation: sk-scaleout 2.5s infinite ease-in-out;
}
@keyframes sk-scaleout {
  0% {
    width: 40px;
    height: 40px;
    transform: translateY(-50%) translateX(-50%);
  }
  100% {
    height: 540px;
    width: 540px;
    transform: translateY(-50%) translateX(-50%);
    opacity: 0;
  }
}
<div class="spinner"></div>

如果您出于某种原因想要保留偏移量,但仍要从 容器元素的水平和垂直中间开始,那么只需将偏移量添加到父元素,如下所示:

.spinner {
  position: relative;
  top: 100px;
  left: 100px;
  min-height: 100vh;
  border: 1px solid; /* just to illustrate where the element is on screen */
}
.spinner:after {
  position: absolute;
  content: '';
  top: 50%;
  left: 50%;
  width: 40px;
  height: 40px;
  margin: 0px auto;
  background-color: black;
  z-index: 2;
  border-radius: 100%;
  animation: sk-scaleout 2.5s infinite ease-in-out;
}
@keyframes sk-scaleout {
  0% {
    width: 40px;
    height: 40px;
    transform: translateY(-50%) translateX(-50%);
  }
  100% {
    height: 540px;
    width: 540px;
    transform: translateY(-50%) translateX(-50%);
    opacity: 0;
  }
}
<div class="spinner"></div>

另一方面,如果你想保留偏移量但让它从页面的水平和垂直中间开始,那么使用下面的sn-p:

.spinner {
  position: relative;
  top: 100px;
  left: 100px;
  min-height: 100vh;
}
.spinner:after {
  position: absolute;
  content: '';
  top: calc(50% - 100px);
  left: calc(50% - 100px);
  width: 40px;
  height: 40px;
  margin: 0px auto;
  background-color: black;
  z-index: 2;
  border-radius: 100%;
  animation: sk-scaleout 2.5s infinite ease-in-out;
}
@keyframes sk-scaleout {
  0% {
    width: 40px;
    height: 40px;
    transform: translateY(-50%) translateX(-50%);
  }
  100% {
    height: 540px;
    width: 540px;
    transform: translateY(-50%) translateX(-50%);
    opacity: 0;
  }
}
<div class="spinner"></div>

这仅适用于偏移并从圆心扩展。

.spinner {
  position: relative;
  top: 100px;
  left: 100px;
}
.spinner:after {
  position: absolute;
  content: '';
  width: 40px;
  height: 40px;
  background-color: black;
  z-index: 2;
  border-radius: 100%;
  animation: sk-scaleout 2.5s infinite ease-in-out;
}
@keyframes sk-scaleout {
  0% {
    width: 40px;
    height: 40px;
    transform: translateY(-50%) translateX(-50%);
  }
  100% {
    height: 540px;
    width: 540px;
    transform: translateY(-50%) translateX(-50%);
    opacity: 0;
  }
}
<div class="spinner"></div>

【讨论】:

  • 感谢您的回答,但我也有同样的问题:-/ 我需要输入一个左值,因为我需要将旋转定位在特定位置
  • @Xroad 是什么意思?我可以在 sn-p 窗口中看到它不再以偏移量开始。您是否也希望将其垂直居中?
  • 在您的 sn-p 中,我看到微调器从窗口顶部开始。事实上,我需要将微调器从他的中心水平和垂直扩展,并定位在距离顶部和左侧 100 像素处
  • @Xroad:请参阅我添加到答案中的第二个 sn-p。它有一个解决方案可以让它从水平和垂直中间开始。我不明白您所说的 定位在 100px 然后是水平和垂直中间是什么意思。如果您定位在 100px 偏移处,那么除非我们修改很多属性,否则它不能再从中间。
  • 最后一个圆的 sn-p 从 40px 开始,从左上角到左上角 100px 就是我要找的。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多