8 kroków do zmniejszenia ilości obrazków na stronie


Na końcu każdego artykułu topblogger.pl zobaczycie listwę ikonek za pomocą których dany wpis można dodać do siedmiu serwisów społecznościowych, są to:

  1. wykop – serwis umozliwiający dodanie ciekawych znalezisk w sieci
  2. elefanta – serwis społecznościowy
  3. technorati – serwis społecznościowy o blogach
  4. stumbleupon – serwis umozliwiający ocenę i polecanie stron
  5. digg – anglojęzyczny pierwowzór wykop.pl
  6. del.icio.us – serwis zakładek internetowych
  7. co.mments.com – serwis śledzenia komentarzy różnych wpisów

Każdy serwis przedstawiany jest w postaci ikonki o rozmiarach 16 na 16 pikseli co w sumie daje siedem obrazków o łacznej wadze 4,267 bajtów:

Obr. a. – tabela ikonek zawartych w pasku serwisów społecznościowych uporządkowana alfabetycznie

icons

Cel

Aby zmniejszyć ilość plików na stronie TopBlogger.pl za kilka dni zamierzam zmienić sposób ich prezentacji i z siedmiu obrazków zrobić jeden. Motywuję się nastepująco:

  • poszczególne strony wpisów będą ładowały się szybciej (każdorazowo 1,2 sekundy tylko za pomocą tej małej modyfikacji)
  • obciążenie serwera "obsługujacego" jednego czytelnika będzie wymagało mniej zasobów (6 połączeń mniej na każdy obejrzany wpis)
  • za pomocą tego samego zaplecza bedę mógł zaprezentować treść większej liczbie czytelników jednocześnie (konsekwencja powyższych punktów)

Przygotowania

Przed modyfikacją uwzgledniłem trzy rzeczy:

  1. będzie bardzo kolorowo i muszę korzystać z formatu PNG obsługującego 16,7 milionów kolorów i dodatkowo przeźroczyste tło
  2. każda ikonka ma 16 na 16 pikseli
  3. mam do połaczenia siedem obrazków

1.) Przygotowujemy tło

Aby ze wszystkich siedmiu grafik zrobić jedną potrzebujemy nowy obrazek o rozmiarach 112 pikseli szerokości i 16 pikseli wysokości tak by wszystkie siedem ikonek ładnie zmieściło się obok siebie. Dla kontrastu przy wklejaniu obrazków kolor tła: ciemny.

Obr. b. – nowy pojemnik dla obrazków : icons.png

krok1

2.) Wklejamy obrazki

Otwieramy wszystkie obrazki i jeden po drugim kopiujemy ich zawartość do nowego pliku icons.png, ewentualne różnice rozmiarów wypełniamy kolorem tła.

Obr. c. – icons.png po przekopiowaniu wszystkich obrazków

socicons

3.) Potrzebujemy okienka

Obecna postać pliku rozwiązała jeden z naszych problemów, z siedmiu obrazków powstał jeden. Teraz potrzebujemy swoistego "okienka", czyli sposobu by wyświetlić tę część obrazka która w danym momencie jest nam potrzebna. W tym celu posłużymy się znacznikiem <div>.

4.) Budujemy okienko

Aby znacznik <div> spełnił swoją rolę trzeba określić co i jak ma pokazywać -posłużymy się językiem arkuszy stylów CSS i zamiast samego <div> wpiszemy:

<div style="">

Następnym krokiem jest powiedzenie okienku, że ma wyświetlać zrobioną przez nas grafikę:

<div style="background: url(‘icons.png’);">

Dodatkowo chcemy aby okienko wyświetlało tylko mały fragment całego obrazka odpowiadający pierwotnym ikonkom 16 na 16 pikseli, więc określamy jego szerokość i wysokość (cały kod jest w jednej linijce):

<div style="background: url(‘icons.png’); width: 16px; height: 16px;">

Jako ostanie zagadnienie budowy chcemy aby kolejne okienka pojawiały się obok siebie – do tego użyjemy polecenia float: left;

