Guest User

Untitled

a guest
Jan 21st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. /**
  2. * Controla o carregamento das imagens com base na posição do viewPort.
  3. *
  4. * @author Casa Publicadora Brasileira - Davi Aragão
  5. * @since 26/12/2017
  6. **/
  7. export class LazyImg
  8. {
  9. /**
  10. * Construtor
  11. *
  12. * @param Array HTMLElement elementsToObserve - Os elementos que terão as imagens carregadas sob demanda do view port.
  13. * @param Number imgType - O tipo da imagem. 0 - <img>. 1 - backround-image: url().
  14. * @return void
  15. * @author Casa Publicadora Brasileira - Davi Aragão
  16. * @since 26/12/2017
  17. **/
  18. constructor(elementsToObserve, imgType = 1) {
  19. this.imgType = imgType;
  20. ('IntersectionObserver' in window) ? this.observeElements(elementsToObserve) : this._loadAllImages(elementsToObserve);
  21. }
  22.  
  23. /**
  24. * Percorre a lista de elementos elementsToObserve e começa a observá-los.
  25. * Com 50px de margin o método _onIntersection é acionado.
  26. *
  27. * @param Array HTMLElement elementsToObserve - Os elementos que terão as imagens carregadas sob demanda do veiw port.
  28. * @return void
  29. * @author Casa Publicadora Brasileira - Davi Aragão
  30. * @since 26/12/2017
  31. **/
  32. observeElements (elementsToObserve) {
  33. const config = {
  34. rootMargin: '50px 0px',
  35. threshold: 0.01
  36. };
  37.  
  38. this._onIntersection = this._onIntersection.bind(this);
  39. let observer = new IntersectionObserver(this._onIntersection, config);
  40. for (const element of elementsToObserve)
  41. observer.observe(element);
  42. }
  43.  
  44. /**
  45. * Método chamado quando um dos elementos é observado.
  46. * Para de observar a entrada que foi afetada.
  47. * Carrega a imagem para a entrada afetada.
  48. *
  49. * @param Array entries - As entradas que foram capturadas pelo observador.
  50. * @param IntersectionObserver observer - O observador das entradas.
  51. * @return void
  52. * @author Casa Publicadora Brasileira - Davi Aragão
  53. * @since 26/12/2017
  54. **/
  55. _onIntersection (entries, observer) {
  56. for (const entry of entries) {
  57. if (entry.intersectionRatio > 0) {
  58. observer.unobserve(entry.target);
  59. this._fetchImage(entry.target).then(() => this.loadImage(entry.target));
  60. }
  61. }
  62. }
  63.  
  64. /**
  65. * Carrega todas as imagens dos elementos observados instântaneamente.
  66. * Método executado caso não exista suporte para IntersectionObserver.
  67. *
  68. * @param Array HTMLElement elementsToObserve - Os elementos que terão as imagens carregadas sob demanda do veiw port.
  69. * @return void
  70. * @author Casa Publicadora Brasileira - Davi Aragão
  71. * @since 27/12/2017
  72. **/
  73. _loadAllImages (elementsToObserve) {
  74. for (const element of elementsToObserve)
  75. this.loadImage(element);
  76.  
  77. }
  78.  
  79. /**
  80. * Carrega a imagem antes de colocá-la na página.
  81. *
  82. * @param Object element - O elemento que foi observado e contém a imagem.
  83. * @return void
  84. * @author Casa Publicadora Brasileira - Davi Aragão
  85. * @since 27/12/2017
  86. **/
  87. _fetchImage (element) {
  88. return new Promise((resolve, reject) => {
  89. const img = new Image();
  90. img.src = element.dataset.img;
  91. img.onload = resolve;
  92. img.onerror = reject;
  93. });
  94. }
  95.  
  96. /**
  97. * Inicia a requisição da imagem.
  98. * Caso this.imgType seja 1, carrega a imagem no estilo do elemento.
  99. * Caso seja 0 espera-se que se trate de uma tag <img>, coloca a url no src.
  100. *
  101. * @param Object element - O elemento que foi observado e contém a imagem.
  102. * @return void
  103. * @author Casa Publicadora Brasileira - Davi Aragão
  104. * @since 26/12/2017
  105. **/
  106. loadImage (element) {
  107. (this.imgType) ? element.style.backgroundImage = `url(${element.dataset.img})` : element.src = element.dataset.img;
  108. }
  109. }
Add Comment
Please, Sign In to add comment