<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>