【问题标题】:Changing Background Image with CSS3 Animations使用 CSS3 动画更改背景图像
【发布时间】:2011-09-06 10:31:59
【问题描述】:

为什么这不起作用?我做错了什么?

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;
}

演示

http://jsfiddle.net/hAGKv/

提前致谢!

【问题讨论】:

  • 您在哪个浏览器中查看? :D
  • 你有这个代码的链接吗?
  • 当然,请参阅jsfiddle.net/hAGKv
  • 您的代码可以通过一些调整很好地工作。请参阅下面的完整回复;-)

标签: css background-image css-animations


【解决方案1】:

2020 年更新:是的,可以做到! Here's如何

片段演示:

#mydiv{ animation: changeBg 1s infinite; width:143px; height:100px; }
@keyframes changeBg{
   0%,100%  {background-image: url("https://i.stack.imgur.com/YdrqG.png");}
   25% {background-image: url("https://i.stack.imgur.com/2wKWi.png");}
   50% {background-image: url("https://i.stack.imgur.com/HobHO.png");}
   75% {background-image: url("https://i.stack.imgur.com/3hiHO.png");}
}
<div id='mydiv'></div>

背景图片[不是可以动画的属性][1] - 你不能对属性进行补间。

原答案:(仍然是一个不错的选择) 相反,请尝试使用 position:absolute 将所有图像叠加在一起,然后将所有图像的不透明度设置为 0,除了您想要重复的那个。

【讨论】:

  • 太棒了——虽然它已经在 Webkit 中出现了一段时间,但这并不是规范的一部分。当您说全现代时,您是指 Chrome、Safari 6+、Firefox、IE10+ 吗?有助于澄清此页面的未来访问者。 (到目前为止,已经有 13,372 个!)
  • 仅 webkit - 刚刚测试过(这也包括 Opera 15)
  • 啊,我就是这么想的。正如我所说,它不是规范的一部分,所以它不应该工作,这取决于渲染引擎是否愿意。
  • 背景图片现在可以动画了
  • 这个答案很早就出现在谷歌上,所以对于未来的读者来说,现在可以用关键帧来完成:nicolapietroluongo.com/css/css3-background-change-effect
【解决方案2】:

它适用于 Chrome 19.0.1084.41 测试版!

所以在未来的某个时候,关键帧可能真的是……帧!

你生活在未来;)

【讨论】:

    【解决方案3】:

    为我工作。 注意使用 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;
    }
    

    【讨论】:

      【解决方案4】:

      这确实又快又脏,但它完成了工作: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

      【讨论】:

        【解决方案5】:

        我需要做和你一样的事情,然后回答你的问题。我最终找到了我从here 读到的步骤函数。

        JSFiddle of my solution in action(注意它目前在 Firefox 中有效,我会让你添加跨浏览器行,尽量保持解决方案整洁)

        首先我创建了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 但我想我会详细说明。非常简单和很棒的东西。

        【讨论】:

        • 为了让图像立即从一个变化到另一个,使用这种技术:图像“精灵”+ CSS 动画“步骤”对我来说效果很好。相反,如果我想要一个“无限”循环,使用上面提到的 + opacity 技术并不能按预期工作:动画将失控并相互叠加。
        【解决方案6】:

        linear 计时函数将对定义的属性进行线性动画处理。对于背景图像,它似乎在更改动画帧时具有这种淡入淡出/调整大小的效果(不确定这是否是标准行为,我会采用@Chukie B 的方法)。

        如果您使用steps 函数,它将离散地设置动画。有关更多详细信息,请参阅MDN 上的计时功能文档。对于你的情况,这样做:

        -webkit-animation-timing-function: steps(1,end);
        animation-timing-function: steps(1,end);
        

        看到这个jsFiddle

        我也不确定这是否是标准行为,但是当您说只有一步时,它允许您更改@keyframes 部分中的起点。这样您就可以定义动画的每一帧。

        【讨论】:

          【解决方案7】:

          你的代码可以很好地适应一些调整:

          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); }
          }
          

          这意味着你想要:

          • bg-1 从 00% 保持固定到 11%
          • bg-2 从 12% 保持固定到 24%

          投入 11%,过渡持续时间将为 1% (12% - 11% = 1%)。 240 秒的 1%(总持续时间)=> 2.4 秒。

          您可以根据自己的需要进行调整。

          【讨论】:

            【解决方案8】:

            如上所述,您无法更改动画中的背景图像。我发现最好的解决方案是将您的图像放入一个精灵表中,然后通过更改背景位置来制作动画,但如果您正在为移动设备构建,则您的精灵表限制为小于 1900x1900 像素。

            【讨论】:

              【解决方案9】:

              您可以使用动画背景位置属性和精灵图像。

              【讨论】:

                【解决方案10】:

                我最近需要做同样的事情。这是一个简单的实现

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

                【讨论】:

                  【解决方案11】:

                  您可以按照以下代码进行操作:

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

                  【讨论】:

                  【解决方案12】:

                  您可以使用 jquery-backstretch 图像作为背景图像!

                  https://github.com/jquery-backstretch/jquery-backstretch 向下滚动到设置,所有文档都在那里。

                  【讨论】:

                    【解决方案13】:

                    好吧,我可以在 chrome 中更改它们。使用 -webkit css 属性,它简单且在 Chrome 中运行良好。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-02-28
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-11-08
                      • 2012-09-23
                      • 1970-01-01
                      • 2023-03-08
                      • 1970-01-01
                      相关资源
                      最近更新 更多