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

使用NgOptimizedImage时如何设置图片加载前占位图?

解决NgOptimizedImage的占位图及滚动卸载空白问题

NgOptimizedImage本身提供了更简洁可靠的占位图实现方案,同时也能针对性解决你遇到的滚动卸载后返回空白的问题,具体方法如下:

1. 内置占位图实现(推荐)

无需手动监听load/unload事件,组件本身支持两种常用占位图模式:

低质量缩略图占位(LQIP)

准备一张原图的低分辨率缩略图,通过placeholder属性绑定即可,组件会自动先加载小体积的低清图,原图加载完成后自动替换:

<img [ngSrc]="imageUrl" fill [placeholder]="lowResImageUrl">

纯色占位

如果不需要缩略图,可直接指定纯色作为占位背景,配合placeholderColor使用:

<img [ngSrc]="imageUrl" fill placeholder="color" placeholderColor="#f5f5f5">

2. 解决滚动离开后返回的空白问题

你遇到的滚动离开后原图卸载、返回时空白的情况,是因为NgOptimizedImage默认的懒加载策略会在元素离开视口时自动卸载图片以节省资源,可通过以下两种方式调整:

调整卸载阈值

修改组件配置,设置更高的卸载阈值,让图片在离开视口更远的距离后才触发卸载,短距离滚动时不会卸载图片:

import { NgOptimizedImage } from '@angular/common';

@NgModule({
  imports: [
    NgOptimizedImage.withConfig({
      unloadImageThreshold: 500, // 元素离开视口500px后才卸载图片
    })
  ]
})
export class YourModule {}

禁用图片卸载(按需使用)

如果你的场景对资源占用要求不高,可直接禁用卸载功能,图片加载后会一直保留:

NgOptimizedImage.withConfig({
  unloadImages: false
})

自定义占位容器方案(备选)

如果不想使用内置属性,也可以用容器包裹的方式,将占位图设为容器背景,原图加载完成后覆盖显示:

<div class="image-wrapper">
  <img [ngSrc]="imageUrl" fill class="target-image" (load)="onImageLoaded($event.target)">
</div>

配套CSS:

.image-wrapper {
  position: relative;
  background: url('占位图地址') center/cover no-repeat;
}
.target-image {
  opacity: 0;
  transition: opacity 0.3s ease;
}
.target-image.loaded {
  opacity: 1;
}

组件内逻辑:

onImageLoaded(img: HTMLImageElement) {
  img.classList.add('loaded');
}

这种方式下背景占位图不会被卸载,即便原图重新加载,占位背景也会一直显示。


内容的提问来源于stack exchange,提问作者1baz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:38:14