Autor Zpráva
4li1985
Profil
Zdravím.

Chcem vás skúsenejších poprosiť o radu, keďže neovládam JS, neviem si rady a potrebujem vyriešiť jeden problém. Za pomoc viem zaplatiť.

Na stránke používam Masonry / Isotope skript (isotope.metafizzy.co), ktorým dosiahnem to, že sa mi jednotlivé divs na stránka zarovnajú pod seba - Pinterest efekt:


Zároveň chcem použit Lazyload skript (github.com/aFarkas/lazysizes), ktorý načítava obrázky postupne pri scrollovaní, tj. až keď sú viditeľné. Zrýchli sa tým načítanie stránky.

Problém je, že keď sa tieto dva skripty použijú, tak Isotope nefunguje správne (jednotlivé divs sa zobrazujú cez seba a celý layout je tzv. scrambled)

Dole je môj kód. Samostatne každý skript funguje, ale dokopy to robí problém.

Našiel som na stackoverflow nejaké riešenia, ale neovládam JS a neviem si s tým pomôcť. Za riešenie viem zaplatiť.

Ďakujem.

Edit: Riešenie som našiel tu, ale neviem to aplikovať na môj web.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<script src="/js/jquery.isotope.min.js" ></script>
<script>
  $.Isotope.prototype._getCenteredMasonryColumns = function() {
    this.width = this.element.width();
    
    var parentWidth = this.element.parent().width();
    
                  // i.e. options.masonry && options.masonry.columnWidth
    var colW = this.options.masonry && this.options.masonry.columnWidth ||
                  // or use the size of the first item
                  this.$filteredAtoms.outerWidth(true) ||
                  // if there's no items, use size of container
                  parentWidth;
    
    var cols = Math.floor( parentWidth / colW );
    cols = Math.max( cols, 1 );

    // i.e. this.masonry.cols = ....
    this.masonry.cols = cols;
    // i.e. this.masonry.columnWidth = ...
    this.masonry.columnWidth = colW;
  };
  
  $.Isotope.prototype._masonryReset = function() {
    // layout-specific props
    this.masonry = {};
    // FIXME shouldn't have to call this again
    this._getCenteredMasonryColumns();
    var i = this.masonry.cols;
    this.masonry.colYs = [];
    while (i--) {
      this.masonry.colYs.push( 0 );
    }
  };

  $.Isotope.prototype._masonryResizeChanged = function() {
    var prevColCount = this.masonry.cols;
    // get updated colCount
    this._getCenteredMasonryColumns();
    return ( this.masonry.cols !== prevColCount );
  };
  
  $.Isotope.prototype._masonryGetContainerSize = function() {
    var unusedCols = 0,
        i = this.masonry.cols;
    // count unused columns
    while ( --i ) {
      if ( this.masonry.colYs[i] !== 0 ) {
        break;
      }
      unusedCols++;
    }
    
    return {
          height : Math.max.apply( Math, this.masonry.colYs ),
          // fit container to columns that have been used;
          width : (this.masonry.cols - unusedCols) * this.masonry.columnWidth
        };
  };
    
  $('#container').isotope({
    // options
    itemSelector: '.box',
    layoutMode: 'masonry',
  });
  
// scroll event to fire masonry
    $(document).ready(function(){
    $(window).scroll(function(){
        if ($(window).scrollTop() > 300){
            $grid.masonry('layout');
        }
    });
});
</script>

<script src="/js/lazysizes.min.js" ></script>
Kajman
Profil
Tipuji, že tu není důležitý javasript, ale css. V první řadě musíte těm divům určit výslednou velikost, i když obrázek není určen (načten). V html je tedy potřeba označit divy, jaký mají poměr a v css si např. nachystat všechny varianty poměrů. Buď podle ukázky, co jste poslal nebo např. podle www.vzhurudolu.cz/prirucka/pruzna-media

Edit: Poměr se tuším u nových verzí prohlížečů určí i podle atributů width a height u img, takže pokud je příliš moc poměrů a nevadí nefunkčnost ve starých prohlížečích, mohlo by stačit toto.
4li1985
Profil
Kajman:
Ďakujem za radu.

Išiel som to riešiť, ale v tom ma napadlo veľmi jednoduché riešenie.

Problém bol v tom, že Lazysizes skript požaduje, aby bol zdroj obrázku uvedený ako <img data-src=".....">, ale Isotope skript hladá zdrojový obrázok štandardne v src="", a keďže nebol určený, tak nefungoval správne. Pridal som teda src atribút a do neho URL na transparentný obrázok, ktorý sa natiahne podľa potreby. Vďaka Lazysizes skripte sa transparentný obrázok zmení na požadovaný hneď ako je viditeľný vo viewporte.

Hope it make sense ;)
Kajman
Profil
A funguje to dobře, i když má černý obrázek jiný poměr než později načtený?
4li1985
Profil
Kajman:
Prekvapivo to funguje.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0