javascript - 一旦加载不起作用,div 中的动画和图像就会淡入淡出

标签 javascript html css dom

我正在尝试在 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>

我不知道我是否解释得足够好:

  1. div 和图像从一开始就存在(但图像自然会在 div 之后加载)
  2. 然后 div 会从比例和不透明度 0 变为 1 进行动画处理。
  3. 加载每个图像后,该图像就会从不透明度 0 淡入到 1

最佳答案

所以,你的问题是你太晚了 onload 事件。发生这种情况是因为您的代码在 DOM 创建之后运行。这样想:当您的代码被评估时,浏览器已经评估了图像源属性,并且很可能已经触发了 onload 事件。

您只需使用自定义属性和 getAttribute() 即可解决此问题。因此,首先我们将图像的 src 属性更改为 lazy-src 属性。这样,浏览器就会知道有一个图像,但其来源未知 - 因此它不会触发 onload

然后,当你循环遍历你的元素时;您无需将该元素推送到数组中,而是在 Hook 时将其 src 属性更改为 lazy-srcthats 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/

相关文章:

javascript - Backbone 集合长度与大小()

javascript - 遍历树来检查值

javascript - 未捕获的类型错误 : info1 is not a function at HTMLInputElement. onkeyup

html - 列出有分隔但没有边距和填充的元素

css - 星号 CSS 规则错误

javascript - Jquery Mouseenter 单击以删除类不起作用

javascript - 在 HTML 中存储任意数据

html - 编辑 Google Chrome 开发者工具本身

html - 无法让搜索框拉伸(stretch)到一定宽度

jquery - 如何使用 jQuery 让我的 6 张图片向外展开?