当前位置: 首页 > 知识库问答 >
问题:

角度2-预加载背景图像?

江浩慨
2023-03-14

我有一个angular项目,其中有一个大的背景图像,填充页面,还有一个简单的侧边栏,其中包含链接,单击后,会将背景的url更改为另一个图像(来自cdn)。由于这些图像相当大,需要一两秒钟才能加载,这很明显,我想添加一个预加载程序,但我不确定如何在angular 2中完成。

在我的html中,我有这个:

<section class="fullsizebg image-bg" [ngStyle]="{'background-image': 'url(' + urlImage + ')'}"></section>

变量urlImage填充在组件的构造函数中,侧栏链接在单击时用一个简单的函数改变它的值,如下所示:

generateImage(data: any){
    this.urlImage = 'http://example.com/mycdn/'+this.data.url+'.jpg';
}

所以url实际上是立即更改的,但图像需要一点时间才能加载。我想添加一个加载gif或类似的东西,以保持图像更改对用户来说很流畅,而不是像现在这样跳来跳去。

共有3个答案

蒋高杰
2023-03-14

使用图像对象(Plunker演示⇗)

tmpImg: HTMLImageElement; // will be used to load the actual image before showing it

generateImage(data: any){
 this.urlImage = 'http://example.com/mycdn/'+ 'loading_GIF_url';  // show loading gif

 let loaded = () => { // wait for image to load then replace it with loadingGIF
   this.urlImage = 'http://example.com/mycdn/' + this.data.url+'.jpg';
 }

 // background loading logic
 if(this.tmpImg){
   this.tmpImg.onload = null; // remove the previous onload event, if registered
 }
 this.tmpImg = new Image();
 this.tmpImg.onload = loaded;  // register the onload event
 this.tmpImg.src = 'http://example.com/mycdn/'+this.data.url+'.jpg';
}
欧君之
2023-03-14

这个解决方案利用了angular和浏览器已经提供的功能。图像加载由浏览器完成,不需要自己处理任何数据或DOM。

我已经在Chrome53上测试过了,它工作得非常完美。

这是你的元素,它正在改变它的背景:

<div class="yourBackgroundClass" [style.background-image]="'url(' + imgUrl + ')'"></div>

为了预取图像,我们使用未显示的图像标记。最好将其<code>位置设置为绝对

<img [src]="imgPreloadUrl" (load)="imgUrl = imgPreloadUrl" hidden>

通过设置imgPreloadUrlimgsrc被angular更新,浏览器将图像加载到不可见的img标签中。完成后,onload触发,我们设置imgUrl=imgPreloadUrl。Angular现在更新实际背景的style.background图像,背景图像立即切换,因为它已经加载到隐藏图像中。

While imgUrl!== imgPreloadUrl我们可以显示一个微调器来指示加载:

<div class="spinner" *ngIf="imgUrl !== imgPreloadUrl"></div>

测试:

<button (click)="imgPreloadUrl = 'https://upload.wikimedia.org/wikipedia/commons/2/24/Willaerts_Adam_The_Embarkation_of_the_Elector_Palantine_Oil_Canvas-huge.jpg'">test</button>

洪琦
2023-03-14

一种方法是使用Blob获取图像并将其存储在img组件中,这样您就可以参与加载过程,并且可以添加加载gif:

@Component({
   selector:'loading-image',
   template:'<img alt="foo" [src]="src"/>'
})
export class ExampleLoadingImage{

   public src:string = "http://example.com/yourInitialImage.png";

   constructor(private http:Http){}

   generateImage(data: any): void {
      this.src = 'http://www.downgraf.com/wp-content/uploads/2014/09/01-progress.gif'; //Just a random loading gif found on google.
      this.http.get('http://example.com/mycdn/'+this.data.url+'.jpg')
         .subscribe(response => {
            let urlCreator = window.URL;
            this.src = urlCreator.createObjectURL(response.blob());
         });
    }
}

注意:你应该输入你的数据参数,键入是确保代码一致性的好方法,任何类型都应该只用作小丑,就像Java中的Object一样。

 类似资料:
  • 问题内容: 在html模板中,我具有带有动态图像的这种样式: 可以在网络浏览器和android浏览器中使用。但是,使用“ style =”动态显示的背景图像不会在iPad上显示。 我总是可以使用img标签创建动态图像,但是我正在寻找iPad的样式/ css解决方案。 问题答案: 改用 要么

  • 我实际上正在学习Angular2,但我遇到了一个...CSS问题o_O我曾搜索过一个类似的问题,但没有任何成功,现在开始: 我在中有一个标记元素 我在div中设置了并使用来适应,但似乎根本不起作用,图片不适合div。 我很困惑因为这是第一次发生在我身上 请参阅:我使用styleUrls在组件中注入css规则 代码 谢谢!

  • 问题内容: 我已经按照所有的教程讲完话了。我在CSS样式表中的身体内部指定了背景,但是页面仅显示空白的白色背景。图片与.html和.css页面位于同一目录中。本教程说 已弃用,所以我在CSS中使用 没有成功。这是整个CSS样式表: 问题答案: 这是另一个图片网址结果..工作正常…我只是放了一个图片路径..请检查一下..

  • 我是一个新的编码,我正在尝试设置一个图像作为我的CSS页面的背景。我可以让背景改变颜色,但当我尝试使用一个实际的图像,什么都不加载。 以下是我的HTML: 以下是我的CSS: 我做错了什么?

  • 简而言之;有没有办法取消/清除JavaFX图像的背景加载? 在我的代码中,我加载了一堆图像。出于性能原因,在后台使用 来自Images类。 问题是,有时,用户交互会导致程序在加载之前更新图像列表(而不需要之前的图像)。在这一点上,我想取消以前的后台加载。现在,它仍然加载以前的图像,导致实际需要的图像加载时间更长。 请看下面的例子。当我在旧的源完成处理之前得到一个新的源流时,内容开始显示图像需要更长

  • 问题内容: 我正在尝试在CSS中使用背景图片,但是即使我给出了图片的完整路径,也无法正常工作。Firebug显示“无法加载给定的URL”。我确定该文件夹中没有权限问题。我的CSS课是 是什么原因引起的? 问题答案: 您正在使用本地路径。那真的是你想要的吗?如果是,则需要使用前缀: 显然,这仅在您的本地计算机上有效。 此外,在许多现代浏览器中,仅当页面本身也位于本地文件路径上时,此方法才有效。从远程