Centrer une popup au passage de la souris

haelfyk -  
 HaelfyK -
hello !

je me suis permise d'essayer un script posté il y a quelques temps sur ce forum afin d'ouvrir automatiquent une image au passage de la souris sur une vignette puis disparaisse une fois la souris enlevée : )

par contre j'aimerais arriver à ce que l'image quand elle s'ouvre soit toujours au même endroit, par exemple centrée, et malheureusement je n'y arrive pas : /

pour l'instant, quand j'ai une vignette qui se trouver toute à droite de la fenêtre, l'image qui s'ouvre se perd et est coupée....

possible de m'aider ? je galère un peu pour trouver une solution : )

merci !
A voir également:

1 réponse

NookZ Messages postés 2376 Statut Membre 514
 
Bonjour,

Normalement il suffit de spécifier la position que vous souhaiter au lieu de récupérer la position de la souris et d'afficher par rapport à ça. Pour plus d'aide, inscrivez le code ici, merci.
0
haelfyk
 
voilà le code : ) Merci pour l'aide, sympa

<script>

function Target(id, picture, width, height)
{
this.id = id;
this.ref = null;
this.width = width;
this.height = height;
this.picture = picture;
}

// Attention : offsetHeight ne fonctionne que si l'élément ne comporte ni marges, ni bordures, ni padding sinon ...
Target.prototype.getHeight = function()
{
var elt = document.getElementById(this.id);
return elt.offsetHeight;
}

Target.prototype.getWidth = function()
{
var elt = document.getElementById(this.id);
return elt.offsetWidth;
}


function TargetList(popupId, popupWidth, popupHeight)
{
this.popupId = popupId;
this.popupWidth = popupWidth;
this.popupHeight = popupHeight;
this.items = new Array();

this.currentIndex = -1;
}

TargetList.prototype.addTarget = function(id,picture,width,height)
{
var item = new Target(id,picture,width,height);
item.index = this.items.length;

var elt = document.getElementById(id);
this.items.push(item);
}

TargetList.prototype.hidePopup = function()
{
if (this.currentIndex != -1)
{
document.getElementById(this.popupId).style.left=-10000+"px";
this.currentIndex = -1;
}
}

TargetList.prototype.selectTarget = function(index)
{
if (this.currentIndex != index)
{
if ((index >=0) && (index < this.items.length))
{
document.getElementById(this.popupId).innerHTML='<img src="'+this.items[index].picture+'">';
this.currentIndex = index;
}
}
}

TargetList.prototype.showPopup = function(x,y)
{
var elt = document.getElementById(this.popupId);
elt.style.left=x+5+"px";
elt.style.top=y-this.popupHeight+"px";
}

TargetList.prototype.findTarget = function(x,y)
{
var index = -1;
for (var i=0; i < this.items.length; i++)
{
var position = findPosition(this.items[i].id);
if ((x >= position.x) && (x < position.x+this.items[i].getWidth()) && (y >= position.y) && (y < position.y+this.items[i].getHeight()))
{
index = i;
break;
}
}
return index;
}


var targetList = new TargetList("popup",400,250);




function strToNumber(value)
{
var nbr = parseInt(value);
if (isNaN(nbr)) { nbr = 0;}
return nbr;
}

