Guida html

I Frames e L'iFrame

Comporre una pagina in frame

I frame (“riquadri”) comparvero per la prima volta con Netscape Navigator 2: si tratta della possibilità di suddividere una medesima finestra del browser in vari riquadri indipendenti.

Questa soluzione all’epoca si rivelò un successo, dal momento che permetteva notevoli vantaggi:

  • Fino a qualche tempo fa la velocità di navigazione era ben poca cosa, e si navigava con modem analogici molto lenti (anche da 14.4 kbs): i frame hanno l’indubbio vantaggio di non costringere a ricaricare tutta quanta la pagina, accelerando così la navigazione dell’utente all’interno di un sito web. D’altro canto il fatto che solo una parte del contenuto sia ricaricata fa risparmiare banda anche dal punto di vista del server che deve erogare le pagine
  • Per quel che riguarda i webmaster, i frame hanno la caratteristica di utilizzare una struttura che consente di non ripetere le parti comuni nelle varie pagine di un sito, dal momento che il contenuto della pagina (per sua natura) è organizzato “a zone”
  • Il fatto di poter mantenere fisso su un lato del monitor il menu di navigazione e far scorrere sull’altro lato il contenuto piace a molti utenti, soprattutto quando la risoluzione del monitor è bassa (800 x 600 o 640x480, magari su un monitor da 15’’)

Tutte queste caratteristiche hanno causato un vero e proprio boom dei frames, tanto che subito dopo l’invenzione della Netscape, anche Microsoft si trovò a “copiare” la possibilità di strutturare le pagine in questo modo; in seguito (con l’HTML 4) i frames divennero una specifica ufficiale del W3C.

Struttura di un frameset

Per utilizzare i frame, è necessario creare una pagina che contenga la dichiarazione della struttura che vogliamo utilizzare. Vediamo subito il codice:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//IT" "http://www.w3.org/TR/html4/frameset.dtd">

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <title>isolajava</title>
</head>

<frameset rows="50%,50%" cols="50%, 50%">
 <frame src="prima.html">
 <frame src="seconda.html">
 <frame src="terza.html">
 <frame src="quarta.html">
 
 <noframes>
  <p>Qui può essere indicato il link a
   <a href="senzaFrame.html"> una versione del sito</a>
   che non utilizzi un layout a frame
  </p>
 </noframes>

</frameset>
</html>
 

L’esempio completo si trova qui.

Come vi sarete accorti, rispetto alle pagine che abbiamo studiato finora cambiano alcune cose. In primo luogo cambia il doctype, cioè il tipo di documento di riferimento.

All’inizio del documento al posto di questa riga:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//IT">

compare ora infatti questa dicitura:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//IT" "http://www.w3.org/TR/html4/frameset.dtd">

stiamo indicando semplicemente al browser che facciamo riferimento alle specifiche che servono per regolare il comportamento dei frame.

Avrete notato inoltre che scompare il tag <body> e al suo posto troviamo il tag <frameset> (“set di riquadri”), che ci permette di indicare come devono essere indicati i frames all’interno della pagina

Il tag <frameset> ha sostanzialmente due importanti attributi: rows e cols:

  • rows permette di specificare il numero e la grandezza delle righe, nel caso in cui venga omesso, significa che ci troviamo di fronte a una struttura a colonne . Ad esempio:

    <frameset cols="33%, 33%,*">

  • cols permette di specificare il numero e la grandezza delle colonne e, nel caso in cui venga omesso significa che ci troviamo di fronte una struttura a righe

    <frameset rows="33%, 33%,*">

Nell’indicare la grandezza di ciascuna riga (o colonna) possiamo poi lasciare che una o più righe si auto-dimensionino, occupando tutto lo spazio che rimane, in questo caso utilizzeremo l’asterisco (“wild card”); normalmente invece potremo esprimere la grandezza dei riquadri secondo uno dei seguenti sistemi di misura (da scegliere a nostra discrezione):

dimensione fissa Questa sintassi crea un frameset di 2 righe con 3 colonne ciascuna, per un totale di 6 riquadri:

<frameset rows="150,*" cols="100,200,*">

L’altezza della 1a riga è di 150 pixel, mentre la seconda si adatta al resto della pagina. Le tre colonne sono larghe rispettivamente: 100 pixel, 200 pixel, e la terza colonna si adatta al resto della pagina

