SELFHTML

Andreas Zierhut:
Positionnement de Layer (DHTML)

Page d'information: vue d'ensemble

vers le bas Andreas Zierhut
vers le bas Conditions préalables
vers le bas Pose du problème
vers le bas Réflexions préalables
vers le bas Première solution: coordonnées avec un layer positionné relativement
vers le bas Deuxième solution: coordonnées avec ancres/images
vers le bas Application: a:hover dans le navigateur Netscape

Bas de la page 

Andreas Zierhut

Adresse électronique: Adresse électronique Andreas.Zierhut@t-online.de
Présence Internet: Page en langue allemande http://www.t-online.de/home/andreas.zierhut/

Il s'agit ici d'un article traduit de l'allemand par la rédaction de SELFHTML actuel. Veuillez poser vos questions relatives à cet article uniquement à son auteur, prenant compte que celui-ci ne maîtrise peut-être pas la langue française!

vers le hautvers le bas 

Conditions préalables

Concept DHTML
Quand HTML est modifié de façon dynamique, on parle de Page d'information: connexion exigée DHTML - HTML dynmique. Lors de la modification d'éléments d'un document, les layer jouent presque toujours un rôle, étant donné que le navigateur Netscape 4 n'a qu'un accès limité aux propriétés des éléments et qu'ainsi par exemple aucune couleur de police ne peut être modifiée par une nouvelle affectation de la propriété (Page d'information: connexion exigée color).

Concept Layer
Un layer est une couche ou un plan dans un document HTML. Une page normale se trouve être la première couche, les layer peuvent être affectés à une couche au moyen du Page d'information: connexion exigée z-Index.

Création d'un layer:

pour les navigateur Netscape et Explorer Internet:

<div id="lelayer" style="position: absolute; z-Index: 2;">
  contenu layer
</div>

spécifique au navigateur Netscape:

<layer name="lelayer" z-index=2>
  contenu layer
</layer>

Le layer se trouve en deuxième couche c'est à dire qu'il recouvrirait à cet endroit le contenu du document.
Il faut privilégier la deuxième variante si le layer est écrit dans le document avec la commande JavaScript Page d'information: connexion exigée document.write() et qu'une solution doit être écrite spécialement pour le navigateur Netscape. Avec la première variante, le navigateur Netscape a tendance autrement à "se planter".

vers le hautvers le bas 

Pose du problème

Souvent, il serait bien utile de pouvoir placer dans un document un layer ou couche/plan.
Exemple concret: une barre de menus doit être affichée dans la deuxième ligne d'un tableau variable. Un Page d'information: connexion exigée positionnement absolu ne peut être envisagé en raison de la représentation qui peut varier selon les différentes résolutions d'écran.

Apparence d'une barre de menus (exemple):

1ère colonne
2ème colonne
sous-menu

vers le hautvers le bas 

Réflexions préalables

Pourquoi ne pas utiliser tout simplement un layer positionné de façon relative?
Dans les CSS existe la possibilité d'insérer un layer en plein milieu d'un document grâce à Page d'information: connexion exigée position:relative.

Inconvénients:

S'il s'agit de modifier la couleur de la couleur de police d'écriture en y faisant passer la souris, Cette solution doit être écartée. La couleur ne peut pas être modifiée dans le navigateur Netscape, tout le contenu du layer doit être réécrit.

Conclusion: un layer positionné de façon absolue résout bien des choses.

vers le hautvers le bas 

Première solution: coordonnées avec un layer positionné relativement

Principe: marquer l'endroit du document avec un layer positionné relativement, puis en mettre un positionné de façon relative à ce même endroit.

Exemple d'affichage (nouvelle fenêtre) Exemple d'affichage: aperçu

Exemple:

<html>
<head>

<script language="JavaScript1.2" type="text/javascript">
<!--

var ie = document.all ? true : false;
var ns = document.layers ? true : false;

function mark()
{
  if (ie)
    document.write('<div id="lelayer">&nbsp;</div>');
  else if (ns)
    document.write('<ilayer name="lelayer">&nbsp;</ilayer>');
}

function ShowNew()
{
  if (ie) {
    var lelayer = document.all.lelayer;
    var afflayer = document.all.layeraffiche;
    afflayer.style.posLeft = getLeft(lelayer);
    afflayer.style.posTop = getTop(lelayer);
    afflayer.style.visibility = 'visible';
  }
  else if (ns) {
    var lelayer = document.lelayer;
    var afflayer = document.layeraffiche;
    afflayer.pageX = lelayer.pageX;
    afflayer.pageY = lelayer.pageY;
    afflayer.visibility = 'show';
  }
}
function getLeft(l)
{
  if (l.offsetParent) return (l.offsetLeft + getLeft(l.offsetParent));
  else return (l.offsetLeft);
}
function getTop(l)
{
  if (l.offsetParent) return (l.offsetTop + getTop(l.offsetParent));
  else return (l.offsetTop);
}
function Write(nom, contenu)
{
  if (ie)
    document.all[nom].innerText = contenu;
  else if (ns) {
    with (document[nom].document) {
      open();
      write(contenu);
      close();
    }
  }
}

//-->
</script>

</head>
<body onLoad="ShowNew()">

<div id="layeraffiche" style="position: absolute; visibility: hidden">contenu layer</div>

<table border=1 cellspacing=0 cellpadding=0 width="100%">
  <tr>
    <td width="20%">&nbsp;</td>
    <td width="80%">
      <script language="JavaScript1.2" type="text/javascript">
      <!--
        mark();
      //-->
      </script>
    </td>
  </tr>
</table>

<a href="javascript:Write('layeraffiche', 'nouveau contenu')">nouveau contenu</a>

</body>
</html>

Description:

Le script prend note de la position du layer dans le tableau et y met un nouveau layer après le chargement de la page.
Ici donc, le texte "contenu layer" est affiché dans la 2ème colonne du tableau.
En cliquant sue le lien, le texte se change en "nouveau contenu".

fonction mark():
Avec document.write() un layer positionné de façon relative est inséré dans le document.

fonction ShowNew():
Le layer "layeraffiche" est positionné et affiché à la position du layer inséré auparavant.

fonctions getLeft() et getTop():
Dans l'Explorer Internet n'existe aucune propriété susceptible de sauvegarder les coordonnées d'écran d'un objet. Pour rechercher les coordonnées, il faut ajouter les ordonnées et les abscisses de l'élément parent ( Page d'information: connexion exigée offsetParent) .

