Laboratorio di Tecnologie Web HTML: Immagini Dott. Stefano Burigat www.dimi.uniud.it/burigat Aggiungere immagini E' possibile inserire immagini all'interno delle pagine web in due modi: come contenuto inline o come immagini di background. La seconda modalità dovrebbe essere utilizzata in tutti i casi in cui dobbiamo inserire immagini a scopo decorativo piuttosto che come contenuto vero e proprio delle pagine e dovrebbe essere implementata tramite l'utilizzo di CSS (ciò consente di rendere il codice html più pulito e facilitare la modifica dello stile delle pagine; ne parleremo più avanti). Per poter essere riconosciute dai browser e visualizzate in una pagina web, le immagini dovrebbero essere salvate nei formati raster GIF, JPEG, PNG oppure nel formato vettoriale SVG (jpeg è preferibile per immagini complesse come le foto, svg o png sono preferibili per immagini come loghi o simili, svg non è supportato da IE8 e precedenti). E' quindi necessario convertire eventuali immagini salvate in altri formati. Se si vuole invece mantenere tali immagini nel loro formato originario e fornirle all'utente, si può rendere l'immagine accessibile tramite link, come nell'esempio seguente. In tal caso, l'immagine viene scaricata come file sul computer dell'utente o aperta all'interno del browser se questo è dotato di apposito plugin per la sua visualizzazione. <!DOCTYPE html> <html> <head> <title> Tecnologie web </title> </head> <body> <article> <h1>HTML5</h1> <p>L'HTML5 è un <a href="http://it.wikipedia.org/wiki/Linguaggio_di_markup">lingu aggio di markup</a> per la strutturazione delle pagine web...</p> <aside> <p><a href="tree.xcf">Scarica mappa del sito</a></p> </aside> </article> </body> </html> L'elemento <img> L'elemento che viene utilizzato per inserire immagini inline è l'elemento vuoto <img>. Tale elemento è un cosiddetto elemento rimpiazzato (replaced) in quanto le immagini non vengono specificate direttamente nel codice sorgente come contenuto (come succede per il testo) ma ne viene inserito un riferimento tramite l'utilizzo dell'attributo “src” (la sintassi per la specifica del riferimento è la stessa utilizzata per i link). Sarà poi il browser ad occuparsi di sostituire il riferimento con l'immagine vera e propria quando dovrà visualizzare la pagina. Normalmente, i riferimenti sono relativi ad immagini presenti sullo stesso server del sito ma è possibile anche creare riferimenti ad immagini presenti su altri siti utilizzando un URL assoluto (anche se in questo caso è necessario avere il permesso per poterlo fare). Poichè <img> è un elemento inline, esso non causa un'interruzione di riga e quindi le immagini, di default, vengono inserite all'interno del flusso del testo, con il loro margine inferiore allineato con la baseline del testo (la linea di base, o baseline, è la linea sulla quale la maggior parte delle lettere si allineano verticalmente ed oltre la quale si estendono i tratti discendenti). Se si vuole posizionare un'immagine in modo diverso o modificarne aspetti come i bordi è necessario utilizzare CSS. L'esempio seguente inserisce due immagini all'interno di un paragrafo di testo. <!DOCTYPE html> <html> <head> <title> Tecnologie web </title> </head> <body> <article> <h1>HTML5</h1> <p>L'HTML5 <img src="imgs/html5.png" alt="" /> è un linguaggio di markup per la strutturazione delle pagine web mentre CSS <img src="imgs/css3.png" alt="" /> è un linguaggio usato per definire la formattazione delle pagine web.</p> <aside> <p><a href="glossario.html">Vai al glossario</a></p> </aside> </article> </body> </html> Quando il browser incontra un elemento <img>, effettua una richiesta al server per poter scaricare il file. Ciò implica che in particolari situazioni (di solito, quando si sta accedendo al sito tramite una connessione lenta) l'utente si accorga del caricamento progressivo delle risorse. Per ovviare a tale problema è consigliabile evitare di riempire i siti di troppe immagini o di immagini troppo grandi. Inoltre, se si vuole visualizzare la stessa immagine più volte, anche in pagine differenti, si dovrebbe utilizzare sempre link allo stesso file sul server (e non link a diverse copie della stessa immagine) in modo che il browser possa sfruttare il caching delle immagini senza doverne scaricare copie multiple. Oltre all'attributo <src>, è obbligatorio inserire all'interno dell'elemento <img> anche l'attributo “alt” che serve a fornire una breve descrizione dell'immagine nei casi in cui l'immagine non possa essere vista (ad esempio, per accessi tramite screen reader, quando la visualizzazione delle immagini è disabilitata, nel caso in cui l'immagine non sia disponibile, quando il sito viene analizzato da un motore di ricerca). Se l'immagine non aggiunge nulla di significativo al contenuto testuale, è preferibile lasciare vuoto il valore dell'attributo “alt” come è stato fatto nell'esempio precedente (notate che non ci deve essere alcuno spazio all'interno delle virgolette). Tenete presente che il modo in cui viene gestito l'attributo “alt” quando l'immagine non è disponibile non è coerente tra i diversi browser. Ad esempio, Chrome e Safari visualizza un'icona di immagine assente, Internet Explorer un'icona accompagnata dal valore dell'attributo, Firefox solo il valore dell'attributo. Questo diverso comportamento può creare effetti non voluti (soprattutto nel caso di Firefox in cui il testo dell'attributo si mescola con il testo del contenuto). In certi casi, ad esempio per quanto riguarda diagrammi o grafici, ci potrebbe essere la necessità di associare una descrizione più lunga di quanto fornito normalmente tramite l'attributo “alt”. Nelle versioni di HTML precedenti alla 5, esisteva l'attributo “longdesc” che poteva essere utilizzato a tale scopo. In HTML5, si può usare l'elemento <figcaption> (insieme a <figure>) per fornire tali informazioni ma la soluzione migliore è quella di inserire tutte le informazioni che servono direttamente nel contenuto testuale della pagina (o, al limite, creare un link ad un documento descrittivo). Al link http://webaim.org/techniques/alttext/ potete trovare una discussione approfondita su come è meglio utilizzare l'attributo “alt” in funzione del contenuto e della funzione della relativa immagine. L'elemento <img> supporta anche l'attributo “title” che permette di inserire del testo che verrà visualizzato in un tooltip quando l'utente passerà con il puntatore del mouse sopra l'immagine. <!DOCTYPE html> <html> <head> <title> Tecnologie web </title> </head> <body> <article> <h1>HTML5</h1> <p>L'HTML5 <img src="imgs/html5.png" alt="" title="Logo ufficiale di HTML5" /> è un linguaggio di markup per la strutturazione delle pagine web ...</p> </article> </body> </html> Dimensioni di un'immagine Di default, un browser visualizza un'immagine con le sue dimensioni originali. Se un'immagine è di 128 per 128 pixel, quello sarà lo spazio che l'immagine occuperà nella finestra del browser. E' però possibile utilizzare due attributi dell'elemento <img>, “width” ed “height”, per specificare quanto dovrà occupare l'immagine a schermo rispettivamente in larghezza ed altezza. Utilizzare correttamente tali attributi può portare ad un caricamento ottimale di una pagina. Questo a causa del modo in cui i browser creano le pagine: come detto in precedenza, quando un browser incontra un elemento <img> fa una richiesta al server per la relativa immagine e intanto va avanti a visualizzare il resto del contenuto; quando poi l'immagine arriva, il browser può calcolare la dimensione dell'immagine ma deve ridisegnare la pagina per inserire tale contenuto e spostare tutto ciò che appariva in seguito (creando problemi all'utente che nel frattempo aveva iniziato a leggere il contenuto). Se invece vengono specificati “width” ed “height”, un browser sa già quanto spazio deve riservare all'immagine e non ha quindi bisogno di ridisegnare la pagina quando l'immagine arriva dal server. Il modo corretto di specificare “width” ed “height” è quello di inserire i valori esatti dell'immagine originale. Sebbene tali attributi possano essere utilizzati per ridimensionare un'immagine, ad esempio per realizzare delle miniature delle immagini, ciò non è consigliabile. Se l'immagine originale è più piccola dei valori inseriti, il risultato può essere un'immagine sfocata o pixellosa. Se l'immagine originale è più grande delle dimensioni inserite, si spreca tempo e banda per scaricare dati che non verranno utilizzati. In entrambi i casi, inoltre, il browser deve effettuare delle operazioni costose dal punto di vista computazionale di scalatura delle immagini. Se poi non si mantengono le proporzioni dell'immagine originale, quella visualizzata risulta deformata. Se necessario, è quindi preferibile ridimensionare un'immagine esternamente con appositi strumenti di elaborazione delle immagini e poi specificare nel codice html le dimensioni corrette. <!DOCTYPE html> <html> <head> <title> Tecnologie web </title> </head> <body> <article> <h1>HTML5</h1> <p>Immagine originale: <img src="imgs/html5.png" alt="logo HTML5" width="128" height="128"/></p> <p>Immagine rimpicciolita: <img src="imgs/html5.png" alt="logo HTML5" width="64" height="64"/></p> <p>Immagine ingrandita: <img src="imgs/html5.png" alt="logo HTML5" width="256" height="256"/></p> <p>Immagine deformata: <img src="imgs/html5.png" alt="logo HTML5" width="256" height="128"/></p> </article> </body> </html> NOTA: le indicazioni del paragrafo precedente sull'effetto negativo di specificare dimensioni diverse da quelle dell'immagine originale non si applicano (ad eccezione della deformazione) al caso delle immagini svg in quanto il contenuto di tali immagini è specificato in modo matematico e ciò porta a poterne variare le dimensioni senza compromissione della qualità. NOTA: l'utilizzo di width ed height è appropriato se si sta creando un'unica versione di una pagina con immagini di dimensione fissa ma non lo è nel caso in cui si voglia creare più versioni di una pagina (ad esempio, per dispositivi diversi) in cui la dimensione delle immagini può essere diversa. Immagini come link Un'immagine può essere trasformata in link semplicemente includendo l'elemento <img> all'interno di un elemento <a> che specifica la risorsa a cui il browser dovrà accedere quando l'utente cliccherà sull'immagine. <!DOCTYPE html> <html> <head> <title> Tecnologie web </title> </head> <body> <article> <h1>HTML5</h1> <p>L'HTML5 <a href="http://it.wikipedia.org/wiki/HTML5"><img src="imgs/html5.png" alt="Link alla pagina Wikipedia su HTML5" title="Logo ufficiale di HTML5" /></a> è un linguaggio di markup per la strutturazione delle pagine web ...</p> </article> </body> </html> E' anche possibile associare dei link a specifiche parti di un'immagine, creando le cosiddette “image maps”. Per far ciò sono necessari diversi diversi passaggi ed elementi. Per prima cosa bisogna creare l'image map utilizzando l'elemento <map>. L'unica cosa che è necessario specificare per tale elemento è un nome che identifichi univocamente l'image map. Ciò si effettua utilizzando gli attributi “id” e “name”, entrambi i quali devono avere come valore il nome univoco scelto (sebbene solo l'attributo “name” sia obbligatorio in HTML5, tale duplicazione è necessaria per mantenere la compatibilità con tutti i browser). <map id="mappa01" name="mappa01"></map> All'interno dell'elemento <map> vanno inseriti tanti elementi vuoti <area> quante sono le aree cliccabili dell'immagine. Tali aree non dovrebbero sovrapporsi (se si sovrappongono, ha la precedenza l'area definita per prima). Attraverso l'elemento <area>, vengono specificati tre attributi fondamentali: “href” determina la risorsa a cui si accede quando si clicca su quell'area dell'immagine, “shape” determina il tipo di forma dell'area, “coords” specifica le esatte dimensioni dell'area. Inoltre, così come <img> anche <area> richiede la presenza dell'attributo “alt” per specificare del testo alternativo all'area dell'immagine. L'esempio seguente mostra la definizione di un'area rettangolare. <area shape="rect" coords="135,304,220,370" alt="Area rettangolare" href="http://it.wikipedia.org/wiki/Rettangolo" /> L'attributo “shape” supporta tre tipi di forme, aree rettangolari (valore rect, come nell'esempio), aree circolari (valore circle) e poligoni generici (valore poly). Per capire come vanno inserite le coordinate di tali aree bisogna considerare che l'angolo in alto a sinistra di un'immagine ha coordinate (0,0) mentre l'angolo in basso a destra ha coordinate (larghezza immagine, altezza immagine). La coordinata x quindi cresce da sinistra verso destra e quella y dall'alto verso il basso. Come mostrato nell'esempio precedente le coordinate vengono inserite come una lista di numeri separati da virgole. Per le aree circolari devono essere specificati la coordinata x del centro, la coordinata y del centro ed il raggio del cerchio. Per i rettangoli, è sufficiente inserire le coordinate x ed y dell'angolo in alto a sinistra seguite dalle coordinate x ed y del punto in basso a destra. Per i poligoni generici, bisogna inserire la sequenza di coordinate x ed y di ogni punto del poligono. Una volta specificate le aree cliccabili dell'immagine, bisogna aggiungere l'attributo “usemap” all'elemento <img> che specifica l'immagine a cui associare l'image map. Il valore di tale attributo deve essere uguale al valore dell'attributo “name” dell'image map preceduto dal simbolo #. <!DOCTYPE html> <html> <head> <title> Tecnologie web </title> </head> <body> <article> <h1>Mappa cliccabile dell'Italia</h1> <p> <img src="imgs/italia.jpg" width="400" height="497" usemap="#mappa01" /> <map id="mappa01" name="mappa01"> <area shape="poly" coords="105,129,102,132,116,148,108,155,87,220,153,225,157,214 ,164,209,169,200,171,187,177,183,171,175,179,167,160,154,162,1 47,154,142,144,150,130,147" alt="Toscana" href="http://it.wikipedia.org/wiki/Toscana" /> <area shape="rect" coords="135,304,220,370" alt="Rettangolo" href="http://it.wikipedia.org/wiki/Rettangolo" /> <area shape="circle" coords="315,99,34" alt="Cerchio" href="http://it.wikipedia.org/wiki/Cerchio" /> </map> </p> </article> </body> </html>