percentuale Questa sintassi crea un frameset che si adatta alla risoluzione. La grandezza dei riquadri è espressa in percentuale:

<frameset rows="20%,80%" cols="25%,25%,50%">

come si può vedere la prima riga occupa il 20% dell’altezza, la seconda il rimanente 80%.

Le 3 colonne si dividono la larghezza: la prima colonna occupa il 25%, la seconda nuovamente il 25%, la terza il 50% dello spazio

proporzionale In questo caso la ripartizione è proporzionale:

<frameset rows="1*,3*" cols="3*,2*,1*">

  • per ciò che riguarda le righe: l’altezza viene suddivisa in 4 parti (1+3); la prima riga ne occupa 1 parte e la seconda riga ne occupa 3
  • per ciò che riguarda le colonne: l’altezza viene suddivisa in 6 parti (3+2+1); la prima colonna occupa 3 parti, la seconda riga ne occupa 2 e la terza 1

Una volta creata la nostra griglia con il tag <frameset>, incrociando le righe e le colonne, dobbiamo specificare dove si trova il file di origine di ciascun frame. Possiamo farlo con la sintassi:

<frame src="prima.html">

come si può vedere l’origine di ciascun frame è un documento HTML standard (come quelli che abbiamo analizzato finora): avrà dunque la sua dichiarazione di documento, la sua <head> e il suo <body>.

Se le dimensioni del riquadro non sono sufficienti a mostrare il documento nella sua interezza, il frame avrà delle barre di scorrimento, a meno che non sia stato esplicitamente specificato il contrario negli attributi (che vedremo tra breve).

Per visualizzare il codice HTML di ciascun frame è sufficiente andare nel riquadro desiderato e poi digitare il tasto destro del mouse. Quindi:

  • Con Internet Explorer:
    selezionare HTML
  • Con Mozilla:
    selezionare this frame > view frame source

È possibile anche individuare un frame in modo più preciso, assegnandogli un nome:

<frame id=”primoRiquadro” name=”primoRiquadro” src="prima.html">

la sintassi corretta per dare un nome a un frame dovrebbe essere:

id=”primoRiquadro”

tuttavia per questioni di retro-compatibilità (con Netscape 4) è oramai entrato nell’uso utilizzare anche name=”primoRiquadro”.

Frameset annidati

È possibile annidare diversi frames l’uno dentro l’altro. In questo caso, al posto di uno dei tag <frame> è sufficiente includere le indicazioni del nuovo frameset. Così:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//IT" "http://www.w3.org/TR/html4/frameset.dtd">

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <title>isolajava.com</title>
</head>
 <frameset rows="15%,70%,15%">
  <frame src="11.html">

   <frameset cols="25%,50%,25%">
    <frame src="21.html">
    <frame src="22.html">
    <frame src="23.html">
   </frameset>
 
  <frame src="12.html">

 <noframes>
 <p>Qui può essere indicato il link a <a href="senzaFrame.html"> una versione del sito</a> che non
utilizzi un layout a frame</p>  </noframes>
</frameset>
</html>
 

L’esempio completo si trova qui.


Attributi dei frames per la visualizzazione

Il tag frameset non ha (secondo le specifiche ufficiali) attributi per la visualizzazione. Alcuni attributi tuttavia sono entrati nell’uso e sono correttamente supportati dai browser attuali:

<frameset frameborder="no" cols="25%,75%">

L’attributo frameborder (di default impostato a “yes”) permette di specificare se nel frameset devono essere presenti i bordi.

L'esempio è qui

<frameset framespacing="20" border=”20” cols="25%,75%">

framespacing funziona solo con Internet Explorer e permette di impostare lo spazio tra un frame e l’altro. Di fatto equivale all’attributo border, che permette di specificare lo spessore dei bordi in pixel.

Per mantenere la compatibilità con Internet Explorer 4 (che non legge l’attributo border), di solito si specificano sia il framespacing, sia il border.
L'esempio è qui

<frameset border="10" framespacing="10" bordercolor=”#FF0000” cols="25%,75%">

bordercolor permette di specificare il colore dei bordi del frameset.
L'esempio è qui

Attributi dei frame

A differenza degli attributi del tag frameset, che sono dovuti alla convenzione, i seguenti attributi del tag frame sono invece descritti nelle specifiche del W3C e permettono di modificare l’aspetto dei riquadri e il modo in cui l’utente può interagire con essi:

<frame src=”prima.html” scrolling=”no”>
<frame src=”prima.html” scrolling=”auto”>