fonction Write(name, contenu):
Le contenu du "layeraffiche" est modifié de façon dynamique. Cette même fonction, utilisée sur le layer "lelayer", positionné de façon relative, n'aurait aucun effet avec le navigateur Netscape.

vers le hautvers le bas 

Deuxième solution: coordonnées avec ancres/images

Principe: affecter des positions avec une Page d'information: connexion exigée ancre ou une Page d'information: connexion exigée image et lire les propriétés "x" et "y" ou respectivement Page d'information: connexion exigée offsetLeft et Page d'information: connexion exigée offsetTop.

Exemple d'affichage (nouvelle fenêtre) Exemple d'affichage: Aperçu

Exemple:

<html>
<head>

<script language="JavaScript1.2" type="text/javascript">
<!--

var ie = document.all ? true : false;
var ns = document.layers ? true : false;

var actuel = 0;
var nombre = 4;
function DeplaceLayer()
{
  if (++actuel == nombre) actuel = 1;

  if (ns) {

    var pos = document.anchors['Position'+actuel];
    if (!pos)
      pos = document.images['Position'+actuel];

    with (document.lelayer) {
      pageX = pos.x;
      pageY = pos.y;
      visibility = 'show';
    }
  }
  else if (ie) {

    var pos = document.all['Position'+actuel];
    with (document.all.lelayer.style) {
      posLeft = getLeft(pos);
      posTop = getTop(pos);
      visibility = 'visible';
    }

  }
}
function getLeft(l)
{
  if (l.offsetParent) return (l.offsetLeft + getLeft(l.offsetParent));
  else return (l.offsetLeft);
}
function getTop(l)
{
  if (l.offsetParent) return (l.offsetTop + getTop(l.offsetParent));
  else return (l.offsetTop);
}
//-->
</script>

</head>
<body onLoad="DeplaceLayer()">

<div id="lelayer" style="position: absolute; visibility: hidden">contenu</div>

<table border=1 cellspacing=0 cellpadding=0 width="100%">
  <tr>
    <td width="10%"><a name="Position1">&nbsp;</a></td>
    <td width="50%"><img src="spacer.gif" width=1 height=1 name="Position2" alt=""></td>
    <td width="40%">&nbsp;<br>
                    <a name="Position3">&nbsp;</a></td>
  </tr>
</table>

