55 lines
		
	
	
		
			No EOL
		
	
	
		
			1.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			No EOL
		
	
	
		
			1.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<div class="lazy-image"
 | 
						|
     style="width: {width}px; height: {height}px; background: {background};">
 | 
						|
  {#if displaySrc}
 | 
						|
    <img
 | 
						|
      class="{hidden ? 'hidden' : ''} {className || ''}"
 | 
						|
      aria-hidden={ariaHidden || ''}
 | 
						|
      alt={alt || ''}
 | 
						|
      title={alt || ''}
 | 
						|
      src={displaySrc}
 | 
						|
      {width}
 | 
						|
      {height}
 | 
						|
    />
 | 
						|
  {/if}
 | 
						|
</div>
 | 
						|
<style>
 | 
						|
  .lazy-image {
 | 
						|
    overflow: hidden;
 | 
						|
  }
 | 
						|
  .lazy-image img {
 | 
						|
    transition: opacity 0.2s linear;
 | 
						|
  }
 | 
						|
</style>
 | 
						|
<script>
 | 
						|
  import { mark, stop } from '../_utils/marks'
 | 
						|
 | 
						|
  export default {
 | 
						|
    oncreate () {
 | 
						|
      mark('LazyImage oncreate()')
 | 
						|
      let img = new Image()
 | 
						|
      let { src } = this.get()
 | 
						|
      let { fallback } = this.get()
 | 
						|
      img.onload = () => {
 | 
						|
        requestAnimationFrame(() => {
 | 
						|
          this.set({
 | 
						|
            displaySrc: src,
 | 
						|
            hidden: true
 | 
						|
          })
 | 
						|
          requestAnimationFrame(() => {
 | 
						|
            this.set({hidden: false})
 | 
						|
          })
 | 
						|
        })
 | 
						|
      }
 | 
						|
      img.onerror = () => {
 | 
						|
        this.set({displaySrc: fallback})
 | 
						|
      }
 | 
						|
      img.src = src
 | 
						|
      stop('LazyImage oncreate()')
 | 
						|
    },
 | 
						|
    data: () => ({
 | 
						|
      displaySrc: void 0,
 | 
						|
      hidden: false,
 | 
						|
      ariaHidden: false
 | 
						|
    })
 | 
						|
  }
 | 
						|
</script> |