<?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>tsevdos.com &#187; css</title>
	<atom:link href="http://www.tsevdos.com/category/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tsevdos.com</link>
	<description>Web design, internet news and blogging tips</description>
	<lastBuildDate>Wed, 11 Jan 2012 13:46:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Front-end development: Libraries, frameworks και άλλα εργαλεία</title>
		<link>http://www.tsevdos.com/2011/07/26/front-end-development-libraries-frameworks-and-other-tools/</link>
		<comments>http://www.tsevdos.com/2011/07/26/front-end-development-libraries-frameworks-and-other-tools/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 07:22:20 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[blueprint]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[html5shiv]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[modernizr]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[queries]]></category>
		<category><![CDATA[respond.js]]></category>
		<category><![CDATA[selectivizr]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=864</guid>
		<description><![CDATA[H εποχή που με έναν απλό και ταπεινό text editor ξεκινάγαμε να γράφουμε από την αρχή τα πάντα έχει τελειώσει εδώ και πολύ καιρό. Πλέον για την δημιουργία ακόμα και του πιο απλού HTML template είναι σχεδόν υποχρεωτικό να χρησιμοποιήσουμε τουλάχιστον ένα CSS-reset καθώς και αρκετά javascript files, έτσι ώστε να προσθέσουμε συμβατότητα σε παλιότερους browsers, να ελέγξουμε τι [...]]]></description>
			<content:encoded><![CDATA[<p>H εποχή που με έναν απλό και ταπεινό text editor ξεκινάγαμε να γράφουμε από την αρχή τα πάντα έχει τελειώσει εδώ και πολύ καιρό. Πλέον για την δημιουργία ακόμα και του πιο απλού HTML template είναι σχεδόν υποχρεωτικό να χρησιμοποιήσουμε τουλάχιστον ένα CSS-reset καθώς και αρκετά javascript files, έτσι ώστε να προσθέσουμε συμβατότητα σε παλιότερους browsers, να ελέγξουμε τι υποστηρίζει ο κάθε browser κτλ κτλ. Παρακάτω περιγράφω τι διαδικασία, και φυσικά τα εργαλεία, libraries, scripts και snippets που χρησιμοποιώ σχεδόν σε κάθε νέο project, από το πιο μικρό μέχρι το πιο μεγάλο&#8230;</p>
<h2>Markup</h2>
<p>Ίσως το πιο εύκολο κομμάτι του puzzle. Μέχρι και πέρσι, συνήθως χρησιμοποιούσα ένα δικό μου template (βασισμένο σε <strong>Strict XHTML</strong>), ωστόσο μιας και προσπαθώ να το γυρίσω σε <strong>HTML5</strong>, πιάνω τον εαυτό μου να χρησιμοποιεί όλο και πιο συχνά το <strong><a title="HTML5 Boilerplate" href="http://html5boilerplate.com/">HTML5 boilerplate</a></strong> του <a title="Paul Irish" href="http://paulirish.com/">Paul Irish</a>. Το μόνο κακό που του βρίσκω είναι πως δεν μου φαίνεται και τόσο &#8220;boilerplate&#8221;, και συνήθως μου παίρνει αρκετή ώρα στο να διαγράφω αρχεία και κώδικα έτσι ώστε να το φέρω στα μέτρα μου. Σιγά-σιγά θέλω να φτιάξω και την <a title="A really simple HTML5 template from Phrappe.com" href="http://phrappe.com/markup/a-really-simple-html5-template/">δική μου λύση</a>, ωστόσο μέχρι τότε το HTML5 boilerplate κάνει μια χαρά την δουλειά του.</p>
<h2>CSS</h2>
<p>Το πρώτο πράγμα που χρειάζομαι είναι ένα καλό <strong>CSS-reset</strong>. Αν η markup μου είναι <strong>HTML5</strong>, χρησιμοποιώ το <a title="HTML5 CSS reset" href="http://html5doctor.com/html-5-reset-stylesheet/"><strong>HTML5 reset</strong> του HTML5 Doctor</a>, αν όχι χρησιμοποιώ το παλιό καλό <strong><a title="CSS reset" href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">HTML reset</a></strong> του <a title="Eric Meyer" href="http://meyerweb.com">Eric Meyer</a> . Πολλές φορές αν το project &#8220;βιάζεται&#8221;, χρησιμοποιώ και σαν βάση την τυπογραφία κάποιου έτοιμου <strong>CSS framework</strong>, συνήθως του <strong><a title="Blueprint CSS framework" href="http://www.blueprintcss.org/">Blueprint</a></strong> ή του <a title="HTML5 Boilerplate" href="http://html5boilerplate.com/">HTML5 boilerplate</a>. Τέλος, αν το project βιάζεται απελπιστικά ή θέλω κάποιο γρήγορο prototype εδώ και τώρα, χρησιμοποιώ και το grid system του <a title="Blueprint CSS framework" href="http://www.blueprintcss.org/">Blueprint</a> (είναι και το μόνο που έχω μάθει!). Τέλος, συνήθως περνάω και τα <strong><a title="Hardboiled CSS3 Media Queries" href="http://www.stuffandnonsense.co.uk/blog/about/hardboiled_css3_media_queries/">media queries</a></strong> του <a title="Andy Clarke" href="http://stuffandnonsense.co.uk/">Andy Clarke</a> αλλά και ένα <strong>print-only style</strong> που περιέχει όλη την βασική τυπογραφία για εκτύπωση, για να υπάρχουν (αργά ή γρήγορα θα χρειαστούν)&#8230;</p>
<h2>Javascript</h2>
<p>Και εφόσον κλείσαμε από markup και CSS το μόνο που μας μένει είναι η <strong>Javascript</strong> μας. Εάν το project έχει <strong>HTML5 markup</strong>, το <strong><a title="HTML5 shiv" href="http://code.google.com/p/html5shiv/">html5shiv</a></strong> είναι το πρώτο &#8220;must&#8221; script που πρέπει να φορτώσουμε. Από εκεί και πέρα συνήθως περνάω το <strong><a title="Μodernizr" href="http://www.modernizr.com/">modernizr</a></strong> και το <strong><a title="jQuery" href="http://jquery.com/">jQuery</a></strong> γιατί όλο και κάπου θα χρειαστούν. Τώρα τελευταία μου αρέσει πολύ σαν ιδέα και το <strong><a title="Selectivizr" href="http://selectivizr.com/">selectivizr</a></strong> μιας και σε βοηθάει πολύ στο να κρατάς την markup σου ακόμα πιο καθαρή, ωστόσο μπορώ να ζήσω και χωρίς αυτό. Τέλος, υπάρχει πιθανότητα (πάντα ανάλογα το project και εάν ο πελάτης είναι περίεργος/φανατικός χρήστης IE) να χρησιμοποιήσω και το <strong><a title="Respond.js: Fast CSS3 Media Queries for Internet Explorer 6-8 and more" href="http://filamentgroup.com/lab/respondjs_fast_css3_media_queries_for_internet_explorer_6_8_and_more/">Respond.js</a></strong>, έτσι ώστε τα <strong>media queries</strong> να παίζουν και σε IE 6-7-8&#8230;</p>
<p>Αυτά τα λίγα σχετικά με το front-end κομμάτι των site. Όπως καταλαβαίνεται, ακόμα και μικρά projects μπορεί να θέλουν όλα τα παραπάνω και ακόμα περισσότερα για να στηθούν και να λειτουργήσουν όπως πρέπει. Τέλος αν κάποιος χρησιμοποιεί φανατικά κάποιο εργαλείο/library που δεν αναφέρω παραπάνω, ας αφήσει ένα σχόλιο έτσι ώστε το τεστάρουμε και εμείς&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2011/07/26/front-end-development-libraries-frameworks-and-other-tools/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSS3 και βοηθητικά εργαλεία&#8230;</title>
		<link>http://www.tsevdos.com/2011/05/19/css3-online-tools/</link>
		<comments>http://www.tsevdos.com/2011/05/19/css3-online-tools/#comments</comments>
		<pubDate>Fri, 20 May 2011 06:38:40 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[freebies]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=832</guid>
		<description><![CDATA[Δεν υπάρχει πιο καλή περίοδος από αυτήν για να αρχίσουμε σιγά-σιγά να χρησιμοποιούμε όλο και περισσότερους CSS3 κανόνες. Οι καινούργιοι browsers είναι αρκετά ώριμοι για κάτι τέτοιο, οι mobile  browsers βρίσκονται σε εξίσου υψηλό επίπεδο, ενώ στους παλιότερους δεν πρόκειται να χαλάσει τίποτα, απλά δεν θα “βλέπουν” τα καινούργια καλούδια (δεν πρόκειται να χαλάσει κάτι). [...]]]></description>
			<content:encoded><![CDATA[<p>Δεν υπάρχει πιο καλή περίοδος από αυτήν για να αρχίσουμε σιγά-σιγά να χρησιμοποιούμε όλο και περισσότερους CSS3 κανόνες. Οι καινούργιοι browsers είναι αρκετά ώριμοι για κάτι τέτοιο, οι mobile  browsers βρίσκονται σε εξίσου υψηλό επίπεδο, ενώ στους παλιότερους δεν πρόκειται να χαλάσει τίποτα, απλά δεν θα “βλέπουν” τα καινούργια καλούδια (δεν πρόκειται να χαλάσει κάτι).</p>
<p>Το μόνο αρνητικό στην παραπάνω υπόθεση είναι πως στις περισσότερες περιπτώσεις είτε το συντακτικό είναι κάπως δύσκολο στην εκμάθηση (κάθε αρχή και δύσκολη), είτε χρησιμοποιούνται διάφορα browser prefixes για να λειτουργήσουν σωστά, είτε οι κανόνες είναι αρκετά “visual”, οπότε θέλουμε να βλέπουμε άμεσα στον browser το αποτέλεσμα, και όχι να προσπαθούμε να μαντεύουμε τις ρυθμίσεις.</p>
<p>Παρακάτω έχω μαζέψει κάποια online εργαλεία που χρησιμοποιώ για την γρήγορη επίλυση των παραπάνω περιπτώσεων. Έχουμε και λέμε λοιπόν :</p>
<ul>
<li><strong><a title="CSS3 Please!" href="http://css3please.com/" target="_blank">CSS3 Please!</a></strong> : Ένα απλό αλλά πολύ περιεκτικό site για να αντιγράψετε εύκολα και γρήγορα τους CSS3 κανόνες που θέλετε (μαζί με όλα τα browser prefixes). Γρήγορο, minimal και &#8220;to the point&#8221;. Είναι συνήθως ο πρώτος μου σταθμός όταν ψάχνω κάποιο prefix για CSS3 κανόνα.</li>
<li><strong><a title="CSS3 Generator" href="http://css3generator.com/" target="_blank">CSS3 Generator</a></strong> : Εξίσου καλό εργαλείο, ωστόσο μερικές φορές πρέπει να κάνεις κάποια click παραπάνω για να πάρεις αυτό που θέλεις&#8230;</li>
<li><strong><a title="Font Squirrel" href="http://www.fontsquirrel.com/fontface/generator" target="_blank">Font Squirrel</a></strong> : Απλά το καλύτερο εργαλείο για μετατροπή γραμματοσειρών σε web fonts (<code>@font-face</code>). Δεν έχω χρησιμοποιήσει ποτέ μου άλλο εργαλείο γι&#8217; αυτήν την δουλειά.</li>
<li><strong><a title="Layer Styles" href="http://www.layerstyles.org/builder.html" target="_blank">Layer Style</a></strong> : Ένα πολύ-εργαλείο που προσφέρει γραφικό περιβάλλον (σε στυλ “Photoshop”) για την δημιουργία των κανόνων μας, αλλά και live preview! Πολύ έξυπνη ιδέα και υλοποίηση, που θα βοηθήσει πολλούς γραφίστες και όχι μόνο&#8230;</li>
<li><strong><a title="Drop Shadow Generator" href="http://www.wordpressthemeshock.com/css-drop-shadow/" target="_blank">Drop Shadow Generator</a></strong> : Πιο εξειδικευμένο στις σκιές, ωστόσο τα έτοιμα presets του είναι φανταστικά, ενώ μπορείτε να δείτε και σε live preview το πως θα φαίνεται η σκιά σας. Προσωπικά το χρησιμοποιώ συχνά γιατί δεν μπορώ να προβλέψω με τίποτα το πως θα φαίνονται οι σκιές στον browser!</li>
</ul>
<p>Έχετε να προσθέσετε κάποιο άλλο εργαλείο, τότε απλά αφήστε ένα comment <img src='http://www.tsevdos.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Update</strong> : Προσθέτω ακόμα 2 πολύ καλά εργαλεία που συστήνει ο φίλος μου <a title="Porcupine.gr" href="http://el.porcupine.gr/" target="_blank">Γιάννης</a>.</p>
<ul>
<li><strong><a title="CSS3 Maker" href="http://www.css3maker.com/" target="_blank">CSS3.0 Maker</a></strong> : Μια λύση &#8220;όλα σε ένα&#8221;, μιας και δημιουργεί κώδικα για τα πάντα, από <code>border-radius</code> μέχρι <code>CSS animations</code>. Μου αρέσει γιατί δείχνει και ποιοι browsers υποστηρίζουν τους CSS3 κανόνες.</li>
<li><strong><a title="Ultimate CSS Gradient Generator" href="http://www.colorzilla.com/gradient-editor/" target="_blank">Ultimate CSS Gradient Generator</a></strong> : Πολύ καλό εργαλείο για την δημιουργία gradients με πολλά presets και εύκολο UI.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2011/05/19/css3-online-tools/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CSS : Κληρονομικότητα (inheritance) και cascade</title>
		<link>http://www.tsevdos.com/2010/11/08/css-inheritance-and-cascade/</link>
		<comments>http://www.tsevdos.com/2010/11/08/css-inheritance-and-cascade/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 07:54:38 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[cascade]]></category>
		<category><![CDATA[css importance]]></category>
		<category><![CDATA[css specificity]]></category>
		<category><![CDATA[inheritance]]></category>
		<category><![CDATA[specificity]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=711</guid>
		<description><![CDATA[Εάν θα μπορούσα να δηλώσω expert σε κάτι, αυτό θα ήταν σίγουρα το CSS. Δουλεύω με αυτό από την πρώτη του version και γενικά είναι μέρος της καθημερινότητας μου. Έχω γράψει άπειρες γραμμές σε πολύ μεγάλα αλλά και πολύ μικρά sites, και με ενθουσιάζει το γεγονός πως ένα τόσο φαινομενικά απλό πρότυπο, ζωντανεύει την markup [...]]]></description>
			<content:encoded><![CDATA[<p>Εάν θα μπορούσα να δηλώσω expert σε κάτι, αυτό θα ήταν σίγουρα το <strong>CSS</strong>. Δουλεύω με αυτό από την πρώτη του version και γενικά είναι μέρος της καθημερινότητας μου. Έχω γράψει άπειρες γραμμές σε πολύ μεγάλα αλλά και πολύ μικρά sites, και με ενθουσιάζει το γεγονός πως ένα τόσο φαινομενικά απλό πρότυπο, ζωντανεύει την markup μας. Στην προηγούμενη πρόταση γράφω “φαινομενικά απλό” γιατί το “γράφω CSS” από το “γνωρίζω CSS” έχει τεράστια διαφορά. Ένας γνώστης μπορεί να γράψει μέσα σε ελάχιστες γραμμές, αυτό που κάποιος newbie γράφει και ξαναγράφει! Το όλο μυστικό κρύβεται σε 2 χαρακτηριστικά του CSS που θέλουν λίγο χρόνο για να εξοικειωθείτε, η <strong>κληρονομικότητα (inheritance)</strong> και το <strong>cascade</strong>.</p>
<p>Στο παρακάτω αρθράκι λοιπόν, θα προσπαθήσω να εξηγήσω όσο καλύτερα γίνεται αυτά τα δύο χαρακτηριστικά του CSS, τα οποία ποτέ δεν μου εξήγησε κανείς και τελικά τα έμαθα με τον δύσκολο τρόπο (hard way που λένε και οι Εγγλέζοι). Το περίεργο είναι πως και ολόκληρα βιβλία αφιερωμένα στο θέμα, αποφεύγουν να τα εξηγήσουν αναλυτικά &#8211; μάλλον δεν θέλουν να γίνουν όλοι experts <img src='http://www.tsevdos.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Ας ξεκινήσουμε λοιπόν.</p>
<h2>Κληρονομικότητα (Inheritance)</h2>
<p>Γενικά δουλεύει όπως μπορείτε να φανταστείτε και όπως έχετε συνηθίσει και σε γλώσσες προγραμματισμού (αν έχετε ασχοληθεί τέλος πάντων). Είναι ο μηχανισμός με τον οποίο <strong>συγκεκριμένες ιδιότητες (properties)</strong> μεταφέρονται από το parent element στα “παιδιά” του. Είναι αρκετά εύκολο στην κατανόηση, και στην ουσία το μόνο πράγμα που προκαλεί μπέρδεμα είναι ποιες ιδιότητες (properties) κληρονομούνται τελικά, μιας και <strong>δεν κληρονομούνται όλες</strong>. Σε αυτόν τον <a title="Full property table" href="http://www.w3.org/TR/CSS21/propidx.html">πίνακα</a> (κοιτάξτε την 5η στήλη) μπορείτε να δείτε  ποιες από αυτές κληρονομούνται και ποιες όχι. Προσωπικά δεν τον θυμάμαι απέξω, άλλωστε δεν έχει και πολύ νόημα μιας και γιαυτό υπάρχουν οι DOM inspectros (όπως πχ. το <a title="Firebug" href="http://getfirebug.com/">firebug</a>), ωστόσο κρατήστε πως ότι έχει να κάνει με fonts κληρονομείτε (γι&#8217; αυτό και το declaration του font στο body είναι ο πιο σημαντικός CSS κανόνας ενός site).</p>
<h2>Cascade</h2>
<p>Η κληρονομικότητα όπως είδατε είναι αρκετά εύκολη στην κατανόηση. Ας εξηγήσουμε όμως και το Cascade το οποίο είναι κάπως πιο πολύπλοκο. Το Cascade (δεν νομίζω να μπορεί μεταφραστεί κάπως αξιόλογα στα ελληνικά) είναι ίσως το πιο δυσνόητο κομμάτι του CSS γιατί κρύβει αρκετή θεωρία από πίσω του, ωστόσο είναι και το πιο σημαντικό και γι αυτόν τον λόγο αποτελεί και την πρώτη λέξη του ακρώνυμου CSS (Cascading Style Sheets). To Casade λοιπόν αποτελείται από 3 βασικές έννοιες οι οποίες καθορίζουν πως το CSS θα εφαρμόσει τελικά τους κανόνες των style sheets μας. Οι 3 έννοιες είναι οι παρακάτω :</p>
<ul>
<li><strong>Importance (σπουδαιότητα)</strong></li>
<li><strong>Specificity (ειδικότητα)</strong></li>
<li><strong>Η σειρά που εμφανίζονται μέσα στον κώδικα</strong></li>
</ul>
<p>Και για να μην μπερδευτούμε ας τα πάρουμε ένα-ένα.</p>
<h3>Importance (Σπουδαιότητα)</h3>
<p>Η σπουδαιότητα έχει να κάνει με το που δηλώθηκε ο CSS κανόνας. Οι κανόνες που θα κάνουν conflict μεταξύ τους θα εφαρμοστούν με την παρακάτω σειρά, με τις νεότερες να υπερισχύσουν :</p>
<ol>
<li>User agent style sheets</li>
<li>Κανονικοί style sheet κανόνες συγγραφέα (author)</li>
<li>Κανονικοί style sheet κανόνες χρήστη (user)</li>
<li>Σημαντικοί style sheet κανόνες συγγραφέα (author)</li>
<li>Σημαντικοί style sheet κανόνες χρήστη (user)</li>
</ol>
<p>Αλλά ας εξηγήσουμε λίγο τι είναι τα παραπάνω style sheets και από που έρχονται!</p>
<p>Λέγοντας <strong>user agent style sheets</strong> εννοούμε όλα τα ενσωματωμένα (default) style sheet του browser (πχ. margin/padding σε headers, παραγράφους, λίστες, χρώματα link, κτλ.).</p>
<p><strong>Οι style sheet κανόνες συγγραφέα (author)</strong>, είναι τα κλασικά style sheets που γράφουν οι web designers του εκάστοτε site.</p>
<p><strong>Οι style sheet κανόνες χρήστη (user)</strong>, είναι κάποιοι ειδικοί κανόνες που μπορεί να θέσει ο ίδιος ο χρήστης. Οι περισσότεροι browsers δεν επιτρέπουν τέτοιου είδους κανόνες, ωστόσο πιο ειδικοί browsers (πχ. για δυσλεκτικούς ή screen readers οι οποίοι επιτρέπουν κυρίως <a title="Aural style sheets" href="http://www.w3.org/TR/CSS2/aural.html">aural style sheets</a>) δίνουν αρκετές επιλογές και δυνατότητες στον ίδιο χρήστη (και μάλιστα υπερτερούν!).</p>
<p>Τέλος, τα δύο τελευταία είδη style sheet, μπορούν να εφαρμοστούν είτε ως κανονικοί (normal) κανόνες, είτε ως σημαντικοί (important) κανόνες (πχ. <code>p { font-size: 1em <strong>!important</strong>;  }</code>), με τους δεύτερους να είναι ισχυρότεροι από τους πρώτους.</p>
<p>Γενικότερα εμείς που ασχολούμαστε με την κατασκευή web sites δεν έχουμε να κάνουμε και πολλά πράγματα με την σπουδαιότητα, γιατί πολύ απλά δεν είναι στο χέρι μας, ωστόσο θα πρέπει να έχουμε στο μυαλό μας τι style sheets δέχεται ένα document, τι είναι τα user agent style sheets, ή πως λειτουργεί ο <code>!important</code> κανόνας.</p>
<h3>Specificity (ειδικότητα)</h3>
<p>Η ειδικότητα είναι το πιο σημαντικό κομμάτι του cascade, και αυτό που πρέπει να κατανοήσει ο κάθε web designer. Ο γενικός κανόνας είναι σχετικά απλός, όσο πιο συγκεκριμένος (ειδικός) είναι o selector ενός κανόνα, ο συγκεκριμένος κανόνας υπερισχύει! Αν και είναι εύκολο και λογικό, κάποιος νέος στον χώρο μπορεί να χάσει πολύ εύκολα την μπάλα σε ένα πολύπλοκο έγγραφο (document), και να καταντήσει να γράφει ξανά και ξανά τα ίδια πράγματα.</p>
<p>Ο πιο συγκεκριμένος selector, ο οποίος αναιρεί όλους τους άλλους, αλλά <strong>δεν πρέπει να χρησιμοποιούμε ποτέ</strong>, είναι το <strong>style attribute</strong> σε οποιοδήποτε element. Δεν το χρησιμοποιούμε για να μην μπλέκουμε την markup με τα styles, και για πολλούς άλλους λόγους που έχουμε εξηγήσει σε άλλα posts. Από εκεί και πέρα έχουμε ένα περίεργο <strong>point system</strong> για το κάθε selector, το οποίο παίζει ως εξής:</p>
<ul>
<li>Το κάθε element (ή pseudo-element) που εμφανίζεται στον selector μας παίρνει 1 βαθμό</li>
<li>Η κάθε κλάση (class) που που εμφανίζεται στον selector μας παίρνει 10 βαθμούς</li>
<li>Το κάθε id που εμφανίζεται στον selector μας παίρνει 100 βαθμούς</li>
</ul>
<p>Εδώ μπορείτε να βρείτε και μια πιο <a title="CSS: Specificity Wars" href="http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html">χιουμοριστική εξήγηση</a> του point system που περιγράφω, ωστόσο με τα παρακάτω παραδείγματα του πίνακα, πιστεύω πως θα καταλάβετε καλύτερα το πως δουλεύει.</p>
<table>
<caption>Το Point system της ειδικότητας (specificity)</caption>
<thead>
<tr>
<th>Selector</th>
<th>id</th>
<th>class</th>
<th>element</th>
<th>Specificity</th>
</tr>
</thead>
<tbody>
<tr>
<td>p</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>001</td>
</tr>
<tr>
<td>.class</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>010</td>
</tr>
<tr>
<td>p.class</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>011</td>
</tr>
<tr>
<td>#id</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>100</td>
</tr>
<tr>
<td>#id .class</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>110</td>
</tr>
<tr>
<td>#id p.class</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>111</td>
</tr>
<tr>
<td>p a</td>
<td>0</td>
<td>0</td>
<td>1+1</td>
<td>002</td>
</tr>
<tr>
<td>.classa .classb</td>
<td>0</td>
<td>1+1</td>
<td>0</td>
<td>020</td>
</tr>
</tbody>
</table>
<p>Κάπως έτσι υπολογίζεται το specificity και ο selector με τον μεγαλύτερο αριθμό υπερτερεί.</p>
<h3>Η σειρά που εμφανίζονται μέσα στον κώδικα</h3>
<p>Τι γίνεται όμως όταν 2 κανόνες έχουν ακριβώς το ίδιο specifity; Για παράδειγμα :</p>
<pre name="code" class="js">
.nav a { color:green; }
.nav a { color:red; }
</pre>
<p>Και οι 2 παραπάνω selectors έχουν 011, ωστόσο όλοι οι browsers θα κάνουν rendering τα links με κόκκινο χρώμα για τον πολύ απλό λόγο πως ήταν ο πιο πρόσφατος κανόνας που συναντήθηκε. Το μόνο που πρέπει να έχουμε υπόψη μας εδώ είναι πως εάν έχουμε πολλά style sheets η σειρά που φορτώνονται έχει σημασία, οπότε το προσέχουμε και αυτό.</p>
<p>Αυτά τα λίγα για την κληρονομικότητα (inheritance) και το cascade. Ελπίζω να ξεκαθαρίσατε κάποια πράγματα που έχουν να κάνουν με την θεωρία που κρύβεται πίσω από το CSS, η οποία πολλές φορές δεν αναφέρεται και δεν εξηγείτε όπως θα έπρεπε.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2010/11/08/css-inheritance-and-cascade/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CSS3 και CSSS</title>
		<link>http://www.tsevdos.com/2010/11/01/css3-and-csss/</link>
		<comments>http://www.tsevdos.com/2010/11/01/css3-and-csss/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 09:16:00 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[csss]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=706</guid>
		<description><![CDATA[Δεν ξέρω πόσοι από εσάς το πείραν χαμπάρι, αλλά η &#8220;δική&#8221; μας Λία ήταν ομιλήτρια στο τελευταίο Front-Trends Conference, το οποίο έγινε στην Βαρσοβία. Περισσότερα για τo θέμα μπορείτε να διαβάσετε στο post της (πάντα στα αγγλικά), ωστόσο εάν ασχολείστε έστω και λίγο με το web &#8211; και για να διαβάζετε αυτό το blog μάλλον [...]]]></description>
			<content:encoded><![CDATA[<p>Δεν ξέρω πόσοι από εσάς το πείραν χαμπάρι, αλλά η &#8220;δική&#8221; μας <a title="Lea Verou" href="http://leaverou.me">Λία</a> ήταν ομιλήτρια στο τελευταίο <a title="Front-Trends Conference" href="http://front-trends.com/">Front-Trends Conference</a>, το οποίο έγινε στην Βαρσοβία. Περισσότερα για τo θέμα μπορείτε να διαβάσετε <a title="My FT2010 slides and CSSS: My presentation framework" href="http://leaverou.me/2010/10/my-ft2010-slides-and-csss-my-presentation-framework/">στο post της</a> (πάντα στα αγγλικά), ωστόσο εάν ασχολείστε έστω και λίγο με το web &#8211; και για να διαβάζετε αυτό το blog μάλλον ασχολείστε &#8211; πρέπει οπωσδήποτε να παρακολουθήσετε <a title="Lea's CSS3 presentation" href="http://leaverou.me/ft2010/#intro">την παρουσίαση της</a> ή ακόμα καλύτερα να την <a title="Download Lea's CSS3 presentation" href="http://leaverou.me/wp-content/uploads/2010/10/ft2010.zip">κατεβάσετε</a>! Προσωπικά πιστεύω πως είναι μια από τις καλύτερες και πιο επεξηγηματικές παρουσιάσεις για το τι είναι το <strong>CSS3</strong>, τι λύσεις δίνει και τι νέες δυνατότητες παρέχει σε όλους εμάς. Καιρό είχα να παρακολουθήσω μια τόσο καλοφτιαγμένη και δομημένη παρουσίαση, και για να πω την αλήθεια στεναχωρήθηκα που δεν κατάφερα να την δω live, ωστόσο ελπίζω ακόμα σε κάποιο video της παρουσίασης&#8230;</p>
<p>Πέρα από αυτό και για τις ανάγκες της ίδιας της παρουσίασης, η Λία δημιούργησε και το δικό της slideshow system το οποίο ακούει στο όνομα <a title="CSSS : CSS-based SlideShow System" href="http://leaverou.me/csss/sample-slideshow.html#intro">CSSS</a>. Όπως εύκολα καταλαβαίνει κάποιος στηρίζεται κυρίως σε <strong>CSS3</strong> χαρακτηριστικά (και Javascript φυσικά), ενώ μπορεί να το <a title="Download CSSS" href="http://github.com/LeaVerou/CSSS">κατεβάσει</a> και να το  χρησιμοποιήσει ο καθένας για τις παρουσιάσεις του (απορώ ποιοι χρησιμοποιούν ακόμα Powerpoint!). Και πάλι συγχαρητήρια και μακάρι να δούμε ανάλογου επιπέδου events και στην Ελλάδα (αν και το βλέπω πάρα πολύ δύσκολο)&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2010/11/01/css3-and-csss/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CSS selectors</title>
		<link>http://www.tsevdos.com/2009/09/09/css-seletcors/</link>
		<comments>http://www.tsevdos.com/2009/09/09/css-seletcors/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 06:14:17 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=493</guid>
		<description><![CDATA[Κατάφερα επιτέλους να τελειώσω μια σειρά άρθρων που είχα ξεκινήσει εδώ και καιρό, η οποία παρουσιάζει όλους τους CSS selectors! Τα άρθρα είναι γραμμένα στα ελληνικά και είναι λεπτομερέστατα (άνετα θα μπορούσαν να μπουν σε κάποιο βιβλίο στο κεφάλαιο selectors) οπότε όποιοι ενδιαφέρεστε για CSS απλά διαβάστε τα. Τα άρθρα μπορείτε να τα βρείτε στο CSS3.gr [...]]]></description>
			<content:encoded><![CDATA[<p>Κατάφερα επιτέλους να τελειώσω μια σειρά άρθρων που είχα ξεκινήσει εδώ και καιρό, η οποία παρουσιάζει <strong>όλους τους CSS selectors</strong>! Τα άρθρα είναι γραμμένα στα ελληνικά και είναι λεπτομερέστατα (άνετα θα μπορούσαν να μπουν σε κάποιο βιβλίο στο κεφάλαιο selectors) οπότε όποιοι ενδιαφέρεστε για CSS απλά διαβάστε τα. Τα άρθρα μπορείτε να τα βρείτε στο <strong><a title="CSS3.gr : Το ελληνικό CSS group" href="http://css3.gr/">CSS3.gr</a></strong> και πιο συγκεκριμένα :</p>
<ul>
<li><strong><a title="CSS selectors : Ότι πρέπει να ξέρετε! (μέρος 1ο - CSS 1)" href="http://css3.gr/articles/article/css-selectors-1-css-1/">CSS selectors : Ότι πρέπει να ξέρετε! (μέρος 1ο &#8211; CSS 1)</a></strong></li>
<li><strong><a title="http://css3.gr/articles/article/css-selectors-2-css-2/" href="http://css3.gr/articles/article/css-selectors-2-css-2/">CSS selectors: Ότι πρέπει να ξέρετε! (μέρος 2ο &#8211; CSS 2)</a></strong></li>
<li><strong><a title="CSS selectors : Ότι πρέπει να ξέρετε! (μέρος 3ο - CSS3)" href="http://css3.gr/articles/article/css-selectors-3-css-3/">CSS selectors : Ότι πρέπει να ξέρετε! (μέρος 3ο &#8211; CSS3)</a></strong></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2009/09/09/css-seletcors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS frameworks : Αξίζουν ή όχι</title>
		<link>http://www.tsevdos.com/2008/09/22/css-frameworks-good-or-evil/</link>
		<comments>http://www.tsevdos.com/2008/09/22/css-frameworks-good-or-evil/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 11:41:51 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[opinions]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[styles]]></category>
		<category><![CDATA[typography]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=76</guid>
		<description><![CDATA[Τώρα τελευταία τα CSS frameworks γίνονται όλο και περισσότερο της μόδας, με αρκετούς φανατικούς θαυμαστές αλλά και εξίσου φανατικούς επικριτές. Προσωπικά δεν είμαι και πολύ fun των περισσότερων framework (εξηγώ παρακάτω το γιατί), ωστόσο κατά καιρούς έχω χρησιμοποιήσει και μάλιστα με μεγάλη επιτυχία κάποια από αυτά. Στο παρακάτω αρθράκι λοιπόν, εξηγώ ποια ιδέα κρύβεται πίσω [...]]]></description>
			<content:encoded><![CDATA[<p>Τώρα τελευταία τα <a title="CSS frameworks in Wiki" href="http://en.wikipedia.org/wiki/CSS_framework">CSS frameworks</a> γίνονται όλο και περισσότερο της μόδας, με αρκετούς φανατικούς θαυμαστές αλλά και εξίσου φανατικούς επικριτές. Προσωπικά δεν είμαι και πολύ fun των περισσότερων framework (εξηγώ παρακάτω το γιατί), ωστόσο κατά καιρούς έχω χρησιμοποιήσει και μάλιστα με μεγάλη επιτυχία κάποια από αυτά. Στο παρακάτω αρθράκι λοιπόν, εξηγώ ποια ιδέα κρύβεται πίσω από τα framework, τα πλεονεκτήματα και μειονεκτήματα τους και τέλος ποια ξεχωρίζω και γιατί.</p>
<p>Η ιδέα πίσω από τα <a title="CSS frameworks in Wiki" href="http://en.wikipedia.org/wiki/CSS_framework">CSS frameworks</a> είναι πως σε κάθε site/project που αναλαμβάνουμε, χρησιμοποιούμε πολλά κοινά στοιχεία, όπως για παράδειγμα το κλασικό <a title="CSS reset file from Eric Meyer" href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">CSS reset file</a> (πάντα του <a title="Eric Meyer's blog" href="http://meyerweb.com/">Eric Meyer</a>), κάποια default styles για τα σημαντικότερα elements (όπως headings, tables, φόρμες κτλ.), κάποια styles μόνο για print, ενώ πολλοί πάνε τα πράγματα ακόμα παραπέρα, χρησιμοποιώντας styles για να καθορίσουν την διάταξη του site (columns και rows), να χρησιμοποιήσουν εφέ στις λίστες/μενού τους, και πολλά άλλα. Η ιδέα λοιπόν που κρύβεται πίσω από ένα framework είναι πολύ απλή. Γιατί να ξαναγράφουμε όλους αυτούς τους κανόνες και κώδικα από την αρχή για κάθε site, όταν μπορούμε να τα γράψουμε μόνο μία φορά και να τα χρησιμοποιούμε ξανά και ξανά σε όλα μας τα project? Με τον παραπάνω τρόπο, θα γλιτώνουμε πολύ κόπο και χρόνο!</p>
<p>Φυσικά τα πράγματα δεν είναι και τόσο ρόδινα όπως ακούγονται. Και εγώ χρησιμοποιώ επαναλαμβανόμενο CSS κώδικα στα site μου, όμως προσπαθώ να αποφεύγω τα έτοιμα <a title="CSS frameworks in Wiki" href="http://en.wikipedia.org/wiki/CSS_framework">CSS frameworks</a>, για τους παρακάτω λόγους :</p>
<ul>
<li>Σε αναγκάζουν να χρησιμοποιείς κάποιο συγκεκριμένο, και πολλές φορές όχι semantic και accessible, στυλ στην markup, τις κλάσεις και τα id σου (πχ. class=”div-xyz”).</li>
<li>Συνήθως χρειάζεσαι πολύ λιγότερα πράγματα απ&#8217; ότι σου προσφέρει ένα framework, με αποτέλεσμα να αναγκάζεις τον χρήστη να κατεβάζει άσκοπα κώδικα, που δεν χρησιμοποιεί!</li>
<li>Ακόμα και εάν είσαι έμπειρος στην CSS, αρκετά frameworks είναι πολύπλοκα στην εκμάθηση τους. Επίσης εάν δημιουργηθεί κάποιο πρόβλημα/bug είναι πολύ πιο δύσκολο να εντοπίσεις τι φταίει.</li>
</ul>
<p>Από εκεί και πέρα δέχομαι πως τα <a title="CSS frameworks in Wiki" href="http://en.wikipedia.org/wiki/CSS_framework">CSS frameworks</a> σου προσφέρουν αρκετά πράγματα σχετικά εύκολα και γρήγορα, μιας και δεν κάθεσαι να γράψεις από την αρχή όλους τους CSS κανόνες, ενώ τα περισσότερα υποστηρίζουν αμέσως τους περισσότερους browsers που υπάρχουν. Για όσους θέλουν να ρίξουν μια ματιά σε αυτά, η παρακάτω λίστα αναφέρει όλα τα frameworks που υπάρχουν διαθέσιμα αυτήν την στιγμή (αναφέρομαι στα γνωστά και αυτά που μπορεί να χρησιμοποιήσει κάποιος εδώ και τώρα, και όχι σε αυτά που είναι υπό development ή που βρίσκονται σε beta στάδιο).</p>
<ul>
<li><a title="Elements" href="http://elements.projectdesigns.org/">Elements</a></li>
<li><a title="YUI Grids CSS" href="http://developer.yahoo.com/yui/grids/">YUI Grids CSS</a></li>
<li><a title="YAML" href="http://www.yaml.de/en/">YAML</a></li>
<li><a title="Blueprint" href="http://www.blueprintcss.org/">Blueprint</a></li>
<li><a title="Schema: Web Design Framework" href="http://www.davidgoldingdesign.com/schema.html">Schema : Web Design Framework</a></li>
<li><a title="CleverCSS" href="http://sandbox.pocoo.org/clevercss/">CleverCSS</a></li>
<li><a title="Tripoli" href="http://devkick.com/lab/tripoli/">Tripoli</a></li>
<li><a title="Boilerplate" href="http://code.google.com/p/css-boilerplate/">Boilerplate</a></li>
<li><a title="WYMstyle" href="http://www.wymstyle.org/en/">WYMstyle</a></li>
<li><a title="A CSS Framework" href="http://www.contentwithstyle.co.uk/Articles/17/a-css-framework/">A CSS framework</a></li>
<li><a title="Logicss" href="http://code.google.com/p/logicss/">Logicss</a></li>
<li><a title="960" href="http://960.gs/">960</a></li>
<li><a title="emastic" href="http://code.google.com/p/emastic/">emastic</a></li>
</ul>
<p>Όπως ανέφερα και παραπάνω λοιπόν, έχω δοκιμάσει τα περισσότερα από αυτά, και λογικό είναι να έχω ξεχωρίσει κάποια από αυτά. Γενικότερα, απορρίπτω αμέσως 2 κατηγορίες framework. Αυτά που είναι πολύ μεγάλα σε μέγεθος και κώδικα, με αποτέλεσμα να αναγκάζουν τον χρήστη να περιμένει να φορτωθούν χίλια-δυο άχρηστα πράγματα, και σε αυτά που σε αναγκάζουν να χρησιμοποιείς non-semantic markup, κλάσεις και ids στον κώδικα σου. Με το παραπάνω σκεπτικό λοιπόν, έχω απορρίψει πολλά διάσημα frameworks, όπως <a title="YUI Grids CSS" href="http://developer.yahoo.com/yui/grids/">YUI Grids CSS</a>, <a title="960" href="http://960.gs/">960</a>, <a title="YAML" href="http://www.yaml.de/en/">YAML</a>, και πολλά άλλα, ενώ αντιθέτως έχω χρησιμοποιήσει αρκετές φορές το <a title="Boilerplate" href="http://code.google.com/p/css-boilerplate/">Boilerplate</a> το οποίο δεν αντιμετωπίζει τα παραπάνω προβλήματα, ενώ το σκεπτικό του βασίζεται στην απλότητα τόσο του κώδικα του, όσο και της λειτουργίας του.</p>
<p>To <a title="Boilerplate" href="http://code.google.com/p/css-boilerplate/">Boilerplate</a> λοιπόν είναι ένα πολύ απλό framework, το οποίο δεν περιέχει περίεργες κλάσεις και ids, αλλά προσφέρει μια πολύ ολοκληρωμένη βάση για τον CSS κώδικα σας. Έτσι κάθε φορά που το χρησιμοποιήτε σε κάποιο project, έχετε τον βασικό CSS κορμό έτοιμο, όπως για παράδειγμα ένα reset file, default styles για όλα τα elements (headings, παραγράφους, λίστες, κτλ.), ένα βασικό print-only style και κάποιες πάρα πολύ βασικές κλάσεις. Το δεύτερο χαρακτηριστικό που μου αρέσει στο συγκεκριμένο framework, είναι πως έχει χωρισμένα τα CSS αρχεία με έξυπνο τρόπο, όπως για παράδειγμα ένα αρχείο για την τυπογραφία (typography.css), άλλο για τις φόρμες (forms.css), άλλο για το UI της οθόνης (screen.css) κτλ., οργανώνοντας έτσι προκαταβολικά τον κώδικα σας! Από εκεί και πέρα, ότι extra θέλετε, το γράφεται μόνοι σας! Προσωπικά με έχει κερδίσει αυτή η μινιμαλιστική προσέγγιση που έχει, γιατί μέσα σε πολύ λίγη ώρα μπορώ να στίσω τον βασικό κορμό CSS ενός project, ενώ ταυτόχρονα για οτιδήποτε θέλω να προσθέσω ή να αλλάξω, γίνεται πολύ εύκολα και γρήγορα λόγο της έξυπνης κατηγοριοποίησης και ονοματολογίας των αρχείων του.</p>
<p>Αυτά τα λίγα λοιπόν για τα <a title="CSS frameworks in Wiki" href="http://en.wikipedia.org/wiki/CSS_framework">CSS Frameworks</a>. Γενικότερα δοκιμάστε όσα περισσότερα γίνεται (όπως βλέπεται είναι πάρα πολλά) και προσπαθείστε να βρείτε αυτό που σας ταιριάζει! Εάν ξέχασα κάποιο framework που χρησιμοποιείτε ή που νομίζεται πως αξήζει να αναφερθεί, αφήστε μου ένα σχόλιο, για το κοιτάξω κι αυτό&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2008/09/22/css-frameworks-good-or-evil/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Progressive enhancement : Tsevdos.com sidebar</title>
		<link>http://www.tsevdos.com/2008/08/29/progressive-enhancement-tsevdoscom-sidebar/</link>
		<comments>http://www.tsevdos.com/2008/08/29/progressive-enhancement-tsevdoscom-sidebar/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 08:45:01 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[accessibility and usability]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=66</guid>
		<description><![CDATA[Το δεύτερο και ίσως αγαπημένο μου feature στο Whitepress theme, είναι η AJAX-powered, αλλά ταυτόχρονα accessible sidebar του! Την τεχνική την δανείστηκα από το blog jQuery for designers και πιο συγκεκριμένα από το post jQuery Tabs, και ο λόγος που την λάτρεψα είναι επειδή χρησιμοποιεί σωστά αυτό που ονομάζουμε progressive enhancement. Progressive enhancement με πολύ [...]]]></description>
			<content:encoded><![CDATA[<p>Το δεύτερο και ίσως αγαπημένο μου feature στο <a title="Whitepress theme page" href="http://www.tsevdos.com/2008/06/10/whitepress-tsevdos-com-official-wordpress-theme/">Whitepress theme</a>, είναι η AJAX-powered, αλλά ταυτόχρονα accessible sidebar του! Την τεχνική την δανείστηκα από το blog <a title="jQuery for Designers" href="http://jqueryfordesigners.com/">jQuery for designers</a> και πιο συγκεκριμένα από το post <a title="jQuery Tabs" href="http://jqueryfordesigners.com/jquery-tabs/">jQuery Tabs</a>, και ο λόγος που την λάτρεψα είναι επειδή χρησιμοποιεί σωστά αυτό που ονομάζουμε <a title="Proggressive Enhancement" href="http://en.wikipedia.org/wiki/Progressive_Enhancement"><strong>progressive enhancement</strong></a>. <a title="Proggressive Enhancement" href="http://en.wikipedia.org/wiki/Progressive_Enhancement"><strong>Progressive enhancement</strong></a> με πολύ απλά λόγια σημαίνει πως ο χρήστης έστω και εάν δεν έχει την javascript ενεργοποιημένη στον browser, η sidebar και ολόκληρο το περιεχόμενο της θα εμφανίζεται κανονικά! Το μόνο που θα χάσει ο χρήστης σε αυτήν την περίπτωση είναι το AJAX-like εφέ που δημιουργεί η Javascript (και πιο συγκεκριμένα το <a title="jQuery site" href="http://jquery.com/"><strong>jQuery</strong></a>), ενώ θα βλέπει και όλα τα tabs ανοιχτά, το ένα κάτω από το άλλο. Όπως μπορείτε να παρατηρήσετε και από τις 2 παρακάτω εικόνες, ο χρήστης με ενεργοποιημένη Javascript έχει περισσότερο ελεύθερο χώρο στην sidebar του, και μπορεί να επιλέξει ποιο tab θα είναι ενεργοποιημένο. Αντίθετα κάποιος χρήστης με απενεργοποιημένη Javascript ή screen reader απλά βλέπει κανονικά και στην σειρά όλο το περιεχόμενο της sidebar με την σειρά που εμφανίζεται στην markup!</p>
<p><a title="Tsevdos.com with Javascript on" href="http://farm4.static.flickr.com/3290/2623495243_390f5fcf09_o.jpg"><img src="http://farm4.static.flickr.com/3290/2623495243_501f967f9b_m.jpg" alt="Tsevdos.com with Javascript on" width="240" height="153" /></a><br />
Η sidebar όπως εμφανίζεται σε browser που έχει ενεργοποιημένη την Javascript.<br />
<a title="Tsevdos.com with Javascript off" href="http://farm4.static.flickr.com/3029/2624319292_ea21274a88_o.jpg"><img src="http://farm4.static.flickr.com/3029/2624319292_d58206f508_m.jpg" alt="Tsevdos.com with Javascript off" width="240" height="153" /></a><br />
Η sidebar όπως εμφανίζεται σε browser που <strong>δεν</strong> έχει ενεργοποιημένη την Javascript.</p>
<h2>Η markup (XHTML)</h2>
<p>Ας δούμε όμως πως μπορούμε να φτιάξουμε το συγκεκριμένο εφέ εύκολα και γρήγορα. Εν αρχή λοιπόν (όπως πάντα) η markup μας.</p>
<pre name="code" class="html">
<div id="sidebar">
<ul id="navigation">
<li><a href="#first_div" title="First container">Section 1</a></li>
<li><a href="#second_div" title="Second container">Section 2</a></li>
<li><a href="#third_div" title="Third container">Section 3</a></li>
</ul>
<div id="first_div">
...
</div>
<div id="second_div">
...
</div>
<div id="third_div">
...
</div>
</div>
</pre>
<p>Όπως βλέπεται ένα div με το id sidebar, περιέχει μια unordered list (ul), με τρία list items (li), τα οποία στην ουσία λειτουργούν ως navigation list για τα τρία divs που ακολουθούν και θα περιέχουν το περιεχόμενο μας. Φυσικά η navigation list μπορεί να έχει περισσότερα links, αρκεί να υπάρχουν και τα ανάλογα divs περιεχομένου από κάτω. Αυτό ήταν, η markup είναι έτοιμη! Το μόνο που θα πρέπει να προσέξει κάποιος (θα εξηγήσω παρακάτω το γιατί), είναι πως σε περίπτωση που θέλει να προσθέσει επιπλέον ζευγάρια links και divs (για να έχει επιπλέον tabs και περιεχόμενο δηλαδή), θα πρέπει το link μέσα στο list item, να έχει για href attribute ακριβώς το ίδιο string με το id του div που θα προσθέσει. Όπως ήδη μπορείτε να δείτε, όλα τα links έχουν για href attribute τα id των div που θα εμφανίζουν.</p>
<h2>H CSS</h2>
<p>To styling (CSS) της συγκεκριμένης markup δεν παίζει κανέναν απολύτως ρόλο στον κώδικα μας (όλη η δουλειά γίνεται μέσω Javascript/jQuery), ωστόσο γι αυτούς που θέλουν να δημιουργήσουν κάτι στα γρήγορα, ας αντιγράψουν τον παρακάτω κώδικα, τον οποίο χρησιμοποιώ και στο παράδειγμα που μπορείτε να <a title="Sidebar live example" href="http://www.tsevdos.com/wp-content/uploads/sidebar/sidebar-example.html">δείτε</a> και φυσικά να <a title="Download sidebar example" href="http://www.tsevdos.com/wp-content/uploads/sidebar/sidebar.zip">κατεβάσετε</a>!</p>
<pre name="code" class="css">
* {
margin: 0;
padding: 0;
}

#sidebar {
width: 500px;
margin: 20px;
margin-bottom: 15px;
border-left: 1px solid #999;
}

#navigation {
list-style-type: none;
}

a:link, a:visited {
color: #fff;
background: #ccc;
padding: 1px 5px 0;
text-decoration: none;
font-weight: bold;
}

a:hover, a:active, a.selected {
color: #fff;
background: #999;
}

#navigation li {
list-style-type: none;
float: left;
border: 1px solid #999;
border-width: 1px 1px 0 0;
}

#sidebar div {
clear: left;
padding: 10px;
border: 1px solid #999;
border-width: 1px 1px 1px 0;
}
</pre>
<h2>Και τέλος η Javascript (jQuery)</h2>
<p>Και επιτέλους περνάμε στην καρδιά αυτού του tutorial, δηλαδή στην Javascript και το <a title="jQuery library" href="http://jquery.com/">jQuery</a> πιο συγκεκριμένα! Για τους ανυπόμονους, ο κώδικας είναι ο παρακάτω, ωστόσο καλό θα είναι να τον εξηγήσουμε και λίγο, γιατί πολλά πράγματα γίνονται, μέσα σε πολύ λίγες γραμμές κώδικα&#8230;</p>
<pre name="code" class="js">
<script type="text/javascript" src="jquery-1.2.6.min.js"></script>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function(){
$('#sidebar #navigation li a').click(function(){
$('#sidebar > div').hide().filter(this.hash).fadeIn();
$('#sidebar #navigation li a').removeClass('selected');
$(this).addClass('selected');
return false;
}).filter(':first').click();
});
//]]&gt;
</script>
</pre>
<p>Στην πρώτη γραμμή λοιπόν, δηλώνουμε στην markup πως θα κάνουμε χρήση της <a title="jQuery site" href="http://jquery.com/">jQuery library</a>. Η συγκεκριμένη library (όπως και οι περισσότερες άλλωστε) λειτουργεί όταν το <a title="What is DOM" href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM (Document Object Model)</a> είναι έτοιμο. Αυτό ακριβώς κάνει ο παρακάτω κώδικας. Μέσα του θα προσθέσουμε όλον το Javascript κώδικα ο οποίος με την βοήθεια και της βιβλιοθήκης θα δημιουργήσει το εφέ μας.</p>
<pre name="code" class="js">
$(document).ready(function(){
...
});
</pre>
<p>Επιλέγουμε λοιπόν τα links (anchor elements) που βρίσκονται μέσα στην unordered list με id navigation, και τους προσθέτουμε ένα απλό click event. Με άλλα όταν γίνει click σε κάποιο link της λίστας, τότε ο κώδικας που βρίσκεται ανάμεσα στις αγκύλες ενεργοποιήται.</p>
<pre name="code" class="js">
$('#sidebar #navigation li a').click(function() {
...
});
</pre>
<p>Και πάμε πλέον στο τι γίνεται όταν πατηθεί κάποιο από τα παραπάνω links. Αρχικά επιλέγουμε όλα τα divs της sidebar (#sidebar &gt; div) και τα κρύβουμε (hide()). Ταυτόχρονα εμφανίζουμε το div (με ένα απλό fadeIn εφέ) το οποίο έχει id ίδια τιμή με το string της href attribute του link (hash). Για τον λόγο αυτό σας προειδοποίησα παραπάνω πως πρέπει να προσέξουμε πολύ στην markup μας αυτήν την μικρή λεπτομέρεια. Εάν δεν έχουν ίδια τιμή ο κώδικας απλά δεν παίζει&#8230; Για να το κάνω ακόμα πιο κατανοητό (για αυτούς που κάνουν τώρα τα πρώτα τους βήματα σε jQuery), ας υποθέσουμε πως πατήθηκε το link Section 1, το οποίο έχει για href attribute την τιμή &#8220;#first_div&#8221;. Μόλις γίνει click λοιπόν, το jQuery θα κρύψει όλα τα divs της sidebar, και θα επιλέξει το div το οποίο έχει για id την τιμή #first_div. Αυτό γίνεται επειδή το this.hash εκείνη την στιγμή παίρνει την τιμή #first_div. Μόλις ολοκληρωθεί και αυτό, απλά εμφανίζουμε με fade in το συγκεκριμένο div. Και όλα αυτά γίνονται μόλις σε 1 γραμμή κώδικα!</p>
<pre name="code" class="js">
$('#sidebar > div').hide().filter(this.hash).fadeIn();
</pre>
<p>Ευτυχώς ο υπόλοιπος κώδικας είναι πολύ πιο κατανοητός και εύκολος. Στις παρακάτω 3 γραμμές απλά επιλέγουμε όλα τα links και τους αφαιρούμε (εάν έχουν, όμως πάντα ένα link θα έχει) την κλάση &#8220;selected&#8221;, η οποία και δίνει το ανάλογο style στο επιλεγμένο link. Τέλος προσθέτουμε στο link που έχει γίνει το click την κλάση &#8220;selected&#8221;, έτσι ώστε να φαίνεται πως είναι επιλεγμένο (highlighted), και δηλώνουμε στον browser να σταματήσει την default ενέργεια του click event (return false;), μιας και έχουμε πετύχει το εφέ που θέλουμε!</p>
<pre name="code" class="js">
$('#sidebar #navigation li a').removeClass('selected');
$(this).addClass('selected');
return false;
</pre>
<p>Τέλος σε όλο αυτό το click event προσθέτουμε ένα από τα αγαπημένα μου χαρακτηριστικά που έχει το jQuery. Φιλτράρουμε το πρώτο element που έχει επιλεχθεί, δηλαδή το πρώτο link της λίστας μας, και κάνουμε click πάνω του, μέσω κώδικα! Έτσι όταν στο τέλος εμφανίζεται η σελίδα το πρώτο link (ή tab ή όπως αλλιώς θέλετε να το πείτε), θα είναι πάντα επιλεγμένο!!! Αυτό ήταν, είναι έτοιμο, δουλεύει και πάνω από όλα, είναι φιλικό προς όλους τους χρήστες! Δοκιμάστε να απενεργοποιήσετε την Javascript και θα δείτε πως θα συνεχίζει να δουλεύει χωρίς κανένα πρόβλημα, απλά θα χάσει λίγη από την μαγεία του&#8230;</p>
<pre name="code" class="js">
.filter(':first').click();
</pre>
<h2>Επίλογος</h2>
<p>To <a title="jQuery library" href="http://jquery.com/">jQuery</a> είναι πραγματικά μια φανταστική Javascript library η οποία κάνει τα δύσκολα πράγματα απλά! Όπως βλέπεται μέσα σε μόλις 6-7 γραμμές κώδικα έχουμε ένα πολύ όμορφο και accessible αποτέλεσμα το οποίο μπορεί να χρησιμοποιηθεί παντού! Η δυνατότητα του να κάνεις εύκολα και γρήγορα αυτά που έχεις στο μυαλό σου, χωρίς να σε απασχολούν οι μικρολεπτομέρειες τις Javascript (οι οποίες πιστέψτε με είναι πολλές και ενοχλητικές), είναι αυτό που κάνει το<a title="jQuery library" href="http://jquery.com/"> jQuery</a> να ξεχωρίζει από τις άλλες libraries. Τέλος για όσους θέλουν μια ακόμα πιο εύκολη και φυσικά accessible λύση καλό θα είναι να ρίξουν και μια ματιά στο <a title="UI plug in for jQuery" href="http://docs.jquery.com/UI/Tabs">UI Tabs</a> το οποίο είναι ένα επίσημο plug-in για το <a title="jQuery library" href="http://jquery.com/">jQuery</a> και κάνει με πολύ λιγότερο κόπο αυτό που δημιουργήσαμε παραπάνω ()&#8230;</p>
<ul>
<li><a title="See live example" href="http://www.tsevdos.com/wp-content/uploads/sidebar/sidebar-example.html"><strong>Δείτε το παράδειγμα στον browser σας</strong></a></li>
<li><a title="Download sidebar files" href="http://www.tsevdos.com/wp-content/uploads/sidebar/sidebar.zip"><strong>Κατεβάστε τα αρχεία του tutorial</strong></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2008/08/29/progressive-enhancement-tsevdoscom-sidebar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Στρογγυλές γωνίες (rounded corners) χρησιμοποιώντας μόνο CSS και 1 γραφικό</title>
		<link>http://www.tsevdos.com/2008/07/10/rounded-coreners-using-pure-css-and-just-one-image/</link>
		<comments>http://www.tsevdos.com/2008/07/10/rounded-coreners-using-pure-css-and-just-one-image/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 09:03:01 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/?p=62</guid>
		<description><![CDATA[Από καιρό ήθελα να γράψω ένα tutorial με θέμα τις στρογγυλές γωνίες (rounded corners) και την HTML/CSS που κρύβεται πίσω από ένα τέτοιο εγχείρημα, όμως πάντα κάτι τύχαινε και δεν το έγραφα. Σήμερα λοιπόν έχετε την ευκαιρία να διαβάσετε ένα πολύ ενδιαφέρον tutorial πάνω στο θέμα, στο οποίο χρησιμοποιώ και πολλές άλλες ενδιαφέρουσες τεχνικές σε [...]]]></description>
			<content:encoded><![CDATA[<p>Από καιρό ήθελα να γράψω ένα tutorial με θέμα τις στρογγυλές γωνίες (rounded corners) και την HTML/CSS που κρύβεται πίσω από ένα τέτοιο εγχείρημα, όμως πάντα κάτι τύχαινε και δεν το έγραφα. Σήμερα λοιπόν έχετε την ευκαιρία να διαβάσετε ένα πολύ ενδιαφέρον tutorial πάνω στο θέμα, στο οποίο χρησιμοποιώ και πολλές άλλες ενδιαφέρουσες τεχνικές σε CSS κυρίως επίπεδο.</p>
<p>Ας αρχίσουμε λοιπόν φτιάχνοντας ένα div (division) το οποίο θα περιέχει το κείμενο μας (του δίνω και μία κλάση/class έτσι ώστε να ξεχωρίσει από τα υπόλοιπα), και εφαρμόζω κάποια βασικά styles έτσι ώστε να φαίνεται καλύτερα.</p>
<pre name="code" class="html">
<div class="rounded">

Κείμενο...
</div>
</pre>
<pre name="code" class="css">

* {
margin: 0;
padding: 0;
}

body {
padding: 20px;
}

div.rounded {
margin-bottom: 10px;
padding: 10px;
background: #999;
}
</pre>
<p>Αναγκαίο κακό εάν θέλουμε στρογγυλές γωνίες στο web, είναι η extra non-semantic markup (ούτε και εμένα μ αρέσει, αλλά δεν γίνεται αλλιώς), οπότε βάζουμε αναγκαστικά άλλα 4 span elements μέσα στο div μας, ένα για κάθε γωνία.</p>
<pre name="code" class="html">
<div class="rounded"><span class="tl"> </span>
<span class="tr"> </span>&nbsp;

Κείμενο...

&nbsp;
</div>
</pre>
<p>Και τώρα μπορούν να αρχίσουν τα ωραία <img src='http://www.tsevdos.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Το γραφικό που χρησιμοποιώ είναι ένας κύκλος με διάμετρο 20px (width και height). Αυτό που θέλω να πετύχω είναι όλα τα span elements, να δείχνουν αυτόν τον κύκλο, αλλά διαφορετικό κομμάτι του κάθε φορά! Ας γράψουμε λοιπόν τους γενικούς κανόνες για τα span elements, αφού προσθέσουμε άλλον έναν σημαντικό κανόνα για το positioning στο div μας. (Το γραφικό που χρησιμοποιώ μπορείτε να το κατεβάσετε από εδώ <img src="http://farm4.static.flickr.com/3248/2653187323_57a5ee13be_o.gif" alt="circle" width="20" height="20" /> )</p>
<pre name="code" class="css">

div.rounded {
margin-bottom: 10px;
padding: 10px;
background: #999;
position: relative;
}

div.rounded span {
width: 10px;
height: 10px;
background-image: url(circle.gif);
background-repeat: no-repeat;
position: absolute;
}
</pre>
<p>Με τον κανόνα που πρόσθεσα στο div (position: relative;) θα μπορέσω στην συνέχεια να τοποθετήσω τα span elements ακριβώς εκεί που θέλω με absolute positioning. Τα span προς το παρόν, απλά δείχνουν πάντα την πάνω αριστερή μεριά του κύκλου. Μην ξεχνάτε πως τα span είναι 10px (ύψος-πλάτος) ενώ οι διαστάσεις του γραφικού είναι 20px! Επίσης ρυθμίζω να μην επαναλαμβάνεται το γραφικό στο background, αν και ο συγκεκριμένος κανόνας δεν χρειάζεται, τον έχω προσθέσει για σιγουριά.</p>
<p>Τέλος απλά τοποθετούμε το κάθε span στην σωστή γωνία με absolute positioning (το tl πάνω αριστερά &#8211; top left, το tr πάνω δεξιά &#8211; top right, κοκ.). Αυτό γίνεται πολύ εύκολα με τους positioning κανόνες top, left, right και bottom και τις ανάλογες τιμές τους (0 στο παράδειγμα μας, μιας και θέλουμε να βρίσκονται ακριβώς στις γωνίες του div). Είναι σχεδόν έτοιμο, το μόνο που πρέπει να κάνουμε τώρα είναι να παρουσιάζουμε το σωστό κομμάτι του κύκλου/γραφικού μας στο κάθε span. Αυτό γίνεται με background-positioning στο καθένα από τα span μας!</p>
<pre name="code" class="css">

span.tl {
top: 0; left: 0;
background-position: top left;
}

span.tr {
top: 0; right: 0;
background-position: top right;
}

span.bl {
bottom: 0; left: 0;
background-position: bottom left;
}

span.br {
bottom: 0; right: 0;
background-position: bottom right;
}
</pre>
<p>Για όσους δεν έπιασαν το τελευταίο κομμάτι (μιας και οι προηγούμενοι κανόνες είναι πιο ξεκάθαροι) θα τους πρότεινα να βάλουν και τον παρακάτω κανόνα στον κώδικα τους και να παρατηρήσουν τις γωνίες τους! Όπως βλέπεται, το γραφικό που έχουν είναι πάντα το ίδιο, απλά το span με κλάση/class tl (top left), εμφανίζει την πάνω αριστερή μεριά του κύκλου, μιας και το span δείχνει μόνο 10px σε ύψος και πλάτος από τα 20px που έχει συνολικά το image μας. Έτσι εμφανίζουμε μόνο την μεριά του κύκλου που θέλουμε σε κάθε γωνία μας.</p>
<pre name="code" class="css">

div.rounded span {
border: 1px solid red;
}
</pre>
<p>Τέλος για τους λάτρεις του <a title="jQuery library" href="http://jquery.com/">jQuery</a> αλλά και της καθαρής markup, στο <a title="Rounded corners example by Tsevdos.com" href="http://www.tsevdos.com/wp-content/uploads/rounded_corners/rounded_corners.html"><strong>παράδειγμα</strong> που έχω ανεβάσει</a>, έχω φτιάξει άλλο ένα div, στο οποίο έχω προσθέσει μέσω DOM την απαραίτητα markup του παραπάνω παραδείγματος. Έτσι προσθέτοντας μία μόνο γραμμή Javascipt (και το jQuery φυσικά), μπορούμε να απολαύσουμε την πεντακάθαρη markup έχοντας το ίδιο φυσικά αποτέλεσμα! Δείτε τον παρακάτω κώδικα (ή το για όσους βαριούνται να πληκτρολογούν το δεύτερο div, απλά δείτε το δεύτερο div του <a title="Rounded corners example by Tsevdos.com" href="http://www.tsevdos.com/wp-content/uploads/rounded_corners/rounded_corners.html">παραδείγματος</a>) και θα καταλάβετε τι εννοώ.</p>
<pre name="code" class="html">
<div class="rounded jquery">

Κείμενο...
</div>
</pre>
<pre name="code" class="js">

$(document).ready(function(){
$('.jquery').prepend('').append('');
});
</pre>
<p>Το μόνο πρόβλημα σε αυτήν την περίπτωση είναι πως εάν ο χρήστης δεν έχει ενεργοποιημένη την Javascript, δεν θα δει στρογγυλές τις γωνίες του div, μιας και αυτές &#8220;εισχωρούν&#8221; στο DOM μέσω Javascript. Το τελικό αποτέλεσμα μπορείτε να το <a title="Rounded corners example by Tsevdos.com" href="http://www.tsevdos.com/wp-content/uploads/rounded_corners/rounded_corners.html">δείτε</a> αλλά και να το <a title="Download rounded corners example by Tsevdos.com" href="http://www.tsevdos.com/wp-content/uploads/rounded_corners/rounded_corners.zip"><strong>κατεβάσετε</strong></a> (σε zip format).</p>
<p>Η συγκεκριμένη τεχνική δουλεύει σε όλους τους μοντέρνους browsers, αλλά όχι στον IE6 (ο οποίος δεν είναι μοντέρνος, απλά πολλοί χρήστες τον χρησιμοποιούν ακόμα)! Εάν λοιπόν δεν σας ενδιαφέρει ο συγκεκριμένος browser (εδώ δεν ενδιαφέρει την <a title="37signals and IE6" href="http://37signals.blogs.com/products/2008/07/basecamp-phasin.html">37signals</a>) μπορείτε να χρησιμοποιήσετε την συγκεκριμένη τεχνική αμέσως! Εάν πάλι σας ενδιαφέρει και ο IE6 καλό θα είναι να δοκιμάσετε κάποια ανάλογη τεχνική με floats και 4 images (δυστυχώς)&#8230; Περιμένω σχόλια και προτάσεις για tutorials (yes, I&#8217;m on fire!!! <img src='http://www.tsevdos.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2008/07/10/rounded-coreners-using-pure-css-and-just-one-image/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>HTML e-mails και πως πρέπει να σχεδιάζονται</title>
		<link>http://www.tsevdos.com/2007/12/20/how-to-design-html-emails-properly/</link>
		<comments>http://www.tsevdos.com/2007/12/20/how-to-design-html-emails-properly/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 14:57:17 +0000</pubDate>
		<dc:creator>John Tsevdos</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[clients]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[rendering]]></category>

		<guid isPermaLink="false">http://www.tsevdos.com/2007/12/20/how-to-design-html-emails-properly/</guid>
		<description><![CDATA[Αν και έχουν γίνει αρκετά βήματα μπροστά στο θέμα HTML e-mails/newsletters, όπως το Email Standards Project (όπως έχω αναφέρει και σε παλιότερο post), τα πράγματα για τους developers παραμένουν άσχημα, μιας και οι mail clients εκτός από από πολλοί, έχουν μείνει και αρκετά πίσω στο θέμα rendering HTML περιεχομένου. Οι περισσότεροι, για λόγους ασφαλείας κυρίως, [...]]]></description>
			<content:encoded><![CDATA[<p>Αν και έχουν γίνει αρκετά βήματα μπροστά στο θέμα HTML e-mails/newsletters, όπως το <a title="Email Standards Project" href="http://www.email-standards.org/">Email Standards Project</a> (όπως έχω αναφέρει και σε παλιότερο <a title="Tsevdos.com and Email Standards Project" href="http://www.tsevdos.com/2007/11/29/email-standards-project/">post</a>), τα πράγματα για τους developers παραμένουν άσχημα, μιας και οι mail clients εκτός από από πολλοί, έχουν μείνει και αρκετά πίσω στο θέμα rendering HTML περιεχομένου. Οι περισσότεροι, για λόγους ασφαλείας κυρίως, κόβουν πολλά χαρακτηριστικά όπως Javascript, CSS και πολλές φορές ακόμα και εικόνες, οπότε η κατάσταση είναι δύσκολο να ελεγχθεί από τον developer/designer που έχει αναλάβει την δημιουργία του περιεχομένου! Επιπλέον πρόβλημα είναι και η ύπαρξη on-line αλλά και off-line (desktop) mail clients, όπου ο καθένας ακολουθεί τους δικούς του κανόνες στο τι θα κάνει render και με ποιον τρόπο! Το παρακάτω άρθρο θα προσπαθήσει να δώσει συμβουλές αλλά και να προβάλει τεχνικές έτσι ώστε να σχεδιάζετε καλύτερα και πιο συμβατά HTML mails.</p>
<p>Το πρώτο πράγμα που πρέπει να ασπαστείται είναι η <a title="inline CSS" href="http://www.tizag.com/cssT/inline.php"><strong>inline CSS</strong></a>! Αν και στο web design η <a title="inline CSS" href="http://www.tizag.com/cssT/inline.php"><strong>inline CSS</strong></a> θεωρείτε τόσο κακή πρακτική όσο και τα παλιομοδίτικα font tags, στην περίπτωση των HTML mails η <a title="inline CSS" href="http://www.tizag.com/cssT/inline.php"><strong>inline CSS</strong></a> είναι το μόνο είδος <a title="What is CSS" href="http://www.w3.org/Style/CSS/"><strong>CSS</strong></a> που λειτουργεί στους περισσότερους clients! Έτσι εάν θέλετε να χρησιμοποιήσετε σε κάποιο span element Arial font, σε γκρι χρώμα και bold, ο κανόνας που πρέπει να γράψετε (inline) είναι ο εξής :</p>
<pre name="code" class="html"><span style="font-family: Arial; color: #cccccc; font-weight: bold">
Span element με Arial font, γκρι χρώμα και bold!
</span></pre>
<p>Από εκεί και πέρα προσπαθήστε να χρησιμοποιήσετε τις βασικές CSS properties οι οποίες υποστηρίζονται στους περισσότερους clients, και αποφύγετε τις πιο σπάνιες (όπως πχ list-style-image). Παρακάτω συγκέντρωσα μία λίστα η οποία εξηγεί τι εννοώ γράφοντας βασικές properties. Την λίστα την έφτιαξα μετά από μελέτη ενός καταπληκτικού άρθρου πάνω στο θέμα το οποίο έχει κάνει ολόκληρη μελέτη για το <a title="CSS properties that mail clients support" href="http://www.campaignmonitor.com/blog/archives/2006/03/a_guide_to_css_support_in_emai.html">ποιες CSS properties υποστηρίζονται και ποιες όχι</a> (γράφτηκε το 2006, αλλά υπάρχει και το <a title="CSS properties that mail clients support 2007 edition" href="http://www.campaignmonitor.com/blog/archives/2007/04/a_guide_to_css_support_in_emai_2.html">2007 review</a>).</p>
<ul>
<li>color</li>
<li>background-color</li>
<li>border</li>
<li>font-family</li>
<li>font-size</li>
<li>font-style</li>
<li>font-variant</li>
<li>font-weight</li>
<li>letter-spacing</li>
<li>line-height</li>
<li>margin</li>
<li>padding</li>
<li>text-align</li>
<li>text-decoration</li>
<li>text-transform</li>
</ul>
<p>Κάποιοι παρατηρητικοί θα είδαν πως στις παραπάνω CSS properties δεν αναφέρω πουθενά <a title="Positioning properties" href="http://www.w3schools.com/css/css_positioning.asp">positioning properties</a>. Ο λόγος είναι πολύ απλός, για HTML e-mail (και μόνο για τον συγκεκριμένο λόγο) η καλύτερη λύση είναι να χρησιμοποιήσετε <strong>tables</strong>! Το ξέρω πως σε αυτό το blog γράφω πάντα κατά των tables και υποστηρίζω τις μοντέρνες web design τεχνικές, αλλά στην συγκεκριμένη περίπτωση όλα αυτά απλά δεν ισχύουν! Χρησιμοποιήστε tables λοιπόν και μάλιστα αποφύγετε τα πολλά tables μέσα σε tables (γνωστά και ως <strong>nested tables</strong>). Ένα απλό table-based layout, με λίγα rows και columns είναι το ιδανικότερο, μετά με την εισαγωγή κάποιων βασικών styles στο περιεχόμενο (content) του πίνακα και ακολουθώντας τις παραπάνω συμβουλές, μπορείτε εύκολα να δημιουργήσετε ένα πολύ ευανάγνωστο και εντυπωσιακό HTML e-mail/newsletter.</p>
<p>Άλλο ένα σημαντικό λάθος, που το κάνουν ακόμα και μεγάλες εταιρείες, είναι η αλόγιστη χρήση γραφικών (images) και το ακόμα χειρότερο, η χρήση γραφικών για την προβολή περιεχομένου (content). Ο λόγος που δεν πρέπει να χρησιμοποιούμε πολλά γραφικά, είναι πως πολλοί mail clients (on-line και off-line) δεν αφήνουν τα γραφικά να &#8220;περάσουν&#8221;, με αποτέλεσμα να μην εμφανίζονται! Όπως καταλαβαίνεται τα πράγματα γίνονται ακόμα χειρότερα εάν τα γραφικά περιέχουν και μέρος του περιεχόμενου μας, όπως για παράδειγμα κείμενο, γραφήματα κτλ. Καλό θα είναι το κείμενο (τίτλοι, παράγραφοι, κτλ.) να είναι κείμενο, και όχι γραφικά με περίεργα Photoshop fonts, γιατί εκτός από το κίνδυνο να μην τα δουν ποτέ οι παραλήπτες, υπάρχει και μεγάλο accessibility πρόβλημα όταν κάποιος θέλει να κάνει copy κάποιο κομμάτι του κειμένου σας!</p>
<p>Τέλος κάντε όσα πιο πολλά τεστ μπορείτε! Και για να γίνω πιο συγκεκριμένος εξετάστε τα HTML mails τουλάχιστον σε :</p>
<ul>
<li><a title="Hotmail" href="http://www.hotmail.com/">Hotmail </a></li>
<li><a title="Yahoo Mail" href="http://mail.yahoo.com/">Yahoo Mail</a></li>
<li><a title="Gmail" href="http://www.gmail.com/">Gmail </a></li>
<li><a title="Outlook" href="http://www.microsoft.com/outlook/">Outlook </a></li>
<li><a title="Thunderbird" href="http://www.mozilla.com/en-US/thunderbird/">Thunderbird</a></li>
<li><a title="Mac Mail" href="http://www.apple.com/macosx/features/mail.html">Mac Mail</a></li>
<li><a title="Entourage" href="http://www.microsoft.com/mac/products/entourage2004/">Entourage </a></li>
<li><a title="Kmail" href="http://kontact.kde.org/kmail/">Kmail </a></li>
<li><a title="Eudora" href="http://www.eudora.com/">Eudora </a></li>
</ul>
<p>Αυτά τα βασικά και πιο τεχνικά πράγματα για τα HTML e-mails (προς το παρόν). Ελπίζω να με διαβάζουν και κάποιοι που δημιουργούν τέτοια mails, γιατί όπως πάντα η κατάσταση στην Ελλάδα είναι πάλι αρκετά πίσω από τον μέσο όρο, οπότε όσοι πιστοί νοιάζεστε, διορθώστε όσο μπορείτε την κατάσταση!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tsevdos.com/2007/12/20/how-to-design-html-emails-properly/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