L’attributo scrolling (di default impostato a “yes”) indica se si vuol consentire all’utente di poter scorrere il frame oppure no.

Nel caso sia impostato a “no”, il frame non ha la barra di scorrimento anche nel caso in cui il contenuto della pagina HTML vado oltre la cornice, come si può vedere nell’esempio.
L'esempio è qui

scrolling può anche essere impostato ad “auto”. In questo caso la barra di scorrimento compare in automatico, ma solo se necessario

<frame src=”prima.html” scrolling=”no”>
<frame src=”prima.html” scrolling=”no” noresize>

noresize impedisce al singolo frame di essere ridimensionato.
L'esempio è qui

Se usato in unione con scrolling=”no”,di fatto “blocca” il contenuto del frame.
L'esempio è qui

Un uso maldestro di questa tecnica potrebbe però impedire all'utente la corretta visualizzazione dei contenuti

<frame src=”prima.html” frameborder=”0”>

frameborder conesente di far apparire o meno i bordi del frame (i valori ammessi sono "0" e "1", ovvero "no" e "yes").

Se frameborder è impostato a “0” i bordi non sono visibili
L'esempio è qui

Attenzione però a come impostate i bordi nei vari frame, dal momento che i bordi di frame adiacenti non sempre vanno d’accordo(provate)

Questo attributo permette di specificare un valore differente da quello impostato nel frameborder del <frameset>

<frame marginwidth="50" marginheight="50" src="prima.html">

marginheight e marginwidth permettono di impostare la distanza erticale (marginheigth) e orizzontale (marginwidth) ra i bordi del frame e il suo contenuto.
L'esempio è qui

Approfondimenti

Ovviamente sarebbe meglio impostare i bordi e gli spazi tra i frame attraverso i CSS. Nella lezione della guida ai fogli di stile dedicata ai bordi con i CSS è spiegato come fare.


I link in un frameset e il tag noframes

In una struttura a frames può apparire difficile caricare il contenuto di un link nella sezione appropriata. Grazie all’attributo target possiamo specificare qual'è la destinazione del link; con questa sintassi siamo dunque in grado di caricare il contenuto di un collegamento nel riquadro che riteniamo più opportuno:

<a href=”paginaDaLinkare.html” target=”nomeDelFrame”>

come si può vedere nell’esempio.

Ci sono poi delle “parole chiave” che ci consentono di ricaricare i link in destinazioni predefinite:

target=”_blank”

Apre il link in una nuova finestra, senza nome
L'esempio è qui

target=”_self”

Apre il link nel frame stesso (è così di default) L'esempio è qui

target=”_parent”

Il documento viene caricato nel frameset precedente a quello corrente (più esattamente nel frame genitore)
L'esempioè qui

Il comportamento di “_parent” è particolarmente evidente in una struttura annidata in cui alcune pagine HTML contengono a loro volta dei frameset, come nell’esempio: in questo caso viene caricato il contenuto del link nel frameset immediatamente precedente alla pagina del link.

target=”_top”

Il documento viene caricato nella finestra originale, cancellando ogni struttura a frame.
L'esempio è qui

(si noti la differenza con “_parent”).

Più esattamente il documento viene caricata o nella parte più alta ("top") della struttura, ed è questo il motivo per cui il frameset stesso viene annullato e sostituito dal contenuto del link.

Può essere noioso specificare per tutti i link il target appropriato. Ci viene in aiuto allora il tag <base> che ci consente di specificare la destinazione dei tutti link in una sola volta. Il tag va inserito nella pagina contenente i link. Ad esempio:

<base target=”_blank”>

a questo indirizzo è possibile visualizzare l’esempio completo.

Abbiamo già incontrato il tag <base> per impostare un percorso predefinito di default. Ovviamente è possibile combinare i due attributi di <base>:

<base href=”http://www.isolajava.com” target=”_blank”>

Questa sintassi indica che l’indirizzo di base per i percorsi della pagina è http://www.isolajava.com e che tutti i link vanno aperti in una nuova pagina.

Il tag noframes

All’interno della dichiarazione del <frameset> abbiamo sempre visto comparire l’elemento <noframes>: questo tag serviva per browser particolarmente obsoleti (come Mosaic 2) che non erano in grado di leggere e visualizzare una struttura frameset. In previsione di situazioni di questo genere è possibile inserire all’interno del tag <noframes> un contenuto appositamente studiato per questa eventualità, ad esempio l’avvertimento che il sito è strutturato a frame, o un contenuto alternativo, oppure una descrizione per i motori di ricerca (come vedremo tra breve).

