2016-01-05 3 views
0

Я использую Isotope на веб-сайте, который я создал - он используется для размещения большого количества JPEG-файлов, а также с фильтрующей системой - это хорошо работает, но загрузка страницы медленная, поскольку я думаю, что Isotope имеет некоторые проблемы с загрузкой много изображений ...Изображения с изотопной нагрузкой progessively

код я использую, как показано ниже:

$(window).load(function() { 
    // init Isotope 
    var $grid = $('.workGridWrapper').isotope({ 
    // options 
    itemSelector: '.workGridItem', 
    percentPosition: true, 
    masonry: { 
    // use element for option 
    columnWidth: '.grid-sizer' 

    }, 

    filter: '.InitialLoad' 

    }); 

    // store filter for each group 
    var filters = {}; 

    $('.filterGridInner').on('click', 'a', function() { 
    var $this = $(this); 
    // get group key 
    var $buttonGroup = $this.parents('.button-group'); 
    var filterGroup = $buttonGroup.attr('data-filter-group'); 
    // set filter for group 
    filters[ filterGroup ] = $this.attr('data-filter'); 
    // combine filters 
    var filterValue = concatValues(filters); 
    // set filter for Isotope 
    $grid.isotope({ filter: filterValue }); 
    }); 

    // change is-checked class on buttons 
    $('.filterGridInner .button-group').each(function(i, buttonGroup) { 
    var $buttonGroup = $(buttonGroup); 
    $buttonGroup.on('click', 'li', function() { 
     $buttonGroup.find('.filterOn').removeClass('filterOn'); 
     $(this).addClass('filterOn'); 
    }); 
    }); 

}); 

// flatten object by concatting values 
function concatValues(obj) { 
    var value = ''; 
    for (var prop in obj) { 
    value += obj[ prop ]; 
    } 
    return value; 
} 

Я уверен, что функция window.load это вопрос ...

Я видел заметки об использовании imagesLoaded - но не знаете, как его использовать не испортив мое текущее решение.

Любые советы по загрузке страницы намного быстрее? Общий вес страницы составляет всего 2,1 МБ, что на 1,7 Мбайт, что на изображениях - но, как мне кажется, требуется 18 секунд для загрузки.

Любые идеи?

+0

Проверить эту codepen, который использует как ImagesLoaded + изотопный плагин. Http: // codepen.io/desandro/pen/bsHix –

+0

Спасибо. Я действительно хочу адаптировать то, что у меня есть, а не использовать другое решение. – dubbs

ответ

0

Первый шаг, который вы можете предпринять, - убедиться, что все ваши изображения оптимизированы для Интернета (переформатировано & сжато правильно).

Использование ImagesLoaded довольно много прямо вперед, вы можете вызвать ваши функции изотопных только изображения в .workGridItem «s загружаются.

$(function(){ 
    $grid = $('.workGridWrapper'); 
    $grid.imagesLoaded(function() { 
    // Init isotope here after images have loaded.. 
    $grid.isotope({..}); 
    }); 
}); 

Ваш HTML разметка будет выглядеть примерно так:

<div class="workGridWrapper"> 
    <div class="workGridItem"><img src=".."/></div> 
    <div class="workGridItem"><img src=".."/></div> 
</div> 

Однако все это плагин делает, обнаружить, если загружаются изображения и является ли или нет какие-либо неработающие ссылки. Это не улучшит производительность и не изменит факт наличия на странице больших изображений.

Что бы я сделал, это создать две версии изображений: Маленький размер (Миниатюры) & Большой размер (высокое разрешение). Сначала загрузите миниатюры в свой изотоп, а затем, щелкнув по нему, выберите вариант с высоким разрешением.

Вместо того чтобы делать:

<div class="workGridItem"><img src="http://example.com/image.jpg"/></div> 

ли

<div class="workGridItem"> 
    <a href="http://example.com/image.jpg"> 
    <img src="http://example.com/image_thumb.jpg"/> 
    </a> 
</div> 

Пример

$(function() { 
 

 
    var $grid = $('#workGridWrapper'), 
 
    $photos = $grid.find('.workGridItem'), 
 
    $loadingIndicator = $('<div class="loading"><span><img src="http://i.imgur.com/IE7iw.gif" /></span></div>'); 
 

 
    // Setup Isotope and call after Images are loaded 
 
    $grid.imagesLoaded(function() { 
 
    $grid.isotope({ 
 
     animationOptions: { 
 
     duration: 750, 
 
     easing: 'linear', 
 
     queue: false 
 
     }, 
 
     itemSelector: '.workGridItem', 
 
     masonry: { 
 
     columnWidth: 200 
 
     }, 
 
     percentPosition: true 
 
    }); 
 
    }); 
 

 
    // toggle images version 
 
    function enlargeImage($photo) { 
 
    $photos.filter('.large').removeClass('large'); 
 
    $photo.addClass('large'); 
 
    $grid.isotope('reLayout'); 
 
    } 
 

 
    // On click fetch large size image/toggle 
 
    $photos.find('a').click(function() { 
 
    var $this = $(this), 
 
     $photo = $this.parents('.workGridItem'); 
 

 
    if ($photo.hasClass('large')) { 
 
     $photo.removeClass('large'); 
 
     $grid.isotope('reLayout'); 
 
    } else { 
 
     if ($photo.hasClass('has-big-image')) { 
 
     enlargeImage($photo); 
 
     } else { 
 
     $this.append($loadingIndicator); 
 
     var $bigImage = $('<img>', { 
 
      src: this.href 
 
     }); 
 

 
     $('<div>', { 
 
      'class': 'big-image' 
 
      }) 
 
      .append($bigImage) 
 
      .appendTo($this) 
 
      .imagesLoaded(function() { 
 
      $loadingIndicator.remove() 
 
      enlargeImage($photo); 
 
      }); 
 
     $photo.addClass('has-big-image'); 
 

 
     } 
 
    } 
 

 
    return false; 
 
    }); 
 

 
});
body { 
 
    background: #000; 
 
} 
 
