css 如何在body标签的background-image属性中添加动画?

cngwdvgl  于 2023-01-22  发布在  其他
关注(0)|答案(4)|浏览(324)

我在style标签中使用背景图像。

<style>
body {
 background-image: url("img.jpg");
 background-size: cover;
 transition: background-image 4s linear;
 }
</style>

我想让图片淡入,而不必在页面上添加单独的div。有可能实现吗?

n7taea2i

n7taea2i1#

这里有一个只使用CSS的方法。但是,有一个警告,CSS不能等待一个事件,所以它不能知道整个网站何时加载。
相反,在这个代码片段中,它在开始引入body的before伪元素上的背景图像之前等待了1秒钟。

body {
  width: 100vw;
  height: 100vh;
  /*just for demo */
  position: relative;
}

body::before {
  background-image: url(https://picsum.photos/id/1015/1024/768);
  background-size: cover;
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  opacity: 0;
  animation: fadein 5s 1 1s linear forwards;
}

@keyframes fadein {
  to {
    opacity: 1;
  }
}
Hello, this is some text in the body. It will be seen even before the background starts to fade in.
fkaflof6

fkaflof62#

是的,这是可能的。这就是你能做到的。

@keyframes mymove {
     from {
      /* background: white; */     
     }
     to {
      background: url("https://www.shutterstock.com/image-photo/welded-metal-chain-various-rigging-260nw-2238426561.jpg");
       }
}
body {        
        animation: mymove 2s infinite;
      }
<body><body>
vh0rcniy

vh0rcniy3#

如何淡入背景

有几种方法可以实现这一点,但最简单的方法可能是使用transition css属性。

CSS转换属性:

https://developer.mozilla.org/en-US/docs/Web/CSS/transition
转换使您能够定义元素的两种状态之间的转换。不同的状态可以使用伪类定义,如:hover或:active或使用JavaScript动态设置。
通常转换是在css层应用事件的,所以你可能有第三个规则,***on:hover***将应用css属性的转换(在这个例子中是opacity),但是这里我们需要在文档加载时做,并且没有css选择器,所以我们将在文档准备好后缓慢延迟地添加类。

演示:

所以在这个演示中,我有一个css规则来处理.bg元素,在一个伪元素中设置它们的背景,这个伪元素覆盖了整个父元素,但是使用了opacity: 0
我之所以使用伪元素::before,是因为过渡将被限制在背景本身,而不是整个正文内容。***重要:***我设置了z-index: -1,以便元素将被授权保留在背景上。
然后,还有另一个针对.show元素的规则,该规则将设置opacity: 1的转换持续5秒。
bg类被赋予html中的body,类show通过js应用于DOMContentLoaded事件(当页面准备就绪时)。
同样的效果可以通过点击页面中的按钮来实现,这个按钮将调用相同的fadeInBackground函数,这个函数将删除show类,并在添加该类之前等待片刻。
这样的延迟很重要,因为css引擎的React会很糟糕,否则如果你删除和添加类的速度太快,它将不会执行动画(这是因为上面解释的css事件与通过js触发动作相比的原因)。

//on page load, fades the background in
document.addEventListener('DOMContentLoaded', ()=> fadeInBackground());

function fadeInBackground(){
  //removes the class show from body
  document.body.classList.remove('show');
  //waits 200ms before adding the class show to body
  setTimeout(()=> document.body.classList.add('show'), 200);  
}
.bg::before {
  content: ' ';
  
  display: block;  
  position: absolute;  
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;  
  
  background-image: url('https://thumbs.dreamstime.com/z/cors-caron-bog-pools-as-seen-boardwalk-national-nature-reserve-near-tregaron-wales-60217166.jpg');
  background-repeat: no-repeat;  
  background-size: cover;
  
  opacity: 0;
  z-index: -1;
}

.show::before {
  opacity: 1;
  transition: opacity 5s;
}

div{  
  background: white;
  opacity: .8;
  padding: 1em;
  background: dashed 4px gray;
}
<body class="bg">    
  
  <div>
    <p>This is the page content slightly faded relative to the background</p>
    <br>
    <p>The fadein is expected to happen at page load but you can trigger the action also from here</p>
    <button onclick="fadeInBackground()">Fade in background</button>
  </div>
    
</body>
bpzcxfmw

bpzcxfmw4#

它可能与关键帧只是有点棘手。

@keyframes backgroundAnimation {
    from {
        background-position: 0% -100%;
    }
    to {
        background-position: 0% 0%;
    }
}
@keyframes azcdF {
    from {
        background-color: white;
        opacity: 1;
    }
    to {
        background-color: white;
        opacity: 0;
    }
}
#franz {
    background-image: 
        url("https://i.stack.imgur.com/vf9IF.png");
    animation: backgroundAnimation 5s linear 1 0s;
    height: 100%;
    width: 100%;
    position: absolute;
    background-repeat: no-repeat;
}
#aniZ {
    animation: azcdF 5s linear 1 0s;
    opacity: 0;
    height: 100%;
    width: 100%;;
    position: absolute;
    z-index: 999;
    background-repeat: no-repeat;
}
<div id="franz">
    <div id="aniZ">
    </div>
</div>

相关问题