为什么这不起作用?我做错了什么?
CSS
@-webkit-keyframes test {
0% {
background-image: url('frame-01.png');
}
20% {
background-image: url('frame-02.png');
}
40% {
background-image: url('frame-03.png');
}
60% {
background-image: url('frame-04.png');
}
80% {
background-image: url('frame-05.png');
}
100% {
background-image: url('frame-06.png');
}
}
div {
float: left;
width: 200px;
height: 200px;
-webkit-animation-name: test;
-webkit-animation-duration: 10s;
-webkit-animation-iteration-count: 2;
-webkit-animation-direction: alternate;
-webkit-animation-timing-function: linear;
}
样本
提前致谢!
答案 0 :(得分:22)
背景图片不是可以设置动画的属性 - 您无法补间属性。
相反,尝试使用position:absolute将所有图像放在彼此的顶部,然后将所有图像的不透明度设置为0,除了你想要重复的那个。
答案 1 :(得分:8)
适用于Chrome 19.0.1084.41 beta!
所以在未来的某个时刻,关键帧可能真的是......帧!
你生活在未来;)
答案 2 :(得分:3)
这真的很快且很脏,但它完成了工作:jsFiddle
#img1, #img2, #img3, #img4 {
width:100%;
height:100%;
position:fixed;
z-index:-1;
animation-name: test;
animation-duration: 5s;
opacity:0;
}
#img2 {
animation-delay:5s;
-webkit-animation-delay:5s
}
#img3 {
animation-delay:10s;
-webkit-animation-delay:10s
}
#img4 {
animation-delay:15s;
-webkit-animation-delay:15s
}
@-webkit-keyframes test {
0% {
opacity: 0;
}
50% {
opacity: 1;
}
100% {
}
}
@keyframes test {
0% {
opacity: 0;
}
50% {
opacity: 1;
}
100% {
}
}
我正在使用jQuery为我的网站开发类似的东西,但当用户向下滚动页面时会触发转换 - jsFiddle
答案 3 :(得分:2)
linear
计时功能将线性地为定义的属性设置动画。对于背景图像,它在改变动画帧时似乎有这种淡入淡出/调整大小的效果(不确定它是否是标准行为,我会选择@Chukie B的方法)。
如果您使用steps
功能,它将会离散地制作动画。有关更多详细信息,请参阅MDN上的计时功能文档。对于你的情况,这样做:
-webkit-animation-timing-function: steps(1,end);
animation-timing-function: steps(1,end);
请参阅此jsFiddle。
我不确定它是否也是标准行为,但当你说只有一步时,它允许你改变@keyframes
部分的起点。这样您就可以定义动画的每个帧。
答案 4 :(得分:2)
我需要和你做同样的事情并着手解决你的问题。我最终找到了我从here读到的步骤函数。
JSFiddle of my solution in action(注意它目前适用于Firefox,我会让你添加crossbrowser行,试图让解决方案保持整洁)
首先我创建了a sprite sheet that had two frames。然后我创建了div并将其作为背景,但我的div只是我的精灵的大小(100px)。
<div id="cyclist"></div>
#cyclist {
animation: cyclist 1s infinite steps(2);
display: block;
width: 100px;
height: 100px;
background-image: url('../images/cyclist-test.png');
background-repeat: no-repeat;
background-position: top left;
}
动画设置为2步,整个过程需要1秒钟。
@keyframes cyclist {
0% {
background-position: 0 0;
}
100% {
background-position: 0 -202px; //this should be cleaned up, my sprite sheet is 202px by accident, it should be 200px
}
}
Thiago above mentioned the steps function但我想我会详细说明一下。非常简单和令人敬畏的东西。
答案 5 :(得分:2)
您的代码可以通过一些修改很好地工作:
div {
background-position: 50% 100%;
background-repeat: no-repeat;
background-size: contain;
animation: animateSectionBackground infinite 240s;
}
@keyframes animateSectionBackground {
00%, 11% { background-image: url(/assets/images/bg-1.jpg); }
12%, 24% { background-image: url(/assets/images/bg-2.jpg); }
25%, 36% { background-image: url(/assets/images/bg-3.jpg); }
37%, 49% { background-image: url(/assets/images/bg-4.jpg); }
50%, 61% { background-image: url(/assets/images/bg-5.jpg); }
62%, 74% { background-image: url(/assets/images/bg-6.jpg); }
75%, 86% { background-image: url(/assets/images/bg-7.jpg); }
87%, 99% { background-image: url(/assets/images/bg-8.jpg); }
}
以下是适合您情况的百分比说明:
首先,您需要计算“块”。如果您有8个不同的背景,则需要执行以下操作: 100%/ 8 = 12.5%(为简化起见,您可以舍弃小数点)=> 12%
之后,您获得了:
@keyframes animateSectionBackground {
00% { background-image: url(/assets/images/bg-1.jpg); }
12% { background-image: url(/assets/images/bg-2.jpg); }
25% { background-image: url(/assets/images/bg-3.jpg); }
37% { background-image: url(/assets/images/bg-4.jpg); }
50% { background-image: url(/assets/images/bg-5.jpg); }
62% { background-image: url(/assets/images/bg-6.jpg); }
75% { background-image: url(/assets/images/bg-7.jpg); }
87% { background-image: url(/assets/images/bg-8.jpg); }
}
如果执行此代码,您将看到过渡将永久存在。如果您希望背景保持一会儿,可以这样:
@keyframes animateSectionBackground {
00%, 11% { background-image: url(/assets/images/bg-1.jpg); }
12%, 24% { background-image: url(/assets/images/bg-2.jpg); }
25%, 36% { background-image: url(/assets/images/bg-3.jpg); }
37%, 49% { background-image: url(/assets/images/bg-4.jpg); }
50%, 61% { background-image: url(/assets/images/bg-5.jpg); }
62%, 74% { background-image: url(/assets/images/bg-6.jpg); }
75%, 86% { background-image: url(/assets/images/bg-7.jpg); }
87%, 99% { background-image: url(/assets/images/bg-8.jpg); }
}
这意味着您想要:
通过投入11%,转换持续时间将为1%(12%-11%= 1%)。 240秒的1%(总持续时间)=> 2.4秒。
您可以根据需要进行调整。
答案 6 :(得分:1)
如上所述,您无法更改动画中的背景图像。我找到了最好的解决方案,将你的图像放到一张精灵表中,然后通过改变背景位置进行动画处理,但是如果你正在构建移动设备,那么你的精灵表只限于1900x1900像素。
答案 7 :(得分:0)
您可以使用以下代码:
#cd{
position: relative;
margin: 0 auto;
height: 281px;
width: 450px;
}
#cf img{
left: 0;
position: absolute;
-moz-transition: opacity 1s ease-in-out;
transition: opacity 1s ease-in-out;
}
#cf img.top:hover{
opacity: 0;
}
<div id="cf">
<img class="button" src="Birdman.jpg" />
<img src="Turtle.jpg" class="top" />
</div>
答案 8 :(得分:0)
您可以使用动画背景位置属性和精灵图像。
答案 9 :(得分:0)
我最近需要做同样的事情。这是一个简单的实现
#wrapper { width:100%; height:100%; position:relative; }
#wrapper img { position:absolute; top:0; left:0; width:100%; height:auto; display:block; }
#wrapper .top { animation:fadeOut 2s ease-in-out; animation-fill-mode:forwards; }
@keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
<div id="wrapper">
<img src="img1.jpg" class="top" style="z-index:2;">
<img src="img2.jpg" style="z-index:1;">
</div>
答案 10 :(得分:0)
适合我。 请注意使用 background-image 进行转换。
#poster-img {
background-repeat: no-repeat;
background-position: center;
position: absolute;
overflow: hidden;
-webkit-transition: background-image 1s ease-in-out;
transition: background-image 1s ease-in-out;
}
答案 11 :(得分:0)
您可以使用jquery-backstretch图像,该图像允许将动画幻灯片作为背景图像!
https://github.com/jquery-backstretch/jquery-backstretch 向下滚动以进行设置,所有文档都在其中。
答案 12 :(得分:-1)
我可以用chrome改变它们。它简单,在使用-webkit css属性的Chrome中运行良好。