我在网上找到了一个tutorial来制作一个CSS3无限加载图标,使用长度增长和缩小的矩形。他们最终看起来像:
它使用包裹在外div
中的5个div
,并且效果很好。我想尝试使用SVG重新创建效果,这样我只需要一个图像就可以引用它,而不必添加5个HTML元素。
我开始使用相同的CSS动画代码,并在rect
标记内使用了5 svg
个。动画效果很好,但我不能让矩形垂直居中。由于它们是使用x
和y
坐标放置的,这些坐标对应于每个矩形的顶部/左侧点,因此它们固定在该位置。
<svg version="1.1" baseProfile="full" width="250" height="250" xmlns="http://www.w3.org/2000/svg" xmlns:xlink= "http://www.w3.org/1999/xlink">
<rect class="rect1" fill="black" height="30" width="6" x="0" />
<rect class="rect2" fill="black" height="30" width="6" x="10" />
<rect class="rect3" fill="black" height="30" width="6" x="20" />
<rect class="rect4" fill="black" height="30" width="6" x="30" />
<rect class="rect5" fill="black" height="30" width="6" x="40" />
</svg>
rect {
-webkit-animation: stretchdelay 1.2s infinite ease-in-out;
animation: stretchdelay 1.2s infinite ease-in-out;
alignment-baseline:bottom;
}
.rect2 {
-webkit-animation-delay: -1.1s;
animation-delay: -1.1s;
}
.rect3 {
-webkit-animation-delay: -1.0s;
animation-delay: -1.0s;
}
.rect4 {
-webkit-animation-delay: -0.9s;
animation-delay: -0.9s;
}
.rect5 {
-webkit-animation-delay: -0.8s;
animation-delay: -0.8s;
}
@-webkit-keyframes stretchdelay {
0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
20% { -webkit-transform: scaleY(1.0) }
}
@keyframes stretchdelay {
0%, 40%, 100% {
transform: scaleY(0.4);
-webkit-transform: scaleY(0.4);
} 20% {
transform: scaleY(1.0);
-webkit-transform: scaleY(1.0);
}
}
请参阅工作示例: http://codepen.io/Kelderic/pen/vuipF
有一件事很奇怪,它在CodePen中运行,相同的代码并没有在JSFiddle中运行。当我将CodePen作为SVG嵌入时,它也不会运行。
使用这样的CSS动画应该适用于SVG元素,我可以在中心修复它们以匹配原始动画吗?
js1568的回答提供了什么应该是一个解决方案,它确实可以让Chrome工作正常。但它在Firefox中没有任何影响,经过一些研究后我发现我并不是唯一一个与Firefox有同样问题的人。
Setting transform-origin on SVG group not working in FireFox
我认为这里唯一的答案是,此时此功能无法在所有浏览器中运行。 (如果有人知道某种方式,请随时添加答案!)
我想方设法在Firefox中完成这项工作,在下面的答案中解释。尽管如此,仍然没有IE9-11。
答案 0 :(得分:1)
好的,所以我找到了答案,它适用于Chrome和Firefox。 IE不支持SVG元素的CSS转换(尽管它确实支持转换属性,我试图找出一种解决方法)。
我没有尝试将基线设置为rect
元素的中心,而是使用第二个动画。我上下移动元素,按时间同步。这会创建元素垂直居中的外观。
在使用0.4
比例时,我遇到了一些问题让它完全同步,所以我改为0.5
,看起来还不错。
<svg version="1.1" baseProfile="full" width="250" height="250" xmlns="http://www.w3.org/2000/svg" xmlns:xlink= "http://www.w3.org/1999/xlink">
<rect class="rect1" fill="black" height="30" transform="translate(2,2)" width="6" x="0" y="0" />
<rect class="rect2" fill="black" height="30" width="6" x="10" y="0" />
<rect class="rect3" fill="black" height="30" width="6" x="20" y="0" />
<rect class="rect4" fill="black" height="30" width="6" x="30" y="0" />
<rect class="rect5" fill="black" height="30" width="6" x="40" y="0" />
</svg>
@-webkit-keyframes stretchdelay {
0% {
-webkit-transform: scaleY(1.0) translate(0,0);
} 30%,70% {
-webkit-transform: scaleY(0.5) translate(0,15px);
} 100% {
-webkit-transform: scaleY(1.0) translate(0,0);
}
}
@keyframes stretchdelay {
0% {
transform: scaleY(1.0) translate(0,0);
-webkit-transform: scaleY(1.0) translate(0,0);
} 30%,70% {
transform: scaleY(0.5) translate(0,15px);
-webkit-transform: scaleY(0.5) translate(0,15px);
} 100% {
transform: scaleY(1.0) translate(0,0);
-webkit-transform: scaleY(1.0) translate(0,0);
}
}
rect {
-webkit-animation: stretchdelay 1.2s infinite ease-in-out;
animation: stretchdelay 1.2s infinite ease-in-out;
-ms-animation: stretchdelay 1.2s infinite ease-in-out;
}
.rect2 {
-webkit-animation-delay: -1.1s;
animation-delay: -1.1s;
}
.rect3 {
-webkit-animation-delay: -1.0s;
animation-delay: -1.0s;
}
.rect4 {
-webkit-animation-delay: -0.9s;
animation-delay: -0.9s;
}
.rect5 {
-webkit-animation-delay: -0.8s;
animation-delay: -0.8s;
}
(注意,最近CodePen添加了一项功能,允许您嵌入在线创建的SVG作为SVG图像。我今天发现,因为我创建了这个,所有CSS必须放在HTML输入框内的<style>
标签中。如果它放在CSS框中,它将无法工作。)
答案 1 :(得分:0)