javascript - 在其 onload 处理程序中更改图像的不透明度时遇到问题

标签 javascript css

我有这段 JavaScript:

function performSearch(keywords) {
  const itemList = document.getElementById('items-div');
  const search = document.getElementById('search');
  itemList.innerHTML = '';
  setLoading(true);

  store.where({ name: keywords }).then((items) => {
    setLoading(false);
    console.log(`Found ${items.length} items...`);

    items.forEach((c, i) => {
      console.log(c);
      if (c.imageUrl) {
        itemList.innerHTML += rowTemplate({
          card: c,
          index: i,
        });
        const img = document.getElementById(`image-${i}`);
        img.onload = () => {
          img.style.transition = "opacity 0.3s";
          img.style.opacity = "1";
          console.log(`Image ${i} loaded succesfully.`);
        };
        img.src = c.imageUrl;
      }
    });

    search.focus();
    search.select();
  });
}

似乎不起作用的是 img.onload 部分。

console.log() 消息显示在控制台中,但是不透明度没有改变。

如果我在控制台本身做完全相同的事情,它工作正常。

我意识到这一定是因为 DOM 还没有完成我正在添加的内容的渲染,但我不确定如何修复它。

最佳答案

因为您需要在加载时指定启动器 opacity(默认情况下为 1,并且您正尝试从 1 过渡到 1 没有可见效果)。并且可以通过@keyframes实现fade-in效果,例子如下:

const onload = () => {
  const img = document.getElementById('target');
  img.style.opacity = 0;
  img.style.animation = "fadeIn .5s ease-in 1 forwards";
};

onload();
@keyframes fadeIn {
  to {
    opacity: 1;
  }
}
<img src="http://qnimate.com/wp-content/uploads/2014/03/images2.jpg" id="target">

更新

“这种显示我的意思:jsfiddle.net/92w79gxa/3 ...在这个例子中,我默认显示所有图像,但随后试图让它们全部消失。只有最后一个消失了。”

您需要在 img.onload 中分配新值:img = document.getElementById('some-image-${i}');。这是工作示例:

const stuff = document.getElementById("stuff");
stuff.innerHTML = '';
console.log('started');
for(let i = 0; i <= 5; i++) {
   stuff.innerHTML += `
   <img style="opacity: 1" id="some-image-${i}" width="20" height="20"><br>
   `;

   let img = document.getElementById(`some-image-${i}`);
   console.log('BEFORE "onload"')
   img.onload = () => {
     console.log('INSIDE "onload"')
     img = document.getElementById(`some-image-${i}`);
     img.style.transition = 'opacity 2s';
     img.style.opacity = '0';
   };

   img.src = 'http://synic.world/s/someicon.png';
}

console.log('Done!');
<div id="stuff">

</div>

如果你查看控制台日志,你会看到,所有迭代都先进行,只有在最后一个迭代完成后,所有的 onload 才会被执行,最后存储的元素将是.some-image-5(这是因为只有最后一项褪色了)。

关于javascript - 在其 onload 处理程序中更改图像的不透明度时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46548246/

相关文章:

javascript - 我不明白为什么一些随机颜色与图像重叠?

带有淡入淡出的 jQuery slider 不改变图像

jquery - 在 Bootstrap 中滚动后更改导航栏中的 Logo 和字体

css - 我怎样才能让两张 table 并排?

javascript - 通过 Redux 使用 Web-Worker 的 Promise

javascript - 将扬声器中的麦克风静音但仍然能够使用 Web Audio Api 进行分析(createAnalyser)?

javascript - 跨子域使用 session 存储

javascript - 如何在 HTML 输入字段的末尾自动添加 .com?

javascript - 我怎样才能在一个容器中有两个 div,以便在调整一个的大小时另一个自动调整大小以填充容器?

javascript - 仅当另一个元素悬停时才更改元素的颜色