<div style="background: url(‘icons.png’); width: 16px; height: 16px; float: left;">

Ostatnim krokiem budowy okna jest określenie, że już skończyliśmy je budować, czyli znacznik </div>.

<div style="background: url(‘icons.png’); width: 16px; height: 16px; float: left;"></div>

Okno gotowe, pozostaje kwestia poruszania okienkiem tak, aby pokazywało ten fragment obrazka który najbardziej potrzebujemy.

5. Ruszamy obrazkami

Skoro w obrazku icons.png jedna ikonka położona jest obok drugiej a każda ikonka ma 16 pikseli szerokości potrzebujemy sposobu by pokazać akurat te 16 pikseli o które nam chodzi – w tym celu będziemy przesuwali pasek obrazków tak by okienko pokazywało wybrany fragment, czyli o kolejno 0, 17, 33, 49, 65, 81 i 97 pikseli w lewo.

Obr. c. – icons.png po przekopiowaniu wszystkich obrazków

socicons

pierwszy obrazek (del.icio.us) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) 0px 0px; width: 16px; height: 16px; float: left;"></div>

drugi obrazek (technorati) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) -17px 0px; width: 16px; height: 16px; float: left;"></div>

trzeci obrazek (wykop) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) -33px 0px; width: 16px; height: 16px; float: left;"></div>

czwarty obrazek (stumbleupon) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) -49px 0px; width: 16px; height: 16px; float: left;"></div>

piąty obrazek (elefanta) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) -65px 0px; width: 16px; height: 16px; float: left;"></div>

szósty obrazek (digg) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) -81px 0px; width: 16px; height: 16px; float: left;"></div>

siódmy obrazek (co.mments) wyświetlamy za pomocą:

<div style="background: url(‘icons.png’) -97 0px; width: 16px; height: 16px; float: left;"></div>

I bylibyśmy juz na końcu naszej podróży gdyby nie mały problem: okienko lubi znikać.

6. Potrzebujemy szyby

Przeglądarki uwielbiają ignorować okienka bez treści. Mamy pięknie zbudowane okienko, panoramę w postaci icons.png i jedyne czego nam teraz brakuję jest obrazek-szyba – możecie pobrać go spod adresu http://topblogger.pl/blank.gif (prawy przycisk myszy i "zapisz obiekt docelowy jako…").

7. Wstawiamy szybę

Podobnie jak okienko przeźroczysty obrazek trzeba umieścić na swoim miejscu za pomocą (znów wszystko w jednej linijce):

<img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" />

Tak więc kod dla każdego okienka będzie wygladał nastepująco (dla lepszej czytelności część kodu z punktów 4 i 5 zastąpiłem oznaczeniem [...] )

<div style="[...]"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

8.) Gotowe

A oto jak wygląda całość:

<div>

<div style="background: url(‘icons.png’) 0px 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<div style="background: url(‘icons.png’) -17px 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<div style="background: url(‘icons.png’) -33px 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<div style="background: url(‘icons.png’) -49px 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<div style="background: url(‘icons.png’) -65px 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<div style="background: url(‘icons.png’) -81px 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<div style="background: url(‘icons.png’) -97 0px; width: 16px; height: 16px; float: left;"><img src="blank.gif" alt="" style="width:16px; height:16px; border: 0;" /></div>

<br style="clear: both;" />

</div>

Korzyści

  • 6 obrazków mniej na stronie
  • strona ładuje się 1,2 sekundy szybciej
  • waga obrazków zmniejszyła się z 4,267 bajtów na 2,525 bajtów
  • aby strona ładowała się jeszcze szybciej można połączyć większą liczbę obrazków bądź stworzyć kilka zestawów okienek

Podsumowanie

Zwiększenie szybkości wyświetlania strony nie polega na wykonaniu jednej czynności, a skutki nie są zależne wyłącznie od środków. Albo cytując blog sgk74exp we wpisie wykopana muzyka z windowsowych dźwięków:

Elementy składowe nieszczególne, ale końcowy efekt naprawdę imponujący, momentami wręcz niewiarygodny!

Lubię takie niecodzienne pomysły.
Lubię jak ktoś tak potrafi zrobić "coś z niczego" :)

Każdy może zrobić coś z niczego. Druga część miniserii będzie o tym, jak powyższy sposób zastosowałem w innych miejscach szaty graficznej topblogger.pl i strona główna ma tylko 10 elementów.

Na zakończenie spytam: Czy wpis był ciekawy? Dlaczego? Dlaczego nie?

Podziękowania

Dziekuję Marcinowi za miniaudyt – topblogger.pl bez którego następny wpis z pewnoscią byłby o wiele uboższy.

Kommentarze: 30 »

  • Krzysztof Lis pisze:

    W tych 2,5 kB wliczyłeś, jak rozumiem, kod HTMLowy odpowiedzialny za wyświetlenie?

    • Łukasz Sobek pisze:

      Nie, różnica w kodzie to obecnie 578 bajtów do 1,281 bajtów na korzyść starego sposobu, ale jeśli dodasz wszystko do arkusza stylów poprawiony sposób będzie mniejszy, nie wiem o ile, bo na razie to wersja podstawowa bez CSS w osobnym pliku.

  • Pavel pisze:

    Jak zwykle, miałbym kilka uwag.

    - Co to jest ten obrazek szyba? Robiłem takie manewry wcześniej i nigdy wpadłem na to żeby wklejać jakiegoś dodatkowego gifa. Jeżeli div ma szerokość i wysokość 16px, to nie widzę powodu dla którego przeglądarka miałaby to zignorować. Możesz powiedzieć jakie to robią? Patrząc na stronę w której to zastosowałem, to IE6, IE7, Fx 2, Opera 9.2, Safari 3 (windows) nie obserwuję tych anomalii.
    - Na moje oko to wystarczyłby PNG-8 z 64 kolorami, bez przeźroczystości (białe tło ikon, białe tło bloga)
    - Po całym zabiegu polecam programem PNGGauntlet potraktować pliki .png z włączoną opcją „Brute force”, bardzo rzadko nie zmniejsza wielkości pliku.
    - Style css inline są nunu :)

    • Łukasz Sobek pisze:

      Obrzek szyba jest po to by w razie potrzeby po wstawieniu linka było w co klikać :).
      Masz rację, w powyższym przykładzie starczy png lub gif z 256 kolorami, ale przez to przewodnik byłby jeszcze dłuższy.
      Dziękuję za informacje o Gaunlet, jeszcze go nie znałem :)
      Moze i nunu ale działają i to we wszystkich przeglądarkach ;) – a tak na poważnie, coś musiałem wyrzucić z opisu, i tak jest koszmarnie długi.

  • Igor pisze:

    No dobrze, a co z różnymi graficznymi widgetami? Mozna tylko wywalic?

    • Łukasz Sobek pisze:

      Widgety to kod który zazwyczaj pobieramy z innego serwera, w związku z czym nasze możliwości edycji kodu są ograniczone :(. Na przykładzie MyBloLog: jedyne co możemy zrobić to zakomunikować widgetowi, że zamiast np. 30 ostatnich odwiedzających chcemy wyświetlić 10. Jest to jeden z powodów dla których nie stosuje tu widgetów – zbyt mały wpływ na treść widgeta i jego układ.

  • Marcin pisze:

    „szyba” to koszmarny błąd.

    tam powinien się znaleźć:

    <span>wykop</span>

    do cssów reguła:

    .soc a span{
    display:block;
    width:16px;
    height:16px;
    text-indent:-99em
    }

    a nie przeźroczysty gif… ugh

    • Łukasz Sobek pisze:

      “szyba” to koszmarny błąd.

      Może dlatego tak słabo mi się dziś spało ;). Jak już mówiłem w podziękowaniach: O tym w kolejnym wpisie, bo jeszcze nie przetrawiłem informacji i muszę zastosować ją na stronie. Krok po kroku znaczy czasem popełnianie błędów, nawet przez piszącego :).

  • Span? Div? Neee Panowie… :-)

    Najlepiej zbiór tych odnośników do portali społecznościowych przedstawić jako listę (ul) żeby było semantycznie.

  • Pavel pisze:

    Normalnie, tak samo jak w przypadku divów.
    Dla li: float: left; width: 16; height: 16; background: url(x.png) top left no-repeat; i dla poszczególnych li poszczególna wartość background-position.

    display: block; dla ul li a i nie powinno być wielkich zawirowań.

    Pozostaje kwestia czy wpisujemy tekst w anchor text żeby validator nie miał oporów i wyrzucamy go poza widok użytkownika, czy zostawiamy puste.

    Jeżeli coś palnąłem to mnie poprawcie, bo z pamięci pisałem.

  • [...] „8 kroków do zmniejszenia ilości obrazków na stronie” to świetny artykuł, w którym Topblogger (Łukasz Sobczak) poruszył kwestię optymalizacji grafiki (i kodu) prezentacji ikonek-odnośników do portali społecznościowych. [...]

  • Marcin pisze:

    <!DOCTYPE html
    PUBLIC „-//W3C//DTD XHTML 1.0 Strict//EN”
    „http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
    <html lang=”pl” xml:lang=”pl” xmlns=”http://www.w3.org/1999/xhtml”>
    <head>
    <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/>
    <title>soc</title>
    <style type=”text/css”>
    li{background-image:url(socicons.gif);list-style:none;margin:0;float:left;margin-right:2px}
    a{display:block;width:16px;height:16px;text-indent:-99em}
    li.t{background-position:-17px}
    li.w{background-position:-32px}
    </style>
    </head>
    <body>
    <ul>
    <li class=”d”><a href=”#”>del.i</a></li>
    <li class=”t”><a href=”#”>tech</a></li>
    <li class=”w”><a href=”#”>wykop</a></li>
    </ul>
    </body>
    </html>

  • [...] 8 kroków do zmniejszenia ilości obrazków na stronie Łukasz Sobek rozprawia się z prezentacją odnośników do portali społecznościowych. [...]

  • Szymon pisze:

    Ja podobny efekt uzyskałem ustawiając obrazek z ikonami jako tło dla kontenera linków. Same linki pozostają przezroczyste, a ja je jedynie pozycjonuje w odpowiednich miejscach (margines). Dodatkowa zaleta, to nieco mniejszy kod CSS, bo nie trzeba ustawiać przesunięcia tła dla poszczególnych linków.

    Tak po za tematem:
    Z ciekawości sprawdziłem pod IE 6 i strasznie mi się blog rozsypał. Zdaje się, że problem leży w „krzaczkach” z komentarza przy bloku z treścią (wina kodowania?). Popraw to w CSS-ie, a powinno być OK.

    • Łukasz Sobek pisze:

      Dziekuję, właśnie szykowałem się na batalie z problemem IE 6.

      Sposób z pojemnikiem bardzo mi się podoba. Dobrze, że istnieje wiele rozwiązań tego samego problemu :)

  • [...] momencie pogubicie się zapraszam do wpisów Jak przyspieszyć bloga dla szybkich łącz i 8 kroków do zmniejszenia ilości obrazków na stronie które zawierają pierwsze dwa odcinki drogi, której finałem jest ten [...]

  • testblog pisze:

    Lista odnośników społecznościowych…

    h3 Wcześniejsze głosy w dyskusji h3
    ul
    li 8222 a href http: zaistniejwsieci.pl 2008 02 22 semantyka-html-lista-nieuporzadkowana title Przeczytaj wpis Semantyka HTML: lista nieuporządkowana a na blogu a href http: zaistniejwsie…

  • [...] 8 kroków do zmniejszenia ilości obrazków na stronie [...]

Zostaw komentarz