La struttura è la seguente:

<frameset rows="50%,50%">
  <frame src="prima.html">
  <frame src="seconda.html">

  <noframes>
   <p>Qui può essere indicato il link a
    <A href="senzaFrame.html">una versione del sito<A>
    che non utilizzi un layout a frame,
    oppure un contenuto alternativo,
    o anche una descrizione per i motori di ricerca.
  </p>
  </noframes>
</frameset>
 

È importante capire una volta per tutte come funziona questo genere di tag, dal momento che un tipo di struttura di questo genere ricorre in diverse occasioni nell’HTML: il tag <noscript> e i contenuti alternativi nel caso dell’<iframe> utilizzano infatti gli stessi principi di funzionamento.

I browser obsoleti non sono in grado di interpretare né la struttura di un frameset, né tanto meno il <noframes>: non essendo un tag previsto nelle specifiche rilasciate all’epoca in cui questi browser sono stati costruiti, si tratta infatti di una sintassi del tutto oscura per loro.

Di tutto il codice in questione l’unica parte comprensibile a questo genere di browser è l’HTML standard compreso all’interno del <noframes>: e questo si limitano a leggere.

Sono invece i browser moderni che sanno di dover ignorare il <noframes>, dal momento che il suo contenuto non li riguarda.

C’è da dire che, se tutti i browser odierni sono in grado di interpretare correttamente la struttura di un frameset, viceversa sotto molti punti di vista i motori di ricerca sono paragonabili a browser obsoleti, e non è raro che un sito organizzato a frame sia inserito nell’indice dei motori di ricerca in maniera non corretta: per questo motivo alcuni di essi “catturano” il contenuto del <noframes> come descrizione di un sito.

Quindi per evitare messaggi di questo genere a seguito di una ricerca in rete:

Figura 1. Messaggio del motore di ricerca per pagine senza «noframes»
Messaggio del motore di ricerca per pagine senza «noframes»

è bene utilizzare il tag noframes per indicare la descrizione del sito: in questo modo miglioriamo anche il posizionamento nei motori di ricerca. Ad esempio:

<frameset rows="50%,50%">
  <frame src="prima.html">
  <frame src="seconda.html">

  <noframes>
   <p>Su www.isolajava.com - Approfondimenti sul Web Publishing e articoli per webmaster</p>
  </noframes>
</frameset>


L'iframe

“Iframe” significa “inline frame”: in qualsiasi momento in un documento che non utilizzi una struttura a frame è possibile creare un frame al volo grazie a questo tag.

Possiamo specificare la larghezza e l’altezza del tag, mentre gli attributi di visualizzazione sono gli stessi del tag <frame>: si tratta di una vera e propria finestra verso l’esterno all’interno di un documento ordinario.

Questo tag è correttamente supportato da tutti i browser moderni (Netscape 4 non lo supporta, ma questo browser oramai sta scomparendo). La sintassi è:

<iframe src="http://www.isolajava.com" width="300" height="300">
  Contenuto alternativo per i browser che non leggono gli iframe.
</iframe>
 

Come si può vedere tra l’apertura e la chiusura del tag è possibile specificare un contenuto alternativo per i browser che non siano in grado di leggere l’<iframe>: in realtà questi browser sono ciechi a questo tag (come abbiamo visto per il <noframes>) e dunque leggono direttamente il contenuto al suo interno. Sono invece i browser che supportano questa sintassi a ignorare volutamente quanto viene compreso tra apertura e chiusura del tag.

Anche in questo caso sarò opportuno utilizzare la possibilità di inserire un contenuto alternativo per migliorare il posizionamento nei motori di ricerca. Ad esempio:

<iframe src="http://www.isolajava.com" width="300" height="300">
  <p>Su <a href="http://www.isolajava.com">Isolajava.com</a> -
  Approfondimenti sul Web Publishing e articoli per webmaster</p>
</iframe>
 

Un esempio completo è disponibile a questa pagina.


Vantaggi e svantaggi dei frames

Abbiamo già visto all’inizio delle lezioni sui frames quali sono stati alcuni dei motivi di successo dei frames. E cioè:

  • Dal punto di vista dell’utente: evitare di ricaricare le parti comuni
  • Dal punto di vista del webmaster: includere il layout comune in pochi files
  • Dal punto di vista dell’utente: mantenere in vista alcuni punti del layout

