FRAMES
9.FRAMES
Frames (en inglés, marcos
o cuadros) es un procedimiento del lenguaje HTML para dividir
la pantalla en diferentes zo- nas, o ventanas, que pueden actuar
independientemente unas de otras, como
si se tratara de páginas
diferentes, pues incluso
cada una de ellas puede
tener sus propias
barras deslizadoras. Los navegadores que lo implementan son el Netscape 2.0, y el Explorer 2.0 en adelante.
Una de sus características más importantes es que pulsando un enlace situado
en un frame,
se puede cargar
en otro frame una
página determinada. Esto se utiliza
frecuentemente para tener un frame estrecho
en la parte lateral
(o superior) con un índice
del contenido en forma de diferentes enlaces,
que, al ser pulsados cargan
en la ventana principal
las distintas pá- ginas. De esta manera
se facilita la navegación entre
las páginas, pues
aunque se vaya
pasando de unas
a otras, siempre
estará a la vista el índice del conjunto.
Para comprender los distintos conceptos vamos a desarrollar un ejemplo, creando
una página con dos Frames.
El de la iz- quierda va a servir
de índice de lo que veamos en el de la derecha,
y en éste veremos inicialmente una página de presenta-
ción.
Documento de definición de los frames
Lo primero
que tenemos que hacer es crear un documento
HTML en
el que definiremos cuántas zonas va a haber, qué
distribución y tamaño van a tener, y cuál va ser el contenido de cada una de ellas.
En el ejemplo que vamos a desarrollar, la página va a tener
dos frames distribuidos en columnas (es decir,
uno al lado del otro, en vez de uno encima
del otro, lo que sería
una distribución en filas).
Con respecto
al tamaño, haremos que el primero
(el del izquierda) ocupe el 20% del ancho de la pantalla, y el otro, el 80% restante.
Y con respecto al contenido, el frame de la izquierda
va a contener un documento HTML que va a servir de índice
de
lo que veamos en el otro (y que vamos a llamar
mi_indice.html), y el de la derecha otro documento HTML que va a
servir de página de presentación (al que llamaremos mi_presentacion.html).
Todo lo anterior se refleja en el
siguiente documento HTML:
<HTML>
<HEAD>
<TITLE>Mi primera pagina con frames</TITLE>
</HEAD>
<FRAMESET
COLS="20%,80%">
<FRAME
SRC="mi_indice.html">
<FRAME
SRC="mi_presentacion.html" NAME="principal">
</FRAMESET>
</HTML>
Obsérvese lo siguiente:
Es un documento parecido
a los que conocíamos hasta
ahora. La diferencia está en que en vez de utilizar
la etiqueta BODY, que sirve normalmente para delimitar lo que se va a ver en la pantalla, se hace uso de la etiqueta
FRAMESET (definir los frames).
En este caso, con la etiqueta
<FRAMESET COLS="20%,80%"> se define que va a haber dos frames y que van a ir en columnas. Si hubiéramos querido
que fueran en filas, habríamos puesto ROWS (filas, en inglés). También
se define el es- pacio en anchura que va a ocupar cada
uno de ellos en la pantalla. Se ha puesto
como porcentajes del total, pero se podría también haber puesto una cifra absoluta,
que representaría el número de pixels a ocupar.
Ya se ha definido
el número de frames, su distribución y su tamaño,
pero falta por definir el contenido de cada frame.
Esto se hace con las etiquetas:
<FRAME
SRC="mi_indice.html">
<FRAME
SRC="mi_presentacion.html" NAME="principal">
Con
esto se define que el contenido del primer frame (izquierda) sea el documento
HTML que hemos llamado
mi_indice.html y el del segundo (derecha) sea el documento HTML mipresentacion.html.
Obsérvese que en la etiqueta del segundo se ha incluido
el atributo NAME="principal", pero no así en el primero.
El motivo es que se necesita dar un nombre
al segundo frame,
pues, como veremos
a continuación, en el documento del pri- mer
frame va a haber unos
enlaces que van a ir dirigidos hacia
él. En este caso sólo
tenemos dos frames, pero podría haber más, y es necesario distinguirlos unos de otros. Y el primero
no necesita nombre,
pues no va a haber enlaces en el segundo
dirigidos hacia él.
A este documento le vamos a llamar mi_pagina.html, pero todavía
no lo vamos a guardar,
pues falta por añadir algo que
veremos más adelante.
Documentos
HTML de cada frame
Necesitamos ahora confeccionar el documento HTML de cada uno de los frames.
Recuérdese que son como páginas
in- dependientes, que pueden
tener cada una su propio
fondo, etc., y todo lo que queramos
añadir en ellos.
Documento
del frame de la izquierda
Va a tener un fondo amarillo, y va a contener dos enlaces
dirigidos al frame de la derecha.
<HTML>
<HEAD>
<TITLE> Indice </TITLE>
</HEAD>
<BODY
BGCOLOR="#FFBB00">
<P><A HREF="mi_presentacion.html"
TARGET="principal">Presentación</A>
<P><A
HREF="otra_pagina.html" TARGET="principal">Esta es otra página</A>
<P><IMG
SRC="imagen.gif">
</BODY>
</HTML>
Dentro de las etiquetas de los enlaces
podemos observar algo
nuevo, y es el atributo TARGET (en inglés: objetivo,
blanco), que sirve para hacer que al ser activado el enlace no se cargue
en el propio frame, sino en otro, precisamente en el que ha- yamos
llamado con ese nombre en el documento de definición de los frames.
En nuestro
caso, le hemos
dado el nombre
de "principal" al frame
de la derecha, y es por tanto
ahí donde se van a car- gar los documentos HTML.
Guardamos este documento con el nombre de mi_indice.html
Documento
del frame de la derecha
Va a tener un fondo negro, y va a contener sólamente un texto.
<HTML>
<HEAD>
<TITLE>
Presentación </TITLE>
</HEAD>
<BODY
BGCOLOR="#000000" TEXT="#0000FF">
<CENTER><FONT
SIZE=+3><STRONG>
<P>Esta es la versión
<BR><FONT
COLOR="#FF0000">con
frames</FONT>
<BR>de mi página
</STRONG></FONT></CENTER>
</BODY>
</HTML>
Guardamos este documento con el nombre de mi_presentacion.html
Con lo visto anteriormente, ya tenemos las tres piezas
que necesitamos: Documento de definición de los frames
Documento del contenido
del primer frame
Documento del contenido
del segundo frame
Alternativa
para los navegadores que no soportan frames
Hay que prever el caso en que los navegadores no soportan o
desconocen las etiquetas FRAMESET y FRAME.
Para estos
casos está prevista
la etiqueta <NOFRAMES> y </NOFRAMES>. Se añaden al final del documento de defini- ción de los frames,
y se pone entre ambas
lo que veran los que acceden con un navegador que no soporta frames.
Puede in- cluso ser el código HTML de una página completa.
En nuestro
caso, pudiéramos poner
un mensaje advirtiendo de esta circunstancia, y dirigiendo al usuario, con un enlace normal, hacia una página
que hayamos definido
como principal o de presentacion para estos casos. (También podríamos no decir nada sobre frames, y colocar aquí el código
de la página de presentación)
<HTML>
<HEAD>
<TITLE>Mi pagina con frames</TITLE>
</HEAD>
<FRAMESET
COLS="20%,80%">
<FRAME
SRC="mi_indice.html">
<FRAME
SRC="mi_presentacion.html" NAME="principal">
</FRAMESET>
<NOFRAMES>
Estas utilizando un
navegador que no soporta frames.
<P>Pulsa para visitar mi <A
HREF="presentacion.html"> página</A>.
</NOFRAMES>
</HTML>
Ahora sí podemos guardar este documento
con el nombre de mi_pagina.html.
Atributos de la etiqueta <FRAMESET>
La etiqueta
FRAMESET, como hemos visto
en el ejemplo, es la que define
la distribución, el número y tamaño de los fra- mes.
Tiene dos atributos: COLS (columnas) y ROWS (filas):
<FRAMESET COLS="XX,YY,ZZ,...">
<FRAMESET ROWS="XX,YY,ZZ,...">
Define la distribución de los frames en
columnas o en filas, según se use uno u otro atributo. Por ejemplo:
<FRAMESET COLS="XX,YY"> (habrá dos frames
en columnas)
<FRAMESET COLS="XX,YY,ZZ"> (habrá tres frames en columnas)
Define el tamaño de los frames,
según el valor que demos a XX, YY, ZZ.... Este valor se puede expresar
en un porcentaje del ancho del pantalla
(para las columnas), o del alto de la pantalla (para las filas).
Así, por ejemplo:
<FRAMESET
COLS="%20,%80">
(la columna de la
izquierda ocupará el 20% del ancho de la pantalla, y la de la derecha el 80%
restante)
<FRAMESET
ROWS="%10,%70,%20">
(la fila superior ocupará
el 10% del alto de la pantalla, la del medio el 70%, y la inferior el 20%)
Un número
absoluto que representa el número de pixels que ocupará cada frame a lo ancho
o a lo alto (según sean filas o columnas). Así, por ejemplo:
<FRAMESET
COLS="40,600">
(la columna de la
izquierda tendrá 40 pixels de ancho y la de la derecha 600).
Pero es peligroso utilizar
sólo valores absolutos, pues el tamaño
de la pantalla varía de un usuario
a otro. Si se va a usar al- gún
valor absoluto para un frame, es mejor mezclarlo con alguno relativo, como los que vamos a ver acontinuación, para que se ajuste el
total a la pantalla del usuario
Si se pone un valor relativo
poniendo un asterisco (*), en vez de un número, se interpreta como
que ese frame debe tener
el espacio restante. Por ejemplo:
<FRAMESET
ROWS="100,*,100">
(Habrá tres filas, la
superior y la inferior de una altura de 100 pixels, y la del medio el espacio
restante).
Si hay más de un frame
con *, ese espacio
restante se dividirá
por igual entre
ellos. Si hay un número
antes del *, ese frame obtiene esa cantidad más de espacio
relativo. Así "2*,*" daría 2/3 para el primer frame y 1/3 para el otro.
Frames sin bordes
Si se desea que no haya un borde
de separación entre
los frames, se deben incluir
el atributo FRAMEBORDER="0" den-
tro de la etiqueta
FRAMESET. No todas las versiones de los navegadores lo implementan.
Para que también desaparezcan los huecos
de separación entre frames
hay que añadir
otros dos atributos (el primero es para
el Explorer y el segundo
para el Netscape): FRAMESPACING="0" y BORDER="0", con lo que la
etiqueta com- pleta quedaría:
<FRAMESET FRAMEBORDER="0"
FRAMESPACING="0" BORDER="0" COLS="xx,yy">
Atributos
de la etiqueta <FRAME>
Esta etiqueta define
las cararacterísticas de un frame
concreto, no del conjunto de los frames,
como era el caso con la eti- queta <FRAMESET>. Puede tener los siguientes posibles
atributos, que van dentro de la etiqueta
<FRAME>:
SRC="dirección"
• Esta dirección
puede ser la de un documento HTML (tal como hemos utilizado
en el ejemplo), o cualquier otro recur- so
Web (o URL). Con este atributo se indica lo que se cargará inicialmente en el frame.
Si no se le pone este atributo
a la etiqueta <FRAME>, entonces dicho frame aparecerá
inicialmente vacío, aunque tendrá las dimensiones asignadas.
NAME="nombre_de_la_ventana"
• Este atributo
se usa para asignar un nombre a un frame.
De esta manera
se podrá "dar en el blanco" (en inglés, target)
en esta página, desde un enlace situado
en otra página. Es decir,
que pulsando en otra página un enlace,
se cargará precisa- mente en ésta, tal como hemos
visto en el ejemplo. El atributo NAME es opcional. Por defecto,
todas las ventanas
carecen de nombre. Los nombres que se escojan
deben comenzar por un carácter
alfanumérico.
MARGINWIDTH="número"
• Se utiliza
este atributo cuando
se quiere controlar el ancho de los márgenes
dentro de un frame. El número que se pon- ga representa los pixels de los
márgenes. Este atributo es opcional.
MARGINHEIGHT="número"
• Igual que el anterior, pero referido a
los márgenes en altura.
SCROLLING="yes|no|auto"
• Este atributo
se utiliza para decidir si el frame
tendrá o no una barra
deslizadora. Si se escoje "yes" tendrá siempre
una barra deslizadora. Si se escoje
"no" no la tendrá
nunca, y si se escoje
"auto", será el navegador quien decida si la tendrá
o no. Este atributo
es opcional. Su valor por defecto es "auto".
NORESIZE
• A este atributo no se le asigna un valor numérico,
como a los demás. Es un indicador
para que la ventana no se pueda re- dimensionar (en inglés, resize)
por parte del usuario. Es un atributo
opcional. Por defecto,
todos los frames
son redimen- sionables.
FRAMEBORDER="no"
• Este atributo
elimina el borde en un frame, pero si se quiere que se elimine
completamente, también hay que ponérselo al frame contiguo. Si se quiere
eliminar los bordes de todos los frames,
se debe colocar en la etiqueta FRAMESET, como hemos visto anteriormente.
El atributo TARGET
En el ejemplo hemos
visto que, como
queríamos que los
enlaces situados en el frame
de la izquierda surtieran efecto
no en él mismo, sino en otro frame (el situado a la derecha),
teníamos que poner dentro de cada enlace el siguiente atributo TARGET="principal", siendo "principal" el nombre
que habíamos dado
al segundo frame,
en el documento de
definición de frames. Es decir,
hemos utilizado el atributo de esta manera:
TARGET="nombre_dado_a_otro_frame"
Estos nombres,
que los escogemos nosotros, pueden ser
cualquiera, pero con
la condición que el primer caracter
sea alfa- numérico (letra o número).
Pero hay
unos nombres reservados (es decir, que
no se pueden usar para
denominar a un frame), que hacen que este atribu- to efectúe unas funciones especiales. Para que cumplan
su cometido, es imprescindible escribir
estas palabras reservadas (blank, self y top) en minúsculas.
TARGET="_blank". Hace que se abra una nueva
copia del navegador, y el enlace
activado se carga
en
ella, a pantalla completa. Es decir,
tendríamos dos copias
funcionando a la vez.
TARGET="_self". Hace que el enlace se cargue en el
propio frame.
TARGET="_top". Hace que el enlace se cargue a pantalla completa, suprimiendo todos los frames, pero sin que se car- gue
una nueva copia del navegador. Un error común es olvidar
poner este atributo en los enlaces que están
en un frame, con lo que al ser activados, la página llamada
se carga en el propio
frame, lo cual es muy molesto si esa página pertenece
a otro sitio web. Esto se evita poniendo
este atributo en las etiquetas
de los enlaces.
Frames anidados dentro de otros frames
Hasta ahora hemos contemplado sólo la posibilidad de tener una distribución de los frames en filas o en columnas,
(de- pendiendo que se utilice
el atributo ROWS o COLS en la etiqueta
FRAMESET), pero no ambos
a la vez. Se puede obtener
distribuciones complejas anidando
filas en una columna, o a la inversa, columnas
dentro de una fila.
Supongamos que queremos la siguiente
distribución:
Un frame estrecho en horizontal en la parte superior, de lado a lado de la pantalla
(altura, el 15%) Otro
frame estrecho en vertical en la parte
izquierda, debajo del anterior (anchura, el 20%)
Un tercero ocupando el
resto de la pantalla.
Vemos que,
en realidad, esto
equivale a la siguiente distribución: Dos filas. La superior
ocupa el 15% y la inferior el resto.
La fila inferior dividida
en dos columnas. La primera (la de la izquierda) ocupa el 20% y la otra, el
resto.
El documento de definición de las dos
filas (olvidémonos de momento que la de abajo está subdividida), sería:
<HTML>
<HEAD>
<TITLE>Pagina con dos filas</TITLE>
</HEAD>
<FRAMESET
ROWS="15%,*">
<FRAME SRC="documento_fila_superior">
<FRAME SRC="documento_fila_inferior">
</FRAMESET>
</HTML>
Como la fila
inferior, en realidad, son dos columnas (con una distribución del 20% y resto), sustituimos (anidando) la etiqueta <FRAME SRC="documento_fila_inferior"> por:
<FRAMESET
COLS="20%,*">
<FRAME
SRC="documento_columna_izqda">
<FRAME
SRC="documento_columna_dcha">
</FRAMESET>
Con lo que queda el documento definitivo
así:
<HTML>
<HEAD>
<TITLE>Pagina con fila superior y dos columnas
inferiores</TITLE>
</HEAD>
<FRAMESET
ROWS="15%,*">
<FRAME
SRC="documento_fila_superior">
<FRAMESET
COLS="20%,*">
<FRAME
SRC="documento_columna_izqda">
<FRAME
SRC="documento_columna_dcha">
</FRAMESET>
</FRAMESET>
</HTML>