// Retourne la position de la souris sur la page (et pas sur l'écran !)
function mousePosition(e)
{
var result = new Array();
result["x"] = 0;
result["y"] = 0;
if (!e) var e = window.event;
if (e.pageX || e.pageY) {
result["x"] = e.pageX;
result["y"] = e.pageY;
}
else if (e.clientX || e.clientY) {
result["x"] = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
result["y"] = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
return result;
}

// Retourne la position absolue d'un objet sur la page
function findPosition(id)
{
var elt = document.getElementById(id);
var result = new Array();
result["x"] = 0;
result["y"] = 0;
while (elt)
{
result["x"] += elt.offsetLeft;
result["y"] += elt.offsetTop;

elt = elt.offsetParent;
}

return result;
}

function mouseMove(e)
{
var mouse = mousePosition(e);
index =targetList.findTarget(mouse.x,mouse.y);

if (index != -1)
{
targetList.selectTarget(index);
targetList.showPopup(mouse.x,mouse.y);
}
else
{
targetList.hidePopup();
}
}


function load()
{
targetList.addTarget("image1","../images/01_projets/P01_place_riponne/P1_1_riponne.jpg",567,281);
targetList.addTarget("image2","../images/01_projets/P01_place_riponne/P1_2_riponne.jpg",454,362);
targetList.addTarget("image3","../images/01_projets/P01_place_riponne/P1_3_riponne.jpg",453,362);
targetList.addTarget("image4","../images/01_projets/P01_place_riponne/P1_4_facade_nord_jour.jpg",595,421);
targetList.addTarget("image5","../images/01_projets/P01_place_riponne/P1_5_retouche.jpg",595,421);
targetList.addTarget("image6","../images/01_projets/P01_place_riponne/P1_6_retouche2.jpg",595,421);
targetList.addTarget("image7","../images/01_projets/P01_place_riponne/P1_7_toiture_jour.jpg");
targetList.addTarget("image8","../images/01_projets/P01_place_riponne/P1_8_testfilm3m.jpg");
targetList.addTarget("image9","../images/01_projets/P01_place_riponne/P1_9_Passage_FINAL.jpg");
targetList.addTarget("image10","../images/01_projets/P01_place_riponne/P1_10_riponne.jpg");
targetList.addTarget("image11","../images/01_projets/P01_place_riponne/P1_11_parking.jpg");



document.onmousemove=mouseMove;
}

</script>


</head>

<body onload="load()">
<div class="popup" id="popup"></div>

<table width="1020" height="600" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td class="image"><img src="../images/01_projets/P01_place_riponne/mini_P1_1_riponne.jpg" id="image1"></td>
<td class="spaceh"> </td>
<td class="image"><img src="../images/01_projets/P01_place_riponne/mini_P1_2_riponne.jpg" id="image2"></td>
...etc...
0
NookZ Messages postés 2376 Statut Membre 514 > haelfyk
 
Bon à vrai dire ce code n'est pas très adapté à ce que vous voudriez faire, puisqu'une grande partie du code est là pour calculer la position exacte de l'élément et faire l'affichage en conséquence.
La solution que je vais vous donner, permet uniquement pour vous de spécifier la position fixée que vous souhaitez utiliser, cependant il faudra nettoyer le code du reste ou encore, si vous pensez avoir l'utilité du code avec l'affichage à droite de l'élément créer une deuxième fonction d'affichage simplifiée pour le cas présent.

A MODIFIER
TargetList.prototype.showPopup = function(x,y)
{
var elt = document.getElementById(this.popupId);
elt.style.left=x+5+"px";
elt.style.top=y-this.popupHeight+"px";
}

REMPLACE PAR
TargetList.prototype.showPopup = function(x,y)
{
var elt = document.getElementById(this.popupId);
// je passe l'élément en position absolute, on peut aussi la mettre en fixed ou relative selon les besoins
elt.style.position= "absolute";
elt.style.top= 10+"px";
elt.style.left= 15+"px";
}
0
haelfyk > NookZ Messages postés 2376 Statut Membre
 
merci beaucoup NookZ !

ça m'émerveille à chaque fois quand cela fonctionne :D

je vais essayer de nettoyer le code de ce qui n'est pas nécessaire, sans tout faire foirer ^_^

et encore voir pourquoi sur IE ça ne fonctionne pas. j'ai un tout vieux, le 5.2 pour mac, c'est peut-être pour ça
0
NookZ Messages postés 2376 Statut Membre 514 > haelfyk
 
Si vous avez un soucis avec le nettoyage du code, faites-moi signe.

Oui, pour IE c'est sûrement du fait de l'ancienneté de la version.

Conseil :
Voici les navigateurs sur lesquels il est important de tester si vous voulez être sûr que quasiment tous les utilisateurs auront le bon rendu : IE7/IE8, Firefox3, Safari, Chrome
0
haelfyk > NookZ Messages postés 2376 Statut Membre
 
oui j'ai un souci... je suis nuuuuuuuuulllle !
enfin, il faut bien commencer quelque part et apprendre ^_^

je n'utilise pas les div, je fais des tableaux, des CSS, je mélange tout et je me perd.
je bidouille et après plus rien ne fonctionne, donc je suis revenue à ma bête base.

argh.

mon test et là : http://www.mplusv.ch/test/test.html

merci de ne pas rigoler en regardant le code...! x_o''


si vous avez des liens pour apprendre la base de la base expliqué simplement pour les 2 neurones et demi que mon cerveau contient, je suis preneuse... : )
0