<a href="javascript:DeplaceLayer()">Position suivante</a>

</body>
</html>

Description:

Trois endroits dans le document sont marqués au moyen d'images et d'ancres. Lors du chargement du document, le layer est affiché à la position1 (ancre), à chaque fois que le lien est cliqué, le layer est repoussé à la position suivante.
Cette solution est la plus risquée. Sous certaines circonstances, elle ne fonctionne pas étant donné que les propriétés "x" et "y" ne contiennent que la position relative par rapport à l'élément parent.

fonction MoveLayer():
Il est recherché si la position suivante a été déterminée avec une ancre ou une image. Ensuite le layer est repoussé et affiché à l'endroit de l'ancre ou de l'image.

fonction getLeft() et getTop():
Même principe que celui de la solution 1.

vers le hautvers le bas 

Application: a:hover dans le navigateur Netscape

Douloureuse expérience pour de nombreux concepteurs Web: la Renvoie au chapitre d'origine commande CSS Page d'information: connexion exigée a:hover ne fonctionne pas dans le navigateur Netscape.
Il n'y a pas de solution universelle pour ce problème. Mon idée a été de créer un script aussi court et facile à actualiser que possible, qui représente au moins un succédané comparable.
L'idée: chaque lien a des propriétés "x" et "y", avec lesquelles les coordonnées du lien peuvent être déterminées avec fiabilité dans 90% des cas. Le texte du lien se trouve dans la propriété "text".
Donc: avec Page d'information: connexion exigée onMouseOver on place un layer sur le lien et on formate le texte du layer avec les CSS.

Exemple d'affichage (nouvelle fenêtre) Exemple d'affichage: aperçu

Code source:

<html>

<head>

<style type="text/css">
<!--
  a:link  { color:#0FA00F; }
  a:hover { color:#000000; font-style:italic; text-decoration:none; }
  a.hover { color:#000000; font-style:italic; text-decoration:none; }
//-->
</style>

</head>

<body bgColor="#F0F0F0">

<script language="JavaScript1.2" type="text/javascript">
<!--

var ns = document.layers ? true : false;

function HoverInit()
{
  if (onLoadOld)
    onLoadOld();
  tmpLayer = new Layer(1);
  tmpLayer.bgColor = document.bgColor;
}

var obj = null;
var tmpLayer = null;
var onLoadOld = null;

if (ns) {
  if (window.onload)
    onLoadOld = window.onload;
  window.onload = HoverInit;
  document.captureEvents(Event.MOUSEOVER);
  document.onmouseover = Hover;
}

function Hover(evt)
{
  document.routeEvent(evt);

  if (tmpLayer && tmpLayer.visibility == 'hide' && evt.target.text) {

    obj = evt.target;

    tmpLayer.left = obj.x;
    tmpLayer.top  = obj.y;
    tmpLayer.width = 1;

    with (tmpLayer.document) {
      open();
      write('<nobr><a href="'+obj.href+'" class="hover"' +
            (obj.target ? ' target="' + obj.target + '"' : '') +
            '>'+obj.text+'</a></nobr>');
      close();
    }

    tmpLayer.visibility = 'show';

    document.captureEvents(Event.MOUSEMOVE);
    document.onmousemove = Hoveroff;

  }

}

function Hoveroff(evt)
{
  if (tmpLayer && evt.target != tmpLayer.document.links[0] && evt.target != obj) {

    tmpLayer.visibility = 'hide';
    document.releaseEvents(Event.MOUSEMOVE);

  }
}

//-->
</script>

<center><a href="javascript:alert('premier lien')">| premier lien |</a></center>
<br><br>

<a href="javascript:alert('ne sois pas si curieux')">| et encore un... |</a><br><br>

</body>
</html>

Remarque:

L'idéal est de sauvegarder le script comme script externe.
Le formatage pour l'effet Hover sera déterminé dans le navigateur Netscape grâce à la mention de feuille de style a.hover (et non pas a:hover).

Description:

En passant dans notre exemple sur un lien avec la souris, celui-ci n'est plus souligné mais affiché en italique.

fonction HoverInit():
Lors du chargement du document, un layer est crée pour l'effet Hover et sa couleur de fond est réglée sur celle du document.

fonction Hover(evt):
Le layer ici créé est positionné à la place du lien souligné, et son contenu est reformaté en italique.

fonction Hoveroff(evt):
Le layer est caché.


 
vers le haut

© 2001-2005 Seite Informations