<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BBProject.net &#187; html</title>
	<atom:link href="http://www.bbproject.net/tag/html/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Tue, 01 Mar 2011 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>AJAX w jQuery dla początkujących</title>
		<link>http://www.bbproject.net/2010/04/ajax-w-jquery-dla-poczatkujacych/</link>
		<comments>http://www.bbproject.net/2010/04/ajax-w-jquery-dla-poczatkujacych/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 19:10:40 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[load]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=288</guid>
		<description><![CDATA[Szybki i lekki kurs dla początkujących pod tytułem: AJAX w jQuery. Innymi słowy, jak przy pomocy tej biblioteki załadować dynamiczną treść bez przeładowania strony. Wszystko czego będziemy potrzebować to biblioteka jQuery, dobre chęci oraz szczypta zapału. Przechodzimy na stronę jquery.com i pobieramy najnowszą wersję skryptu. Ja na potrzeby tego wpisu stworzyłem sobie dwa pliki, pierwszy [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-289" title="jQuery" src="http://www.bbproject.net/wp-content/uploads/2010/03/jquery.png" alt="" width="235" height="73" />Szybki i lekki kurs dla początkujących pod tytułem: <a href="http://pl.wikipedia.org/wiki/AJAX">AJAX</a> w jQuery. Innymi słowy, jak przy pomocy tej biblioteki załadować dynamiczną treść bez przeładowania strony.</p>
<p>Wszystko czego będziemy potrzebować to biblioteka jQuery, dobre chęci oraz szczypta zapału. Przechodzimy na stronę <a href="http://jquery.com">jquery.com</a> i pobieramy najnowszą wersję skryptu.</p>
<p>Ja na potrzeby tego wpisu stworzyłem sobie dwa pliki, pierwszy będący główną stroną która będzie korzystać z techniki AJAX, oraz drugą zawierającą ładowane treści &#8211; obie jako skrypty PHP, aby nie było zbyt nudno. Ok, przechodzimy do działania.</p>
<p><span id="more-288"></span>Pierwszym krokiem będzie dołączenie do dokumenty biblioteki jQuery w sekcji <em>head</em> strony:</p>
<pre class="brush: xml">&lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
</pre>
<h4>Najprostszy przypadek</h4>
<p>Czyli zwyczajne załadowanie zawartości innego pliku html/php bez przeładowania strony.</p>
<p>Dodam do naszej strony dwie warstwy, jedną która będzie przyjmować ładowane treści, i drugą z przyciskiem wywołującym zdarzenie.</p>
<pre class="brush: xml">&lt;div id="box"&gt;&lt;/div&gt;
&lt;div&gt;&lt;input id="btn" type="button" value="Wyślij"&gt;&lt;/div&gt;
</pre>
<p>Teraz pozostaje nam już tylko dodanie akcji do przycisku.</p>
<pre class="brush: jscript">$(document).ready(function(){
  $('#btn').click(function(){
    $('#box').load('data.php');
  });
});
</pre>
<p>Może czas na wyjaśnienie powyższego kodu. Pierwsza linia przypisuje zdarzeniu załadowania strony funkcję w której określamy co ma się dziać. Jest to wymagane podczas używania jQuery (i nie tylko), aby mieć pewność że struktura dokumentu widziana przez przeglądarkę jest kompletna. Kolejno elementowi o identyfikatorze <em>btn</em> przypisujemy zdarzenie kliknięcia w którym do elementu <em>box</em> ładujemy przy pomocy funkcji <a href="http://api.jquery.com/load"><em>.load</em></a> dane z pliku <em>data.php</em>.</p>
<p>W <em>data.php</em> umieściłem zwyczajowy tekst, równie dobrze może to być plik html. Przy tak przygotowanym kodzie, kliknięcie przycisku „Wyślij” powinno skutkować pojawieniem się nad nim treści zawartej w zewnętrznym pliku.</p>
<p>Kompletny kod całego dokumentu wygląda następująco:</p>
<pre class="brush: xml">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
    &lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
      $(document).ready(function(){
        $('#btn').click(function(){
          $('#box').load('data.php');
        });
      });
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="box"&gt;&lt;/div&gt;
    &lt;div&gt;&lt;input id="btn" type="button" value="Wyślij"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<h4>Przekazywanie parametrów</h4>
<p>Jeśli powyższy przypadek chcielibyśmy wzbogacić o przekazanie jakichś parametrów do wywoływanego pliku <em>data.php</em>, musimy rozbudować nieco funkcję <em>.load</em>.</p>
<pre class="brush: jscript">$('#box').load('data.php', {index: 4, str: 'abc'});
</pre>
<p>Drugi parametr określa tablicę par klucz: wartość. Dane te są przesyłane metodą POST, zatem mamy do nich łatwy dostęp w docelowym skrypcie php. Przykładowa zawartość <em>data.php</em>:</p>
<pre class="brush: php">Index: &lt;?php echo $_POST['index']; ?&gt;&lt;br&gt;
Ciąg znaków: &lt;?php echo $_POST['str']; ?&gt;
</pre>
<p>Tym sposobem możemy wpływać na to co ma zostać załadowane. Podawane dane możemy odczytać z pola tekstowe lub innych zmiennych &#8211; wszystko zależy od naszej inwencji oraz umiejętności pisania w JavaScript.</p>
<h4>Wysyłanie formularzy</h4>
<p>Ostatnim punktem będzie wysłanie formularza. Można by oczywiście skorzystać z powyższej metody kopiując zawartości pól formy, jednak było by to mało wygodne. My skorzystamy z funkcji <a href="http://api.jquery.com/serializeArray"><em>.serializeArray</em></a>.</p>
<p>Zmodyfikowałem zawartość dokumentu wzbogacając go o prosty formularz z dwoma polami:</p>
<pre class="brush: xml">&lt;div id="box"&gt;&lt;/div&gt;
&lt;div&gt;
  &lt;form id="form"&gt;
    Pole 1: &lt;input type="text" name="pole1"&gt;&lt;br&gt;
    Pole 2: &lt;input type="text" name="pole2"&gt;&lt;br&gt;
    &lt;input id="btn" type="button" value="Wyślij"&gt;
  &lt;/form&gt;
&lt;/div&gt;
</pre>
<p>Kolejno modyfikujemy kod JavaScript:</p>
<pre class="brush: jscript">$('#box').load('data.php', $('#form').serializeArray());
</pre>
<p>Tym sposobem, do pliku <em>data.php</em> zostanie przekazana zawartość pól formularza o identyfikatorze <em>form</em>. Co z nimi zrobimy, zależy już od nas.</p>
<h4>Podsumowanie</h4>
<p>Mam nadzieję iż chociaż troszkę pomogłem osobą które po raz pierwszy próbowały użyć technologii AJAX przy pomocy jQuery. Bardziej zaawansowanym polecam zapoznanie się z resztą <a href="http://api.jquery.com/category/ajax">funkcji</a> dostępnych w jQuery, które dają większe możliwości manipulacji danymi i tym co się dzieje podczas wywołania asynchronicznego.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/04/ajax-w-jquery-dla-poczatkujacych/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Co zrobić gdy reklama blokuje wyświetlanie strony?</title>
		<link>http://www.bbproject.net/2010/03/co-zrobic-gdy-reklama-blokuje-wyswietlanie-strony/</link>
		<comments>http://www.bbproject.net/2010/03/co-zrobic-gdy-reklama-blokuje-wyswietlanie-strony/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 06:07:39 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[absolute]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[position]]></category>
		<category><![CDATA[reklama]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=220</guid>
		<description><![CDATA[Otwieramy stronę internetową, widzimy nagłówek i czekamy&#8230; czekamy&#8230; po chwili pojawia się reklama a za nią interesująca nas treść. Brzmi znajomo? Zdecydowana większość systemów reklamowych opiera się na załączaniu zewnętrznego kodu JavaScript, który w przypadku wolnego serwera dostawcy reklam, może powodować niepotrzebne spowalnianie ładowania się naszej strony. O ile w sytuacji takich gigantów jak Google [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-224" title="Billboard" src="http://www.bbproject.net/wp-content/uploads/2010/02/billboard-160x122.jpg" alt="" width="160" height="122" />Otwieramy stronę internetową, widzimy nagłówek i czekamy&#8230; czekamy&#8230; po chwili pojawia się reklama a za nią interesująca nas treść. Brzmi znajomo?</p>
<p>Zdecydowana większość systemów reklamowych opiera się na załączaniu zewnętrznego kodu JavaScript, który w przypadku wolnego serwera dostawcy reklam, może powodować niepotrzebne spowalnianie ładowania się naszej strony. O ile w sytuacji takich gigantów jak <a href="https://www.google.com/adsense">Google AdSense</a> nie mamy się o co martwić, to przy korzystaniu z usług innych podmiotów czy też systemów pośredniczących (np.: <a href="http://www.openx.org">OpenX</a>), może warto zastanowić się jak pozbyć się tego problemu i nie opóźniać pokazania treści tylko przez reklamę. Zniecierpliwiony użytkownik naszej witryny może ją po prostu opuścić zanim zdąży cokolwiek zobaczyć.</p>
<p><span id="more-220"></span>Przedstawione rozwiązanie problemu jest stricte teoretyczne, gdyż docelowa implementacja zależy od konkretnego przypadku, a osoby które zajmują się tworzeniem stron internetowych na pewno będą wiedziały jak przenieść to na własny grunt.</p>
<p>Załóżmy hipotetyczną budowę naszej witryny w następującej postaci:</p>
<div style="margin: 10px auto; width: 300px;">
<div style="border: 2px solid #ff0000; padding: 10px; margin: 10px 0px; text-align: center;"><span style="color: #ff0000;">nagłówek</span></div>
<div style="border: 2px dotted #696969; padding: 10px; margin: 10px 0px; text-align: center;"><strong><span style="color: #696969;">reklama</span></strong></div>
<div style="border: 2px solid #1e90ff; padding: 10px; margin: 10px 0px; text-align: center;"><span style="color: #1e90ff;">treść</span></div>
</div>
<p>Przykładowy kod takiej witryny mógł by wyglądać w następujący sposób:</p>
<pre class="brush: xml">&lt;div id="header"&gt;&lt;/div&gt;
&lt;div id="advert"&gt;&lt;/div&gt;
&lt;div id="content"&gt;&lt;/div&gt;</pre>
<p>Jeśli nie chcemy aby warstwa reklamowa blokowała pojawienie się treści, wystarczy że przeniesiemy ją na sam koniec. Ktoś powie &#8211; ok, ale w tym wypadku reklama powędruje na dół strony. Musimy zatem zastosować pewną sztuczkę. Mianowicie, zwiększamy <strong>dolny margines</strong> warstwy nagłówka o wartość wysokości sekcji reklamowej, tak aby powstała pusta luka. Z kolei warstwę z reklamą, pozycjonujemy w sposób <strong>absolutny</strong> (<em>position: absolute;</em>) przy pomocy stylów, umieszczając ja w otrzymanej wnęcę.</p>
<pre class="brush: xml">&lt;div id="header" style="margin-bottom: 50px;"&gt;&lt;/div&gt;
&lt;div id="content"&gt;&lt;/div&gt;
&lt;div id="advert" style="position: absolute; top: 200px; height: 50px;"&gt;&lt;/div&gt;</pre>
<p>Tym sposobem, przeglądarka wyświetlając stronę, najpierw pokaże nagłówek, treść a dopiero na samym końcu reklamę &#8211; ale w odpowiednim miejscu. Jeśli ta z jakichś powodów nie będzie w stanie się wyświetlić (padnie serwer reklamy), to nie spowoduje to blokowania treści.</p>
<p>Oczywiście to co znajduje się pod reklamą, np.: stopka strony, nie pokaże się dopóki nie zostanie pobrana reklama, nie mniej, nie jest to tak istotny element w stosunku do treści po którą sięga odwiedzający witrynę.</p>
<p>Rozwiązania tego nie możemy zastosować w sytuacji w której odległość warstwy z reklamą jest zmienna w stosunku do początku strony, gdyż w tym momencie nie jesteśmy w stanie pozycjonować warstwy przy pomocy atrybutu <em>absolute</em>. Metodę tą stosuje z powodzeniem na dwóch swoich stronach i spisuje się znakomicie &#8211; <a href="http://www.cotozaplik.pl">cotozaplik.pl</a> oraz <a href="http://checksum.me">checksum.me</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/03/co-zrobic-gdy-reklama-blokuje-wyswietlanie-strony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kodowanie polskich znaków w PHP</title>
		<link>http://www.bbproject.net/2009/12/kodowanie-polskich-znakow-w-php/</link>
		<comments>http://www.bbproject.net/2009/12/kodowanie-polskich-znakow-w-php/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 11:20:25 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[kodowanie]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=93</guid>
		<description><![CDATA[Prawdziwym problemem dla początkujących programistów PHP, może być nie rzadko brak wyświetlania polskich znaków w skryptach PHP. Zamiast miotać się pomiędzy różnymi edytorami kodu, które w taki czy inny sposób oferują zmianę kodowania pliku, prześledźmy po kolei wszystkie etapy tej przypadłości i rozwiążmy je raz na zawsze. Przyczyny mogą być różne, od błędnego zapisania pliku, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-94" title="Polski font" src="http://www.bbproject.net/wp-content/uploads/2009/12/pl_font-160x113.png" alt="" width="160" height="113" />Prawdziwym problemem dla początkujących programistów PHP, może być nie rzadko brak wyświetlania polskich znaków w skryptach PHP. Zamiast miotać się pomiędzy różnymi edytorami kodu, które w taki czy inny sposób oferują zmianę kodowania pliku, prześledźmy po kolei wszystkie etapy tej przypadłości i rozwiążmy je raz na zawsze.</p>
<p>Przyczyny mogą być różne, od błędnego zapisania pliku, aż po wymuszone kodowanie znaków w nagłówku HTTP. Jeśli spotkałeś się nie raz z popularnymi krzakami na swojej stronie, zamiast polskich znaków diakrytycznych, to zapraszam do przeczytania dalszej części wpisu.</p>
<p><span id="more-93"></span>Po pierwsze musimy zdecydować się na jakiś system kodowania znaków, których używamy w tworzonych plikach. W moim przypadku będzie to, obecnie najpopularniejszy, system <a href="http://pl.wikipedia.org/wiki/UTF-8"><em>utf-8</em></a>. Nic nie stoi przeszkodzie aby używać chociażby <em>iso-8859-2</em>, jednakże <em>utf-8</em> oferuje nam znacznie szerszy zestaw znaków i jest obsługiwany obecnie przez coraz więcej systemów docelowych (np.: przeglądarki mobilne).</p>
<h4>Edytor</h4>
<p>Zacznijmy od edytora w jakim tworzymy nasz skrypt. Początkowo jest to zapewne systemowy notatnik. Program ten, o ile nie wybierzemy inaczej, domyślnie zapisuje pliki w kodowaniu <em>windows-1250</em>. Kodowanie to obsługiwane jest wyłącznie na systemach firmy Microsoft i należy go unikać jak ognia na dzień dzisiejszy. Podczas zapisywania pliku, mamy możliwość zmiany na <em>utf-8</em> na dole okna dialogowego &#8211; pole wyboru <em>Kodowanie</em>.</p>
<p>Osobiście, polecam korzystanie z narzędzi o większych możliwościach, takich jak środowiska <a href="http://www.netbeans.org">NetBeans</a> czy <a href="http://www.eclipse.org">Eclipse</a>. Mogą one wyglądać skomplikowanie dla początkującego programisty, jednakże oferują gamę udogodnień i przydatnych funkcji.</p>
<h4>Sekcja meta</h4>
<p>Przypuśćmy że mamy już poprawnie zapisany plik w wybranym przez nas systemie kodowania znaków. Uruchamiamy skrypt na lokalnym bądź wirtualnym serwerze a naszym oczom ukazują się znaczki o nieznanym dla nas pochodzeniu, które na pewno nie są naszymi rodzimymi ogonkami.</p>
<p>Drugim, często popełnianym błędem, jest brak sekcji <em>meta</em> strony, informującej o jej kodowaniu. Aby poprawnie zdefiniować kodowanie dokumentu HTML, używamy następującego zapisu:</p>
<pre class="brush: xml">&lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;</pre>
<p>&#8230;który umieszczamy między znacznikami <em>&lt;head&gt;</em>&#8230;<em>&lt;/head&gt;</em>. Przykładowo:</p>
<pre class="brush: xml">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
    &lt;title&gt;Moja strona w utf-8&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;...&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Co jednak zrobić jeśli wciąż nie otrzymujemy oczekiwanego efektu?</p>
<h4>Nagłówek HTTP</h4>
<p>Nagłówek protokołu <a href="http://pl.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> zawiera szereg informacji przesyłanych do przeglądarki, mówiący o tym co tak właściwie jest wysyłane. Jedną z tych informacji jest kodowanie znaków dokumentu &#8211; znowu.</p>
<p>Problem polega na tym, iż przeglądarki wyświetlają stronę w takim kodowaniu, jakie zostało im przedstawione w nagłówku protokołu. W praktyce to co zostało zdefiniowane w sekcji meta strony nie ma znaczenia, chyba że nagłówek HTTP nie zawiera takiej informacji.</p>
<p>Bardzo często, parser PHP ma wymuszone wysyłanie dokumentów w jednym, określonym systemie kodowania znaków. Odpowiada za to następujący wpis w pliku konfiguracji <em>php.ini</em>:</p>
<pre class="brush: plain">default_charset = "iso-8859-1"</pre>
<p>O ile dysponujemy własnym, lokalnie postawionym serwerem, możemy łatwo edytować bądź całkowicie wyłączyć tą linię, to w przypadku serwera wirtualnego z reguły nie posiadamy takiej władzy.</p>
<p>W takim wypadku musimy nadpisać sami nagłówek HTTP w skrypcie PHP. Służy do tego polecenie <em><a href="http://php.net/manual/en/function.header.php">header</a></em>. Nas interesuje oczywiście zmiana samego kodowania, inne możliwości tej komendy na razie zostawmy w spokoju. Dodajemy zatem do naszego skryptu następującą linię:</p>
<pre class="brush: php">header('Content-Type: text/html; charset=utf-8');</pre>
<p>Nie mniej musimy pamiętać o tym, że ustawienie parametru nagłówka HTTP przy pomocy w/w komendy, musi nastąpić zanim wyślemy jakiekolwiek inne dane do przeglądarki. Innymi słowy, nie może użyć polecenia <em>echo</em> czy też <em>print</em> zanim nie ustawimy nagłówka. Jak sama nazwa wskazuje, jest to nagłówek, czyli znajduje się przed docelową treścią dokumentu.</p>
<h4>Podsumowanie</h4>
<p>Mój docelowy plik, jaki stworzyłem na potrzeby tego wpisu, prezentuje się następująco:</p>
<pre class="brush: php">&lt;?php header('Content-Type: text/html; charset=utf-8'); ?&gt;
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
    &lt;title&gt;Moja strona w utf-8&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;&lt;?php echo 'ęóąśłżźćń'; ?&gt;&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Jak widzimy, wymusiliśmy tutaj kodowanie <em>utf-8</em> w nagłówku HTTP, sekcji <em>meta</em>, oraz sam plik został zapisany z poprawnym kodowaniem znaków. Tak przygotowany dokument, nie powinien sprawiać żadnych problemów w dowolnej konfiguracji serwera. W efekcie otrzymamy poprawnie zakodowane oraz wyświetlone polskie znaki diakrytyczne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2009/12/kodowanie-polskich-znakow-w-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Poprawa szybkości wczytywania grafik przy pomocy stylów</title>
		<link>http://www.bbproject.net/2009/12/poprawa-szybkosci-wczytywania-grafik-przy-pomocy-stylow/</link>
		<comments>http://www.bbproject.net/2009/12/poprawa-szybkosci-wczytywania-grafik-przy-pomocy-stylow/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 09:16:27 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[optymalizacja]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=9</guid>
		<description><![CDATA[Czy zdarza się Wam czy to projektując własną stronę czy też odwiedzając cudzą, mieć do czynienia z dużą ilością drobnych grafik (np.: ikon) które to kolejno wypełniają zawartość strony? Czy nie można przyspieszyć tego procesu skoro każdy z plików to z reguły nie więcej niż 1KB? Oczywiście można. Przyczyną tego stanu jest sposób w jaki [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-44" title="Wirtualna Polska - menu" src="http://www.bbproject.net/wp-content/uploads/2009/11/wp_menu-160x123.png" alt="Wirtualna Polska - menu" width="160" height="123" />Czy zdarza się Wam czy to projektując własną stronę czy też odwiedzając cudzą, mieć do czynienia z dużą ilością drobnych grafik (np.: ikon) które to kolejno wypełniają zawartość strony? Czy nie można przyspieszyć tego procesu skoro każdy z plików to z reguły nie więcej niż 1KB? Oczywiście można.</p>
<p>Przyczyną tego stanu jest sposób w jaki przeglądarka pobiera kolejne zasoby dołączone do odwiedzanej strony. Łącząc wszystkie drobne grafiki w jeden większy plik, a następnie przy pomocy stylów CSS wybierając interesującą nas część, możemy znacznie przyspieszyć ładowanie takiej strony.</p>
<p><span id="more-9"></span></p>
<h4>Jak działa przeglądarka?</h4>
<p>Otwierając dowolną stronę www, uzyskujemy od serwera treść dokumentu HTML, to czy jest on statyczny czy generowany dynamicznie (przez np.: php) nie ma w tej chwili znaczenia, która jest parsowana i wyświetlana przez przeglądarkę. Jeśli ta napotka na swej drodze zewnętrzne zasoby w postaci stylów CSS, skryptów JavaScript czy też grafikę rozpoczyna ich pobieranie.</p>
<h4>W czym tkwi problem?</h4>
<p>Na nieszczęście, z uwagi na fakt iż protokół HTTP jest protokołem bezstanowym, każde pobranie zasobu poprzedzone jest otwarciem gniazda TCP, nawiązaniem połączenia, pobraniem danych oraz zamknięciem połączenia. Stwarza to pewien narzut w postaci danych oraz czasu. Jeśli mamy do czynienia z dużymi plikami, przykładowo zdjęciami, nie jest to tak istotne. Z kolei jeśli naszą stronę ozdabiają różne drobne elementy graficzne, wtedy ów narzut nie tyle przekracza rozmiar zasobu co wprowadza niepotrzebne opóźnienia, gdyż samo nawiązanie sesji TCP trwa dłużej niż pobranie piku.</p>
<h4>Jak temu zaradzić?</h4>
<p>Dobrym rozwiązaniem jest scalenie wszystkich elementów graficznych w jeden plik, np.: w postaci kolumny obrazków. Ktoś może powiedzieć, jaki w tym zysk skoro i tak przeglądarka musi pobrać tą samą ilość danych? Zgadza się, jednakże zyskujemy mnóstwo czasu na narzucie związanym z tworzeniem połączenia i jego kończeniem dla każdego zasobu z osobna. Co to oznacza w praktyce? Znacznie szybsze ładowanie strony. Oczywiście opłacalność zabiegu w dużej mierze zależy od ilości grafiki klasyfikującej się do scalenia.</p>
<h4>A w praktyce?</h4>
<p>Przejdźmy zatem do części praktycznej. O ile samo scalenie obrazków nie powinno stwarzać problemów o tyle ich późniejsze wykorzystanie może rodzić pytania. Jak „wyciąć” grafikę na której nam zależy? Oczywiście stosując odpowiednią klasę stylów kaskadowych. Najprostszym sposobem jest używanie obrazków jako tło którym jest nasz zbiorczy plik graficzny, przesunięty o żądaną ilość pikseli.</p>
<p>Zastosujmy teraz zdobytą wiedzę do stworzenia menu strony składającego się z etykiet tekstowych oraz ikon. Potrzebny nam będzie zestaw stosownych obrazków oraz odpowiednie style zastosowane do menu. Zacznijmy jednak od napisania samego kodu HTML:</p>
<pre class="brush: xml">&lt;ul class="menu"&gt;
  &lt;li class="home"&gt;Strona główna&lt;/li&gt;
  &lt;li class="mail"&gt;Kontakt&lt;/li&gt;
  &lt;li class="download"&gt;Pobierz&lt;/li&gt;
  &lt;li class="tools"&gt;Narzędzia&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>&#8230;kolejno arkusza stylów:</p>
<pre class="brush: css">.menu
{
  list-style: none;
  color: #404040;
  font: bold 16px Arial;
}
.menu li
{
  float: left;
  height: 24px;
  line-height: 24px;
  padding: 0px 30px;
}
.home     { background: url(icons.png) 0px   0px no-repeat; }
.mail     { background: url(icons.png) 0px -24px no-repeat; }
.download { background: url(icons.png) 0px -48px no-repeat; }
.tools    { background: url(icons.png) 0px -72px no-repeat; }</pre>
<p>&#8230;jeszcze dodajmy tylko użyty zestaw ikon:</p>
<p><img class="alignnone size-full wp-image-10" title="Zestaw ikon" src="http://www.bbproject.net/wp-content/uploads/2009/11/icons.png" alt="Zestaw ikon" /></p>
<p>&#8230;i cieszmy oko gotowym menu:</p>
<p><img class="size-full wp-image-11 aligncenter" title="Menu" src="http://www.bbproject.net/wp-content/uploads/2009/11/menu.png" alt="Menu" width="517" height="24" /></p>
<p>Jak widać, cała zabawa polega na odpowiednim przesunięciu tła tak aby trafić w interesujący nas punkt. Każda ikona ma rozmiar 24x24px, zatem musimy wymusić wysokość elementu menu właśnie na 24px, tak aby sąsiednie obrazki nie były widoczne.</p>
<p>Co zrobić w sytuacji w której mamy dużo rysunków o różnych rozmiarach? Można scalać je podobnie, jednakże lepszym wyjściem jest pogrupowanie identycznych pod względem rozmiaru w osobne pliki.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2009/12/poprawa-szybkosci-wczytywania-grafik-przy-pomocy-stylow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

