<?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>Staicu Ionuţ-Bogdan &#187; UI/UX</title>
	<atom:link href="http://www.iamntz.com/category/uiux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iamntz.com</link>
	<description>the Frontend Developer</description>
	<lastBuildDate>Mon, 23 Jan 2012 04:55:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Ce face norișorul cu săgeată?</title>
		<link>http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 05:52:05 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[UI/UX]]></category>
		<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2153</guid>
		<description><![CDATA[Știu că sunt un hater nenorocit crispat și plin de riduri de la strugurii ăia acri și că n-am văzut în viața mea un produs apple (darămite să mai dețin unul!). Dar sunt și eu curios de următoarea treabă: ce face norișorul cu săgeată în jos? Nu de alta, dar atunci când apăs pe el [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/'>Ce face norișorul cu săgeată?</a>. <br/>
	<a href='http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Știu că sunt un hater nenorocit crispat și plin de riduri de la strugurii ăia acri și că n-am văzut în viața mea un produs apple (darămite să mai dețin unul!). Dar sunt și eu curios de următoarea treabă: ce face norișorul cu săgeată în jos?</p>
<p><a href="http://content.screencast.com/users/iamntz/folders/Jing/media/f6650ba0-c4fd-4243-b8ac-e0784db160ec/2011-07-22_0847.png"><img class="aligncenter" src="http://content.screencast.com/users/iamntz/folders/Jing/media/f6650ba0-c4fd-4243-b8ac-e0784db160ec/2011-07-22_0847.png" alt="" width="387" height="289" /></a>Nu de alta, dar atunci când apăs pe el îmi cere parola.</p>
<p>So&#8230; Explicați-mi și mie, haterul absolut, ce căcat face norișorul sufletului! (Și mai ales <em>cum ai aflat</em> că face asta!)</p>
<p><em style="color:#ccc">Norișorul arată că o aplicație a mai fost instalată, iar apăsarea lui reinstalează acea aplicație.</em></p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/'>Ce face norișorul cu săgeată?</a>. <br/>
	<a href='http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2153/frontend-developer/ce-face-norisorul-cu-sageata/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Despre cât de prietenoase sunt formularele românești</title>
		<link>http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 12:06:40 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[UI/UX]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[Random Thoughts]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2148</guid>
		<description><![CDATA[Am citit la Andi o chestie ce mi-a adus aminte de zilele trecute, când a trebuit să instalez un certificat digital (am trecut brusc de la declarații pe dischetă la certificate digitale; cred că au omorât jumătate din pc-urile folosite la contabilitate!). Clientul a fost suficient de neinspirat să aleagă Transsped. De fapt, nu cred [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/'>Despre cât de prietenoase sunt formularele românești</a>. <br/>
	<a href='http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Am citit la Andi <a href="http://www.olteteanu.com/427/ba-e%C8%99ti-prost">o chestie</a> ce mi-a adus aminte de zilele trecute, când a trebuit să instalez un certificat digital (am trecut brusc de la declarații pe dischetă la certificate digitale; cred că au omorât jumătate din pc-urile folosite la contabilitate!). Clientul a fost suficient de neinspirat să aleagă <a href="http://ca.transsped.ro/Index.aspx?Document=UA_Form">Transsped</a>. De fapt, nu cred că a fost neinspirat pentru că orice altă firmă ar fi ales cred că nu ar fi fost diferită situația.</p>
<p>Încep să cred că cei ce prind contracte babane cu statul în domeniul it au ca angajați niște monkey code ce au ca slogan: noi muncim, nu gândim. Ori asta ori pur și simplu se gândesc din răsputeri cum ar putea face un <acronym title="User Experience">UX</acronym> cât mai infect.</p>
<p>Dacă accesezi <a href="http://ca.transsped.ro/Index.aspx?Document=UA_Form" title="">linkul</a> de mai sus și încerci să completezi formularul unei firme ești pur și simplu copleșit de multitudinea de câmpuri. Asta după ce, în prealabil, ai completat un formular (pe hârtie) cu fix aceleași date și l-ai trimis firmei sus menționate!</p>
<h3>Idee</h3>
<p>Știu că cei ce sunt plătiți din banii noștri nu dau un scuipat pe ideea asta, dar ar fi cool de aplicat în alte domenii. De exemplu, magazine online. <span id="more-2148"></span></p>
<h5>CNP</h5>
<p>Tot Andi <a href="http://www.olteteanu.com/379/cnplist-2">zice</a> că dintr-un CNP poți afla: data nașterii, sexul, și județul din care ești. N-ar fi interesant ca atunci când completezi cnp pe undeva să se facă autofill la treburile astea? Sau invers, când completezi data nașterii, sexul etc să îți facă autofill (parțial, ce-i drept) la CNP?</p>
<h5>CUI</h5>
<p>Pentru firme, la CUI e și mai drăguț. Afli tot. De ce este nevoie să introduc toată povestea (inclusiv adresă, nr.reg.com. etc) când totul se poate face automat?</p>
<h3>Utopie?</h3>
<p>Va fi vreodată ceva de genul implementat în România la scară largă? Mă îndoiesc. Dar e frumos să visez&#8230; </p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/'>Despre cât de prietenoase sunt formularele românești</a>. <br/>
	<a href='http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2148/frontend-developer/despre-cat-de-prietenoase-sunt-formularele-romanesti/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Usability Rant 3</title>
		<link>http://www.iamntz.com/1832/frontend-developer/usability-rant-3/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1832/frontend-developer/usability-rant-3/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 06:38:22 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[UI/UX]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Usabitliy]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1832</guid>
		<description><![CDATA[Sunt curios dacă eu sunt defect: în imaginea de mai jos, sliderul din stânga (de lângă butonul ăla mare cu un difuzor pe el), ce îți inspiră că face? Că ar ajusta volumul sau luminozitatea?
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1832/frontend-developer/usability-rant-3/'>Usability Rant 3</a>. <br/>
	<a href='http://www.iamntz.com/1832/frontend-developer/usability-rant-3/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Sunt curios dacă <em>eu</em> sunt defect: în imaginea de mai jos, sliderul din stânga (de lângă butonul ăla mare cu un difuzor pe el), ce îți inspiră că face? Că ar ajusta volumul sau luminozitatea?</p>
<p><a href="http://content.iamntz.com.s3.amazonaws.com/wp-content/uploads/2011/04/ipad_volume_ctrl.jpg"><img src="http://content.iamntz.com.s3.amazonaws.com/wp-content/uploads/2011/04/ipad_volume_ctrl-300x153.jpg" alt="" title="ipad_volume_ctrl" width="300" height="153" class="aligncenter size-medium wp-image-1833" /></a></p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1832/frontend-developer/usability-rant-3/'>Usability Rant 3</a>. <br/>
	<a href='http://www.iamntz.com/1832/frontend-developer/usability-rant-3/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1832/frontend-developer/usability-rant-3/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Chestii enervante în interfețe</title>
		<link>http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 07:47:02 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[UI/UX]]></category>
		<category><![CDATA[Random Thoughts]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1163</guid>
		<description><![CDATA[Cu riscul de a fi catalogat (iar!) ca hater, hai să îți zic câteva chestii văzute prin diversele interefețe cărora eu nu le văd logica. Dacă ai vreo explicație&#8230; Simte-te liber să-mi povesteși și mie de ce: 1) Dacă ai email-ul meu și m-am autentificat cu contul de twitter, de ce nu îmi arăți avatarul? [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/'>Chestii enervante în interfețe</a>. <br/>
	<a href='http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Cu riscul de a fi catalogat (iar!) ca hater, hai să îți zic câteva chestii văzute prin diversele interefețe cărora eu nu le văd logica. Dacă ai vreo explicație&#8230; Simte-te liber să-mi povesteși și mie de ce:</p>
<p>1) Dacă ai email-ul meu și m-am autentificat cu contul de twitter, de ce nu îmi arăți avatarul? De ce este nevoie să fac upload la o imagine când ai două surse din care îmi poți lua imaginea? (Digg)</p>
<p>2) De când nu mai e la modă paginarea așa cum o știam eu? (adică aia cu <code>« 1 2 3 4 ..... 999 »</code>) Cât am dormit? Înțeleg că se actualizează totul atât de repede încât o paginare clasică nu se pretează, dar gândește-te ce se întâmplă când &#8211; după 30 de pagini încărcate &#8211; îți crapă browserul? E greu să faci o paginare în funcție de id-ul curent? Twitter și Digg fac treaba asta.</p>
<p>3) Video playerul de pe ipad (și bănuiesc că pe iphone e la fel) arată progress bar în partea de sus când e full screen și în partea de jos când nu e full screen?</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/'>Chestii enervante în interfețe</a>. <br/>
	<a href='http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1163/frontend-developer/chestii-enervante-in-interfete/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Usability rant</title>
		<link>http://www.iamntz.com/948/frontend-developer/usability-rant/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/948/frontend-developer/usability-rant/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 08:47:57 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[UI/UX]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Usabitliy]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=948</guid>
		<description><![CDATA[Sunt curios de următoarele chestii: Ce face bifa din dreptul săgeții portocalii? Ce reprezintă săgetuțele din dreptul săgeților roșii? Așa așa, că tot Apple este cel mai user friendly&#8230;
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/948/frontend-developer/usability-rant/'>Usability rant</a>. <br/>
	<a href='http://www.iamntz.com/948/frontend-developer/usability-rant/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Sunt curios de următoarele chestii:</p>
<ol>
<li>Ce face bifa din dreptul săgeții portocalii?</li>
<li>Ce reprezintă săgetuțele din dreptul săgeților roșii?</li>
</ol>
<p><a href="http://content.screencast.com/users/iamntz/folders/Jing/media/4a70486c-c2de-4a94-8ef6-c0d5a6c3f5f0/2010-08-19_1143.png"><img class="aligncenter" src="http://content.screencast.com/users/iamntz/folders/Jing/media/4a70486c-c2de-4a94-8ef6-c0d5a6c3f5f0/2010-08-19_1143.png" alt="" width="429" height="78" /></a></p>
<p>Așa așa, că tot Apple este cel mai user friendly&#8230;</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/948/frontend-developer/usability-rant/'>Usability rant</a>. <br/>
	<a href='http://www.iamntz.com/948/frontend-developer/usability-rant/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/948/frontend-developer/usability-rant/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Despre upgrade</title>
		<link>http://www.iamntz.com/393/frontend-developer/despre-upgrade/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/393/frontend-developer/despre-upgrade/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 17:28:00 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[UI/UX]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=393</guid>
		<description><![CDATA[Scriam în postul anterior de Photoshop CS4. Și mi-am adus aminte de o gafă comisă de unii producători de software: salvarea setărilor. Treaba stă în felul următor: am făcut upgrade la Foobar (de la 0.9x la 1.x). Rezultatul? Toate setările s-au dus. Hotkeys, playlist-uri, tot. A apărut o versiune nouă de Foobar, să-i zicem 1.x+1. [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/393/frontend-developer/despre-upgrade/'>Despre upgrade</a>. <br/>
	<a href='http://www.iamntz.com/393/frontend-developer/despre-upgrade/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Scriam în postul anterior de Photoshop CS4. Și mi-am adus aminte de o gafă comisă de unii producători de software: salvarea setărilor.</p>
<p>Treaba stă în felul următor: am făcut upgrade la Foobar (de la 0.9x la 1.x). Rezultatul? Toate setările s-au dus. Hotkeys, playlist-uri, tot. A apărut o versiune nouă de Foobar, să-i zicem 1.x+1. Ce s-a întâmplat după instalare? Desigur, s-au pierdut setările&#8230;</p>
<p>Apoi vine și rândul Adobe. Am avut CS. Am făcut upgrade la CS2. Apoi la CS3. Apoi la CS4. Absolut nicio versiune nu te întreabă dacă vrei să importe setările. </p>
<p>Mie, unul, îmi vine greu să cred că nimeni de la Adobe nu s-a lovit de problema asta&#8230;</p>
<p>Și stau și mă gândesc: cât de greu este să faci un „importator” (?!) pentru setări? Ok, setările au alt format acum, dar TU ești cel ce a făcut formatul precedent! Înțeleg că nu ești în stare să păstrezi același format ( json anyone? ), dar măcar fă dracului un import funcțional. </p>
<p>Fix în aceeași categorie intră programele de back-up. Eu folosesc Acronis True Image și își face treaba excelent. Singura problemă este că&#8230; Habar n-am cum să salvez setările!!! Dacă sunt nevoit să reinstalez Windows, trebuie să trec iar prin setările Acronis&#8230;</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/393/frontend-developer/despre-upgrade/'>Despre upgrade</a>. <br/>
	<a href='http://www.iamntz.com/393/frontend-developer/despre-upgrade/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/393/frontend-developer/despre-upgrade/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>10/GUI</title>
		<link>http://www.iamntz.com/231/frontend-developer/10gui/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/231/frontend-developer/10gui/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 12:02:49 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[UI/UX]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=231</guid>
		<description><![CDATA[Te-ai întrebat vreodată care e viitorul mausului? Unii zic că mausul nu are viitor, datorită modului său limitat de funcţionare. Iată un concept cel puţin interesant de interacţionare cu pc-ul: Via.
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/231/frontend-developer/10gui/'>10/GUI</a>. <br/>
	<a href='http://www.iamntz.com/231/frontend-developer/10gui/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Te-ai întrebat vreodată care e viitorul mausului? Unii zic că mausul nu are viitor, datorită modului său limitat de funcţionare. Iată un concept cel puţin interesant de interacţionare cu pc-ul:</p>
<p>
	<p style='color:#ccc'>
		<strong>Atentie!</strong> Acest post contine elemente video sau javascript ce nu sunt vizibile în feed-ul RSS. <br/>
		Apasă <a href='http://www.iamntz.com/231/frontend-developer/10gui/'>AICI</a> pentru a vedea versiunea integrală
	</p><object
	 width="700" height="385"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6712657&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=6712657&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="700" height="385"></embed></object></p>
<p><a href="http://twitter.com/olteteanuandrei/status/4886937871">Via</a>.</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/231/frontend-developer/10gui/'>10/GUI</a>. <br/>
	<a href='http://www.iamntz.com/231/frontend-developer/10gui/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/231/frontend-developer/10gui/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tooltips</title>
		<link>http://www.iamntz.com/184/frontend-developer/tooltips/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/184/frontend-developer/tooltips/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 18:10:43 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI/UX]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=184</guid>
		<description><![CDATA[Deoarece mi s-a spus că scripturile scurte sunt utile, dar și pentru că am primit ceva cereri pentru acest subiect, m-am gândit să-ți arăt cum poți face tooltip-uri cu jQuery într-un mod foarte simplu. Îți voi arăta două feluri de tooltips: statice și cu conţinutul preluat prin ajax. De ce tooltips cu javascript? Primele motive [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/184/frontend-developer/tooltips/'>Tooltips</a>. <br/>
	<a href='http://www.iamntz.com/184/frontend-developer/tooltips/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Deoarece mi s-a spus că scripturile scurte sunt utile, dar și pentru că am primit ceva cereri pentru acest subiect, m-am gândit să-ți arăt cum poți face tooltip-uri cu jQuery într-un mod foarte simplu. Îți voi arăta două feluri de tooltips: statice și cu conţinutul preluat prin ajax. </p>
<p>De ce tooltips cu javascript? Primele motive ce-mi vin în cap sunt:</p>
<ol>
<li>Știi sigur că sunt afișate cum trebuie în toate browserele. Oricât de ciudat pare, atributul responsabil cu tooltips în browsere nu prea își face treaba. Sau cel puțin nu cum trebuie. Ba textul e trunchiat (dacă e prea lung), ba nu este afișat suficient de mult timp pentru a fi citit, ba e fontul prea mic, atributul <code>title</code> (căci despre el e vorba) se dovedește de multe ori insuficient pentru nevoile de zi cu zi.</li>
<li>Le poți stiliza fix cum vrei tu. Le vrei negre, cu fundal semtransparent, și un glow subtil? Crezi că le poți face fără javascript? Mult succes!</li>
</ol>
<h3>Alternative</h3>
<p>Înainte de a vedea cum poți face tooltips (într-un mod simplu, așa cum am făcut și până acum), hai să-ți prezit câteva alternative (în cazul în care chiar ți-e extrem de lene sau ești în criză de timp, sunt bune și astea):</p>
<ul>
<li><a href="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/">Bassistance.de jQuery tooltip</a></li>
<li><a href="http://www.codylindley.com/blogstuff/js/jtip/">jTip</a></li>
<li><a href="http://web-graphics.com/mtarchive/BubbleTooltips.html">Bubble tooltips</a></li>
</ul>
<p>Și alte câteva (zeci). Totul e să ai răbdare să le cauți. Oricum, cât timp ai pierde căutând și configurând un script pentru tooltip care habar n-ai cum funcționează și îți mănâncă și inutil de mult bandwidth-ul, ai putea sta cinci minute să încerci acest tutorial (care are o introducere mult prea mare <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Poţi stiliza elementul în funcţie de ce ai nevoie. De obicei, am folosit tooltips la mesaje scurte de ajutor (în pagină), prin urmare le stilizam fie cu o imagine cu litera „i” fie cu un semn al întrebării, tot imagine. De ce imagine? Simplu, pentru că arată mai bine <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3>Tooltips statice</h3>
<p>Varianta cea mai simplă este cea în care afişezi un tooltip în funcţie de atributul <code>title</code> (sau <code>alt</code>, depinde ce preferi). Asta presupune un element cu o clasă şi un titlu:<br />
<span id="more-184"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;#&quot; class=&quot;nTip&quot; title=&quot;Tooltip de test&quot;&gt;?&lt;/a&gt;
</pre>
<p>Ca să fiu băiat bun, îţi arăt cum poţi face tot script sub forma unui mic plugin de jQuery. Da, e atât de simplu!</p>
<pre class="brush: jscript; title: ; notranslate">
jQuery.fn.nTip = function() {
	$(document.createElement('div')).attr('id', 'nTipWrapper').appendTo('body');
	$(this).each(function(){
		var tooltipEl=$(this);
		tooltipEl.data('title', tooltipEl.attr('title')).removeAttr('title');
		tooltipEl.hover(function(e){
			$('#nTipWrapper').empty().html(tooltipEl.data('title')).css({
				left:e.pageX+20,
				top:e.pageY+20
			}).show();
			tooltipEl.bind('mousemove.nTip', function(el){
				if( Math.round($(window).width()/2) &gt; el.pageX ) {
					$('#nTipWrapper').css({
						marginLeft:0
					});
				} else {
					$('#nTipWrapper').css({
						marginLeft:-$('#nTipWrapper').outerWidth()-20
					})
				}
				$('#nTipWrapper').css({
					left:el.pageX+20,
					top:el.pageY+20
				})
			});
		}, function(){
			tooltipEl.unbind('mousemove.nTip');
			$('#nTipWrapper').empty().hide();
		});
	});
};
$('.nTip').nTip();
</pre>
<div class="demoDownload"><a href="http://www.iamntz.com/demos/tooltips/simplu.php" class="demoLink">Demo</a></div>
<h4>Ce se întâmplă?</h4>
<ol>
<li><code>jQuery.fn.nTip</code> iniţiază plugin-ul. <code>nTip</code> este numele pluginului (şi îl poţi schimba dacă nu îţi place)</li>
<li>Facem un <code>div</code> şi îl inserăm în <code>body</code>. Aşa cum am mai zis şi în alt articol, această variantă e mai rapidă, dar se pare că în jQuery 1.4 va fi la fel de rapidă ca <code>$('&lt;div&gt;')</code></li>
<li>Iterăm fiecare element şi îl atribuim variabilei <code>tooltipEl</code></li>
<li>Pentru a scoate tooltip-ul ce apare implicit, setăm <code>.<a href="http://docs.jquery.com/Core/data#namevalue">data</a>('title')</code> să aibe valoarea atributului <code>title</code>, după care ştergem atributul <code>title</code></li>
<li>La hover golim <code>#nTipWrapper</code>, îl poziţionăm lângă elementul „victimă” (cel pentru care afişăm tooltip) şi îl afişăm</li>
<li>Acum urmează o treabă tare deşteaptă ce va mişca tooltip-ul după mouse şi va poziţiona tooltip-ul în partea stângă, în cazul în care elementul este prea în margine. Se numeşte <code><a href="http://docs.jquery.com/Namespaced_Events">namespaced events</a></code> şi ne permite să îi dăm un nume bindului. Astfel, dacă mai ai şi alte event-uri pe elementul respectiv, nu va fi niciun conflict la unbind (citeşte mai jos).</li>
<li><code>el.pageX</code> şi <code>el.pageY</code> reprezintă poziţia cursorului la <code>mousemove</code>. În funcţie de <code>mousemove</code> se schimbă şi pageX, respectiv pageY. Aceeaşi metodă e folosită şi la <code>hover</code>, un pic mai sus.</li>
<li>La <code>mouseout</code> (a doua funcţie din <code>hover</code>) ascundem şi golim <code>#nTipWrapper</code>, după care facem <code>unbind</code> la eventul <code>mousemove</code>. De ce facem asta? Să evităm probleme de genul re-re-re-re-bind pentru un element <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Iniţializăm plugin-ul pentru toţi selectorii cu clasa <code>.nTip</code>.</li>
</ol>
<h3>Tooltips + ajax = Love</h3>
<p>O variantă la tooltips statice sunt cele dinamice, preluate cu ajax. Asta înseamnă că poţi afişa text formatat şi stilizat după cum ai nevoie. În plus, poţi avea un panou de control în care poţi schimba fiecare tooltip într-un mod foarte simplu deoarece fiecărui tooltip îi este atribuit un ID din baza de date:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;tooltip.php?id=1&quot; class=&quot;nTip&quot;&gt;?&lt;/a&gt;
</pre>
<p>Observi acum că atributul <code>title</code> a dispărut iar <code>href</code> are o valoare reală, de care ne folosim. Parametrul trimis către <code>tooltip.php</code> este ID-ul menţionat un pic mai sus. Codul javascript suferă mici modificări:</p>
<pre class="brush: jscript; title: ; notranslate">
jQuery.fn.nTip = function() {
	if(!$('#nTipWrapper').length) {$(document.createElement('div')).attr('id', 'nTipWrapper').appendTo('body');}
	$(this).filter(function(){return $(this).data('hasTooltip') === true ? this : '';}).each(function(){
		var tooltipEl=$(this);
		tooltipEl.data('hasTooltip', true);
		tooltipEl.hover(function(e){
			$('#nTipWrapper').addClass('busy').empty().css({
				left:e.pageX+20,
				top:e.pageY+20
			}).show();
			if(typeof(tooltipEl.data('tooltip'))==='undefined') {
				$('#nTipWrapper').addClass('busy');
				$.ajax({
					type: &quot;GET&quot;,
					url: tooltipEl.attr('href'),
					cache: false,
					success: function(data){
						tooltipEl.data('tooltip', data);
						$('#nTipWrapper').removeClass('busy').html(data);
					}
				});
			}else {
				$('#nTipWrapper').removeClass('busy').html(tooltipEl.data('tooltip'));
			}
			tooltipEl.bind('mousemove.nTip', function(el){
				if( Math.round($(window).width()/2) &gt; el.pageX ) {
					$('#nTipWrapper').css({
						marginLeft:0
					});
				} else {
					$('#nTipWrapper').css({
						marginLeft:-$('#nTipWrapper').outerWidth()-20
					})
				}
				$('#nTipWrapper').css({
					left:el.pageX+20,
					top:el.pageY+20
				})
			});
		}, function(){
			tooltipEl.unbind('mousemove.nTip');
			$('#nTipWrapper').empty().hide();
		});
	});
};
$('.nTip').nTip();
</pre>
<h4>Ce se întâmplă?</h4>
<ol>
<li>La hover peste fiecare element, golim, poziţionăm şi afişăm <code>#nTipWrapper</code>. De asemenea îi adăugăm o clasă <code>busy</code>. Aceasta ne permite să stilizăm tooltip-ul pentru momentele în care se face request spre server. Spunem utilizatorului ce se întâmplă şi, în plus, arată bine <img src='http://www.iamntz.com/wp-includes/images/smilies/tongue.gif' alt=':P' class='wp-smiley' /> </li>
<li>Dacă <code>.data('tooltip')</code> este nedefinit, facem un request ajax iar rezultatul îl introducem în tooltip <strong>şi</strong> în <code>.data('tooltip')</code>. De ce se întâmplă asta? Pentru a evita câte un request la fiecare hover. Prin acest sistem de caching mărim viteza de răspuns a scriptului. Practic, după primul hover, tooltipul va funcţiona fix ca cel static.</li>
<li>Continuarea codului este explicată mai sus, la tooltip-urile statice (este folosit acelaşi cod)</li>
</ol>
<div class="demoDownload"><a href="http://www.iamntz.com/demos/tooltips/ajax.php" class="demoLink">Demo</a></div>
<h2>Avantaje/dezavantaje/Când le foloseşti?</h2>
<h3>Metoda statică</h3>
<h5>Avantaje</h5>
<ul>
<li>Avantajul acestei metode: textul e disponibil imediat (metoda cu cererea AJAX implică şi un timp de aşteptare ce variază în funcţie de server dar şi de conexiunea utilizatorului);</li>
<li>Dacă &#8211; din varii motive &#8211; javascript-ul nu s-a încărcat, aceste tooltips funcţionează în continuare fără probleme (desigur, nestilizate).</li>
</ul>
<h5>Dezavantaje</h5>
<ul>
<li>Textul va fi destul de sec, neputând să-i pui formatare (decât cu BBcode, dar asta e altă poveste);</li>
<li>Poţi folosi doar texte scurte, pentru a nu încărca inutil pagina.</li>
</ul>
<h5>Când le foloseşti?</h5>
<p>Când ai texte mici sau când target-ul site-ului sunt fie utilizatori cu conexiune slabă, fie cei cu dizabilităţi vizuale (deci cu js dezactivat)</p>
<h3>Metoda dinamică (cu ajax)</h3>
<h5>Avantaje</h5>
<ul>
<li>Poţi formata textul folosind taguri html;</li>
<li>Poţi folosi texte oricât de lungi. Desigur, asta nu înseamnă să scrii un roman într-un tooltip <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' /> </li>
<li>Poţi administra toate tooltips dintr-un site într-un mod destul de uşor.</li>
</ul>
<h5>Dezavantaje</h5>
<ul>
<li>Fiecare tooltip înseamnă un request spre server. Fiecare request spre server înseamnă timp în plus;</li>
<li>Poţi pune tooltip doar pe elemente de tip <code>a</code> (prin atributul <code>href</code>) sau <code>img</code> (prin atributul <code>longdesc</code>);</li>
<li>Fără javascript nu există niciun fel de tooltip.</li>
</ul>
<h5>Când le foloseşti?</h5>
<ol>
<li>Când ai titluri mai lungi şi nu vrei să încarci sursa paginii cu text aiurea;</li>
<li>Când vrei să formatezi textul afişat în tooltip.</li>
</ol>
<h2>Concluzie</h2>
<p>Ţi-am arătat cum poţi afişa tooltips ceva mai arătoase decât cele standard într-un mod extrem de simplu şi foarte rapid. Dacă stau să mă gândesc şi să fac o comparaţie între plugin-urile existente şi ce am făcut eu, scriptul meu câştigă detaşat la viteză şi dimensiune. Desigur, sunt mult mai puţine opţiuni, dar în momentul când lucrezi la un proiect trebuie să decizi ce primează: dimensiunea în kb sau opţiunile (de multe ori nefolosite!).</p>
<p>Poţi să „go crazy” şi stiliza fiecare tooltip în mod diferit, adăugând elementului <code>#nTipWrapper</code> câte o clasă diferită în funcţie de elementul pentru care se afişează. De asemenea poţi afişa tooltip-urile astfel încât să nu se „plimbe” după mouse. Cu puţină răbdare, desigur. <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/184/frontend-developer/tooltips/'>Tooltips</a>. <br/>
	<a href='http://www.iamntz.com/184/frontend-developer/tooltips/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/184/frontend-developer/tooltips/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Edit in place (EiP)</title>
		<link>http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 21:00:59 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI/UX]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=144</guid>
		<description><![CDATA[Dacă ai edit in place (EiP) pe site nu înseamnă că ai un site cool. Nu înseamnă că ai un site de succes. Nu înseamnă nici măcar că ai un site 2.0. De fapt, termenul de 2.0 a fost atât de folosit încât a început să fie evitat de majoritatea. Dacă stau bine să mă [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/'>Edit in place (EiP)</a>. <br/>
	<a href='http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Dacă ai edit in place (EiP) pe site nu înseamnă că ai un site cool. Nu înseamnă că ai un site de succes. Nu înseamnă nici măcar că ai un site 2.0. De fapt, termenul de 2.0 a fost atât de folosit încât a început să fie evitat de majoritatea. Dacă stau bine să mă gândesc, nu ştiu de ce îl folosesc eu <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Revenind. EiP înseamnă doar că îi oferi utilizatorului opţiunea de a edita un text fără a fi nevoie să părăsească pagina curentă. Desigur, EiP îl oferi doar unui utilizator înregistrat. Păi dacă e înregistrat, de ce să-ţi mai baţi capul? Că de plecat din site nu pleacă, nu? Păi el nu pleacă, dar asta nu înseamnă să-i facem în ciudă, nu? Câteva linii de cod se transferă mai repede faţă de o pagină întreagă. Sau cel puţin după matematica mea.</p>
<h3>Markup</h3>
<p>Dacă la sistemul de votare <a href="http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/">spuneam</a> că avem un markup simplu, am cam minţit. Sunt deja două taguri, e stil inline, ce mai? E prea mult de scris! La EiP, markup-ul constă într-un SINGUR tag:<br />
<span id="more-144"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;h1 id=&quot;eip-102&quot; class=&quot;editable&quot;&gt;Edit in place demo&lt;/h1&gt;
</pre>
<p>Cam asta e tot. Ăsta cred că e singurul tutorial unde voi folosi UN tag.</p>
<h5>Explicaţii (da, e nevoie!)</h5>
<ol>
<li><code>ID</code> este folosit pentru a fi trimis spre server. Cum XHTML nu prea permite să avem ID-uri numerice, punem o literă/secvenţă de litere;</li>
<li><code>class</code> este folosit ca selector pentru jQuery. Putem folosi orice clasă, fără nicio restricţie, cât timp nu există niciun conflict;</li>
<li>TAG-ul nu este important. Poate fi <code>h1</code>, poate fi <code>div</code> sau doar un simplu paragraf, este irelevant, codul funcţionând la fel. Exemplul final va conţine mai multe elemente editabile. De asemenea, CSS-ul nu este important în momentul de faţă.</li>
</ol>
<h3>Javascript</h3>
<pre class="brush: jscript; title: ; notranslate">
$('.editable').click(function(){
var t=$(this);
	if(parseInt(t.css('line-height'), 10) &lt; t.height()) {
		replaceField('textarea', t);
	}else {
		replaceField('input', t);
	}
});
</pre>
<h5>Explicaţii</h5>
<ol>
<li>La fiecare click pe elmentul cu clasa <code>editable</code>, calculăm dacă elementul are un rând de text sau mai multe.</li>
<li>În funcţie de câte rânduri are, apelăm o funcţie care injectează un <code>input type="text"</code> sau un <code>textarea</code></li>
</ol>
<h5>Funcţia <code>replaceField()</code></h5>
<pre class="brush: jscript; title: ; notranslate">
function replaceField(type, e) {
	$(document.createElement(type))
		.css({
			position:'absolute',
			left:e.offset().left,
			top:e.offset().top,
			width:e.innerWidth(),
			height:e.innerHeight(),
			fontSize:e.css('font-size')
		}).addClass('editInPlaceField')
		.val(e.html())
		.appendTo('body').focus().blur(function(){
			var t=$(this);
			t.addClass('saving');
			$.ajax({
				type: &quot;GET&quot;,
				url: &quot;save.php&quot;,
				data: {id:e.attr('id'), data:t.val()},
				cache: false,
				success: function(data){
					e.html(data);
					t.remove();
				}
			});
		});
};//replaceField
</pre>
<h5>Explicaţii</h5>
<ol>
<li>Creăm un element <code>textarea</code> sau <code>input</code>. Aşa cum am mai zis, metoda <code>document.create()</code> este mai rapidă. În plus, faptul că folosim argumentul <code>type</code> ne scuteşte de o condiţie</li>
<li>Îl poziţionăm absolut şi îi setăm dimensiunile conform cu elementul editabil</li>
<li>Îi adăugăm o clasă pentru o stilizare ulterioară</li>
<li>Îl adăugăm la <code>body</code> şi îi facem focus</li>
<li>La eventu-ul <code>blur()</code> trimitem datele spre server.</li>
<li>Dacă totul este ok, textul vechi este înlocuit iar field-ul este şters</li>
</ol>
<h5>save.php</h5>
<p>În save.php, doar ca exemplu, curăţăm textul editat. Desigur, urmează şi partea cu inserarea în baza de date şamd:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	echo strip_tags($_REQUEST['data'], '&lt;a&gt;');
?&gt;
</pre>
<h5>Gata</h5>
<p>Cam asta a fost tot. Ca şi până acum, am făcut o treabă ce ar fi „costat” o grămadă de kb dacă foloseai un plugin existent în doar câteva linii de cod. </p>
<div class="demoDownload"><a href="http://www.iamntz.com/demos/edit_in_place" class="demoLink">Demo</a></div>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/'>Edit in place (EiP)</a>. <br/>
	<a href='http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/144/frontend-developer/edit-in-place-eip/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Taburi cu CSS şi jQuery</title>
		<link>http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 10:30:06 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI/UX]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=56</guid>
		<description><![CDATA[Taburile reprezintă o modalitate foarte eficientă de organizare a informaţiei. Prima dată când le-am văzut au fost prin Windows 95 şi de atunci&#8230; N-am mai scăpat de ele. În editoare text, în browsere, mai nou în Adobe CS4, taburile te ajută să organizezi eficient &#8211; în funcţie de anumiţi factori &#8211; câteva pagini de informaţie. [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/'>Taburi cu CSS şi jQuery</a>. <br/>
	<a href='http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Taburile reprezintă o modalitate foarte eficientă de organizare a informaţiei. Prima dată când le-am văzut au fost prin Windows 95 şi de atunci&#8230; N-am mai scăpat de ele. În editoare text, în browsere, mai nou în Adobe CS4, taburile te ajută să organizezi eficient &#8211; în funcţie de anumiţi factori &#8211; câteva pagini de informaţie.</p>
<p>Având în vedere că de câţiva ani se tot încearcă o migrare a aplicaţiilor desktop spre online (într-o măsură mai mare sau mai mică), taburile nu puteau lipsi. Fie că sunt cât se poate de seci, încărcând fiecare pagină în parte (cu un refresh al browserului), fie că sunt bazate pe AJAX, încărcând doar conţinutul tabului, fie că pur şi simplu se află în sursa paginii ascunse iar utilizatorul le vede după ce face un click, taburile există şi pe online.</p>
<p>Ca utilizator, taburile sunt foarte simplu de folosit. Dar ca programator, oare cât de simplu sunt de implementat?</p>
<h3>Partea uşoară (şi nu neapărat cea mai bună)</h3>
<p>Cea mai uşoară metodă de a implementa într-un proiect taburi ar reprezenta-o folosirea unei librării gen jQuery UI. Desigur, dacă nu te deranjează să încarci 20kb jQuery şi încă vreo 20kb UI (tabs), plus ceva CSS (nu neapărat necesare). Dar hei, ai o grămadă de <a href="http://jqueryui.com/demos/tabs/">opţiuni, events şi metode</a> pe care oricum nu le vei folosi decât foarte rar (spre deloc, îţi spun din experienţă).</p>
<h3>Partea un pic mai&#8230; „grea”</h3>
<p>Ce-ar fi dacă&#8230; Îţi scrii singur o funcţie pentru taburi (desigur, nu cu atât de multe opţiuni cum are UI)? Nu sună prea tentant, nu? Dar dacă ţi-aş spune că poţi face asta în câteva linii de cod scrise răsfirat ? Deja ţi-am stârnit interesul! Pentru că, aşa cum ştie toată lumea, mai puţini KB înseamnă o factură mai mică (la hosting) şi un utilizator ceva mai fericit că se încarcă site-ul mai repede. Desigur, la 2-3000 unici/lună nu e mare brânză, dar ia gândeşte-te la un site cu peste 100.000 unici/lună, ar însemna o economie de vreo 2gb (cel puţin!).</p>
<h4>Mark-up</h4>
<p>Să vedem cu ce ne murdărim pe mâini. Începem cu puţin html:<br />
<span id="more-56"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul class=&quot;tabs clearfix&quot;&gt;
	&lt;li class=&quot;s&quot;&gt;&lt;a href=&quot;#&quot;&gt;Tab 1&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tab 2&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tab 3&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tab 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Ca structură, e o simplă listă dezordonată (ce tare sună în română <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' />  ). Clasa <code>clearfix </code>este o metodă inteligentă (mulţi mă vor contrazice) de a evita problemele cu elementele ce au un <code>float</code>aplicat. De ce am zis că mulţi mă vor contrazice? Pentru că mulţi preferă metoda <code>overflow:hidden</code>, dar din păcate, oricât de curat ar părea, aduce câteva probleme în anumite situaţii. Dacă vrei să foloseşti<code> overflow:hidden</code>, nimic nu te opreşte. <code>Clearfix </code> este o preferinţă personală <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Câteva cuvinte despre <code>clearfix</code> am scris în urmă cu câteva luni <a href="http://blog.iamntz.com/1901/clearfix.ionut">aici</a>.</p>
<p>Primul element din listă are clasa <code>s</code> (selectat) deoarece arată un pic diferit, astfel încât utilizatorul să ştie ce tab este selectat. Această clasă se va schimba în funcţie de tabul selectat.</p>
<h4>CSS</h4>
<p>Dacă am pus clearfix la lista de mai sus, înseamnă că elementele listei vor pluti (hmmm&#8230; cred că trebuie să renunţ la a mai traduce chestii). Aşadar:</p>
<pre class="brush: css; title: ; notranslate">
.tabs {
	border-bottom:1px solid #ccc;
}
	.tabs li {
		float:left;
		margin-left:10px;
		border: 1px solid #ccc;
		position:relative;
		top:1px;
		background:#fff;
		-moz-border-radius:5px 5px 0 0;
		-webkit-border-radius: 5px 5px 0 0;
		border-radius:5px 5px 0 0;
	}
		.tabs li a {
			display:block;
			line-height:24px;
			padding:0 10px;
			color:#444;
		}
			.tabs li a:hover,
			.tabs li a:focus,
			.tabs li.s a {
				color:#000;
			}
			.tabs li.s {
				top:2px;
				border-bottom:none;
				background-color:#fefefe
			}
</pre>
<p>În acest moment, aceste taburi pot fi folosite oriunde, fără pic de javascript. Pe browserele adevărate (FF, Chrome, Safari), taburile au colţurile rotunjite, ceea ce le face mult mai arătoase <img src='http://www.iamntz.com/wp-includes/images/smilies/wink.gif' alt=';)' class='wp-smiley' />  Desigur, poţi folosi sliding doors pentru a face taburile, dar asta ţine strict de designer. Iar eu vreau să-ţi arăt o tehnică ce ţine mai mult de jquery decât de design.</p>
<h5>Mici lămuriri despre <code>.tabs li</code></h5>
<ul>
<li> <code>float:left</code> aranjează toate elementele listei unul lângă celălalt </li>
<li> <code>position:relative</code> şi <code>top:1px</code> ne permit să mutăm puţin mai jos elementul listei, astfel încât linia de jos să fie întreruptă în dreptul tabului selectat </li>
<li> <code>border-radius</code> (şi toate combinaţiile) rotunjesc colţurile (pe browserele ce suportă CSS 3, desigur). ATENŢIE! Dacă eşti genul care vrea cu orice preţ un fişier valid CSS 2.1, atunci NU ar trebui să foloseşti astfel de proprietăţi (ce ţin, aşa cum am mai zis, de CSS 3) <img src='http://www.iamntz.com/wp-includes/images/smilies/wink.gif' alt=';)' class='wp-smiley' />  </li>
</ul>
<div class="demoDownload"><a href="http://iamntz.com/demos/tabs" class="demoLink">Demo</a></div>
<h3>The magic</h3>
<p>Aşa cum am spus mai sus, în momentul acesta ai taburi făcute strict cu CSS. Sunt acele taburi seci, de care am scris la începutul acestui articol. Hai să vedem cum să le facem să nu fie atât de seci. Pentru început, facem o mică modificare asupra codului HTML iniţial:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div class=&quot;tabWrapper&quot;&gt;
	&lt;ul class=&quot;tabs clearfix&quot;&gt;
		&lt;li class=&quot;s&quot;&gt;&lt;a href=&quot;#tabId1&quot;&gt;Tab 1&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#tabId2&quot;&gt;Tab 2&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#tabId3&quot;&gt;Tab 3&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#tabId4&quot;&gt;Tab 4&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;

	&lt;div class=&quot;tab&quot; id=&quot;tabId1&quot;&gt;
		&lt;h3&gt;Ut enim ad minim veniam&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisic [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;

	&lt;div class=&quot;tab&quot; id=&quot;tabId2&quot;&gt;
		&lt;h3&gt;eiusmod tempor incididunt ut &lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisic [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;

	&lt;div class=&quot;tab&quot; id=&quot;tabId3&quot;&gt;
		&lt;h3&gt;consectetur adipisicing elit&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisic [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;

	&lt;div class=&quot;tab&quot; id=&quot;tabId4&quot;&gt;
		&lt;h3&gt;Lorem ipsum dolor sit amet&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisic [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;
&lt;/div&gt;&lt;!--/.tabWrapper--&gt;
</pre>
<p>Ce s-a schimbat? Am inclus taburile şi conţinutul acestora ( <code>.tab</code> ) într-un div mare, din două motive: 1) o organizare mai bună şi 2) în cazul în care ai mai multe zone cu taburi într-o pagină, îţi permite sa le stilizezi individual. În al doilea rând, fiecare link din taburi are un atribut <code>href</code> acesta corespunde cu id-ul fiecărui <code>div</code> cu conţinutul tabului. Îţi voi arăta un pic mai jos cum poţi face acelaşi lucru FĂRĂ a folosi niciun ID <img src='http://www.iamntz.com/wp-includes/images/smilies/wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Dacă nu vrei să te complici cu request-uri ajax iar utilizatorul să beneficieze instant de informaţia din taburi, aceasta e cea mai la îndemână soluţie. Ce trebuie să faci pentru asta? În primul rând, trebuie să ascundem conţinutul tuturor taburilor, mai puţin cel selectat. Pentru asta avem două metode (sau, dacă adăugăm puţin markup, avem trei metode): </p>
<ol>
<li>Ascundem conţinutul taburilor cu CSS iar când se încarcă scripturile afişăm doar conţinutul tabului selectat</li>
<li>Ascundem conţinutul taburilor cu JS, ceea ce presupune că vor exista câteva secunde (sau fracţiuni de secundă, depinde de conexiunea utilizatorului) în care conţinutul tuturor taburilor va fi vizibil</li>
<li>Adăugăm o clasă (gen <code>s</code>) unui <code>div.tab</code>, după care ascundem din CSS totul în afară de acesta. Această metodă mi se pare prea intruzivă pentru a o folosi. Oricum, dacă nu îţi place niciuna din primele două metode, asta e soluţia finală </li>
</ol>
<p>Asta e o alegere ce poate varia de la proiect la proiect, dar de cele mai multe ori prefer să ascund conţinutul cu javascript dintr-un motiv foarte simplu: în cazul în care (din varii motive) nu se încarcă toată pagina, conţinutul este vizibil utilizatorului. Simplu şi eficient.</p>
<h4>Varianta pe bază de ID</h4>
<pre class="brush: jscript; title: ; notranslate">
$('.tabWrapper').each(function(){
	var t=$(this);
	t.find('.tab').hide();
	t.find('.tabs a').click(function(){
		var th=$(this);
		t.find('.tab').hide(); // ascundem toate taburile
		$(th.attr('href')).show(); // în fucţie de atributul href (care aşa cum am spus mai sus corespunde cu ID-ul pe care îl are conţinutul tabului)
		t.find('.tabs .s').removeClass('s');
		th.parent().addClass('s'); // adăugăm clasa s pentru tabul selectat
		return false;
	});
	t.find('.tabs li.s a').click(); // păcălim browserul să facă un click pe tabul selectat
});
</pre>
<div class="demoDownload"><a href="http://iamntz.com/demos/tabs/index2.html" class="demoLink">Demo</a></div>
<h4>Varianta curată (mai simplă şi mai neintruzivă)</h4>
<p>Aşa cum am spus mai sus, sunt două variante pentru a ascunde şi a arăta conţinutul taburilor: fie pe bază de ID (aşa cum am arătat mai sus) fie pe baza succesiunii din cod. A doua variantă este un pic mai inflexibilă deoarece ordinea taburilor în cod trebuie să corespundă cu ordinea elmentelor <code>.tab</code>. Unii consideră o problemă, alţii nu (eu fac parte din alţii). Astfel, din codul HTML de mai sus eliminăm toate <code>id</code>-urile şi referinţele spre ele:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul class=&quot;tabs clearfix&quot;&gt;
	&lt;li class=&quot;s&quot;&gt;&lt;a href=&quot;#&quot;&gt;Tab 1&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tab 2&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tab 3&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tab 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
	&lt;div class=&quot;tab&quot;&gt;
		&lt;h3&gt;Ut enim ad minim veniam&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;
	&lt;div class=&quot;tab&quot;&gt;
		&lt;h3&gt;Ut enim ad minim veniam&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;
	&lt;div class=&quot;tab&quot;&gt;
		&lt;h3&gt;Ut enim ad minim veniam&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;
	&lt;div class=&quot;tab&quot;&gt;
		&lt;h3&gt;Ut enim ad minim veniam&lt;/h3&gt;
		&lt;p&gt;Lorem ipsum dolor sit amet, consectetur [...]&lt;/p&gt;
	&lt;/div&gt;&lt;!-- /.tab--&gt;
</pre>
<pre class="brush: jscript; title: ; notranslate">
$('.tabWrapper').each(function(){
	var t=$(this);
	t.find('.tab').hide();
	t.find('.tabs a').click(function(){
		var th=$(this);
		var index = t.find('.tabs a').index(this); // vedem al câtelea tab e selectat (numărătoarea începe de la 0
		t.find('.tab').hide().eq(index).show(); // ascundem toate taburile şi îl afişăm pe cel ce corespunde cu indexul setat mai sus
		t.find('.tabs .s').removeClass('s');
		th.parent().addClass('s');
		return false;
	});
	t.find('.tabs li.s a').click();
});
</pre>
<div class="demoDownload"><a href="http://iamntz.com/demos/tabs/index3.html" class="demoLink">Demo</a></div>
<h4>GATA!</h4>
<p>În zece linii de cod ai o soluţie rapidă (şi foarte simplă, ce-i drept) pentru taburi. Probabil într-un viitor nu foarte îndepărtat (în funcţie de reacţiile pe care le va genera acest articol) voi pune un al doilea episod în care îţi voi arăta cum poţi face taburi folosind AJAX, callback-uri (foarte utile!) şi taburi bookmark-able (în funcţie de tabul selectat se schimbă şi url-ul paginii FĂRĂ refresh) sau alte bunătăţuri.</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/'>Taburi cu CSS şi jQuery</a>. <br/>
	<a href='http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/56/frontend-developer/taburi-cu-css-si-jquery/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