#workGridWrapper { 
 
    width: 100%; 
 
    background: #fff; 
 
} 
 
.workGridItem { 
 
    width: 200px; 
 
    float: left; 
 
} 
 
.workGridItem.double { 
 
    width: 480px; 
 
} 
 
.workGridItem.large { 
 
    width: 600px; 
 
    z-index: 3; 
 
} 
 
.workGridItem.large .small-image, 
 
.workGridItem .big-image { 
 
    display: none; 
 
} 
 
.workGridItem .small-image, 
 
.workGridItem.large .big-image { 
 
    display: block; 
 
} 
 
.workGridItem img { 
 
    display: block; 
 
    width: 100%; 
 
} 
 
.workGridItem .loading { 
 
    width: 100%; 
 
    height: 100%; 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    z-index: 10; 
 
    background: hsla(0, 0%, 100%, 0.7); 
 
} 
 
.workGridItem .loading span { 
 
    position: absolute; 
 
    left: 50%; 
 
    top: 50%; 
 
} 
 
.workGridItem .loading img { 
 
    width: auto; 
 
    position: absolute; 
 
    left: -16px; 
 
    top: -16px; 
 
} 
 
.isotope-item { 
 
    z-index: 2; 
 
} 
 
.isotope-hidden.isotope-item { 
 
    pointer-events: none; 
 
    z-index: 1; 
 
} 
 
.isotope, 
 
.isotope .isotope-item { 
 
    -webkit-transition-duration: 0.8s; 
 
    -moz-transition-duration: 0.8s; 
 
    transition-duration: 0.8s; 
 
} 
 
.isotope { 
 
    -webkit-transition-property: height, width; 
 
    -moz-transition-property: height, width; 
 
    transition-property: height, width; 
 
} 
 
.isotope .isotope-item { 
 
    -webkit-transition-property: -webkit-transform, opacity; 
 
    -moz-transition-property: -moz-transform, opacity; 
 
    transition-property: transform, opacity; 
 
} 
 
.isotope.no-transition, 
 
.isotope.no-transition .isotope-item, 
 
.isotope .isotope-item.no-transition { 
 
    -webkit-transition-duration: 0s; 
 
    -moz-transition-duration: 0s; 
 
    transition-duration: 0s; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.0.0/imagesloaded.pkgd.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/2.2.2/isotope.pkgd.min.js"></script> 
 

 
<div id="workGridWrapper" class="photos clearfix"> 
 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4113/5013039951_3a47ccd509_b.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4113/5013039951_3a47ccd509.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4131/5013039885_0d16ac87bc_b.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4131/5013039885_0d16ac87bc.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4086/5013039583_26717f6e89_b.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4086/5013039583_26717f6e89.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4144/5013039541_17f2579e33_b.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4144/5013039541_17f2579e33.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4146/5013646070_f1f44b1939_b.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4146/5013646070_f1f44b1939.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4153/5013039741_d860fb640b_b.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4153/5013039741_d860fb640b.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4113/5013039697_a15e41fcd8.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4113/5013039697_a15e41fcd8_b.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4124/5013646314_c7eaf84918.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4124/5013646314_c7eaf84918.jpg" /> 
 
    </a> 
 
    </div> 
 

 
    <div class="workGridItem"> 
 
    <a href="http://farm5.static.flickr.com/4089/5013040075_bac12ff74e.jpg"> 
 
     <img class="small-image" src="http://farm5.static.flickr.com/4089/5013040075_bac12ff74e_b.jpg" /> 
 
    </a> 
 
    </div> 
 

 
</div>

Если ваш изотоп - это галерея изображений, а не только ссылки, вы можете взглянуть на FancyBox, который имеет хороший API.

<div class="workGridItem"> 
    <a href="http://example.com/image1.jpg" rel="group"> 
    <img src="http://example.com/image_thumb1.jpg"/> 
    </a> 
    <a href="http://example.com/image2.jpg" rel="group"> 
    <img src="http://example.com/image_thumb2.jpg"/> 
    </a> 
</div> 


$(function(){ 
    var $grid = $('#workGridWrapper'), 
     $photos = $grid.find('.workGridItem a'); 

    $grid.imagesLoaded(function() { 
    $grid.isotope({ 
     animationOptions: { 
     duration: 750, 
     easing: 'linear', 
     queue: false 
     }, 
     itemSelector: '.workGridItem', 
     masonry: { 
     columnWidth: 200 
     }, 
     percentPosition: true 
    }); 

    //Call fancybox 
    $photos.fancybox(); 
    }); 

}); 

Я надеюсь, что вы найдете его полезным

+0

Спасибо за ваш длинный ответ. Raja. Я нашел еще один фактор, который способствовал медленной загрузке страницы, которая ничего не знала сделать изотоп - так что думаю, мое решение в отношении использования Isotope на самом деле уже хорошо. Однако высоко оценивайте свои усилия по разработке нового решения. – dubbs

+0

Нет проблем, даббс, удачи! –

Смежные вопросы