【问题标题】:Display a Loading icon while images loads加载图像时显示加载图标
【发布时间】:2016-11-26 22:29:19
【问题描述】:

我想在 div 中显示一个背景图像/加载微调器,它将在其中加载一个图像,图像将在完全加载后显示,执行如下操作:

   <div style="background-image:url('imageThatWillAppearBeforeLoad')"></div>

Demo (In jQuery)

如何使用 Angular2/Ionic2 获得相同的效果?

【问题讨论】:

标签: javascript angular ionic2


【解决方案1】:

只需使用此功能

loadImage(element: HTMLElement, imagePath: string, spinnerPath: string) {
  element.tagName === 'img'
    ? element.setAttribute('src', spinnerPath)
    : (element.style.background = `url(${spinnerPath}) 50% 50% no-repeat`);
  const image = new Image();
  image.crossOrigin = 'Anonymous';
  image.src = imagePath;
  image.onload = () => {
    element.tagName === 'img'
      ? element.setAttribute('src', imagePath)
      : (element.style.background = `url(${imagePath})`);
  };
}

您不必担心您的元素是图像还是 div 或其他任何东西?

如果你不知道如何使用它的例子

ngOnInit() {
  const myElement = document.getElementsByClassName('my-element')[0];
  // or however you want to select it.
  const imagePath = 'path/to/image.png';
  const spinnerPath = 'path/to/spinner.gif'; // or base64 spinner url.

  this.loadImage(myElement, imagePath, spinnerPath);
}

快乐编码?

【讨论】:

    【解决方案2】:

    这是我的 posts 之一的副本

    我终于用 CSS 解决了这个问题!当图像在 ionic 2 中加载时,ion-img 标签没有任何类。但是,当最终加载图像时,ion-img 标签会获取“img-loaded”类。

    这是我的解决方案:

      <ion-img [src]="img.src"></ion-img>
      <ion-spinner></ion-spinner>
    

    还有我的 CSS:

    .img-loaded + ion-spinner {
      display:none;
    }
    

    【讨论】:

      【解决方案3】:

      创建一个组件,在加载请求的图像之前显示占位符图像,并隐藏请求的图像。加载图像后,隐藏占位符并显示图像。

      @Component({
        selector: 'image-loader',
        template: `<img *ngIf="!loaded" src="url-to-your-placeholder"/>
          <img [hidden]="!loaded" (load)="loaded = true" [src]="src"/>`
      })
      export class ImageLoader {
        @Input() src;
      }
      

      查看它在 Plunker 中的工作。

      更新

      现在我更好地理解了要求,这里有一个带有背景图片的解决方案。有点hacky,我更喜欢原来的...

      @Directive({
        selector: '[imageLoader]'
      })
      export class ImageLoader {
        @Input() imageLoader;
      
        constructor(private el:ElementRef) {
          this.el = el.nativeElement;
          this.el.style.backgroundImage = "url(http://smallenvelop.com/demo/image-loading/spinner.gif)";
        }
      
        ngOnInit() {
          let image = new Image();
          image.addEventListener('load', () => {
            this.el.style.backgroundImage = `url(${this.imageLoader})`;
          });
          image.src = this.imageLoader;
        }
      }
      

      Updated plunker.

      【讨论】:

      • 您的代码运行良好,但就我发布的情况而言,我有一个 &lt;div style="background-image:url('imageThatWillAppearBeforeLoad')"&gt;&lt;/div&gt;,其中包含背景中的图像,我尝试调整您的代码以匹配 @ 987654326@我有,但没用,有没有可能让它作为div工作?
      • 就我目前所取得的成就而言,我猜想(负载)由于某种原因不起作用!因为我已经用div 替换了img,等等......当我去检查DOM 时,我看到了隐藏,这意味着由于某种原因没有应用loaded = true,这让我什至确定(load) 的一个问题是我用(click) 替换它,然后我将它放在占位符div 中并且它起作用了!那么,你知道为什么(load) 没有用吗?
      • 它不起作用,因为divs 没有onload 事件...这就是我以这种方式制作组件的原因。
      • 必须是div吗?您是否还需要将请求的图像作为背景图像,或者可以是 img 元素?
      • 它必须是div 而不是img
      猜你喜欢
      • 1970-01-01
      • 2015-06-26
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多