<?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>Ferrante.pl - simplicity of web programming &#187; CSS</title>
	<atom:link href="http://ferrante.pl/category/tech/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://ferrante.pl</link>
	<description>Technologie internetowe, PHP5, Python, Javascript. Publicystyka i kursy w najlepszym wydaniu.</description>
	<lastBuildDate>Tue, 27 Jul 2010 19:28:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Front-Trends 2010 &#8211; najtańsza konferencja w Europie?</title>
		<link>http://ferrante.pl/2010/07/27/front-trends-2010-najtansza-konferencja-w-europie/</link>
		<comments>http://ferrante.pl/2010/07/27/front-trends-2010-najtansza-konferencja-w-europie/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 19:28:32 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=799</guid>
		<description><![CDATA[A już na pewno, jeśli chodzi o tę tematykę i taki line-up. Uruchomiliśmy właśnie sprzedaż biletów na Front-Trends 2010, na której pojawią się w tym roku elektryzujące nazwiska, jak Douglas Crockford, Tantek Çelik i Peter-Paul Koch. Pierwsza tura biletów jest ekstremalnie tania, bo 98€ za sztukę! Biletów jest dwadzieścia, więc proszę się spieszyć! Ponadto bilety [...]]]></description>
			<content:encoded><![CDATA[<p>A już na pewno, jeśli chodzi o tę tematykę i <a href="http://front-trends.com/schedule">taki line-up</a>. Uruchomiliśmy właśnie <a href="http://front-trends.com/registration">sprzedaż biletów</a> na Front-Trends 2010, na której pojawią się w tym roku elektryzujące nazwiska, jak Douglas Crockford, Tantek Çelik i Peter-Paul Koch. Pierwsza tura biletów jest <strong>ekstremalnie tania</strong>, bo 98€ za sztukę! Biletów jest dwadzieścia, więc proszę się spieszyć! Ponadto bilety Early Birds są również bardzo tanie, bo 148€. Nie ma chyba innej konferencji z takimi nazwiskami za taką cenę! Zrobiliśmy chyba wszystko, by umożliwić Polakom i obywatelom krajów sąsiednich jak najlepszy dostęp do liderów branży front-end na świecie. Warto było czekać.</p>
<p>To jak, widzimy się na Front-Trends 2010?</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/07/27/front-trends-2010-najtansza-konferencja-w-europie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wygraj bilet na Front-Trends 2010</title>
		<link>http://ferrante.pl/2010/06/10/wygraj-bilet-na-front-trends-2010/</link>
		<comments>http://ferrante.pl/2010/06/10/wygraj-bilet-na-front-trends-2010/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 21:11:54 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=782</guid>
		<description><![CDATA[Przygotowaliśmy specjalny konkurs dla wszystkich, którzy chcieliby być na Front-Trends 2010 w Warszawie. Sprawa jest prosta &#8211; przygotuj ciekawy efekt, stronę, animację, cokolwiek, co jest zbudowane w HTML5, CSS3 lub JS, i udowodnij w swojej pracy, że warto przyjść na Front Trends 2010. Biorąc pod uwagę, że można zaoszczędzić dobrych kilkaset złotych (i przy okazji [...]]]></description>
			<content:encoded><![CDATA[<p style="font-weight: normal !important;">Przygotowaliśmy <a href="http://front-trends.com/konkurs.html">specjalny konkurs</a> dla wszystkich, którzy chcieliby być <a href="http://front-trends.com">na Front-Trends 2010 w Warszawie</a>. Sprawa jest prosta &#8211; przygotuj ciekawy efekt, stronę, animację, cokolwiek, co jest zbudowane w HTML5, CSS3 lub JS, i udowodnij w swojej pracy, że warto przyjść na Front Trends 2010. Biorąc pod uwagę, że można zaoszczędzić dobrych kilkaset złotych (i przy okazji czegoś się nauczyć) polecam gorąco!</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/06/10/wygraj-bilet-na-front-trends-2010/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Konferencyjna Polska</title>
		<link>http://ferrante.pl/2010/05/26/konferencyjna-polska/</link>
		<comments>http://ferrante.pl/2010/05/26/konferencyjna-polska/#comments</comments>
		<pubDate>Wed, 26 May 2010 21:01:24 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=766</guid>
		<description><![CDATA[We wtorek miałem przyjemność uczestniczyć w SparkUp, prawdopodobnie pierwszej w Polsce konferencji o webdev i ux, zrealizowanej z tak dużym rozmachem. Jestem pod wrażeniem atmosfery i ludzi, którzy pojawili się w Poznaniu. Biletów sprzedano masę i dobitnie świadczy to o tym, że w Polsce jest ogromny potencjał i świetny klimat dla takich inicjatyw.
Nie jeździsz na [...]]]></description>
			<content:encoded><![CDATA[<p>We wtorek miałem przyjemność uczestniczyć w <a href="http://sparkup.pl">SparkUp</a>, prawdopodobnie pierwszej w Polsce konferencji o webdev i ux, zrealizowanej z tak dużym rozmachem. Jestem pod wrażeniem atmosfery i ludzi, którzy pojawili się w Poznaniu. Biletów sprzedano masę i dobitnie świadczy to o tym, że w Polsce jest ogromny potencjał i świetny klimat dla takich inicjatyw.<span id="more-766"></span></p>
<h3>Nie jeździsz na konferencje &#8211; tracisz!</h3>
<p>Przede wszystkim, zastałem w stolicy Wielkopolski mnóstwo nieprzypadowych gości. Byli tam managerowie, programiści, designerzy, blogerzy, internetowi celebryci, Czytelnicy tego bloga, uczestnicy moich szkoleń i masa innych specjalistów, którzy na co dzień tworzą nasz polski internet. Motywowały zasłyszane przeze mnie kuluarowe rozmowy, zainspirowane zapewne obejrzanymi wcześniej wystąpieniami. <i>Wiesz, zamiast trzech buttonów dajemy jeden, a to to w ogóle porażka, nie wiem czemu tak zrobiliśmy&#8230;</i> &#8211; spierał się siedzący za mną zespół developerów. Tym ludziom po prostu zależało, a strzelam, że takich dyskusji było tego dnia więcej.</p>
<p>Powiedzmy sobie głośno, jeśli jeszcze tego nie wiesz &#8211; nie bywasz na konferencjach &#8211; przegrywasz. Przegrywasz wiedzę, kontakty biznesowe, potencjalnie wartościowych, nowych znajomych. A w ogólnym rozrachunku &#8211; pieniądze, które mógłbyś zdobyć dzięki powyższym. Na sali kręciły się osoby, związane z takimi markami jak Microsoft, Opera, Nokia, Roche, czy Allegro. Pytanie &#8220;szukasz pracy?&#8221; zdecydowanie nie było tematem tabu.</p>
<h3>Przeglądarka Twoim domem</h3>
<p>Następna dekada to czas nowoczesnego, zgodnego ze standardami front-endu. JavaScript jest już dostępny na większości zaawansowanych urządzeń mobilnych, świat podbija niesamowity HTML5 (i krążące wokół niego nowinki), a <a href="http://www.apple.com/hotnews/thoughts-on-flash/">Flash umiera</a>. W dużych korporacjach &#8220;J2ME&#8221; zaczyna być ustawiany w parze z takimi słowami jak skansen czy muzeum, a zaawansowane, webowe aplikacje sprawiają wrażenie software&#8217;u desktopowego &#8211; są szybkie, lekkie, wygodne i działają w przeglądarce. Jest rzeczą niezwykle ważną, abyśmy nie przegapili pewnego skoku jakościowo &#8211; technologicznego, który niedługo się dokona. Tym bardziej cieszy fakt, że na horyzoncie pojawiły się wydarzenia, dzięki którym możemy poczuć się jak np. Brytyjczycy, którzy mają u siebie co roku kilkanaście (o ile nie więcej) takich konferencji.</p>
<h3>SparkUp &#8211; jestem na tak</h3>
<p>Nie chciałbym oceniać poszczególnych elementów konferencji SparkUp. Jak na każdej, były rzeczy, które należałoby poprawić, jak i te, za które należą się oklaski. Ogólne wrażenie było bardzo dobre. Nie będzie więc tutaj szyderczej i bratobójczej krytyki, którą z pewnością wielu blogerów by podniosło. Zresztą, najlepiej konferencję ocenią/ocenili jej uczestnicy na <a href="http://blip.pl/tags/sparkup">Blipie</a> czy <a href="http://twitter.com/#search?q=sparkupconf">Twitterze</a>. Jest to wręcz idealny kanał komunikacji dla takich eventów, czego kiedyś nie doceniałem.</p>
<p>Miałem też okazję porozmawiać dłuższą chwilę z jednym z organizatorów &#8211; Piotrem Czekałą. Wielkie gratulacje za chęci i sprawienie, że konferencja się odbyła! Miejcie świadomość, że SparkUp organizują sympatyczni ludzie z głową na karku. Przy okazji dowiedzieliśmy się kilku ciekawych rzeczy, co z pewnością przemyślimy w kontekście <a href="http://front-trends.com">Front Trends</a>.</p>
<h3>Front Trends</h3>
<p>No właśnie, Front Trends. Pojawiło się ostatnio mnóstwo pytań, co do konferencji, która odbędzie się w Warszawie 21 i 22 października. Wiedzcie, że pracujemy bardzo ciężko nad pełną wersją strony internetowej, a także nad cenami i ścieżkami tematycznymi. Nie chcę składać żadnych obietnic czasowych, ponieważ mamy zamiar zaoferować Wam jak najlepszą konferencję i dbamy o dopracowanie każdego szczegółu. Zbliża się najwyższy moment na podanie wszystkich, wiążących informacji, więc proszę o odrobinę cierpliwości!</p>
<h3>Konferencji czas</h3>
<p>Muszę przyznać, że jestem wielkim optymistą, jeśli chodzi o przyszłość konferencyjną w Polsce. Po tym, co usłyszałem i zobaczyłem we wtorek, jestem pewien, że Polska pragnie takich wydarzeń. I będzie je miała, bo taki potencjał nie może zostać zmarnowany.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/05/26/konferencyjna-polska/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Front-Trends 2010 &#8211; konferencja, jakiej w Polsce nie było</title>
		<link>http://ferrante.pl/2010/04/13/front-trends-2010-konferencja-jakiej-w-polsce-nie-bylo/</link>
		<comments>http://ferrante.pl/2010/04/13/front-trends-2010-konferencja-jakiej-w-polsce-nie-bylo/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 08:39:27 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[W sieci...]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=736</guid>
		<description><![CDATA[Wielkie wydarzenie w świecie polskiego i wschodnioeuropejskiego front-endu. Z inicjatywy Pawła Czerskiego i Damiana Wielgosika oraz firmy Frontend Force, 21-22 października br. w Warszawie odbędzie się konferencja Front-Trends 2010. Największe światowe gwiazdy JavaScript, CSS3 i HTML5 przyjadą do stolicy Polski podzielić się swoją wiedzą i doświadczeniem. Wśród nich między innymi Douglas Crockford, Peter-Paul Koch, Paul [...]]]></description>
			<content:encoded><![CDATA[<p>Wielkie wydarzenie w świecie polskiego i wschodnioeuropejskiego front-endu. Z inicjatywy Pawła Czerskiego i Damiana Wielgosika oraz firmy <a href="http://frontendforce.com">Frontend Force</a>, <strong>21-22 października br. w Warszawie</strong> odbędzie się konferencja <a href="http://front-trends.com">Front-Trends 2010</a>. Największe światowe gwiazdy JavaScript, CSS3 i HTML5 przyjadą do stolicy Polski podzielić się swoją wiedzą i doświadczeniem. Wśród nich między innymi <strong>Douglas Crockford, Peter-Paul Koch, Paul Bakaus,</strong> czy <strong>Dmitry Baranovskiy</strong>.</p>
<p>Można powiedzieć, że marzenia się spełniają. Długo zapowiadana niespodzianka stała się faktem. Szykuje się <strong>największe w tej części Europy</strong> święto dla wszystkich ludzi odpowiedzialnych za kształt Internetu.</p>
<p>Niniejszym zapraszam na stronę informacyjną konferencji &#8211; <a href="http://front-trends.com">Front-Trends.com</a>. Jak dotąd, udało się nam zebrać samą śmietankę w postaci <strong>naukowców</strong>, <strong>ewangelizatorów</strong> i <strong>twórców popularnych frameworków</strong>. Ludzi, którzy kreują światowy web. Już wkrótce kolejne, równie gorące nazwiska!</p>
<p>Oficjalna strona wydarzenia ma obecnie charakter wyłącznie informacyjny. Identyfikacja wizualna wraz logo i pełną wersją strony (w tym płatnościami) pojawią się <strong>już niedługo</strong>. Jednocześnie zapraszamy na <a href="http://twitter.com/fronttrends">Twittera</a> oraz <a href="http://fronttrends.blip.pl">Blip</a> po najnowsze wiadomości.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/04/13/front-trends-2010-konferencja-jakiej-w-polsce-nie-bylo/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Jak zrobić przypisy boczne w CSS i jQuery</title>
		<link>http://ferrante.pl/2009/04/19/jak-zrobic-przypisy-boczne-w-css-i-jquery/</link>
		<comments>http://ferrante.pl/2009/04/19/jak-zrobic-przypisy-boczne-w-css-i-jquery/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 17:04:13 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Publicystyka]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=428</guid>
		<description><![CDATA[Podczas kodowania nowego designu wpadłem w pewną pułapkę &#8212; umieszczałem przypisy boczne w kodzie po lub przed danym akapitem. W efekcie, czytając artykuł w czytniku RSS można było poczuć niemałą dezorientację, kiedy ni stąd ni zowąd pojawiała się niespójna logicznie treść. Postanowiłem rozwiązać ten problem, przy okazji publikując i omawiając zastosowane przeze mnie rozwiązanie.
Naszym celem [...]]]></description>
			<content:encoded><![CDATA[<p>Podczas kodowania nowego designu wpadłem w pewną pułapkę &mdash; umieszczałem przypisy boczne w kodzie po lub przed danym akapitem. W efekcie, czytając artykuł w czytniku RSS można było poczuć niemałą dezorientację, kiedy ni stąd ni zowąd pojawiała się niespójna logicznie treść. Postanowiłem rozwiązać ten problem, przy okazji publikując i omawiając zastosowane przeze mnie rozwiązanie.<span id="more-428"></span></p>
<p>Naszym celem jest stworzenie przypisów dolnych tak, aby wyglądały jako boczne, zupełnie jak na tym blogu. Jeśli w jakimś akapicie znajdzie się odnośnik do przypisu, jego treść powinnna pojawić się z prawej strony akapitu (tagu <span class="f">&lt;p /&gt;</span>). Zacznijmy od semantycznego szablonu:</p>
<pre><code>&lt;div class="article"&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa. Fusce sed erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse auctor neque id purus. Ut dignissim felis et velit suscipit fringilla. Aenean et est et lacus interdum rutrum.&lt;a href="#przypis-1" class="hint"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; Nam iaculis ipsum vel neque blandit placerat. Cras dui elit, varius at, gravida a, consectetur ut, elit. Donec turpis. Fusce quis sapien ac nisl lobortis eleifend. Morbi posuere, massa vel fermentum commodo, arcu quam fermentum turpis, vel tincidunt ante odio at arcu. Sed vitae purus.&lt;/p&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa. Fusce sed erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse auctor neque id purus. Ut dignissim felis et velit suscipit fringilla. Aenean et est et lacus interdum rutrum. Nam iaculis ipsum vel neque blandit placerat. Cras dui elit, varius at, gravida a, consectetur ut, elit. Donec turpis. Fusce quis sapien ac nisl&lt;a href="#przypis-2" class="hint"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;lobortis eleifend. Morbi posuere, massa vel fermentum commodo, arcu quam fermentum turpis, vel tincidunt ante odio at arcu. Sed vitae purus.&lt;/p&gt;
	&lt;hr /&gt;
	&lt;ol id="notes"&gt;
		&lt;li id="przypis-1"&gt;First note&lt;/li&gt;
		&lt;li id="przypis-2"&gt;Second note&lt;/li&gt;
	&lt;/ol&gt;
&lt;/div&gt;</code></pre>
<p>Jak widać, kontenerem dla artykułu jest <span class="f">.article</span>, odnośnikami do przypisów są linki <span class="f">.hint</span>. Domyślne przypisy dolne tworzy lista <span class="f">#notes</span>.</p>
<p>Pora na trochę podstawowych CSSów. Wypozycjonujmy treść, nadajmy odpowiednie typy fontów i tak dalej:</p>
<pre><code>* {
	padding: 0;
	margin: 0;
}
a {
	text-decoration:none;
	color: #7EBB1F;
	font-weight: bold;
}
a:hover {
	background-color: #7EBB1F;
	color: #fff;
}
.article {
	width: 960px;
	margin: auto;
	font: normal 14px 'Lucida Sans Unicode', Arial, Helvetica, sans-serif;
}
.article p {
	margin-bottom: 20px;
	line-height: 20px;
	width: 680px;
}</code></pre>
<p>Generalnie, cel jest następujący &#8211; jeśli mamy włączony JavaScript usuwamy listę numerowaną <span class="f">&lt;ol#notes /&gt;</span>, a jej elementy zmieniamy na <span class="f">&lt;p /&gt;</span> i umieszczamy pomiędzy stosownymi akapitami artykułu. To teoretyczny opis. W praktyce będzie to zrobione nieco inaczej.</p>
<p>Poszukamy akapitów, które linkują do określonych przypisów. Jeśli dany akapit zawiera link <span class="f">.hint</span> to dodajemy zaraz po nim stosowny przypis. Treść przypisu pobierzemy na podstawie identyfikatora, który znajduje się po hashu (#) w linku-odnośniku.</p>
<p>Najpierw jednak zajmijmy się sytuacją, kiedy mamy wyłączony JavaScript:</p>
<pre><code>.article hr {
	border: none;
	border-top: 1px solid #7EBB1F;
	width: 680px;
	float: left;
	margin-bottom: 10px;
}
.article #notes {
	clear: left;
}
#notes li {
	font-size: 11px;
	width: 680px;
	margin-bottom: 3px;
	line-height: 15px;
	font-style: italic;
}</code></pre>
<p><a href="http://ferrante.pl/examples/jquery/przypisy/przypis1.html">Powyższym ostylowaliśmy przypisy dolne</a> &#8211; w końcu jeśli JavaScript będzie wyłączony, to będzie trzeba jakoś je zaprezentować. Warto sprawdzić efekt.</p>
<p>Fajnie jednak byłoby, gdyby jakiś aktywny przypis (tzn. ten, w który kliknęliśmy) został nieco wyróżniony. Zrobić możemy to dzięki selektorowi <span class="f">:target</span>:</p>
<pre><code>#notes li:target {
	font-weight: bold;
}</code></pre>
<p>Oznacza to, że jeśli w linku pojawi się identyfikator jakiegoś tagu <span class="f">&lt;li /&gt;</span> np. <em>przypis1.html#przypis-2</em> to treść tego tagu (tutaj: <span class="f">&lt; li id=&#8221;przypis-2&#8243; /&gt;</span>) zostanie wyboldowana. Wynika na to, że <a href="http://ferrante.pl/examples/jquery/przypisy/przypis2.html">załatwiliśmy problem wyłączonego JavaScriptu</a>.</p>
<p>Zajmijmy się teraz odpowiednimi skryptami, które przeniosą elementy z listy <span class="f">#notes</span> pod stosowne akapity. Skorzystamy w tym celu z <a href="http://jquery.com">jQuery</a>.</p>
<p>Najpierw należy poszukać wszystkich linków <span class="f">.hint</span> w obrębie artykułu <span class="f">.article</span>:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {</code></pre>
<p>Dzięki funkcji <span class="f">each</span> przeiterujemy się przez wszystkie znalezione odnośniki do przypisów. Pierwsze, co powinniśmy zrobić, to znaleźć akapit, który jest rodzicem danego linku:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');</code></pre>
<p>Następnie pobieramy adres linku, by uzyskać identyfikator przypisu, do którego się on odnosi:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');</pre>
<p></code></p>
<p>Tym sposobem pod zmienną <span class="f">id</span> będą następujące wartości:</p>
<ul>
<li>#przypis-1</li>
<li>#przypis-2</li>
<li>itd.</li>
</ul>
<p>Pora pobrać treść przypisu na podstawie jego <em>ID</em> i uformować nowy akapit z przypisem:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+'&lt;/sup&gt;'+note+'&lt;/p&gt;');</code></pre>
<p>Szczególnie istotna jest tutaj 8. linijka:</p>
<pre><code>var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id+'"&gt;'+(i+1)+'&lt;/sup&gt;'+note+'&lt;/p&gt;');</code></pre>
<p>Otóż dzięki niej tworzymy nowy tag drzewa DOM jakim jest <span class="f">&lt;p /&gt;</span>. Oczywiście ubieramy go w stosowne wdzianko - nadajmy <em>class="note"</em> - tak, by potem można było ostylować przypis boczny. W nowym przypisie umieszczamy również indeks w <span class="f">&lt;sup /&gt;</span>, korzystając ze zmiennej <span class="f">i</span> z pętli <em>each</em> - jej wartość zaczyna się standardowo od zera, więc należy dodać jeden, by otrzymać zwykłe odliczanie od 1. Znacznik sup musi mieć dobry identyfikator bez hasha na początku. Wyrzucamy więc "#" przez <em>id.replace(/#/g, '')</em>.</p>
<p>Trzeba jeszcze zająć się pozycjonowaniem przypisu tak, by był wertykalnie nieco bliżej jego odnośnika <span class="f">.hint</span>. Spróbujemy ustawić tak dobrany, <strong>ujemny</strong> <span class="f">margin-top</span>, by nie było zbytnich przerw pomiędzy wspomnianym linkiem i akapitem z przypisem.</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+&lt;/sup&gt;'+note+'&lt;/p&gt;');

		newNote.css('margin-top', (parseInt($(parent).css('margin-bottom')) + ($(parent).height() + $(parent).offset().top) - $(element).offset().top) * -1);</code></pre>
<p>Stosowny <em>margines górny</em> ustawiamy na podstawie prostego wyliczenia. Sumujemy wysokość i odległość od początku strony całego akapitu, a następnie od tej sumy odejmujemy odległość linku od początku strony. Odległość od początku strony możemy pobrać przez jQuery'owe <span class="f">offset().top</span>, a wysokość przez <span class="f">height()</span>. Do wszystkiego dodajemy jeszcze margines dolny akapitu, w którym mieści się link. Wszystko mnożymy razy minus jeden, by uzyskać ujemny margines dla naszego przypisu. Oto rysunek poglądowy, jak wyliczamy margines:</p>
<p><img src="http://ferrante.pl/wp-content/uploads/2009/04/przypisy.jpg" alt="przypisy" title="przypisy" width="448" height="195" class="alignnone size-full wp-image-433" /></p>
<p>Pora dodać nowy przypis pod stosowny akapit i zakończyć pętlę <em>each</em>:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+'&lt;/sup&gt;'+note+'&lt;/p&gt;');

		newNote.css('margin-top', (parseInt($(parent).css('margin-bottom')) + ($(parent).height() + $(parent).offset().top) - $(element).offset().top) * -1);

		newNote.insertAfter(parent);

});</code></pre>
<p>Na koniec musimy jeszcze usunąć przypisy dolne, które nie są już nam potrzebne:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+&lt;/sup&gt;'+note+'&lt;/p&gt;');

		newNote.css('margin-top', (parseInt($(parent).css('margin-bottom')) + ($(parent).height() + $(parent).offset().top) - $(element).offset().top) * -1);

		newNote.insertAfter(parent);

	});

	$('#notes').prev('hr').remove();
	$('#notes').remove();
});</code></pre>
<p><a href="http://ferrante.pl/examples/jquery/przypisy/przypis3.html">Wynik naszej zabawy nie wygląda jednak zbyt atrakcyjnie</a>.</p>
<p>Pora dodać stosowne style dla <span class="f">.note</span>:</p>
<pre><code>.article .note {
	float: right;
	background-color: #FBF1AB;
	border: 1px solid #ECD42B;
	width: 162px;
	padding: 4px;
	overflow: hidden;
	font-size: 12px;
}
.article .note sup {
	float:left;
	font-size:20px;
	vertical-align: bottom;
	margin-right: 5px;
	text-align: center;
	width: 30px;
}
.article .note sup:target {
	background: #FBEA71;
}</code></pre>
<p>Jest całkiem nieźle!</p>
<p>Można by co prawda zwiększyć widoczność odnośników do przypisów:</p>
<pre><code>.article .hint {
	margin-right: 10px;
}
.article .hint sup {
	font-size: 14px;
}</code></pre>
<p><a href="http://ferrante.pl/examples/jquery/przypisy/przypisy.html">Działa wyśmienicie</a>!</p>
<p>Zastosowane tutaj rozwiązanie ma w zasadzie tylko jedną wadę - nie należy nadużywać przypisów w jednym akapicie, ponieważ mogą one na siebie nachodzić, tworząc dość nieprzyjemny efekt. Oczywiście możemy nie stosować pozycjonowania względem odnośnika, usuwając linijkę odpowiedzialną za ustawianie górnego marginesu. Wtedy możemy stawiać przypisy gdziekolwiek i w jakiej ilości chcemy.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/04/19/jak-zrobic-przypisy-boczne-w-css-i-jquery/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Narodowy spis front-endowców!</title>
		<link>http://ferrante.pl/2009/04/18/narodowy-spis-front-endowcow/</link>
		<comments>http://ferrante.pl/2009/04/18/narodowy-spis-front-endowcow/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 12:48:53 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[W sieci...]]></category>
		<category><![CDATA[ferrante.pl]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=424</guid>
		<description><![CDATA[Minęły ponad dwa lata od pierwszego wpisu na tym blogu. Pora zebrać nieco szersze informacje o najważniejszym pierwiastku ferrante.pl, jakim są jego Czytelnicy!
Postanowiłem stworzyć ankietę, w której zadaję Wam 30 pytań na różne, branżowe tematy. Najważniejsze dla mnie informacje są wymagane, jednak kilka pytań możecie z czystym sumieniem opuścić. Oczywiście ankieta jest w pełni anonimowa, [...]]]></description>
			<content:encoded><![CDATA[<p>Minęły ponad dwa lata od pierwszego wpisu na tym blogu. Pora zebrać nieco szersze informacje o najważniejszym pierwiastku <span class="f">ferrante.pl</span>, jakim są jego Czytelnicy!<span id="more-424"></span></p>
<p>Postanowiłem stworzyć <a href="http://www.ankietka.pl/ankieta/23752/narodowy-spis-front-endowcow-ferrantepl.html">ankietę</a>, w której zadaję Wam 30 pytań na różne, branżowe tematy. Najważniejsze dla mnie informacje są wymagane, jednak kilka pytań możecie z czystym sumieniem opuścić. Oczywiście <a href="http://www.ankietka.pl/ankieta/23752/narodowy-spis-front-endowcow-ferrantepl.html">ankieta</a> jest w <strong>pełni anonimowa</strong>, tak więc im więcej respondentów, tym lepiej! Apeluję też o poważne odpowiedzi, ponieważ zależy mi na tym, by jak najlepiej dopasować ofertę bloga do Waszych preferencji. Na wynikach ankiety planuję również oprzeć wygląd paru projektów, związanych z tematyką blogów i front-endem jako takim.</p>
<p>Oczywiście wyniki ankiety omówię i przedstawię w jakiejś przystępnej formie. Bez obaw!</p>
<p>Zapraszam więc gorąco do <a href="http://www.ankietka.pl/ankieta/23752/narodowy-spis-front-endowcow-ferrantepl.html">wypełnienia ankiety na Ankietka.pl</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/04/18/narodowy-spis-front-endowcow/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Co wkurza mnie w zakładkach?</title>
		<link>http://ferrante.pl/2009/03/24/co-wkurza-mnie-w-zakladkach/</link>
		<comments>http://ferrante.pl/2009/03/24/co-wkurza-mnie-w-zakladkach/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 21:44:22 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=287</guid>
		<description><![CDATA[Zakładki (zwane też tabami lub kartami) to dość newralgiczny element stron internetowych. Każdy interpretuje go po swojemu. Często są nam wciskane, choć tak naprawdę kontekst nakazuje użycie czegoś zupełnie innego. Przede wszystkim jednak zakładki wkurzają mnie dlatego, że nigdy do końca nie wiem, jak się zachowają.
javascript: void();
Widziałem w swoim życiu wiele kombinacji. Raz treść ładowana [...]]]></description>
			<content:encoded><![CDATA[<p>Zakładki (zwane też tabami lub kartami) to dość newralgiczny element stron internetowych. Każdy interpretuje go po swojemu. Często są nam wciskane, choć tak naprawdę kontekst nakazuje użycie czegoś zupełnie innego. Przede wszystkim jednak zakładki wkurzają mnie dlatego, że nigdy do końca nie wiem, jak się zachowają.<span id="more-287"></span></p>
<h3>javascript: void();</h3>
<p>Widziałem w swoim życiu wiele kombinacji. Raz treść ładowana była AJAXem bez żadnego komunikatu, drugi raz pojawiał się pasek postępu. Czasem zakładki otwierały się natychmiast, choć byłem pewien, że sobie poczekam (wszakże na stronie, z której przyszedłem, wszystko odbywało się przez zapytania asynchroniczne). Często też jestem świadkiem sytuacji, że zostaję przekierowany na inną stronę, mimo że zakładka sprawiała wrażenie dynamicznej. O niedostępnych tabach nie wspomnę &#8211; mało kto zwraca uwagę, że w przypadku wyłączonego JavaScriptu bądź uruchomienia zakładki w nowym oknie powinienem zostać przeniesiony do strony, która pokaże mi mniej więcej to, o czym była mowa w etykiecie karty. Niestety, nadal pokutuje (nie)słynne <span class="f">javascript:void</span> &#8211; przykład pierwszy z brzegu &#8211; gry-online.pl:</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/gol-tabs.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/gol-tabs.jpg" alt="gol-tabs" title="gol-tabs" width="431" height="170" class="alignnone size-full wp-image-329" /></a></p>
<h3>A to Polska właśnie</h3>
<p>Najlepiej przykład wkurzających zakładek prezentują polskie, czołowe portale. Zacznijmy od Onetu (używając tzw. skórki eleganckiej).</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/onet-tabs.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/onet-tabs.jpg" alt="onet-tabs" title="onet-tabs" width="431" height="170" class="alignnone size-full wp-image-293" /></a></p>
<p>Po pierwsze, link <em>więcej</em> powoduje przeładowanie strony, mimo że wygląda on jak pozostałe zakładki. Po drugie, kontrast między zakładką a treścią jest tak mały, że można ulec dezorientacji. Tym bardziej, że treść jest dość długa i znacznie wykracza poza widzialny obszar monitora (1280&#215;800). Nie wspomnę też o tym, że zakładki ładowane są AJAXem, używając bardzo mało przejrzystego komunikatu:</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/onet-tabs2.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/onet-tabs2.jpg" alt="onet-tabs2" title="onet-tabs2" width="431" height="170" class="alignnone size-full wp-image-294" /></a></p>
<p>Na szczęście bez problemów mogłem otworzyć daną zakładkę w nowym oknie przeglądarki.</p>
<p>Na Onecie jesteśmy zaskakiwani niejeden raz. Trochę niżej widnieje zupełnie inny, horyzontalny dodajmy, system zakładkowy.</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/onet-tabs3.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/onet-tabs3.jpg" alt="onet-tabs2" title="onet-tabs2" width="431" height="170" class="alignnone size-full wp-image-294" /></a></p>
<p>Oprócz braku konsekwencji, wyróżnienie aktywnego elementu jest dość mało sugestywne (o ile kolor pomarańczowy załatwia sprawę dość skutecznie, tak jasne obramowanie i wszędobylski biały niwelują pozytywne uczucie).</p>
<p>Na Wirtualnej Polsce nie lepiej. Powtórzony błąd z linkiem <em>więcej</em>. W dodatku bliskość dwóch systemów zakładek obok siebie sprawia wrażenie niezłego miszmaszu. Nie lubię powoływać się, jak już pisałem, na gadające głowy, ale jest to podręcznikowy przykład na tezy Jacoba Nielsena (które zresztą przetłumaczyłem poniżej). Na WP spróbowano też pobić rekord świata w upchnięciu jak największej treści na jak najmniejszym obszarze. Udało się to nieźle. </p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/wp-zakladki.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/wp-zakladki.jpg" alt="wp-zakladki" title="wp-zakladki" width="431" height="170" class="alignnone size-full wp-image-296" /></a></p>
<p>Poza tym, znowu zostałem zmylony brakiem AJAXa &#8211; tym razem interesująca mnie prognoza pogody została załadowana natychmiast. Zdziwiłem się także tym, że pod tabem reprezentującym pogodę nie ma oferty żarówek &#8211; tutejsza ikonka za nic nie przypomina słońca, o co, jak mniemam po głębszym zastanowieniu, zapewne chodziło autorom. </p>
<p>Nie lepsze są zakładki wyszukiwarek &#8211; tym razem aktywny element został wyróżniony pogrubieniem, co w połączeniu z klaustrofobiczną wręcz ilością miejsca tworzy duży chaos.</p>
<p>Z dziennikarskiego obowiązku wszedłem też na Interię i Gazetę.pl. W pierwszym przypadku było prawie idealnie &#8211; zachowana konsekwencja w używaniu zakładek, spójna kolorystyka i layout oraz natychmiastowe ładowanie bez AJAXa. Razić może jedynie dość niski kontrast między aktywnymi i nieaktywnymi zakładkami.</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/interia-tabs.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/interia-tabs.jpg" alt="interia-tabs" title="interia-tabs" width="431" height="170" class="alignnone size-full wp-image-297" /></a></p>
<p>Na Gazecie jak to na Gazecie &#8211; o ile kontrast pomiędzy głównymi zakładkami jest stosunkowo mały, tak sytuację ratują duże odstępy pomiędzy nimi. </p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/gazeta-tabs1.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/gazeta-tabs1.jpg" alt="gazeta-tabs" title="gazeta-tabs" width="431" height="170" class="alignnone size-full wp-image-290" /></a></p>
<p>Dalej jest już mniej przejrzyście i dostępnie (najlepiej to widac w kontekście całego portalu, a nie konkretnego wycinka obrazu):</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/gazeta-tabs2.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/gazeta-tabs2.jpg" alt="gazeta-tabs2" title="gazeta-tabs2" width="431" height="170" class="alignnone size-full wp-image-291" /></a></p>
<p>Paradoksalnie, najbardziej dostępnymi zakładkami na stronie są te:</p>
<p class="p"><a href='http://ferrante.pl/wp-content/uploads/2009/03/gazeta-tabs3.jpg'><img src="http://ferrante.pl/wp-content/uploads/2009/03/gazeta-tabs3.jpg" alt="gazeta-tabs3" title="gazeta-tabs3" width="431" height="170" class="alignnone size-full wp-image-292" /></a></p>
<p>Choć urodą i przestrzenią nie grzeszą.</p>
<p>Podsumowując &#8211; zakładki są skuteczne w realizacji założeń (upchanie treści w danym obszarze, czego wręcz developerzy nadużywają), jednak dobrze wykonanych tabów ze świecą szukać. Z reguły są one wręcz rozmyte z innymi elementami strony, nieprzewidywalne, mają mały kontrast, a zamieszczonej w nich treści jest o wiele za dużo.</p>
<h3>Trzynaście przykazań</h3>
<p>Swego czasu Jacob Nielsen <a href="http://www.useit.com/alertbox/tabs.html">popełnił 13 wskazówek co do budowania zakładek</a>. Pozwolę sobie je przytoczyć:</p>
<ul>
<li>Używaj zakładek do rozróżnienia widoków tyczących się tego samego kontekstu (nie do nawigacji pomiędzy zupełnie innymi obszarami).</li>
<li>Zakładki powinny logicznie dzielić treść tak, aby użytkownik z łatwością mógł się domyślić, co znajdzie pod każdą z nich.</li>
<li>Zazwyczaj użytkownicy nie chcą widzieć jednocześnie treści z wielu zakładek. Jeśli ktoś chce porównać dane, przełącza się pomiędzy kartami, zapamiętując treść jednej z nich, by potem dopasować ją do danych z aktywnej zakładki.</li>
<li>Zakładki nie powinny być od siebie tematycznie oderwane.</li>
<li>Podświetlanie aktywnej zakładki poprzez jej rozjaśnienie jest ok, jeśli zakładek jest poniżej czterech (dla tylko dwóch tabów ciężko jest natomiast wtedy stwierdzić, która jest aktywna). Dodatkowo, możesz wyróżnić aktywną kartę poprzez zmianę jej wielkości, pogrubienie, ikonkę. Możesz ją również zaprojektować tak, by sprawiała wrażenie mieszczącej przed innymi zakładkami.</li>
<li>Niewybrane zakładki powinny być czytelne i dobrze widoczne, przypominając użytkownikowi, że ma do wyboru także inne opcje. Jeśli nieaktywne karty są za bardzo &#8220;zlane&#8221; z tłem, pozostaje ryzyko, że użytkownik nigdy ich nie dojrzy, tym samym pozbawiając sie odkrycia dodatkowych opcji na Twojej stronie.</li>
<li>Aktywna zakładka powinna być ściśle połączona z panelem jej contentu, sprawiając wrażenie przyklejonej. Podkreśla to, który box jest pokazywany i wskazuje użytkownikowi, która zakładka jest aktywna.
<p>Co więcej, ten sam kolor tła dla boxu i zakładki do niego prowadzącej wzmacnia także relację między nimi i wymusza używanie różnych kolorów tła dla nieaktywnych i aktywnych zakładek.</li>
<li>Etykiety (<em>labelki</em>) powinny być krótkie i jasne. Ich długość powinna przeważnie wynosić od jednego do dwóch wyrazów. Krótkie nagłówki są bardziej widoczne i wpadają po prostu w oko. Jeśli potrzebujesz dłuższych jest to znak, że system zakładek to nie do końca to, czego potrzebujesz.</li>
<li>Każde słowo etykiety powinno zaczynać się od dużej litery np. Biało-Czerwony Orzeł (<em>choć biorąc pod uwagę specyfikę języka polskiego nie jest to do końca trafne założenie- przyp. ferrante</em>). Unikaj kapitałek, które są mniej czytelne.</li>
<li>Umieszczaj zakładki tylko w jednym rzędzie. Wielorzędowe zakładki wymagają &#8220;skakania&#8221; po elementach interfejsu, wprowadzając użytkownika w dezorientację. Jeśli masz aż tyle zakładek, że nie mieszczą się one w jednym rzędzie, pomyśl nad uproszczeniem designu.</li>
<li>Zakładki powinny być nad boxem, nigdy pod lub z boku, ponieważ użytkownik może je przeoczyć.</li>
<li>Powinno być oczywiste, jaki obszar strony jest objęty systemem zakładek.</li>
<li>Pomiędzy kliknięciem w zakładkę a pojawieniem się stosownej treści nie powinno być dłuższych odstępów niż jedna sekunda (idealny czas to poniżej < 0,1s). W przeciwnym razie użytkownik nie czuje naturalnej zależności między jego ruchami myszką, a zmianą wyglądu poszczególnych tabów i paneli z treścią.</li>
</ul>
<p>Jak widać, Jacoba Nielsena opłaca się czytać. Co więcej, ponoć większość go czyta (sic!). Szkoda jednak, że nikt przy tym nie myśli. Sam mam na swoim blogu zakładki i zaręczam Wam, to była zła decyzja. Na szczęście już wkrótce nadarzy się okazja, by to zmienić.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/03/24/co-wkurza-mnie-w-zakladkach/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Zostań lepszym programistą front-endu &#8211; fakty i mity</title>
		<link>http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/</link>
		<comments>http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 19:52:46 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Publicystyka]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[W sieci...]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=215</guid>
		<description><![CDATA[Zastanawiałem się ostatnio, co tak naprawdę czyni nas dobrymi programistami front-endu. Abstrahując od tego, że cały czas uczę się i nigdy nie będę mógł powiedzieć o sobie, że jestem w czymś doskonały, postanowiłem zebrać do kupy kilka wskazówek, które wywarły ogromny wpływ na moją karierę.
Pokora to jedna z największych cnót
Szafowanie szeroką gamą branżowych terminów nie [...]]]></description>
			<content:encoded><![CDATA[<p>Zastanawiałem się ostatnio, co tak naprawdę czyni nas dobrymi programistami front-endu. Abstrahując od tego, że cały czas uczę się i nigdy nie będę mógł powiedzieć o sobie, że jestem w czymś doskonały, postanowiłem zebrać do kupy kilka wskazówek, które wywarły ogromny wpływ na moją karierę.<span id="more-215"></span></p>
<h3>Pokora to jedna z największych cnót</h3>
<p>Szafowanie szeroką gamą branżowych terminów nie czyni z Ciebie specjalisty. Spotykałem osoby, które twierdziły, że wiedzą, co to dostępność, użyteczność i inne takie&#8230; No, zresztą, sami dobrze wiecie&#8230; Większość z nich, zapytana o szczegóły, rzucała jednak podstawowymi określeniami, które można bez trudu znaleźć po 30 sekundach wyszukiwania w sieci.</p>
<p>Bardzo często ktoś, coś tam słyszał, jednak nie przypomina sobie szczegółów. <a href="http://www.useit.com/">Nielsen</a>, <a href="http://www.sensible.com/">Don&#8217;t let me think</a>. A! I o niepełnosprawnych coś było! Prawie jak na lekcji biologii&#8230; Problem w tym, że tak jak lekarz podczas operacji nie sięga po podręczniki, by dowiedzieć się, gdzie mieści się serce, tak programista front-end nie myśli dwie godziny nad tym, jak działa, dajmy na to, hierarchia nagłówków.</p>
<p>Dlatego też o wiele bardziej cenię ludzi pokornych, którzy owszem, w trakcie boomu na użyteczność słyszeli kilka podstawowych haseł, aczkolwiek otwarcie przyznają, że nie wiedzą zbyt wiele i chcieliby poszerzyć horyzonty.</p>
<p>Poza tym, gro osób spod znaku <span class="f">doskonała znajomość HTML, XHTML, CSS oraz standardów W3C, WAI</span> tak naprawdę, co komiczne, ma w swoim portfolio strony, które przeczą współczesnym standardom. Co więcej, pewnikiem wszyscy zrobiliśmy kiedyś jakiegoś potworka. W związku z tym, sto razy bardziej docenię osobę, która jest świadoma tego faktu, niż tę, która stwierdzi, że wszystko jest w porządku, a jej kwalifikacjami powinna zająć się najlepiej komisja złożona ze <a href="http://www.joelonsoftware.com/">Spolsky&#8217;ego</a>, <a href="http://meyerweb.com/">Meyer&#8217;a</a>, <a href="http://www.zeldman.com/">Zeldmana</a> i innych.</p>
<h3>To nadal jest programowanie!</h3>
<p>Jeśli chodzi o JavaScript, zważ, że to nie tylko <a href="http://jquery.com">jQuery</a>. Wielu programistów uważa czysty JavaScript za zupełnie zbędny, kiedy jest to podejście pozbawione sensu. Chciałbym wiedzieć, ile do powiedzenia na temat optymalizacji, closures czy programowania obiektowego mają osoby, które w swoim portfolio oceniają JavaScript na &#8220;doskonały&#8221;. Sam łapałem się na tym wielokrotnie &#8211; udało mi się napisać to i owo, dlatego myślałem, że jestem w danej dziedzinie ekspertem. Nic bardziej mylnego, języki programowania to żywy twór, który z każdym dniem odsłania nowe obszary.</p>
<p>Kiedyś o eventach w JavaScript wiedziałem tylko tyle, że trzeba pobrać odnośnik do <a href="https://developer.mozilla.org/en/DOM">DOM</a> i przypiąć stosowną funkcję. Dziś o ból głowy (z zachwytu nad rozwiązaniami) przyprawiają mnie problemy wycieków pamięci lub zdarzeń bąbelkowych. </p>
<p>A gdzie mi tu Panie do zaawansowanego użycia <a href="https://developer.mozilla.org/En/Drawing_Graphics_with_Canvas">Canvas</a>, w którym zrobiłem bardzo mało rzeczy, aczkolwiek mam świadomość, jak to działa i wiem, że gdybym poświęcił swój czas na konkretny projekt, na pewno bym go zrobił. O ile z czystym sumieniem mogę więc stwierdzić, że nie jestem specjalistą z tej dziedziny, tak wiele osób napisałoby na <a href="http://goldenline.pl">Goldenline</a> czy gdziekolwiek indziej, że Canvas wciąga uchem, kiedy tak naprawdę używała jedynie jakiegoś widgetu z <a href="http://ajaxian.com">Ajaxian.com</a>.</p>
<p>Poznawanie zagadnień od podstaw jest bardzo ważne. Prędzej czy później trafimy na problem, któremu nie będziemy mogli podołać przez nasze zaniedbania. Pierwszy przykład z brzegu &#8211; miałem swego czasu zoptymalizować system walidacji formularzy faktur. Pozycji było ponad 30, każda z nich miała po pięć sprawdzanych informacji. Pętli były dziesiątki (setki?) tysięcy, a czas wykonywania skryptu oscylował wokół 15 sekund. Wszystko oparte było o jQuery i <a href="http://docs.jquery.com/Plugins/Validation">jQuery Validation</a>. Dla każdego walidowanego pola frywolnie używano selektorów jak poniżej:</p>
<pre><code>$('input[name^=xxx][name$=xxx]');</code></pre>
<p>Przyjmując, że jQuery musi sprytnie przefiltrować wszystkie inputy, dopasowując je do podanych dwóch wyrażeń regularnych, mamy 30*5*2*600 iteracji (w dokumencie było około 600 inputów). Ciekaw jestem, co powiedziałaby osoba bez jakiejkolwiek wiedzy analityczno-algorytmicznej (choćby jak działają selektory w jQuery). Że o podstawach JavaScript nie wspomnę.</p>
<p>Pomyśl też, co stałoby się, gdybyś musiał napisać coś w <a href="http://mootools.net/">MooTools</a> lub <a href="http://www.prototypejs.org/">Prototype</a>?</p>
<h3>Staranność</h3>
<p>Nie rób w kodzie bałaganu, pod żadnym pozorem. Nieważne, czy zaczynasz duży czy mały projekt. Nazywaj klasy i identyfikatory zgodnie z przyjętą przez Ciebie konwencją. Żadnych <em>test3</em>, <em>somethingExampleHehe</em> i innych potworków. Nie pisz skryptów na szybko, bez dobrego formatowania i logicznego nazewnictwa zmiennych. Utrzymuj porządek w sekcji <em>head</em> dokumentów, jak i w folderach z plikami źródłowymi. Przyjmij konwencje nazw katalogów, w których trzymasz pliki css, js i obrazki.</p>
<p>Otaczaj skrypty JS anonimowymi funkcjami, tak, by nikt nie nadpisał Twojego kodu:</p>
<pre><code>(function() {
// Twoj kod...
})();</code></pre>
<p>Niestety, programowanie stron niesie ze sobą wiele pułapek, a jedną z nich jest skłonność do powstawania bałaganu. Wielokrotnie widziałem zdublowany kod, puste deklaracje w CSSach i wiele innych niedoróbek. Znając życie, większość pochodzi z czystego pośpiechu. Osobiście, często robiłem coś na szybko, dodawałem style inline, by sprawdzić, jak coś się zachowa, mimo że miałem do dyspozycji debugger. CSS i JS są bardzo czułe na fuszerkę, dlatego unikaj kompromitacji, nawet, gdyby praca miała potrwać 10 minut dłużej.</p>
<p>Zdarza się również, że mozolnie szukamy rozwiązania, dajmy na to pod IE, dopisując coś i skreślając w kodzie, a także pisząc na szybko różne nazwy zmiennych, typu <em>some</em>, <em>x</em>, <em>aaa</em> itd. Gdy dochodzimy do celu, zapominamy o sprawie, skoro &#8220;<em>jest zrobione</em>&#8220;. W efekcie w kodzie pozostaje bubel, który będzie nielogiczny dla programistów edytujących kod w przyszłości. Zmusi ich to prawdopodobnie do kontynuowania złej konwencji i dalszego brudzenia, bo <em>przecież nie będę się doczytywał, o co temu kolesiowi chodziło.</em>. Nie zostawiaj po sobie kodu, którego sam nie zrozumiesz za miesiąc.</p>
<p>Debugger i dobre narzędzia wspomagające to świętość! Dowiedz się, co to Firebug, WebDeveloper, Live Headers, Pixel Perfect, IE Tab, HTML Validator, czy Firecookie. Przeglądaj często <a href="https://addons.mozilla.org/en-US/firefox/browse/type:1/cat:4">stronę z rozszerzeniami do Firefoxa</a>. A nuż wyjdzie coś interesującego!</p>
<p>Frameworki CSS to nie do końca trafiony pomysł, jednak przydatny w pewnych okolicznościach. Przeanalizuj dokładnie wady i zalety takiego rozwiązania, zainteresuj się <a href="http://meyerweb.com/eric/tools/css/reset/">resetami CSS</a> czy też projektami typu <a href="http://960.gs">960 grid system</a>.</p>
<p>Typografia <a href="http://www.webtypography.net/">potrafi być ciekawa</a>, a <a href="http://ferrante.pl/2008/05/17/uzywanie-html4-a-profesjonalizm/">XHTML ma wady</a>, więc bądź ostrożny.</p>
<h3>Rozwój osobisty</h3>
<p>Nikt nie jest alfą i omegą. Nie zniechęcaj się tym, że wielokrotnie podczas pracy używasz Google. Zapamiętywanie hacków, czy też bugów przeglądarek jest pomocne, lecz nie jest to najważniejsze. Wystarczy, że znasz i kojarzysz problem. Rozwiązanie to tylko kwestia doboru środków.</p>
<p>Czytaj książki. O sieci pisze się tyle ciekawych rzeczy! Nie przeczytasz ich na żadnej stronie internetowej. Luke Wroblewski, Joel Spolsky, Eric Meyer, Jakob Nielsen, Louis Rosenfeld, Dean Clarke to tylko czubek góry lodowej nazwisk, które szanujący się developer powinien znać. Czytanie zagranicznych pozycji to nie moda, lans czy cokolwiek innego &#8211; to polepszanie swoich kwalifikacji. Biorąc pod uwagę, że w sieci są prawdopodobnie tysiące koderów z szablonu (CSS, HTML, JS), zatrudniłbym kogoś, kto po prostu wie więcej.</p>
<p>Jeśli nie znasz z kolei jakiejś pozycji, przyznaj to otwarcie, zamiast szukać okrężnej drogi w swoich tłumaczeniach. Nie znać &#8220;X&#8221; czy &#8220;Y&#8221; to nie wstyd, acz argument do dalszej nauki i sztuki poznania. Osobę, która próbuje podjąć dyskusję na temat, o którym nie ma żadnego pojęcia, z reguły można rozpoznać po kilku sekundach. Pamiętaj o tym.</p>
<p>Staraj się czytać blogi, choć zważ na to, że nie jest to żaden wyznacznik Twojej wiedzy, o czym nieliczni próbują przekonywać. Jeśli blogi, to nie tylko polskie (tym bardziej, że bardzo mało jest tych wartościowych). O JavaScript absolutnie fantastyczne rzeczy tworzy <a href="http://ejohn.org">John Resig</a> (twórca jQuery), jest genialny <a href="http://dean.edwards.name/weblog/">Dean Edwards</a>, <a href="http://paulbakaus.com/">Paul Bakaus</a>, <a href="http://mootools.net/blog/">Valerio Proietti</a>. To tylko kilka nazwisk, bo o JS i CSS piszą tysiące osób. Bardzo pomocne są też serwisy typu <a href="http://alistapart.com">A List Apart</a> czy też <a href="http://ajaxian.com">Ajaxian.com</a>, gdzie zgromadzone są najnowsze wiadomości i projekty z branży.</p>
<p>Zauważ, że posiadanie sprzętu Apple lub pisanie Twittera/Blipa nie czyni Cię specjalistą. Wiedz, że na Macu nie zobaczysz 64-bitowej palety kolorów, a to że Zeldman twitteruje nie robi Cię jego kumplem od wódki. Jeśli mimo wszystko stawiasz powyższy fakt za swoje ewidentne zalety, powinieneś zaznajomić się ze znaczeniami ekshibicjonizmu i jego pochodnymi.</p>
<p>Ucz się języka obcego, najlepiej angielskiego. Większość ważnych rzeczy mówi się tutaj w języku Szekspira. W prestiżowych firmach komunikacja z klientem bardzo często odbywa się po angielsku. Z kolei, jeśli Twoje aspiracje sięgają naprawdę wysoko, raczej nie dosięgniesz nieba w Polsce. Niestety, pierwsza liga front-endu gra za granicą. Sam fakt, jak mało mają tam do powiedzenia Polacy, świadczy o tym, że możemy traktować nasz kraj jako branżowy zaścianek.</p>
<p>Bądź krytyczny i szczery w swoich osądach, nie bój się wyrażać własnych opinii. Jeśli projekt dyskutowany jest pod kątem dziedziny, w której jesteś ekspertem, narzuć swoje zdanie i przede wszystkim przedstaw stosowne argumenty. Broń swojej wiedzy! Kto ma wiedzieć cokolwiek o dostępności, jak nie specjalista front-end? Oczywiście, sugestie innych osób są cenne, jednak ostateczne zdanie powinno należeć do Ciebie. </p>
<p>Fajne rzeczy o rozwoju osobistym <a href="http://alexba.eu/">pisze Alex Barszczewski</a>.</p>
<h3>Użyteczność</h3>
<p>Sądzę też przekornie, że <a href="http://pl.wikipedia.org/wiki/Użyteczność_(web-usability)">użyteczność</a> to jedna z największych pułapek, jakie wyprodukował webdevelopment w ostatnich latach. Podstawowe terminy użyteczności stron www są jak najbardziej zasadne, jednak im dalej w las, tym więcej drzew. Tak naprawdę, wiele aspektów użyteczności jest sprawą dyskusyjną i to, dlaczego, przyjmijmy umownie, link jest czerwony, a nie niebieski, w gruncie rzeczy determinuje kontekst, zamierzony cel i dziesięć innych czynników, których nie znajdziemy w szablonowych książkach o usability.</p>
<p>Jest to działka, w której najwięcej mają do powiedzenia krzykacze. Ubzdurało im się, że znają się na użyteczności, bo przeczytali kilka mądrych książek. Większość sporów o usability danego elementu na stronie można podważyć &#8220;pierwszą lepszą&#8221; publikacją książkową. Dlatego też najgorsze argumenty, jakie możesz użyć w dyskusji o usability, tyczą się fanatycznego powoływania na konkretnego autora i rzekomego specjalisty od użyteczności. Nikt jeszcze nie wymyślił złotego środka, a książki o usability wskazują jedynie na najpopularniejsze problemy!</p>
<p>Przede wszystkim radzę myśleć! Użyteczność to nie proste regułki. To nie wersety z książek, które często powielają banały lub które są po prostu słabe (vide publikacje Kasperskiego). Nie idź na łatwiznę. Dopatruj się kontekstu, przeprowadzaj testy z użytkownikami, dyskutuj z kolegami po fachu! Nie ma nic bardziej zbawiennego, niż solidna burza mózgów, poparta konkretnymi argumentami merytorycznymi. Wiele publikacji aspiruje do bycia tak uniwersalnym, jak tylko sie da. Nie daj się nabrać, tym bardziej, że jest to ostatnio niezwykle chwytliwy temat. Specjalistów od użyteczności przybywa niczym cinkciarzy pod Pewexem, dlatego powtórzę jeszcze raz &#8211; myśl!</p>
<h3>Prototypowanie</h3>
<p>Doceń prototypy i testy z użytkownikami. Muszę stwierdzić, że wcześniej rzadko korzystałem z papierowych bądź elektronicznych prototypów. Designy od początku do końca projektował dla mnie grafik, zgodnie ze słownymi wytycznymi. Jakież to amatorskie podejście! Profesjonalny projekt powstaje stopniowo. Najpierw pracuje się nad wymaganiami, potem wkracza front-endowiec, który ma za zadanie przedstawić prototyp funkcjonalności strony. Nie projektuje on designu, ale ustala layout, rozmieszczenie buttonów, warstw, menu i wszystkiego, co tyczy się www. Przy okazji projektuje on większość aspektów użyteczności strony. Prototyp ułatwia pracę wszystkim &#8211; klientowi, designerowi, back-endowi i Tobie oczywiście. To na etapie prototypu powinny być wyjaśniane wszystkie wątpliwości. Tutaj ustalany jest ostateczny, podkreślmy to, kształt aplikacji. Wszystko po to, by potem zająć się tylko i wyłącznie kodowaniem oraz testowaniem.</p>
<p>Profesjonalne prototypy można tworzyć np. w <a href="http://axure.com">Axure</a>.</p>
<p>Prawdopodobnie to nie wszystko, co można by napisać na ten temat. Uczymy się jednak na błędach, a kolejne akapity dopisze życie, z pewnością&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Setki standardów, tysiące problemów i tylko jeden JavaScript</title>
		<link>http://ferrante.pl/2009/03/05/setki-standardow-tysiace-problemow-i-tylko-jeden-javascript/</link>
		<comments>http://ferrante.pl/2009/03/05/setki-standardow-tysiace-problemow-i-tylko-jeden-javascript/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 21:20:36 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=173</guid>
		<description><![CDATA[Przysłowiowa współpraca front-endu z back-endem nie zawsze jest usłana różami. Programiści z pierwszej frakcji są najczęściej bombardowani przez swoich „oponentów” narzekaniami na niemal wszystkie (w dodatku pomnożone przez siebie) wady JavaScriptu i kodu opartego o divy. Back-endowi zarzuca się z reguły to, dlaczego na stronie jest X, a nie Y, zgodnie z wcześniejszymi umowami.  [...]]]></description>
			<content:encoded><![CDATA[<p>Przysłowiowa współpraca front-endu z back-endem nie zawsze jest usłana różami. Programiści z pierwszej frakcji są najczęściej bombardowani przez swoich „oponentów” narzekaniami na niemal wszystkie (w dodatku pomnożone przez siebie) wady JavaScriptu i kodu opartego o divy. Back-endowi zarzuca się z reguły to, dlaczego na stronie jest X, a nie Y, zgodnie z wcześniejszymi umowami.  Abstrahując od celowej hiperbolizacji, warto tak naprawdę zastanowić się, czy między wierszami nie przemknęło nam czasem maleńkie ziarenko prawdy. Mianowicie, czy JavaScript, CSS i XHTML noszą na swoich plecach pokaźny garb wyraźnych niedociągnięć i problemów, które programistę server-side po prostu irytują i przyprawiają o śmiech politowania?<span id="more-173"></span> </p>
<h3>Jawa czy sen?</h3>
<p>By podejść do tematu z lepszej strony, zobaczmy, jak (w dużym uproszczeniu) wygląda development w JAVA. Mamy kompilator. Mawia się, że najpierw był kompilator, a dopiero potem wszystko inne. Tak naprawdę jednak jest to wręcz niebagatelne przyspieszenie pracy. Większość błędów programisty wykrywa właśnie on, dlatego na ewentualny debug kodu poświęca się naprawdę mało czasu. Aplikacje po prostu działają.</p>
<p>Z kolei system wyjątków pomoże nam w tym, czego nie zrobi kompilator Możemy z łatwością wyłapać niestandardowe zachowania programu i stosownie je obsłużyć. Całość dopełnia fakt, że JAVA jest w pełni obiektowym językiem – rzadko zdarza się (wcale?), że kod napisany w jednym miejscu, nadpisuje inny. Hermetyzacja robi swoje.</p>
<p>Do skutecznego i łatwego deploymentu, szybkiego uruchamiania projektów, czy po prostu  utrzymywania ich mamy takie narzędzia, jak choćby Maven, Ant , czy Log4J.</p>
<h3>Domek z kart</h3>
<p>Jeśli chodzi o CSS i XHTML, wspierane przez JavaScript, można odnieść wrażenie, że to klocki, z których możemy coś poskładać, aczkolwiek nie możemy być pewni, czy w przyszłości nie trafi się element, który zburzy nam mozolnie tworzoną budowlę.</p>
<p>O ile CSS i XHTML współpracują ze sobą dość dobrze, tak JavaScript sprawia wrażenie przyszywanego wujka. Przede wszystkim, w JS pokutuje prawie to samo, co w PHP – naciągana obiektowość. Teoretycznie JavaScript jest obiektowy, ale by osiągnąć dziedziczenie, czy też ścisłą kontrolę dostępu trzeba postarać się o naprawdę wymyślny kawałek kodu, który w znacznej mierze trąci zawodami w hakowaniu, bądź konkursem na długość przyrodzenia. Dość powiedzieć, że dziedziczenie można uzyskać niejedną metodą, a każda różni się dość znacznie od poprzedniczki. Mawiają, że z gówna bata nie ukręcisz, jednak w JavaScript udaje się to bez problemów. Nie będę nawet wspominał o tym, że deklaracja klasy odbywa się poprzez <em>function</em>.</p>
<p>„Skopaną” konstrukcję poznajemy po tym, że wystarczy uszkodzić jeden element, by całość legła w gruzach w mgnieniu oka. Podobnie jest z JS. Niedostatki obiektowości powodują, że nie mamy choćby kontroli typów, przez co mnożą się instrukcje warunkowe, wspomagane przez typeof. </p>
<h3>Kompilator</h3>
<p>Za kompilator robią tutaj z reguły konsola błędów oraz narzędzia typu Firebug. Co to jednak za pomoc, skoro w gruncie rzeczy sami musimy analizować kod i czaić się na potencjalne błędy, używając call stacków (polskie „czujki”).</p>
<p>Pierwszy z brzegu przykład:</p>
<ul>
<li><span class="f">JAVA</span>:</p>
<pre><code>String foo = "string";
int bar = 0;
bar = foo+10;</code></pre>
</li>
<li>
<span class="f">JavaScript</span>:</p>
<pre><code>var foo = "string";
var bar = 0;
bar = foo+10;
alert(bar); // daje "string10"</code></pre>
</li>
</ul>
<p>W  pierwszym wypadku kompilator JAVA zgłosi niezgodność typów. Natomiast JavaScript z łatwością przepuści taką operację. To tylko wierzchołek góry lodowej problemów, z którymi stykamy się na co dzień. Zapewne większość z Was nieraz wyrywała sobie włosy z głowy, przytłoczona poszukiwaniami pod tytułem &#8220;<em>gdzie to cholerstwo schowało się w IE</em>&#8221; lub &#8220;<em>dlaczego pod Fx jest <em>null</em>, a gdzie indziej, powiedzmy, 31137</em>&#8220;. Można rzec, że taka jest już cecha języków skryptowych – ewentualne błędy wychwycić można dopiero po uruchomieniu całego programu. Programiści najbardziej chwalą je ze względu na szybkość. W przypadku JavaScript nie jest to najtrafniejszy argument – już 300 tysięcy iteracji potrafi zawiesić przeglądarkę.</p>
<p>Istotną wadą JS jest jego permanentna zależność od czynników zewnętrznych. Jesteśmy narażeni na skutki niepoprawnej implementacji ECMAScript (i DOM) przez przeglądarki, a następnie na przydział zasobów systemowych dla nich.</p>
<p>Mimo że w JavaScript można zrobić naprawdę wielkie rzeczy, to język przypomina raczej prototyp niż finalną wersję. Razi też jego mała integracja z HTML (XML) jako takim. W końcu JavaScript to interpretacja ECMAScriptu w założeniach ściśle związana z webem. Dlaczego przeglądarka dopuszcza <span class="f">document.getElementById(&#8216;foobar&#8217;)</span>, kiedy w dokumencie nie ma żadnego elementu o takim identyfikatorze? W gruncie rzeczy, powinniśmy być ostrzegani przed taką ewentualnością. W jaki sposób?</p>
<p>Kłania się potrzeba kompilatora lub czegoś w tym rodzaju. Najlepiej byłoby, gdyby tłumaczył on kod JS na inny, ściśle znany tylko przeglądarce. Tylko skompilowany program mógłby zostać użyty na stronach internetowych. W innym wypadku, dołączenie plików &#8220;przypominających&#8221; poprawny JS byłoby niemożliwe.</p>
<p>Na pewno uniknęlibyśmy wielu błędów. Z pewnością devlopment zostałby również przyspieszony. Podejrzewam też, że szybkość wykonania programów w JS (bo już nie skryptów) byłaby o wiele większa, niż jest ona obecnie. Z drugiej strony, kod zostałby zamknięty na zewnątrz. </p>
<h3>Standaryzacja!</h3>
<p>By sen się ziścił, potrzeba klarownych reguł języka. JavaScript musi stać się w pełni obiektowy. Również relacje z HTML powinny być o wiele bardziej zacieśnione. Nie ukrywajmy tego, skoro w JavaScript istnieje obsługa DOM, dlaczego jeszcze bardziej nie popchnąć języka w tę stronę? Przecież większość skryptów odnosi się do struktury dokumentów HTML!</p>
<p><a href="http://ferrante.pl/2007/12/27/o-frameworkach-i-javascript-slow-kilka/">Pisałem</a> to już jakiś czas temu, napiszę jeszcze raz:</p>
<blockquote><p> Ta jedyna w swoim rodzaju zależność języka od czynników zewnętrznych (przeglądarki) skazuje JavaScript na dość powolny i niejednostajny rozwój. Pozornie specyfikacja jest taka sama dla wszystkich, jednak szybkość działania diametralnie różna</p></blockquote>
<h3>JavaScript 2</h3>
<p>Sytuację próbuje ratować JavaScript 2, bazujący na ECMAScript 4. Pojawiają się deklaracje klas, typizacja, specyfikatory dostępu i wszystko inne, czego dobry programista mógłby sobie zażyczyć. Niestety, i tutaj musiała znaleźć się łyżka dziegciu. JavaScript 2 ze względu na taką, a nie inną obiektowość, jest praktycznie niekompatybilny wstecz. Biorąc pod uwagę miażdżącą popularność JS 1.* w internecie, nie wyobrażam sobie wejścia na rynek JS 2 bez zgodności wstecznej. Na to z kolei dość krzywym okiem spoglądają producenci przeglądarek. </p>
<p>Mamy tutaj dwa wyjścia – wprowadzić JS2 ze wsteczną kompatybilnością lub bez niej. Pierwsze wyjście może przypominać analogiczną sytuację z PHP4 i PHP5 – było niby świeżutkie i piękne PHP5, jednak proces migracji na nową platformę trwał latami. Boje się, że w przypadku JavaScriptu będzie podobnie – po co uczyć się nowej składni (a propos składni, wkrótce postaram się omówić nowe elementy JavaScript 2), skoro stara jest prosta i, co najważniejsze, działa?</p>
<h3>Rewolucja pożera własne dzieci</h3>
<p>Powyższa sytuacja obrazuje tak naprawdę, gdzie stoi dziś programowanie front-endu, a gdzie może być w przyszłości. Prawdopodobnie pomiędzy drugą a trzecią literką słowa web 2.0 zatraciliśmy, nie ukrywajmy, zdroworozsądkowy krytycyzm. Tworzymy standardy, propagujemy semantyczną sieć, jednak wydaje się, że reformować system powinniśmy od korzeni. Po co tworzyć 100 standardów, z których każdy mówi o zupełnie innym zagadnieniu. Robimy strony, używając w większości tych samych technologii – dlaczego z każdym rokiem nie konsolidujemy ich ze sobą, a wymyślamy ich nowe, niezależne definicje, które powodują 100 razy więcej problemów?</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/03/05/setki-standardow-tysiace-problemow-i-tylko-jeden-javascript/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Obiektowy CSS &#8211; wolne żarty!</title>
		<link>http://ferrante.pl/2009/03/01/obiektowy-css-wolne-zarty/</link>
		<comments>http://ferrante.pl/2009/03/01/obiektowy-css-wolne-zarty/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 14:02:11 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=128</guid>
		<description><![CDATA[CSS jest wręcz niewdzięczny dla developerów &#8211; potrafi dużo, jednocześnie oferując nam tak niewiele. Od kilku lat istnieją dość nieudane próby zrobienia ze stylami czegoś więcej &#8211; powstają koncepcje frameworków, siatek i innych udziwnień, mających wnieść coś do świata kaskadowych arkuszów stylów. Tym razem niejaka Nicole Sullivan &#8220;z Denver, Colorado&#8221; postanowiła wprowadzić w obieg pojęcie [...]]]></description>
			<content:encoded><![CDATA[<p>CSS jest wręcz niewdzięczny dla developerów &#8211; potrafi dużo, jednocześnie oferując nam tak niewiele. Od kilku lat istnieją dość nieudane próby zrobienia ze stylami czegoś więcej &#8211; powstają koncepcje <a href="http://en.wikipedia.org/wiki/CSS_framework#Criticism">frameworków</a>, <a href="http://960.gs/">siatek</a> i innych udziwnień, mających wnieść coś do świata kaskadowych arkuszów stylów. Tym razem niejaka <a href="http://wiki.github.com/stubbornella/oocss">Nicole Sullivan</a> &#8220;z Denver, Colorado&#8221; postanowiła wprowadzić w obieg pojęcie obiektowo zorientowanego CSS. Brzmi co najmniej tak abstrakcyjnie, jak wskaźniki w PHP albo Wojciech Olejniczak w PiS.<span id="more-128"></span></p>
<p>Już na samym wstępnie trzeba zaznaczyć, że rewolucji nie ma. Postanowiono podeprzeć się chwytliwymi terminami, które ze stanem rzeczywistym mają naprawdę mało wspólnego. Otóż Pani Sullivan oparła swój manifest OOCSS na dwóch tezach:</p>
<ul>
<li>Oddzielmy strukturę od wyglądu</li>
<li>Oddzielmy layout (kontenery) od treści</li>
</ul>
<div style="width:425px;margin: auto;text-align:center" id="__ss_990405"><a href="http://www.slideshare.net/stubbornella/object-oriented-css?type=powerpoint" title="Object Oriented CSS">Object Oriented CSS</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=oocss-1233786987806904-3&#038;stripped_title=object-oriented-css" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=oocss-1233786987806904-3&#038;stripped_title=object-oriented-css" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>Pozwolę sobie przetłumaczyć część pobudek, którymi kierowała się autorka, wymyślając OOCSS:</p>
<blockquote><p>
By zobrazować moją tezę piszę odpowiedniego frameworka, przede wszystkim jednak OOCSS jest zupełnie innym podejściem do CSS i kaskadowości. Bazuje na tradycyjnych dogmatach programowania, takich jak rozszerzalność obiektów, modułowość i przewidywalność kodu. Zaproponowane rozwiązania ocenione zostały przez pryzmat ich złożoności, innymi słowy: „co stanie się z wielkością Twojego CSS po dodaniu nowych stron i modułów?”.</p>
<p>Odpowiedzią na to pytanie jest dla wielu stron wymykający się spod kontroli rozrost kodu (spaghetti code), powodujący problemy z jego utrzymaniem. Ludzie często  narzekają na CSS i słusznie – mimo że często jest to zwykłe pieniactwo, rozumiem ich frustracje.</p>
<p>Obecne metody pisania CSS wymagają od developera dużej wiedzy. By mianować się ekspertem CSS, trzeba spędzić wiele lat na kodowaniu. Nim nasz kod stanie się użyteczny, musimy okupić to nauką na własnych błędach. Proces developmentu we front-endzie skupia w sobie specjalistów na wielu poziomach wiedzy i obowiązków, mimo to nasze strony są niczym kolos na glinianych nogach. Możesz mieć świetnie dopracowaną dostępność, czy bezbłędny kod, ale kiedy dosiada się do niego ktoś zupełnie z zewnątrz, wszystko pada na łeb i szyję. Kod powinien być na tyle solidny, by nawet osoba nie znająca tajników CSS mogła w nim odnaleźć się bez problemów i złowieszczego wpływu na standardy kodowania, które przyjęliśmy wcześniej.</p></blockquote>
<p>I tak, powstało 10 dobrych praktyk:</p>
<ul>
<li>twórz reużywalne komponenty</li>
<li>używaj konsekwentnie stylów w zależności od semantyki – nie rób na jednej stronie nagłówka pierwszego stopnia, który raz jest zielony i 12-pikselowy, a raz niebieski i 15-pikselowy</li>
<li>używaj zrozumiałych nazw dla innych</li>
<li>bądź elastyczny</li>
<li>naucz sie kochać siatki</li>
<li>nie nadużywaj zbędnych selektorów</li>
<li>oddziel wygląd od struktury kodu</li>
<li>oddziel layout od treści</li>
<li>rozszerzaj style elementów poprzez nadawanie im kolejnych klas</li>
<li>Używaj resetów CSS z Yahoo UI</li>
</ul>
<p>Mamy również 9 zagrożeń, których powinniśmy unikać jak ognia:</p>
<ul>
<li>style zależne od lokalizacji</li>
<li>łączenie stylów z konkretnymi tagami np. <span class=”c”>div.someClass {}</span></li>
<li>łączenie stylów z konkretnymi identyfikatorami np. <span class=”c”>#someID {}</li>
<li>umieszczanie cieni i zaokrąglonych rogów na różnorodnych tłach</li>
<li>nadużywanie metody sprite dla obrazków (chyba ze mamy bardzo mało stron w projekcie)</li>
<li>dostosowywanie wysokości</li>
<li>używanie obrazków zamiast tekstów</li>
<li>nadmierna ilość kodu</li>
<li>pochopna optymalizacja</li>
</ul>
<p>Bazując m.in. na nich, Nicole <a href="http://wiki.github.com/stubbornella/oocss">opublikowała framework CSS</a>, opierający się na rozszerzalnych gridach oraz rozdzieleniu layoutu od treści i wyglądu od struktury kodu. Mamy więc stosowne <span class="f">grids.css</span>, <span class="f">content.css</span> i <span class="f">libraries.css</span> (reset). Według frameworka OOCSS można stworzyć np. taki kod:</p>
<pre><code>&lt;div class=”line”&gt;
	&lt;div class=”unit size1of2 rss”&gt; &lt;/div&gt;
	&lt;div class=”unit size1of2 gmail lastUnit”&gt; &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>który da nam jeden poziomy kontener (<span class="f">class=&#8221;line&#8221;</span>),a w nim dwie sąsiadujące kolumny, mające 50% całej szerokości rodzica (<span class="f">size1of2</span>). Mniej więcej na tej podstawie, autorka zaleca budowanie naszych stron – dzięki reużywalnym komponentom, takim jak choćby te zaprezentowane wyżej, powinniśmy budować wszystkie kontenery – w imię zasady, że większość z nich ma wspólne cechy. Zaleca się więc, by to kontenery (grids) definiowały szerokość, a zawarte w nich elementy contentu –  wysokość (paddingi, marginesy, heighty). Do tego dochodzi customizacja przez dodawanie nowych klas do tagów, jeśli standardowy package jest niewystarczający. W gruncie rzeczy dobry pomysł – nie musimy przecież sugerować się zaproponowanymi przez autorkę szerokościami, wyglądem i czymkolwiek innym – framework ten ma ukazać, jak można wdrożyć w życie koncept OOCSS.</p>
<p>Trzeba uczciwie przyznać, że większość powyższych tez istnieje w świadomości koderów od kilku dobrych lat. Mimo to tylko nieliczni developerzy używają łatwych w utrzymaniu technik CSS. O ile więc nazywanie czegoś mianem „OOCSS” jest raczej żartobliwe w kontekście tego, co ten termin definiuje (przerost formy nad treścią!), tak nazwa ta swoimi gabarytami niepokojąco sugeruje, że należałoby rozważyć problemy, którym OOCSS stara się postawić.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/03/01/obiektowy-css-wolne-zarty/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
