【问题标题】:How to set transition for 2 backgrounds in an element?如何为元素中的 2 个背景设置过渡?
【发布时间】:2022-02-12 05:02:18
【问题描述】:

在这段代码中:

    #p1 {
        background-image: url(backimgs/first/1.jpg), url(backimgs/first/2.jpg);
        background-color: #05080d;
        background-position: left top, left bottom;
        background-size: 100% 35%, 100% 65%;
    }

我希望页面出现时,首先显示backimgs/first/1.jpg,然后在 1 秒后显示backimgs/first/2.jpg。我该怎么做?

【问题讨论】:

  • 1秒后第一张图片是逐渐消失还是保留?

标签: html css css-transitions background-image


【解决方案1】:

您不能为背景图像设置动画。您可以更改它,但不会有任何平滑过渡:

#p1 {
  background-image: url(backimgs/first/1.jpg), url(backimgs/first/2.jpg);
  background-color: #05080d;
  background-position: left top, left bottom;
  background-size: 100% 35%, 100% 65%;
  animation: change-bg;
  animation-duration: 1s;
}

@keyframes change-bg {
  0% {
    background-image: url(backimgs/first/1.jpg), url(backimgs/first/2.jpg);
    background-size: 100% 35%, 100% 65%;
  }
  100% {
    background-image: url(backimgs/first/2.jpg), url(backimgs/first/1.jpg);
    background-size: 100% 65%, 100% 35%;
  }
}

如果您想要平滑过渡 - 您可以使用带有背景的 ::before::after 并为它们的不透明度设置动画。如果您需要有关此方法的更多信息,请在评论中告诉我,我将编辑帖子并展示它是如何完成的。

【讨论】:

  • 我只是想以某种方式将它们的不透明度从 0 更改为 1。在此代码中,图像位置正在发生变化。
【解决方案2】:

您在标题中提到了“过渡”,因此您需要分别控制背景的两个部分。

为了实现这一点,这个 sn-p 从元素本身中删除背景,而不是将它们放在两个伪元素上。以第一张图片为背景的 before 伪元素和以第二张图片为背景的 after 伪元素。

以这种方式分离组件意味着我们可以为不透明度设置动画,第一个伪元素在第一秒内从不透明度 0 变为不透明度 1。

但请注意,已在 ths sn-p 中添加了一些小技巧。由于 before 伪元素上的动画是在加载时发生的,因此需要有某种方法在动画开始之前等待背景图像加载,否则就有可能在动画开始之前完成,甚至完成。图片实际可用。

我不知道您是如何测试负载是否完成的更广泛的背景,所以这里只是为了演示目的而延迟。您需要决定如何避免这种初始负载情况。

* {
  margin: 0;
  padding: 0;
}

#p1 {
  /* added for this demo */
  display: inline-block;
  width: 100vw;
  height: 100vh;
  position: relative;
}

#p1::before,
#p1::after {
  content: '';
  position: absolute;
  z-index: -1;
  width: 100%;
  left: 0;
  display: inline-block;
  background-color: #05080d;
  background-size: cover;
  background-repeat: no-repeat no-repeat;
  background-position: center center;
  animation: fadein 1s linear;
  animation-fill-mode: forwards;
  opacity: 0;
}

#p1::before {
  top: 0;
  height: 35%;
  background-image: url(https://picsum.photos/id/1018/1024/768);
  animation-delay: 1s;
  /* a hack to ensure it is loaded before start the animation */
}

#p1::after {
  bottom: 0;
  height: 65%;
  background-image: url(https://picsum.photos/id/1015/1024/768);
  animation-delay: 2s;
}

@keyframes fadein {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
<div id="p1"></div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多