<?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>CescoBlog &#187; CSS</title>
	<atom:link href="http://www.cescopag.com/category/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cescopag.com</link>
	<description>Web-appunti tecnici (e non) per webdesigner e sviluppatori.</description>
	<lastBuildDate>Fri, 24 Dec 2010 08:11:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google Maps API: &#8220;Calcola il percorso&#8221; nel nostro sito</title>
		<link>http://www.cescopag.com/2009/11/google-maps-api-calcola-il-percorso-nel-nostro-sito/</link>
		<comments>http://www.cescopag.com/2009/11/google-maps-api-calcola-il-percorso-nel-nostro-sito/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:05:40 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[directions]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[maps]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=122</guid>
		<description><![CDATA[
Come molti di voi sapranno Google mette a disposizione per la maggior parte dei propri prodotti una serie di strumenti per sfruttarne le potenzialità nei nostri progetti.
  Google Maps non fa eccezione e ci fornisce tutti gli strumenti (API) per sfruttare le mappe di Google nei nostri siti tramite Javascript.


  Una delle funzionalità [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cescopag.com/wp-content/uploads/2009/11/maps.jpg" alt="Google Maps Directions" title="Google Maps Directions" width="200" height="167" class="alignright size-full wp-image-130" /></p>
<p>Come molti di voi sapranno Google mette a disposizione per la maggior parte dei propri prodotti una serie di strumenti per sfruttarne le potenzialità nei nostri progetti.<br />
  <strong>Google Maps </strong>non fa eccezione e ci fornisce tutti gli strumenti (<strong>API</strong>) per sfruttare le mappe di Google nei nostri siti tramite Javascript.
</p>
<p>
  Una delle funzionalità più utili è quella di poter <strong>calcolare il percorso </strong>ottimale per raggiungere un determinato luogo, ottenendo tutte le indicazioni sulle svolte e sulle strade da percorrere. Non molti sanno che queste funzionalità sono a disposizione degli sviluppatori per integrarle nei propri progetti, ed è proprio ciò che faremo.
  </p>
<p><a href="http://www.cescopag.com/demos/directions/demo3.html" class="linkdemo" target="_blank">Demo</a></p>
<p><span id="more-122"></span></p>
<p>
  Ipotizziamo di voler integrare nel nostro sito una comoda sezione &#8220;Come raggiungerci&#8221;, dove l&#8217;utente possa inserire la propria posizione ed ottenere il percorso per raggiungerci.
  </p>
<p>
  La nostra pagina quindi sarà composta da un breve form dove l&#8217;utente inserirà la posizione, la mappa dove verrà visualizzato il percorso e l&#8217;area in cui verranno visualizzate le informazioni:</p>
<pre>
&lt;form name="findRoute" action=""&gt;
	&lt;p&gt;
		&lt;label for="partenza"&gt;Da dove parti?&lt;/label&gt;
		&lt;input type="text" name="partenza" /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;input type="submit" value="Calcola" name="calcola" id="calcola" /&gt;
	&lt;/p&gt;
&lt;/form&gt;

&lt;div id="map"&gt;&lt;/div&gt;
&lt;div id="route"&gt;&lt;/div&gt;
</pre>
<p>Com&#8217;è facile intuire la mappà sarà inserita all&#8217;interno del div <em>map</em>, mentre le indicazioni all&#8217;interno del div <em>route</em>.</p>
<p>  Ma veniamo alla parte Javascript. Per prima cosa è necessario procurarsi una <strong>API Key </strong>dal sito google:
</p>
<p> <a href="http://code.google.com/intl/it-IT/apis/maps/signup.html">http://code.google.com/intl/it-IT/apis/maps/signup.html</a></p>
<p>Una volta ottenuta la chiave possiamo includere il javascript di Google Maps: </p>
<pre>
&lt;script src="http://maps.google.com/maps?file=api&#038;v=2.x&#038;key=CHIAVE" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p>Dove al posto di <em><strong>CHIAVE</strong></em> ci andrà la API Key fornita da Google.</p>
<p>Procediamo ora con lo script vero e proprio. Innanzitutto inizializziamo una serie di variabili vuote che conterranno gli oggetti di Google Maps che istanzieremo:</p>
<pre>
/* GOOGLE MAPS OBJECTS */
var home;       //Home GLatLng object
var map;        //GMap object
var directions; //Directions object
var marker;     //GMarker object
</pre>
<p>La prima funzione che andremo ad utilizzare sarà la funzione <code>initialize()</code> che come dice il nome preparerà tutto il necessario per far funzionare la mini-applicazione. Questa funzione dovrà essere richiamata al caricamento della pagina, ad esempio all&#8217;interno del tag <em>body</em>:</p>
<pre>
&lt;body onload="initialize()"&gt;
</pre>
<p>Ma veniamo al codice. Per prima cosa recuperiamo gli elementi html che ci servono tramite il metodo <code>document.getElementById</code>:</p>
<pre>
//Get html elements needed:
var mapPanel        = document.getElementById('map');
var directionsPanel = document.getElementById('route');
var submitButton    = document.getElementById('calcola');
</pre>
<p>Subito dopo invece definiamo il nostro punto base, nell&#8217;esempio sarà la nostra ipotetica sede:</p>
<pre>
//Home location:
home = new GLatLng(45.434629,12.337925);
</pre>
<p>Ora che abbiamo il necessario possiamo già istanziare la mappa che verrà visualizzata di default e mostrerà il punto base:</p>
<pre>
//Create a map:
map = new GMap2(mapPanel);
map.setCenter(home, 13);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
</pre>
<p>Per prima cosa viene creato l&#8217;oggetto <strong>GMap2</strong>, cioè la Google Map, e viene associato al <em>div#map</em> (mapPanel). La mappa viene poi centrata in home, al livello di zoom 13 (qui possiamo procedere a tentativi, più piccolo sarà il numero e più superficie terrestre vedremo). Tramite le altre due righe andiamo ad aggiungere i controlli che ci interessano (in questo caso i controlli standard e quelli per il tipo di visualizzazione &#8211; satellite, mappa, ibrida).</p>
<p>Ora dobbiamo evidenziare il punto base, e lo faremo aggiungendo un <em>marker</em>:</p>
<pre>
//Create marker:
marker = new GMarker(home);
map.addOverlay(marker);
</pre>
<p>Al marker possiamo aggiungere un fumetto descrittivo, contenente ad es. l&#8217;indirizzo, che si apre al click:</p>
<pre>
GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml("&lt;strong&gt;Venezia&lt;/strong&gt;&lt;br /&gt;Piazza San Marco");
});
</pre>
<p>Il comando <code>addListener</code> serve appunto per associare il click sul marker all&#8217;operazione di mostrare un fumetto contenente una stringa html (tramite il comando <code>openInfoWindowHtml</code>).</p>
<p>Come ultimo passaggio preparatorio dobbiamo istanziare l&#8217;oggetto <em>GDirections</em> di Google, che ci servirà per calcolare le rotte:</p>
<pre>
//Create directions module:
directions = new GDirections(map, directionsPanel);
</pre>
<p>Ora che tutto è pronto dobbiamo preoccuparci di cosa fare quando l&#8217;utente premerà sul pulsante &#8220;Calcola&#8221;:</p>
<pre>
submitButton.onclick = function() {
    getRoute();
    return false;
}
</pre>
<p>Definiamo quindi la funzione <code>getRoute()</code>:</p>
<pre>
function getRoute() {
	var userLocation = document.findRoute.partenza.value;
	from = userLocation;
	to  = home;

    directions.load("from: " + from + " to: " + to, {"locale":"it_IT"});
}
</pre>
<p>
Questa non fa altro che leggere la posizione di partenza dal campo compilato dall&#8217;utente e assegnarla alla variabile <em>from</em> e associare il punto base alla variabile <em>to</em>.<br />
La magia avviene infine nell&#8217;ultima riga, dove andremo a calcolare la rotta tramite il metodo load del nostro oggetto <em>GDirections</em>.
</p>
<p>
A questo andremo a passare due parametri: Il primo sarà una stringa contenente le indicazioni nella forma &#8220;from:INDIRIZZO_DI_PARTENZA to:INDIRIZZO_DI_ARRIVO&#8221; (esattamente a come faremmo nella casella di ricerca in maps.google.it). Il secondo parametro invece è un oggetto che ci permette di specificare varie opzioni, in questo caso la lingua italiana.
</p>
<p>
Se andiamo a testare il tutto, dovremmo vedere che, una volta scelto un indirizzo di partenza, automaticamente verrà generato un percorso, visualizzato correttamente nella mappa, e generato il percorso passo-passo con tutte le indicazioni. Semplice no?
</p>
<p><a href="http://www.cescopag.com/demos/directions/demo1.html" class="linkdemo" target="_blank">Demo 1</a></p>
<p>Ora aggiungiamo qualche funzionalità in più. Per prima cosa vogliamo dare la possibiltà di calcolare anche il percorso di ritorno. Aggiungiamo quindi un <em>checkbox</em> con la dicitura &#8220;Calcola percorso di ritorno&#8221;:</p>
<pre>
&lt;h1&gt;Come arrivare&lt;/h1&gt;
&lt;form name="findRoute" action=""&gt;
	&lt;p&gt;
		&lt;label for="partenza"&gt;Da dove parti?&lt;/label&gt;
		&lt;input type="text" name="partenza" /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;label&gt;&lt;input type="checkbox" name="inverti" value="inverti" /&gt;Calcola percorso di ritorno&lt;/label&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;input type="submit" value="Calcola" name="calcola" id="calcola" /&gt;
	&lt;/p&gt;
&lt;/form&gt;
</pre>
<p>Nel javascript, all&#8217;interno di <em>getRoute</em>, andiamo quindi a gestire il caso in cui si voglia invertire la direzione:</p>
<pre>
function getRoute() {
	var userLocation = document.findRoute.partenza.value;
	var reverse = document.findRoute.inverti.checked;

	if (!reverse) {
		//andata...
		from = userLocation;
		to  = home;
	} else {
		//ritorno...
		from = home;
		to = userLocation;
	}

    directions.load("from: " + from + " to: " + to, {"locale":"it_IT"});
}
</pre>
<p>Viene infatti controllato se la <em>checkbox</em> è selezionata oppure no, e in caso positivo vengono invertite le posizioni di partenza e arrivo.</p>
<p>Se visualizziamo l&#8217;esempio vediamo quindi che selezionando il <em>checkbox</em> le indicazioni saranno invertite, partendo dal punto base fino alla destinazione inserita dall&#8217;utente.</p>
<p><a href="http://www.cescopag.com/demos/directions/demo2.html" class="linkdemo" target="_blank">Demo 2</a></p>
<p> Come ultima personalizzazione andiamo a sostituire l&#8217;icona di default con una scelta ad-hoc. Per farlo ci avvaleremo dell&#8217;ottimo sito: <a href="http://www.powerhut.co.uk/googlemaps/custom_markers.php">http://www.powerhut.co.uk/googlemaps/custom_markers.php</a> Il quale ci permette di caricare immagini in <em>gif</em>, <em>jpeg</em> e <em>png</em> per generare il corrispondente marcatore, completo di immagini e javascript.</p>
<p>  Nel mio caso il risultato fornito è il seguente: </p>
<pre>
var myIcon = new GIcon();
myIcon.image = 'markers/image.png';
myIcon.printImage = 'markers/printImage.gif';
myIcon.mozPrintImage = 'markers/mozPrintImage.gif';
myIcon.iconSize = new GSize(65,190);
myIcon.shadow = 'markers/shadow.png';
myIcon.transparent = 'markers/transparent.png';
myIcon.shadowSize = new GSize(160,190);
myIcon.printShadow = 'markers/printShadow.gif';
myIcon.iconAnchor = new GPoint(33,190);
myIcon.infoWindowAnchor = new GPoint(33,0);
myIcon.imageMap = [4...0]; //omesso per questioni di spazio
</pre>
<p>Per poter utilizzare l&#8217;icona dobbiamo modificare leggermente la riga dove viene creato il marker:</p>
<pre>
//Create marker:
marker = new GMarker(home, {icon:myIcon});
</pre>
<p>Abbiamo infatti aggiunto l&#8217;opzione <em>icon</em> che permette di specificare quale icona utilizzare.</p>
<p>
  Se visualizzamo quest&#8217;ultimo esempio vedremo una simpatica icona al posto del consueto pallino rosso.
</p>
<p><a href="http://www.cescopag.com/demos/directions/demo3.html" class="linkdemo" target="_blank">Demo 3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/11/google-maps-api-calcola-il-percorso-nel-nostro-sito/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Sfondi semitrasparenti in CSS</title>
		<link>http://www.cescopag.com/2009/10/sfondi-semitrasparenti-in-css/</link>
		<comments>http://www.cescopag.com/2009/10/sfondi-semitrasparenti-in-css/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 21:03:27 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[background]]></category>
		<category><![CDATA[csss]]></category>
		<category><![CDATA[opacity]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=112</guid>
		<description><![CDATA[Una delle ultime tendenze del web è l&#8217;utilizzo di sfondi semitrasparenti. Per ottenere questo effetto non è sempre necessario ricorrere alle PNG trasparenti ma è possibile anche tramite i fogli di stile.
La proprietà che andremo ad utilizzare è l&#8217;opacità, che è possibile impostare tramite il parametro opacity: 0.5. Il numero, variabile da 0.0 a 1.0, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cescopag.com/wp-content/uploads/2009/10/semitrasparenza.jpg" alt="Esempio" title="Esempio" width="157" height="160" class="alignright size-full wp-image-137" />Una delle ultime tendenze del web è l&#8217;utilizzo di sfondi semitrasparenti. Per ottenere questo effetto non è sempre necessario ricorrere alle PNG trasparenti ma è possibile anche tramite i fogli di stile.</p>
<p>La proprietà che andremo ad utilizzare è l&#8217;opacità, che è possibile impostare tramite il parametro <code>opacity: 0.5</code>. Il numero, variabile da 0.0 a 1.0, indica il grado di opacità, dove lo zero corrisponde alla trasparenza e l&#8217;uno alla piena visibilità. Per impostare quindi uno sfondo semitrasparente è possibile utilizzare questa proprietà associata ad un colore di fondo. Non possiamo tuttavia utilizzarla direttamente nell&#8217;elemento che vogliamo rendere semitrasparente, perché l&#8217;opacità influisce direttamente anche sul testo, a scapito della leggibilità. Per risolvere il problema sono sufficienti un paio di DIV in più.</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-2.html" class="linkdemo" target="_blank">Demo</a></p>
<p><span id="more-112"></span></p>
<p>Ipotizziamo di avere un elemento, chiamato &quot;<em>box</em>&quot;:</p>
<pre>&lt;div id=&quot;box&quot;&gt;
   Lorem ipsum dolor sit amet consectetuer...
&lt;/div&gt;</pre>
<p>Per il nostro esempio è necessario aggiungere due div:</p>
<pre>&lt;div id=&quot;box&quot;&gt;
   &lt;div class=&quot;box-bg&quot;&gt;&lt;/div&gt;
   &lt;div class=&quot;box-content&quot;&gt;
      Lorem ipsum dolor sit amet consectetuer...
   &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Come potete intuire dal nome, il primo servirà da sfondo per il secondo. In questo modo possiamo utilizzare l&#8217;opacità solo su quest&#8217;ultimo, senza andare ad intaccare il contenuto.</p>
<p>Passiamo al foglio di stile. Come prima cosa, impostiamo un CSS di base:</p>
<pre>#box {
   width:600px;
}</pre>
<pre>.box-bg {
   background:#000;
   opacity:0.5;
}</pre>
<pre>.box-content {
   padding:10px;
}</pre>
<p>Al <em>box</em> assegnamo soltanto ulna larghezza, mentre al <em>box-content </em>assegnamo un <em>padding </em>di 10px. Allo sfondo invece assegnamo un colore (in questo caso nero) e un&#8217;opacità al 50% (0.5 su scala da 0 a 1).</p>
<p>Ora però dobbiamo dire allo sfondo di posizionarsi sotto al <em>box-content</em> e di assumere le dimensioni grandi quanto l&#8217;intero box. Per farlo ricorriamo ai posizionamenti assoluti e alle dimensioni in percentuale. Ma procediamo con ordine.</p>
<p>Innanzitutto dobbiamo dichiarare <code>position:relative </code>il nostro box, cosicché gli elementi al suo interno si posizionino IN RELAZIONE al div stesso:</p>
<pre>#box {
   width:600px;
   position:relative;
}</pre>
<p>allo sfondo invece dobbiamo dire di posizionarsi indipendentemente sotto al contenuto, perciò dobbiamo dichiararlo <code>position:absolute</code>, mentre per fare in modo che sia grande quanto il box stesso imposto larghezza e altezza al 100%:</p>
<pre>.box-bg {
   background:#000;
   opacity:0.5;
   position:absolute;
   width:100%;
   height:100%;
}</pre>
<p>Ora non resta che posizionare anche il contenuto, semplicemente dichiarandolo <code>position:relative</code>. Gli elementi posizionati infatti &quot;vincono&quot; rispetto a quelli non posizionati e di default vengono visualizzati sopra questi ultimi. In questo modo invece il contenuto sarà sopra allo sfondo:</p>
<pre>.box-content {
   padding:10px;
   position:relative;
}</pre>
<p>Se visualizziamo l&#8217;esempio con un browser moderno (<em>ie7, firefox, safari</em>) vediamo l&#8217;effetto desiderato (ho inserito uno sfondo per contrasto):</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-1.html" target="_blank" class="linkdemo">Esempio 1</a></p>
<p>Naturalmente il problema sorge con IE. Innanzitutto la proprietà opacity viene ignorata, fortunatamente però esiste una proprietà analoga che fa uso del filtro Alpha di Internet Explorer <code>filter:alpha(opacity:50)</code>. In questo caso l&#8217;opacità viene indicata da 0 a 100.</p>
<p>In secondo luogo in IE6 la proprietà <em>height:100%</em> non viene letta correttamente. Anche in questo caso una feature specifica di IE ci permette di simularne il comportamento. Possiamo infatti utilizzare la funzione <em>expression</em> che permette di eseguire calcoli stile javascript all&#8217;interno del css:</p>
<pre>height:expression(document.getElementById(&quot;box&quot;).offsetHeight);</pre>
<p>Come si può facilmente intuire questa imposta l&#8217;altezza dello sfondo uguale all&#8217;altezza esterna (<em>offsetHeight</em>) del box principale ( <em>document.getELementById(&quot;box&quot;)</em> ).</p>
<p>Il nostro CSS diventa quindi:</p>
<pre>#box {
   width:600px;
   position:relative;
}

.box-bg {
   background:#000;
   opacity:0.5;   filter:alpha(opacity=50);
   position:absolute;
   width:100%;
   height:100%;}

.box-content {
   padding:10px;
   position:relative;
}

* html .box-bg {   height:expression(document.getElementById(&quot;box&quot;).offsetHeight);
}</pre>
<p>il prefisso &quot;<em>* html </em>&quot; serve per far sì che quella proprietà venga utilizzata solo da IE 6, in quanto per i browser più recenti non esiste un elemento qualsiasi (*) padre dell&#8217;elemento <em>html</em>.</p>
<p>Ora quindi possiamo visionare l&#8217;esempio corretto fino a IE 6:</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-2.html" target="_blank" class="linkdemo">Esempio 2</a></p>
<p>Come ulteriore esempio ho utilizzato un&#8217;immagine al posto del colore, creando quindi un doppio sfondo:</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-3.html" target="_blank" class="linkdemo">Esempio 3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/10/sfondi-semitrasparenti-in-css/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PNG Fix fai-da-te</title>
		<link>http://www.cescopag.com/2008/12/png-fix-fai-da-te/</link>
		<comments>http://www.cescopag.com/2008/12/png-fix-fai-da-te/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 19:05:59 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[png]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=82</guid>
		<description><![CDATA[Il formato grafico PNG è estremamente interessante. La possibilità offerta dal supporto alle trasparenze è sicuramente la caratteristica più utile. Purtroppo solo gli ultimi browser supportano questa proprietà, e in particolare soltanto a partire da Internet Explorer 7 per quanto riguarda il browser di Microsoft.
Esiste comunque la possibilità di abilitare le trasparenze PNG anche per [...]]]></description>
			<content:encoded><![CDATA[<p>Il formato grafico PNG è estremamente interessante. La possibilità offerta dal supporto alle trasparenze è sicuramente la caratteristica più utile. Purtroppo solo gli ultimi browser supportano questa proprietà, e in particolare soltanto a partire da Internet Explorer 7 per quanto riguarda il browser di Microsoft.</p>
<p>Esiste comunque la possibilità di abilitare le trasparenze PNG anche per Internet Explorer 6 e precedenti attraverso vari plugin basati su javascript. In certe occasioni però l&#8217;effetto potrebbe servirci per solo un&#8217;immagine ed andare ad aggiungere javascript per così poco può essere superfluo.</p>
<p>In realtà tramite CSS e commenti condizionali possiamo intervenire utilizzando le stesse tecniche utilizzate dagli script javascript disponibili. E&#8217; infatti possibile utilizzare i filtri inclusi in IE, in particolare &quot;AlphaImageLoader&quot;, per ottenere il medesimo effetto.</p>
<p><span id="more-82"></span></p>
<p>Ma ipotizziamo di voler utilizzare uno sfondo semitrasparente per l&#8217;header di un sito. Il codice CSS normale, che farà uso del PNG, sarà una cosa del tipo:</p>
<pre>&lt;style type=&quot;text/css&quot;&gt;
#header {
   width:600px;
   height:100px;
   background:url(header.png);
}
&lt;/style&gt;</pre>
<p>Se andiamo a verificare con Internet Explorer 6 vedremmo però, al posto della trasparenza del PNG, uno sgradevole color grigio. La prima cosa da fare quindi è introdurre un commento condizionale per poter intervenire solo per i browser precedenti a IE7:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
   /* qui ci va l'hack */
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>All&#8217;interno andiamo quindi a modificare lo sfondo dell&#8217;header, rimuovendo l&#8217;immagine:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
#header {
   background:none;
}
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>Ora possiamo utilizzare il filtro di IE per reintrodurre l&#8217;immagine:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
#header {
   background:none;
   filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src = 'header.png',  sizingMethod = 'scale');
}
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>Come potete vedere passiamo al filtro due parametri: il primo è il sorgente dell&#8217;immagine, il secondo è il &quot;sizingMethod&quot;, e cioè come l&#8217;immagine viene applicata all&#8217;elemento. Con l&#8217;impostazione &quot;scale&quot; l&#8217;immagine viene stirata fino a raggiungere le dimensioni dell&#8217;elemento a cui è applicata, mentre con &quot;Crop&quot; viene tagliata se supera le dimensioni dell&#8217;elemento.</p>
<p>Rispetto alla gestione normale degli sfondi non abbiamo possibilità di gestire né il posizionamento dello sfondo (background-position) né la sua ripetizione in verticale o orizzontale (background-repeat). Non è quindi possibile avere comportamenti particolarmente avanzati, tuttavia l&#8217;effetto è più che sufficiente per tecniche di image-replacement o per sfondi di elementi dalle dimensioni ben precise.</p>
<p>Come ultima cosa è però necessario ripristinare la corretta funzionalità dei link perché applicando i filtri Internet Explorer va a porre l&#8217;immagine PNG sopra agli elementi interattivi del sito, inibendo quindi la possibilità di clickare. Per sistemare il tutto però è sufficiente aggiungere la proprietà &quot;position:relative&quot; per portare il link sopra lo sfondo e quindi per renderlo nuovamente clickabile. Per farlo modifichiamo il CSS come segue:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
#header {
   background:none;
   filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src = 'header.png',  sizingMethod = 'scale');
}</pre>
<pre>#header a {
   position:relative;
}
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>Come vedete l&#8217;effetto è semplice da ottenere anche senza l&#8217;ausilio di apposite librerie e nel caso di una o due immagini può essere più comodo gestirle manualmente, risparmiando un po&#8217; di bytes e di pesantezza di caricamento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/12/png-fix-fai-da-te/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Footer sempre in fondo</title>
		<link>http://www.cescopag.com/2008/11/footer-sempre-in-fondo/</link>
		<comments>http://www.cescopag.com/2008/11/footer-sempre-in-fondo/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 20:56:59 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[trick]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/2008/11/footer-sempre-in-fondo/</guid>
		<description><![CDATA[Il footer, per definizione, è quell&#8217;elemento che chiude la pagina e si pone alla fine dei contenuti. Quando però il contenuto è più corto dello spazio disponibile  a video &#8211; il viewport &#8211; il footer si &#8220;solleva&#8221; dal bordo inferiore della pagina, lasciando uno spazio più o meno grande al di sotto di esso. [...]]]></description>
			<content:encoded><![CDATA[<p>Il footer, per definizione, è quell&#8217;elemento che chiude la pagina e si pone alla fine dei contenuti. Quando però il contenuto è più corto dello spazio disponibile  a video &#8211; il <em>viewport</em> &#8211; il footer si &#8220;solleva&#8221; dal bordo inferiore della pagina, lasciando uno spazio più o meno grande al di sotto di esso. L&#8217;effetto in certi casi può essere poco gradevole, dando l&#8217;impressione di un layout &#8220;tagliato a metà&#8221;. Potete vedere <a href="http://www.cescopag.com/demos/footer/inizio.html">qui un esempio</a>&#8230;<br />
<span id="more-68"></span><br />
Il footer dovrebbe invece disporsi allineato al bordo inferiore della pagina nel caso citato, mentre dovrebbe posizionarsi in fondo al contenuto, oltre lo scroll, se questo è sufficientemente lungo da riempire tutto il viewport. Per farvi un&#8217;idea date un&#8217;occhiata <a href="http://www.cescopag.com/demos/footer/fine.html" target="_blank">qui</a> e <a href="http://www.cescopag.com/demos/footer/fine_lungo.html" target="_blank">qui</a>.</p>
<p>Una soluzione valida, compatibile con tutti i moderni browser, è quella di utilizzare la proprietà css <span style="font-style: italic;">min-height</span> per imporre l&#8217;altezza minima del contenuto tale da farlo ampliare fino a riempire con il viewport. </p>
<p>Ma procediamo con ordine. Il layout standard potrebbe essere questo:</p>
<pre>&lt;body&gt;
&nbsp;&nbsp;&nbsp; &lt;div id="<span style="font-weight: bold;">container</span>"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &lt;div id="header"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; &lt;div id="content"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &lt;div id="<span style="font-weight: bold;">footer</span>"&gt;
        Footer
&nbsp;&nbsp;&nbsp; &lt;/div&gt;
&lt;/body&gt;
</pre>
<p>Tramite css impostiamo l&#8217;altezza minima del <span style="font-style: italic;">container</span> al 100% in modo da farlo occupare tutto lo spazio verticale disponibile. L&#8217;altezza viene però calcolata in base a quella degli elementi contenenti il div, quindi dobbiamo impostare al 100% sia il tag <span style="font-style: italic;">body</span> che il tag <span style="font-style: italic;">html</span>:</p>
<pre>html, body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;
}</pre>
<p>In questo modo però il footer andrà a posizionarsi fuori dall&#8217;area visibile (oltre il 100%, per intendersi): occorre quindi recuperare lo spazio necessario. Per farlo utilizziamo un semplice margine negativo pari all&#8217;altezza voluta del footer (in pixel o em, come preferite): </p>
<pre>html, body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;
    <span style="font-weight: bold;">margin-bottom:-100px;</span>
}</pre>
<p>Ora però dobbiamo impedire al contenuto di finire sotto al footer che abbiamo portato in primo piano. Aggiungiamo perciò un padding inferiore al content in modo da distanziarlo a sufficienza: è importante quindi che abbia almeno lo stesso valore. Se vogliamo aggiungere un ulteriore spazio basta addizionarlo: (ad es. 110px per un padding inferiore apparente di 10px).</p>
<pre>html, body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;
    margin-bottom:-<span style="font-weight: bold;">100px</span>;
}

#content {
    <span style="font-weight: bold;">padding-bottom:100px</span>;
}
</pre>
<p>Se provate la pagina con un browser come Firefox o Safari noterete che abbiamo già ottenuto l&#8217;effetto desiderato. La proprietà <span style="font-style: italic;">min-height</span> però non è supportata da Internet Explorer 6. Possiamo risolvere facilmente con il noto l&#8217;hack che utilizza la proprietà <span style="font-style: italic;">!important</span>. Aggiorniamo quindi il css ed abbiamo finito:</p>
<pre>#body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;<br style="font-weight: bold;" /><span style="font-weight: bold;">    height:auto !important;</span> /*per gli altri browser*/<br style="font-weight: bold;" /><span style="font-weight: bold;">    height:100%;</span> /*per IE 6*/
    margin-bottom:-100px;
}

#content {
    padding-bottom:100px;
}</pre>
<p>Ecco quindi <a href="http://www.cescopag.com/demos/footer/fine.html">l&#8217;esempio finito</a> con <a href="http://www.cescopag.com/demos/footer/fine.html">poco</a> o <a href="http://www.cescopag.com/demos/footer/fine_lungo.html">molto contenuto</a>. Potete in alternativa <a href="http://www.cescopag.com/demos/footer/footer.zip">scaricare lo zip</a> con i sorgenti.<br />
Ho aggiunto qualche altra istruzione per evidenziare header e footer, ma il css di base è lo stesso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/11/footer-sempre-in-fondo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

