<?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>Dawid Pośliński &#187; menu</title>
	<atom:link href="http://blog.poslinski.net/tag/menu/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.poslinski.net</link>
	<description>Code is poetry.</description>
	<lastBuildDate>Mon, 06 Sep 2010 18:23:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>jQuery: find()</title>
		<link>http://blog.poslinski.net/jquery-find/</link>
		<comments>http://blog.poslinski.net/jquery-find/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 19:03:27 +0000</pubDate>
		<dc:creator>Dawid Pośliński</dc:creator>
				<category><![CDATA[jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[przeglądarki]]></category>

		<guid isPermaLink="false">http://blog.poslinski.net/?p=35</guid>
		<description><![CDATA[jQuery to świetny framework JavaScript. Jeżeli jeszcze nie mieliście okazji z nim pracować, mam nadzieje, że poniższa publikacja, zachęci Was, do skorzystania z tego właśnie rozwiązania. Cechuje go bowiem szybkość, optymalizacja kodu, mająca na celu dostosowanie go pod jak największą liczbę przeglądarek, a także, co pewnie wielu zainteresuje najbardziej &#8211; prostota tworzenia złożonych rozwiązań. W [...]]]></description>
			<content:encoded><![CDATA[<p><strong>jQuery</strong> to świetny <strong>framework JavaScript</strong>. Jeżeli jeszcze nie mieliście okazji z nim pracować, mam nadzieje, że poniższa publikacja, zachęci Was, do skorzystania z tego właśnie rozwiązania. Cechuje go bowiem szybkość, optymalizacja kodu, mająca na celu dostosowanie go pod jak największą liczbę przeglądarek, a także, co pewnie wielu zainteresuje najbardziej &#8211; prostota tworzenia złożonych rozwiązań.</p>
<p>W dzisiejszym artykule skupimy się na bardzo przydatnej metodzie <strong>find()</strong>.</p>
<p><span id="more-35"></span>Jeżeli nie miałeś wcześniej do czynienia z tym <strong>frameworkiem</strong>, zachęcam do zapoznania się z podstawami selektorów, korzystając z <a href="http://docs.jquery.com/Selectors">oficjalnego API na temat selectorów</a>, lub też z przygotowanego przez Bartosza Medonia <a href="http://www.soundpage.info/kurs_javascript/kurs/63jQuery_pokaz_ukryj.html">kursu podstaw jQuery</a>. Ta wiedza znacznie ułatwi pojmowanie zamieszczonych tutaj rozwiązań.</p>
<p>Najlepiej zajmijmy się jakimś konkretnym przykładem zastosowania tej metody. Na większości stron, jednym z podstawowych elementów służących do nawigacji jest menu. Spróbujemy stworzyć własne animowane menu, korzystając z minimalnej ilości elementów i działające pod każdą przeglądarka obsługującą JavaScript.</p>
<h2>1. Przygotowanie elementów</h2>
<p>Zacznijmy od stworzenia pustego dokumentu html:</p>
<pre name="code" class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;Menu&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Następnie pobieramy najnowszą wersję <strong>jQuery</strong> z <a href="http://jquery.com">oficjalnej strony projektu</a> ( production ) i kopiujemy do folderu z naszym plikiem html.</p>
<p>Wewnątrz tego dokumentu, przydałaby się jakaś przykładowa treść, oraz nasze menu. Wykorzystajmy do tego tagi<strong> div</strong> oraz <strong>span</strong>. Oczywiście pozycje w naszym menu, powinny być linkami, zatem umieścimy je w bloku <strong>a</strong>. Całość umieścimy wewnątrz bloku <strong>div</strong> o id=<strong>menu</strong>. Dodany również plik z jQuery wykorzystując tag <strong>script</strong>. Całość powinna wyglądać mniej więcej tak:</p>
<pre name="code" class="html">&lt;div id="menu"&gt;
&lt;div&gt;
&lt;a href="#"&gt;#1 Menu&lt;/a&gt;
&lt;span&gt;
&lt;a href="#"&gt;#1.1 Menu&lt;/a&gt;
&lt;a href="#"&gt;#1.2 Menu&lt;/a&gt;
&lt;a href="#"&gt;#1.3 Menu&lt;/a&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="#"&gt;#2 Menu&lt;/a&gt;
&lt;span&gt;
&lt;a href="#"&gt;#2.1 Menu&lt;/a&gt;
&lt;a href="#"&gt;#2.2 Menu&lt;/a&gt;
&lt;a href="#"&gt;#2.3 Menu&lt;/a&gt;
&lt;a href="#"&gt;#2.4 Menu&lt;/a&gt;
&lt;a href="#"&gt;#2.5 Menu&lt;/a&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="#"&gt;#3 Menu&lt;/a&gt;
&lt;span&gt;
&lt;a href="#"&gt;#3.1 Menu&lt;/a&gt;
&lt;a href="#"&gt;#3.2 Menu&lt;/a&gt;
&lt;a href="#"&gt;#3.3 Menu&lt;/a&gt;
&lt;a href="#"&gt;#3.4 Menu&lt;/a&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="#"&gt;#4 Menu&lt;/a&gt;
&lt;span&gt;
&lt;a href="#"&gt;#4.1 Menu&lt;/a&gt;
&lt;a href="#"&gt;#4.2 Menu&lt;/a&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end #menu --&gt;
Jakaś tam przykładowa treść. Jakaś tam przykładowa treść.
Jakaś tam przykładowa treść. Jakaś tam przykładowa treść.
Jakaś tam przykładowa treść. Jakaś tam przykładowa treść.
Jakaś tam przykładowa treść. Jakaś tam przykładowa treść.
Jakaś tam przykładowa treść. Jakaś tam przykładowa treść.
&lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt;</pre>
<p>Specjalnie umieściłem wiele pozycji w menu, aby pokazać jak łatwym, będzie odwołanie się do wielu z nich z poziomu <strong>jQuery</strong>, w zależności od tego, na który blok najedziemy myszką.</p>
<h2>2. Zdefiniowanie wyglądu menu (css)</h2>
<p>W tym dziale, zdefiniujemy wygląd wykorzystanych w pliku html, bloków kodu. Ja przygotowałem sobie, następujący fragment kodu ze stylem, umieszczony w sekcji head:</p>
<pre name="code" class="css">&lt;style type="text/css"&gt;
&lt;!--
* { margin: 0px; padding: 0px; }
a { text-decoration: none; font: 20px Georgia, "Times New Roman", Times, serif; }
html, body { margin: 10px; }

#menu { top: 0px; float: left; width: 100%; }
#menu div { position: relative; float: left; }
#menu div a:active, #menu div a:link, #menu div a:visited { display: block; position: relative; vertical-align: middle; background: #ccc; color: #fff; padding: 5px 10px; width: 150px; }
#menu div a:hover { background: #999; }
#menu div span { display: none;  position: absolute; top: 100%; left: 0; float: none; }
#menu div span a:active, #menu div span a:link, #menu div span a:visited { position: relative; display: block; float: left; top: 0px; background: #ddd; color: #fff; padding: 5px 10px; width: 150px; }
#menu div span a:hover { background: #999; }
--&gt;
&lt;/style&gt;</pre>
<p>W naszym przykładzie tworzymy tylko proste dwupoziomowe menu, ale nic nie stoi na przeszkodzie, aby zmodyfikować je i dostosować do dowolnej ilości poziomów.</p>
<p>Jeśli już jesteśmy przy tej kwestii, warto również zapoznać się z <a href="http://lwis.net/free-css-drop-down-menu/">frameworkiem do tworzenia css&#8217;owego menu</a>.</p>
<h2>3. Gwóźdź programu &#8211; find.</h2>
<p>Tym oto sposobem, mamy przygotowaną całą stronę do implementacji kodu <strong>JavaScript</strong>. Wiemy także, o czym mowa, mówiąc selektor. W naszym przypadku, przykład jest dość prosty, albowiem mamy tylko 4 menu główne, ale nie trudno sobie wyobrazić, iż może być ich więcej, a każde z nich może mieć wiele rozgałęzień. To dyskwalifikuje metodę pętli, również wyklucza metodę <strong>brute-force</strong>, uwzględniającą przeanalizowanie wszystkich przypadków osobno. Jednak dzięki metodzie <strong>find</strong>, problem sprowadza się do jednej, bardzo czytelnej lini kodu, która zrealizuje za nas całe zadanie. Dobrze jest, aby nasz kod JavaScript znajdował się w <strong>$(document).ready</strong>, co zagwarantuje nam, odwoływanie się do niego, dopiero po załadowaniu strony, wszystkich zewnętrznych skryptów, stylów i innych plików.</p>
<pre name="code" class="javascript">&lt;script type="text/javascript"&gt;
&lt;!--
// &lt;![CDATA[
$(document).ready(function(){
	$("#menu div").hover(
		function() {
			$(this).find("span").css({opacity:0.98}).slideToggle("fast");
		},
		function() {
			$(this).find("span").slideToggle("fast");
		}
	);
});
// ]]&gt;
--&gt;
&lt;/script&gt;</pre>
<p>Powyższy kod zalecam umieścić po znaczniku <strong>script</strong>, w którym odwołujemy się do <strong>jQuery</strong>, na dole strony.</p>
<p>W głównym selektorze, odwołujemy się do znacznika od <strong>id=&#8221;menu&#8221;</strong>, <strong>wewnątrz</strong> którego znajduje się znacznik <strong>div</strong>. Metoda <strong>.hover()</strong>, oznacza zdarzenie najechania myszki, na wybrany element i jako parametry, przyjmuje jedną lub 2 funkcje, które są realizowane podczas zainicjowania tego zdarzenia. Druga funkcja jest opcjonalna i jest wykonywana wówczas, gdy opuścimy kursorem obszar naszego elementu. Postarałem się tak przedstawić kod, aby obie funkcje były przejrzyste dla czytelnika, ale zalecam minimalizację kodu w funkcjonujących projektach.</p>
<p>Przeanalizujmy teraz kod wewnątrz funkcji. Znowu wykorzystujemy tutaj selektor, tym razem odwołujemy się od obiektu, w którym się znajdujemy. <strong>Każdy selektor jQuery zwraca obiekt</strong>, do którego możemy się odnieść przez klauzulę <strong>this</strong>. Jednak jeśli chcemy, wewnątrz elementu, odnieść się do elementu znajdującego się wewnątrz danego elementu, wykorzystujemy metodę find, która wyszukuje i zwraca <strong>wszystkie</strong> pasujące elementy. Należy o tym pamiętać, ponieważ jeśli chcemy odnieść się do jakiegoś konkretnego elementu, należało by zastosować na przykład klasę i odwołać się po przez <strong>.find(&#8222;.classNazwa&#8221;)</strong>. Oczywiście, wewnątrz find, możemy również odnosić się do bardziej skomplikowanej struktury elementów, tak samo jak w selektorach jQuery.</p>
<p>Pierwsza funkcja jak widać, modyfikuje zwracany przez metodę <strong>find</strong> obiekt, i zmienia jego przeźroczystość, następnie, korzystając z metody <strong>slideToggle()</strong>, zainicjowana zostaje animacja, w tym przypadku, jest to animacja &#8222;zjeżdżania&#8221; na dół, o czym decyduje parametr <strong>display</strong> ustawiony na <strong>none</strong> w ustawieniach css elementu ( element jest niewidoczny, więc slide jedyne co może wykonać to pokazanie go ).</p>
<p>W przypadku drugiej funkcji, wszystko wygląda bardzo podobnie, z tą różnicą, że nie musimy już modyfikować opacity, albowiem zostało ono już zmienione. Zrobiliśmy to po przez jQuery, m.in. dlatego, ponieważ w css, nie było by to możliwe, w taki sposób, aby uzyskać pełną zgodność z <strong>validatorem w3c</strong>, a także, aby przeźroczystość wyświetlana była prawidłowo, na wszystkich nowoczesnych przeglądarkach obsługujących JavaScript.</p>
<h2>4. Podsumowanie</h2>
<p>Celem tego artykułu, nie było nauczenie się tworzenia animowanego menu, lecz, poznanie wielu ciekawych kwestii dotyczących metody <strong>find()</strong>, a także samego <strong>jQuery</strong>. Możliwości jakie niesie, są ogromne i mam nadzieje, że po lekturze tego artykułu, zyska ono kilku entuzjastów.</p>
<p>Natomiast efekt naszej pracy, możemy zobaczyć w <a href="http://blog.poslinski.net/examples/1.html" target="_blank">demonstracji</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.poslinski.net/jquery-find/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
