Отложенная загрузка изображений
От: Bаня  
Дата: 17.11.19 04:02
Оценка:
Здравствуйте?

перерыл форум и не нашёл ответа,
есть какая нибудь простая реализация отложенной загрузки изображений (Lazy Load)
чтобы картинка загружалась только когда попадает в viewport ?

спасибо
Re: Отложенная загрузка изображений
От: c-smile Канада http://terrainformatica.com
Дата: 17.11.19 16:00
Оценка:
Здравствуйте, Bаня, Вы писали:

B>Здравствуйте?


B>перерыл форум и не нашёл ответа,

B>есть какая нибудь простая реализация отложенной загрузки изображений (Lazy Load)
B>чтобы картинка загружалась только когда попадает в viewport ?

B>спасибо



Попробуй так:

<picture source="foo" />



class PictureOnDemand : Element {
 
  function paintContent(gfx) {
    this.attributes["src"] = this.attributes["source"];
    this.attributes["source"] = undefined;
  }
}


и CSS:

picture[source] {
  prototype: PictureOnDemand;
}



Ну или использовать virtual list — там в DOM только visible элементы.
Re[2]: Отложенная загрузка изображений
От: Bаня  
Дата: 20.11.19 19:54
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Попробуй так:


не работает, всё равно вызывается для всех элементов по списку

какой самый быстрый способ проверить видимость элемента?
типа этого:
function isInViewport(el){
    var rect = el.getBoundingClientRect();
    
    return (
        rect.bottom >= 0 && 
        rect.right >= 0 && 
        rect.top <= (window.innerHeight || document.documentElement.clientHeight) && 
        rect.left <= (window.innerWidth || document.documentElement.clientWidth)
    );
}



CS>Ну или использовать virtual list — там в DOM только visible элементы.


он не умеет flow: horizontal-wrap;
Re[3]: Отложенная загрузка изображений
От: c-smile Канада http://terrainformatica.com
Дата: 20.11.19 21:04
Оценка: 3 (1)
Здравствуйте, Bаня, Вы писали:

B>какой самый быстрый способ проверить видимость элемента?



  var (cx1,cy1,cx2,cy2) = container.box(#rect,#inner,#view);
  var (x1,y1,x2,y2) = child.box(#rect,#border,#view);

  if( x2 < cx1 || x1 > cx2 ) return false;
  if( y2 < cy1 || y1 > cy2 ) return false;

  return true; // it is somehow visible
Re[4]: Отложенная загрузка изображений
От: Bаня  
Дата: 21.11.19 02:14
Оценка:
Здравствуйте, c-smile, Вы писали:

B>>какой самый быстрый способ проверить видимость элемента?


CS>
CS>  var (cx1,cy1,cx2,cy2) = container.box(#rect,#inner,#view);
CS>  var (x1,y1,x2,y2) = child.box(#rect,#border,#view);

CS>  if( x2 < cx1 || x1 > cx2 ) return false;
CS>  if( y2 < cy1 || y1 > cy2 ) return false;

CS>  return true; // it is somehow visible
CS>

спасибо!
то, что нужно

class PictureOnDemand : Element
{
    function paintContent(gfx)
    {
        if( this.attributes["r"] === "0" )
        {
            if( isInViewport( $(container), this ) )
            {
                ...
                this.attributes["r"] = 1;
            }
        }
    }
}

вот такой способ оптимальный или есть вариант проще/быстрее пометить элемент как загруженный ?
Re[5]: Отложенная загрузка изображений
От: c-smile Канада http://terrainformatica.com
Дата: 21.11.19 19:21
Оценка: 3 (1)
Здравствуйте, Bаня, Вы писали:

B>спасибо!

B>то, что нужно

B>вот такой способ оптимальный или есть вариант проще/быстрее пометить элемент как загруженный ?


Можно использовать :visited state flag для этих целей ибо по смыслу это оно:

class PictureOnDemand : Element
{
    function paintContent(gfx)
    {
        if( !this.state.visited )
        {
            if( isInViewport( $(container), this ) )
            {
                ...
                this.state.visited = true;
            }
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.