You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中如何实现图片加载完成后才显示且加载期间展示骨架屏?

图片加载骨架屏实现方案

实现逻辑

  • 通过预加载机制监听图片完整加载状态,加载过程中骨架屏保持显示,原图默认隐藏
  • 单个图片区块对应独立的骨架屏元素,互不影响,符合分区块加载的场景要求
  • 图片所有区块完全渲染完成后,自动销毁对应骨架屏并显示原图

基础DOM结构

<!-- 每个分区块对应一个独立容器 -->
<div class="image-container">
  <!-- 骨架屏默认显示 -->
  <div class="skeleton"></div>
  <!-- 目标图片默认隐藏,src后续从API获取后赋值 -->
  <img class="content-img" alt="" style="display: none;">
</div>

核心加载代码

/**
 * 批量加载分区块图片
 * @param {Array} imgSrcList 从API获取的图片地址列表
 */
function loadBlockImages(imgSrcList) {
  const containers = document.querySelectorAll('.image-container')
  imgSrcList.forEach((src, idx) => {
    const curContainer = containers[idx]
    const skeleton = curContainer.querySelector('.skeleton')
    const curImg = curContainer.querySelector('.content-img')

    // 新建临时图片实例预加载,避免页面出现半加载状态的图片
    const preloadImg = new Image()
    preloadImg.src = src

    // 图片完全加载完成后触发(渐进式分块加载的图片会在所有区块渲染完成后才触发该事件)
    preloadImg.onload = () => {
      curImg.src = src
      curImg.style.display = 'block'
      // 销毁对应骨架屏
      skeleton.remove()
    }

    // 加载失败降级逻辑(可选)
    preloadImg.onerror = () => {
      curImg.src = '本地默认占位图地址'
      curImg.style.display = 'block'
      skeleton.remove()
    }
  })
}

骨架屏样式示例

.skeleton {
  width: 100%;
  height: 320px; /* 和对应图片展示高度保持一致 */
  border-radius: 4px;
  background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 50%, #f2f2f2 75%);
  background-size: 200% 100%;
  animation: skeletonShine 1.5s linear infinite;
}

@keyframes skeletonShine {
  0% {
    background-position: 200% 0;
  }
  100% {
    background-position: -200% 0;
  }
}

注意事项

  • 对于分块加载的渐进式图片,原生onload事件会在全部分块渲染完成后才触发,刚好匹配需求,不需要额外监听中间加载状态
  • 预加载逻辑可以根据业务需要调整为懒加载模式,仅当图片区块进入可视区域后才触发加载动作

内容的提问来源于stack exchange,提问作者Jayashree R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:01