【问题标题】:Apply different animations to multiple backgrounds images in a single class将不同的动画应用于单个类中的多个背景图像
【发布时间】:2021-06-13 16:27:57
【问题描述】:

我有一个名为滑块的类。我需要为不同的图像设置不同类型的动画。请帮助我实现它。现在我所有的图像都具有相同的动画模式。我只想保留一个类滑块. 这是我的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    

    <title>Document</title>
    <style>
       body{
           margin:0p;
           padding:0p;
          background: green;
          perspective: 800px;
          height: 100vh;
   width: 100wh;
       
       }
        .slider{
        /*    background-image: url(https://www.mozilla.org/media/img/logos/firefox/logo-quantum.9c5e96634f92.png);
  background-size: 800px 800px;
  width: 800px;
  height: 800px;
  border: 2px solid;
  color: pink;
         */
        width:100vw;
         height:100vh;
            background: url(b1.jpg);

  background-size: 100wh 100vh;   
 /* animation: slide 2s infinite;*/
  animation: slide 
   2s infinite;                                                   
  margin: 100px auto;
         
        }
    @keyframes slide{
        from{
           /* transform:rotateY(0deg);*/
          /* transform: rotate3d(1, 1, 1, 0deg);*/
           transform: rotate3d(0, 1, 0, 0deg);
  background-color: pink;
        }
        to{
           /* transform:rotateY(180deg); 
            transform: rotate3d(1, 1, 1, 360deg);*/
            transform: rotate3d(0, 1, 0, 360deg);
  background-color: pink;
        }  
      
            25%{
                background-image: url(b2.jpg);
               
 
                background-size: 100wh 100vh;   
 
            }
            50%{
                background-image: url(b3.jpg);
                

                background-size: 100wh 100vh;   
            }
            75%{
                background-image: url(b4.jpg);
                

                background-size: 100wh 100vh;     
            }
            100%{
                background-image: url(b5.jpg);
                

                background-size: 100wh 100vh;    
            }

        }
    </style>
</head>
<body>
   <div class="slider"></div>
</body>
</html>

这是小提琴

My fiddle

还有一个疑问,在每张图像中似乎都有图像重复,就好像同一张图像被缩小并且图像的一部分被添加到那里。我只想有一个 100% 视图而不是重复的图像.

任何帮助将不胜感激

【问题讨论】:

  • 你的问题我不太清楚,请详细说明一下,至于图像重复,您可以将no repeat添加到.slider,如.slider{background: url(b1.jpg) no repeat;}
  • @Uzair 我正在尝试为不同的图像设置动画,因为关键帧从 0% 变为 25%,从 25% 变为 50% 等等……但是我怎样才能给出不同类型的动画。 . 好像第二张图片从 0 度旋转到 140 度,第三张图片像那样放大和淡出......这里每张图片都有相同的动画模型
  • 如果你想应用不同的动画,那么我认为你必须定义另一个动画,即关键帧,然后分别在不同的图像类上使用它
  • 感谢@Uzair 的建议..但没有重复不起作用jsfiddle.net/hellomidhun2020/wq5kptxu/4
  • 它的no-repeat 实际上但是这样做只会显示一个图像并且它不会摆脱最后的部分,最后的部分也不是由于CSS,我只是因为视口,尝试放大和缩小,您会看到最后的图像将分别完全显示和部分显示

标签: html css animation slider slideshow


【解决方案1】:

这称为滑块,从关键帧定义来看,您似乎想要按顺序旋转一组图像,使用一个动画,而不是为每个图像使用不同的动画。只要您不想为每张“幻灯片”制作完全不同的动画,这是可行的。

有几点: 你的“怀疑”是有道理的。图像正在重复,因为这是 CSS 中背景的默认设置,请将其设置为“不重复”,这样您就不会得到额外的一点点。

图像可能(或可能不,取决于您的用例,但通常)具有不同的纵横比,并且它们可能与视口的纵横比不同或不同(包含元素用于设置其尺寸) .使用background-size: contain 以确保您看到每个人的整个图像,或者使用cover 如果您想覆盖整个视口,但在这种情况下,顶部和底部或侧面可能会被裁剪以适应

您可能希望background-position 水平和垂直居中,而不是在这种情况下默认为左和上。

这是一个修改后的 sn-p。请注意,尺寸会在短时间内发生变化,您可能想要也可能不想要。您可以更改关键帧来阻止它(如果您需要帮助,请告诉我)。最后一张图片也没有时间展示自己,所以您可能需要查看 % 设置以确保它可以被看到。

body {
  margin: 0p;
  padding: 0p;
  background: green;
  perspective: 800px;
  height: 100vh;
  width: 100wh;
}