Tuttavia gli svantaggi che comporta un uso scorretto di un layout a frame sono superiori ai vantaggi che possono derivare dal loro utilizzo.

I motori di ricerca infatti navigano di link in link attraverso il web per catturare contenuti da indicizzare.

È frequente allora che una struttura a frame sia inserita all’interno di un motore di ricerca in modo errato: a volte viene catturato solo un menù (come in questo caso), altre volte compare soltanto la parte interna con il contenuto del frame e dunque viene perso ogni menu di navigazione (come in questo caso).

Per evitare problematiche di questo genere, è meglio evitare di utilizzare una struttura a frame; o nel caso in cui la si desideri utilizzare è bene prevedere sin da subito dei metodi che ricostruiscano il frameset, nel caso in cui sia catturata soltanto una pagina interna. È possibile farlo utilizzando JavaScript (un linguaggio di programmazione lato-client).

C’è anche da dire che oggi molti dei motivi che rendevano vantaggioso l’utilizzo dei frames sono venuti meno: la banda a disposizione si è ampliata, i CSS alleggeriscono la struttura dei siti e rendono possibile alcune soluzioni che prima erano difficili (come quella di mantenere un menu di navigazione sempre a portata di mano), e la gestione dei contenuti può essere semplificata utilizzando le inclusioni lato server.

Viceversa una struttura a frame risulta molto vantaggiosa nel caso in cui si utilizzino delle vere e proprie applicazioni che utilizzano internet (come le piattaforme di e-learning, la webmail, eventuali aree riservate del sito con accesso tramite login e password). In questo caso la suddivisione dei contenuti evita di sovraccaricare il server (dal momento che così vengono ri-caricati solo le parti strettamente necessari), semplifica la gestione, e quindi si rivela estremamente utile.


Impaginare a livelli con i CSS

Abbiamo già visto due stili di impaginazione: le tabelle e i frame. Come accennato più volte all’interno del corso esiste una terza via: l’impaginazione tramite i fogli di stile (ovvero "CSS", cioè "Cascading Style Sheets", che significa "fogli di stile a cascata").

La sintassi dei CSS esula dall’argomento del corso presente, è importante tuttavia afferrare il concetto che un elemento può essere disposto all’interno della pagina, semplicemente specificando le sue coordinate, o indicando il modo in cui deve essere spostato rispetto agli elementi che lo circondano.

Nel caso dell’impaginazione tramite i fogli di stile abbiamo per lo più a che fare con i tag <span> e <div>, che possono essere accuratamente posizionati e visualizzati specificando ad esempio:

  • larghezza
  • altezza
  • distanza dall’alto
  • distanza da sinistra
  • colore o immagine di sfondo
  • colore, tipo e grandezza dei bordi
  • distanza tra il contenuto e il bordo (padding) e tra il bordo e l’esterno (margin)

Per “livello” (o “layer”) in HTML si intende appunto un <div> posizionato tramite i CSS all’interno della pagina.

La sintassi dei CSS è molto diversa da quella dell’HTML solito.

Ad esempio per posizionare la testata di HTML.it a 50 pixel dall’alto della pagina e 200 pixel da sinistra, con lo sfondo a righe, bordo nero, e una dimensione di 600 x 80 pixel di è necessario utilizzare questa sintassi.

Nella <head>:

<style type="text/css">
#logo {
   position:absolute;
   left:200;
   top:50;
   width:600px;
   height:80px;
   background-image: url(sfondo.gif);
   border: 1px solid #000000;
}
</style>
 

nel <body>:

<div id="logo">
  <img src="logo.gif" alt="HTML.it" title="HTML.it" width="224" height="69">
  <img src="logo1.gif" alt="HTML.it" title="HTML.it" width="59" height="70">
</div>
 

L’esempio completo si trova a questo indirizzo.

Il vantaggio di questa impostazione è quella di avere una pagina molto pulita: infatti il file HTML è composto soltanto dai <div> (o dagli span) con i contenuti, mentre lo stile di visualizzazione dei contenuti è affidato ai fogli di stile (per lo più espressi in un file separato).

Per gli approfondimenti vi rimandiamo alla guida sui fogli di stile di HTML.it che approfondisce questo argomento.



Home page Isola java   @@


© All Rights Reserved - www.isolajava.com