我正在尝试在 div 中制作动画,每个 div 内部都有 1 个透明图像。一旦图像加载完毕,我希望它逐渐将不透明度从 0 更改为 1。我已经完成了大部分工作,但仍然有一些代码是错误的,因为图像根本没有任何变化。
有谁知道出了什么问题或如何解决它。
如果代码片段不适合您,这里链接到 jsfiddle
var items = document.querySelectorAll(".item"),
t = 0;
items.forEach(function(i) {
i.style.animationDelay = t + "s";
t = t + 0.05;
});
var imgs = [];
items.forEach(function(itm) {
imgs.push(itm.children[0]);
});
for (var i = 0; i < imgs.length; i++) {
imgs[i].onload = () => {imgs[i].style.opacity = "1";};
}
body {
background: #212121;
}
.list {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.item {
transform: scale(0);
width: 150px;
height: 210px;
margin: 1%;
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.7);
background: #191919;
cursor: pointer;
border-radius: 2px;
animation: 0.2s loadInItems ease forwards;
}
.item img {
opacity: 0;
height: 100%;
width: 100%;
border-radius: 2px;
}
@keyframes loadInItems {
from {
opacity: 0;
transform: scale(0);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes fadeIn {
to {
opacity: 1
}
}
<div class="list">
<div class="item">
<img src="https://bo3li.files.wordpress.com/2011/05/drive-angry-movie-cover.jpg">
</div>
<div class="item">
<img src="http://www.tolkienlibrary.com/press/images/movie-tie-in-The-hobbit.jpg">
</div>
<div class="item">
<img src="http://netdna.webdesignerdepot.com/uploads/2011/02/jurassicpark.jpg">
</div>
<div class="item">
<img src="http://posterwire.com/wp-content/uploads/lord_of_war.jpg">
</div>
<div class="item">
<img src="https://davebrendon.files.wordpress.com/2010/12/i-am-number-four-movie-poster.jpg">
</div>
<div class="item">
<img src="http://gdj.gdj.netdna-cdn.com/wp-content/uploads/2011/12/grey-movie-poster.jpg">
</div>
<div class="item">
<img src="https://s-media-cache-ak0.pinimg.com/originals/e2/81/9d/e2819de0653c516f0e242038770fa3b8.jpg">
</div>
<div class="item">
<img src="http://netdna.webdesignerdepot.com/uploads/2011/02/inception.jpg">
</div>
<div class="item">
<img src="https://bo3li.files.wordpress.com/2011/05/drive-angry-movie-cover.jpg">
</div>
<div class="item">
<img src="http://www.tolkienlibrary.com/press/images/movie-tie-in-The-hobbit.jpg">
</div>
</div>
我不知道我是否解释得足够好:
- div 和图像从一开始就存在(但图像自然会在 div 之后加载)
- 然后 div 会从比例和不透明度 0 变为 1 进行动画处理。
- 加载每个图像后,该图像就会从不透明度 0 淡入到 1
最佳答案
所以,你的问题是你太晚了 onload 事件。发生这种情况是因为您的代码在 DOM 创建之后运行。这样想:当您的代码被评估时,浏览器已经评估了图像源属性,并且很可能已经触发了 onload 事件。
您只需使用自定义属性和 getAttribute()
即可解决此问题。因此,首先我们将图像的 src
属性更改为 lazy-src
属性。这样,浏览器就会知道有一个图像,但其来源未知 - 因此它不会触发 onload
。
然后,当你循环遍历你的元素时;您无需将该元素推送到数组中,而是在 Hook 时将其 src
属性更改为 lazy-src
和 thats onload
更改元素样式:
(here's a link to your updated fiddle)
var items = document.querySelectorAll(".item"),
t = 0;
items.forEach(function(i) {
i.style.animationDelay = t + "s";
t = t + 0.05;
});
var imgs = [];
items.forEach(function(itm) {
let image = itm.children[0]
image.src = image.getAttribute('lazy-src');
image.onload = () => {
image.style.opacity = "1";
};
});
body {
background: #212121;
}
.list {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.item {
transform: scale(0);
width: 150px;
height: 210px;
margin: 1%;
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.7);
background: #191919;
cursor: pointer;
border-radius: 2px;
animation: 0.2s loadInItems ease forwards;
}
.item img {
opacity: 0;
height: 100%;
width: 100%;
border-radius: 2px;
}
@keyframes loadInItems {
from {
opacity: 0;
transform: scale(0);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes fadeIn {
to {
opacity: 1
}
}
<div class="list">
<div class="item">
<img lazy-src="https://bo3li.files.wordpress.com/2011/05/drive-angry-movie-cover.jpg">
</div>
<div class="item">
<img lazy-src="http://www.tolkienlibrary.com/press/images/movie-tie-in-The-hobbit.jpg">
</div>
<div class="item">
<img lazy-src="http://netdna.webdesignerdepot.com/uploads/2011/02/jurassicpark.jpg">
</div>
<div class="item">
<img lazy-src="http://posterwire.com/wp-content/uploads/lord_of_war.jpg">
</div>
<div class="item">
<img lazy-src="https://davebrendon.files.wordpress.com/2010/12/i-am-number-four-movie-poster.jpg">
</div>
<div class="item">
<img lazy-src="http://gdj.gdj.netdna-cdn.com/wp-content/uploads/2011/12/grey-movie-poster.jpg">
</div>
<div class="item">
<img lazy-src="https://s-media-cache-ak0.pinimg.com/originals/e2/81/9d/e2819de0653c516f0e242038770fa3b8.jpg">
</div>
<div class="item">
<img lazy-src="http://netdna.webdesignerdepot.com/uploads/2011/02/inception.jpg">
</div>
<div class="item">
<img lazy-src="https://bo3li.files.wordpress.com/2011/05/drive-angry-movie-cover.jpg">
</div>
<div class="item">
<img lazy-src="http://www.tolkienlibrary.com/press/images/movie-tie-in-The-hobbit.jpg">
</div>
</div>
关于javascript - 一旦加载不起作用,div 中的动画和图像就会淡入淡出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41830872/