50 lines
		
	
	
		
			No EOL
		
	
	
		
			1.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			No EOL
		
	
	
		
			1.1 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 || ''}}"
 | |
|       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('src')
 | |
|       let fallback = this.get('fallback')
 | |
|       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()')
 | |
|     }
 | |
|   }
 | |
| </script> |