.slider {
  /*    background-image: url(https://www.mozilla.org/media/img/logos/firefox/logo-quantum.9c5e96634f92.png);
  background-size: 800px 800px;
  width: 800px;
  height: 800px;
  border: 2px solid;
  color: pink;
         */
  width: 100vw;
  height: 100vh;
  background: url(https://picsum.photos/id/1023/300/300);
  background-repeat: no-repeat no-repeat;
  /* ADDED */
  background-position: center center;
  /* ADDED */
  background-size: cover;
  /* ADDED - TRY BOTH TO DECIDE WHICH YOU WANT IF YOU HAVE IMAGES OF DIFFERENT ASPECT RATIOS */
  background-size: contain;
  /* ADDED */
  background-size: 100wh 100vh;
  /* animation: slide 2s infinite;*/
  animation: slide 2s infinite;
  margin: 100px auto;
}

@keyframes slide {
  from {
    /* transform:rotateY(0deg);*/
    /* transform: rotate3d(1, 1, 1, 0deg);*/
    transform: rotate3d(0, 1, 0, 0deg);
    background-color: pink;
  }
  to {
    /* transform:rotateY(180deg); 
            transform: rotate3d(1, 1, 1, 360deg);*/
    transform: rotate3d(0, 1, 0, 360deg);
    background-color: pink;
  }
  25% {
    background-image: url(https://picsum.photos/id/1015/1024/768);
    background-size: 100wh 100vh;
  }
  50% {
    background-image: url(https://picsum.photos/id/1016/768/1024);
    background-size: 100wh 100vh;
  }
  75% {
    background-image: url(https://picsum.photos/id/1018/200/300);
    background-size: 100wh 100vh;
  }
  100% {
    background-image: url(https://picsum.photos/id/1020/300/300);
    background-size: 100wh 100vh;
  }
}
&lt;div class="slider"&gt;&lt;/div&gt;

更新 在上面的 sn-p 中,每个图像都获得相同的动画。要求是每个都有自己的(旋转,缩放等)。这可以通过让关键帧的每个部分定义特定幻灯片的动画来实现,同时仍然保持单个滑块类的要求。

在这个 sn-p 中有 4 张幻灯片,每张幻灯片都占用了动画一次迭代总分配时间的四分之一。在每个部分中,都定义了所需的特定动画。这个 sn-p 假设您想要在图像显示它的一半时间内执行动画位而不在剩余一半移动。可以通过更改关键帧中的 %s 来更改这些时间。

第一张图片旋转,第二张图片缩放,第三张图片从0不透明度进来,第四张图片只是显示不动。

显然可以添加更多图像,并通过更改 %s 和插入更多背景图像来定义不同类型的移动、缩放、不透明度。

注意:不透明度是指整个元素,所以背景粉红色也会褪色,看起来很奇怪,所以我将其删除。如果拥有背景很重要,您将不得不考虑额外的元素并为其设置动画,或者决定不使用不透明度作为改变的事物之一,或者无论如何让绿色变为粉红色。

body {
  margin: 0p;
  padding: 0p;
  background: green;
  perspective: 800px;
  height: 100vh;
  width: 100wh;
}

.slider {
  width: 100vw;
  height: 100vh;
  background-repeat: no-repeat no-repeat;
  /* ADDED */
  background-position: center center;
  /* ADDED */
  background-size: cover;
  /* ADDED - TRY BOTH TO DECIDE WHICH YOU WANT IF YOU HAVE IMAGES OF DIFFERENT ASPECT RATIOS */
  background-size: contain;
  /* ADDED */
  animation: slide 16s infinite;
  margin: 100px auto;
}

@keyframes slide {
  0% {
    transform: rotate3d(0, 1, 0, 0deg);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1023/300/300);
  }
  12.5%,
  24.99% {
    /* to make the slide not move between those times */
    transform: rotate3d(0, 1, 0, 360deg);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1023/300/300);
  }
  25% {
    transform: rotate3d(0, 0, 0, 0deg) scale(1);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1015/1024/768);
  }
  37.5%,
  49.99% {
    /* so it scales up for the first half of its time, then stays there showing */
    transform: rotate3d(0, 0, 0, 0deg) scale(1.5);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1015/1024/768);
  }
  50% {
    transform: rotate3d(0, 0, 0, 0deg) scale(1);
    opacity: 0;
    background-image: url(https://picsum.photos/id/1016/768/1024);
  }
  74.99% {
    transform: rotate3d(0, 0, 0, 0deg) scale(1);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1016/768/1024);
  }
  75% {
    transform: rotate3d(0, 0, 0, 0deg) scale(1);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1018/200/300);
  }
  100% {
    transform: rotate3d(0, 0, 0, 0deg) scale(1);
    opacity: 1;
    background-image: url(https://picsum.photos/id/1018/200/300);
  }
}
&lt;div class="slider"&gt;&lt;/div&gt;

总体目标有 16 秒的时间让每张图像有 2 秒的移动和 2 秒的静止。

如果这是一个问题,你会发现你需要使用不透明度来阻止非常突然的变化。

sn-p 每次都重复变换和不透明度设置,这并不总是必要的,但我发现它提醒了变换需要其中的所有设置,它不是“累积的”。

【讨论】:

  • @A Hawoth 感谢您的精彩解释.. 但我想要完成的是.. 在每个过渡中应该有所不同,就好像第一帧从 0 度旋转到 360 度.. 第二过渡应该只是放大和淡出......就像那样......有可能......这里所有的动画都从0度旋转到360度......你能帮我吗
  • 好像对于 25% 的过渡,我需要应用一种动画形式,而对于接下来的 25%,我需要另一种类型的动画,依此类推......这可能吗@AHaworth
  • 啊,确实不一样。您也许可以在一个动画中使用您指定的一个类,但每张幻灯片显示的时间是相同的还是不同的?
  • 我们的cmets同时穿越了!我看到您希望每个动画的时间与您给出的 25% 作为示例相同。是的,你可以这么做。我会提供第二个 sn-p,可能需要几分钟。
  • 非常感谢 Hawoth .. 为您提供了出色的支持 ...我正在尝试像在此站点中一样实现一个滑块...karplab.net 但在这里我们需要单击箭头在滑块中进行更改,我需要在一定的毫秒后完成它.. .
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多