Problem z wysokością i pozycją obrazków – masonry, isotope
Wraz z responsive web design, ludzie zaczęli zmieniać rozmiar okna aby sprawdzić jak strona się dopasowuje. Oczywiście jeśli właśnie po to przyszli. Normalni użytkownicy, którzy przyszli przeczytać lub zobaczyć coś, nie robią tego. Tak czy inaczej ostatnio zauważyłam, że coraz więcej stron wykorzystuje masonry lub isotope. Zapewne dlatego, że mają ten fajny efekt “shuffle” przy zmianie rozmiaru okna (lub sortowania). Działają poprzez pobranie absolutnej pozycji i rozmiarów elementów. Problemem jest, że w responsive web design (lub fluid) żeby obrazki mogły się dobrze dopasować nie definiujemy ich rozmiarów. Będę odnościć się do masonry jako, że jest całkowicie darmową biblioteką, ale rozwiązanie również będzie działać dla isotope.
Problem
Zazwyczaj w jQuery inicjujemy rzeczy w $(document).ready(). Tak więc jeśli zainicjujesz masonry w ten sposób:
$(function(){
var $container = $('#container');
// initialize
$container.masonry({
itemSelector: '.item'
});
});
a w elementach masz obrazki które nie mają zdefiniowanych rozmiarów, możesz otrzymać to:
Nie dobrze. Zdjęcia nachodzą na siebie. Moje koty NIE SĄ zadowolone.
Dlaczego obrazki nachodzą na siebie?
Jak napisałam na początku, biblioteki pobierają absolutną pozycję i rozmiary. To oczywiste, że nie możesz pobrać pozycji i rozmiaru czegoś co jeszcze nie istnieje. Gdy umieszczasz inicjalizację w $(document).ready() możesz być prawie pewien, że będziesz miał ten problem przy pierwszym ładowaniu strony. Dlaczego? Ponieważ jest wywoływana kiedy dokument jest gotowy, a to zazwyczaj jest znacznie wcześniej niż zdjęcia są. Jest szansa, że następnym razem będzie to wyświetlone poprawnie jeśli przeglądarka użyje obrazków z pamięci podręcznej.
Rozwiązanie numer 1
Po prostu umieść inicjalizację masonry w $(window).load() zamiast $(document).ready().
$(window).load(function(){
var $container = $('#container');
// initialize
$container.masonry({
itemSelector: '.item'
});
});
Dzięki temu zostanie wywołana gdy już wszystkie elementy strony zostaną załadowane. W tym momencie możemy pobrać prawidłowe wartości i wszystko wygląda dobrze
i koty są zadowolone ;o)
Rozwiązanie numer 2
Jeśli mamy bardzo dużo elementów na stronie, to czekanie aż wszystkie się załadują może nie być dobrym rozwiązaiem. Jeśli tak jest to powienieneś się zainteresować imagesLoaded. Rozwiązanie z wykorzystaniem imagesLoaded zostało już opisane na stronie masonry tak więc nie będę już go powtarzać :o)
masonry i isotope. Czytam i okazuje się że to na prawde jest przydatne. Dzięki za wskazówkę.
Mam właśnie w kolejce kolejny post na rwd kontra device detection ;o) ale krótko mówiąc: to zależy. Przy małej stronie bez większych bajerów, bawienie się w detekcję to za dużo roboty, ale już przy większych stronach lub gdy kodu JS/CSS jest coraz więcej zrobiłabym detekcję mobile i zaserwowała tylko pliki dla mobile bo i tak nie potrzebują tego całego kodu, a to przecież chodzi jeszcze o szybkość działania strony, a nie tylko że ładnie się zmienia w zależności od rozdzielczości ;o)
@Eliza Witkowska przepraszam za pomyłkę płci ;) faktycznie to nie ma wtedy sensu, wczoraj byłem po prawie 24h jazdy z małymi przerwami stąd takie nieogarnięcie moje… Teraz mamy RWD, z góry ustalamy jakie paczki js wczytamy, operujemy na CSS, i co dalej? ;) Czy tak zostawić czy już na poziomie aplikacji warto pobrać informacje o przeglądarce i na jej podstawie dokonać wczytania paczek?
@pionas jakby miało to być tylko do "efektu" przy zmianie rozdzielczości okna to bym żadnej biblioteki nie użyła, bo to jest niepotrzebny JS, niepotrzebne liczenie i obciążenie. Normalnie użytkownicy nie zmieniają rozmiaru okna, więc nawet tego efektu nie zobaczą, więc po co dodatkowo obciążać stronę?
@Eliza Witkowska ja akurat używam do prezentacji ostatnio dodanych artykułów, a gdyby to miało być tylko do efekty przy zmianie okna to co byś polecał?
Jeśli isotope/masonry dla ładnego efektu przy zmianie okna, powiedziałabym – żaden z nich ;o) Jeśli dla efektu przy jakimś sortowaniu to tylko isotope, bo masonry z tego co pamiętam nie ma nawet takiej opcji.
Na blog trafiłem naprawdę przypadkiem, szukałem rozwiązania na niedziałającą mapkę w ukrytym div ;) Tamten artykuł ciekawy, także postanowiłem rozejrzeć się na blogu. I ten artykuł również mnie zaciekawił. Używam isotope (na marginesie co lepsze isotope czy masonry?) i czasami zauważałem problem opisany w tym temacie. I faktycznie "load" – mała rzecz a cieszy :D