TAAT Technologie Cyfrowe

Skalowalny layout

Idea skalowalnego layoutu polega na stworzeniu strony, w której po powiększeniu tekstu (Ctrl++) wzajemne położenie elementów nie zmieni się.

Dla strony opartej wyłącznie o tekst taki efekt jest stosunkowo łatwo uzyskać. Wystarczy podawać wszystkie wielkości (rozmiary tekstu, wielkości elementów, położenie) w jednostkach względnych (em, %).

Problemy zaczynają się, kiedy layout zawiera obrazki, ponieważ większość przeglądarek nie skaluje obrazków przy powiększaniu tekstu.

Rozwiązanie 1: CSS

Pomysł prosty: Każdemu obrazkowi za pomocą CSS nadać wielkość w jednostkach względnych – najlepiej przeliczyć piksele na em. Można sobie ułatwić życie wykorzystując kalkulator jednostek, pamiętając o tym, że wielkości em się sumują przy elementach zagnieżdżonych.

Dla tego przypadku kod CSS będzie wyglądał tak:
.banner480x60 {        /* style dla obrazka wielkości 480x60px */
  font-size: 16px;     /* zresetowanie wielkości czcionki do wartośći domyślnej,
                       aby było łatwiej przeliczyć na piksele
                       (dzieląc przez 16) */
  width: 30em;         /* równowartość 460px szerokości */
  height: 3.75em;      /* równowartość 60px wysokości*/
}        

Przykładowy kod HTML korzystający z powyższego stylu:

<img src="obrazek.png" class="banner480x60" />

Rozwiązanie 2: JavaScript

Skrypt przy uruchamianiu strony

Po co ręcznie przeliczać wymiary z pikseli na em, skoro komputer może to zrobić za nas? Automatyczne ustawienie rozmiarów dla wszystkich obrazków na stronie wykona skrypt:

function scalable_images()
/**********************************************************
* zamienia rozmiary wszystkich obrazków na wymiary w em
**********************************************************/
{
      var image=document.getElementsByTagName('img');
    
    // pobranie wskaźników do wszystkich elementów <img>
    
   for (var i=1;i<image.length;i++)
   {
    // odczytanie wysokości i szerokości kolejnego obrazka
        
       var img = new Image();
       img.src = image[i].src;
       var height = img.height;
       var width = img.width;
       
     // zresetowanie wielkości tekstu
       
        image[i].style.fontSize='16px';
        
     // zmiana wysokości i szerokości na proporconalne wartości wyrażone w em
       
        image[i].style.width=width/16+'em';
        image[i].style.height=height/16+'em';
	}
    return false;
}

Skrypt użytkownika — wszystkie strony skalowane

Oczywiście, można pójść jeszcze dalej i napisać skrypt, który będzie zmieniał obrazki na skalowalne we wszystkich przeglądanych stronach. Dodatek GreaseMonkey do Firefoksa daje możliwość uruchamiania dowolnego skryptu na każdej (lub wskazanej) z przeglądanych stron.

Do pobrania skrypt GreaseMonkey: scalable_images.user.js

Problem – gorsza jakość przy powiększaniu

Powyżej opisane metody mają jedną zasadniczą wadę: powiększane obrazki tracą na jakości, co nie wygląda zachęcająco.

Problem ten można rozwiązać wstawiając obrazek w większych rozmiarach niż potrzeba i nadając mu za pomocą CSS mniejsze rozmiary. Wtedy przy normalnym wyświetleniu przeglądarka przeskaluje obrazek do mniejszego rozmiaru, a dopiero po powiększeniu tekstu zostanie wyświetlony większy obrazek (w lepszej jakości).

Oczywiście, jak można się spodziewać, ta technika też ma swoją wadę. Mianowicie, w niektórych przeglądarkach (Internet Explorer, Firefox) obrazki pomniejszane przez przeglądarkę mają niezadowalającą jakość. Opera zachowuje się lepiej, ale na głowę bije wszystkich Safari, z której reszta powinna brać przykład.

Rozwiązanie 3: Flash