begin process at 2010 03 21 07:26:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > POSITION, OFFSETLEFT, CLIENTLEFT CROSSBROWSER

POSITION, OFFSETLEFT, CLIENTLEFT CROSSBROWSER


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Classé sous :offsetLeft, clientLeft, offsetwidth, position, relative Niveau :Expert Date de création :23/05/2009 Date de mise à jour :02/06/2009 19:56:59 Vu / téléchargé :2 436 / 111

Auteur : Kimjoa

Ecrire un message privé
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

ce script permet de récupérer précisément la position d un élément dans le document...

3 fonction disponible :

getOffset(element, from) -> récupere la position a partir du document
getPosition(element, from) -> récupere la position a partir du dernier élément non static( la position relative n'est pas pris en charge bcp tros de beug, sur ie surtout)
getSize (element, from) -> retourne la taille de l'élément

l'argument from peux prendre 4 valeurs:
margin ou border, ou padding, ou content, et définit ou la mesure doit commencer

getOffset et getPosition commene leur mesure par default à border, getSize à content

si l'élément n'est pas visible , alors, les méthodes forceront sont affichage pour récupérer les données.
getOffset et getPosition, renvoient les valeurs sans les scroll

n'utiliser pas de tableau en position absolue, et préciser les bordure avec l'attribut style et non border


voilà si y a des bug , faite moi le savoir

a++

Source

  • (function(){//on encapusle nos donné grace a une fonction anonyme , pour eviter tros de vriables globale ou de faire un namespace
  • /*------------------------------------fonction privée-------------------------------------------------*/
  • //definit les versions du navigateur, peux etre mit en globale
  • var ua=navigator.userAgent.toLowerCase(),
  • isIE=/msie/.test(ua),
  • isIE6=/msie 6/.test(ua),
  • isIE7=/msie 7/.test(ua),
  • isIE8=/msie 8/.test(ua),
  • isWebKit = /webkit/.test(ua),
  • isGecko = /gecko/.test(ua) && !isWebKit,
  • isOpera = /presto/.test(ua);
  • var getStyle = function(/*DOMObject*/element, /*string*/rule){//peux etre definit en globale car très utilise, aucune dépendance...
  • var camelRule=rule.replace(/\-(\w)/g, function (strMatch, p1){return p1.toUpperCase();}),//supprime les tiré et met en majuscule la lettre suivante
  • value = element.style[camelRule];
  • if (!value){
  • if(document.defaultView && document.defaultView.getComputedStyle){
  • value = document.defaultView.getComputedStyle(element, "").getPropertyValue(/*fait l inverse de camelRule*/rule.replace(/[A-Z]/g, function(match){return '-'+match.charAt(0).toLowerCase();}));
  • }else{//specifique ie
  • value = element.currentStyle[camelRule] ;
  • }
  • }
  • return value == 'auto' ? undefined : value;
  • };
  • var toNum = function(el,rule){// convertie une valeur avec des px
  • return parseInt(getStyle(el,rule) ,10) || 0;
  • };
  • var manageBox = function(element, of, op, dim, co){//ajoute ou enleve les élement du modele de boite (bordure padding margin)
  • for(var i=0,a;(a=op[i]);i++){
  • of[0]+=toNum(element,a+'-left'+(a=='border'?'-width':''))*co;
  • of[1]+=toNum(element,a+'-top'+(a=='border'?'-width':''))*co;
  • if(dim){
  • of[0]+=toNum(element,a+'-right'+(a=='border'?'-width':''))*co;
  • of[1]+=toNum(element,a+'-bottom'+(a=='border'?'-width':''))*co;
  • }
  • }
  • };
  • var displayParent = function(el){//recuepre les parents pas affiché et affiche les, en position absolue (-> plus tard ) et invisible
  • var p=[];
  • while((el=el.parentNode) && el!=document.documentElement){
  • var d=getStyle(el,'display');
  • if(d=='none')
  • p.push(el);
  • }
  • if(p.length){
  • for(var i=0,el;(el=p[i]);i++){
  • el.style.display='';
  • }
  • var last=p[p.length-1];
  • last.__visibility__=getStyle(last,'visibility');
  • last.style.visibility='hidden';//on devrait passer en absolue le dernier parrent avec un display none, mais bcp de travaille ... faut modifier les valeurs pour correspondre à la position d'orgine , vue que le taux de rafraichissement (~= 20 millisec) est plus élévé que le temp d'execution de la fonction, on peux faire sans
  • /* last.__position__=getStyle(last,'position');
  • last.style.position='absolute';*/
  • }
  • return p;
  • };
  • var unDisplayParent = function(p,of,abs){//retablie l'affichage des parents
  • if(p.length){
  • var l=p[p.length-1];
  • /*if(of && l.__position__=='static'){
  • if(abs && (!isIE8 && !isOpera)){
  • of[0] -= toNum(l,'border-left-width');
  • of[1] -= toNum(l,'border-top-width');
  • }
  • if(abs){
  • of[0] -= l.offsetLeft || 0;
  • of[1] -= l.offsetTop || 0;
  • }
  • }
  • l.style.position=l.__position__;
  • l.__position__=null;*/
  • l.style.visibility=l.__visibility__;
  • l.__visibility__=null;
  • for(var i=0,el;(el=p[i]);i++){
  • el.style.display='none';
  • }
  • }
  • };
  • var getOffset = function(/*DOMObject*/element, /*bool*/byPos, /*string*/from){
  • var of=[0,0],//tab de coordonnées à retourner
  • from = from || 'border',//par default offset de la bordure (sasns les marges) , car la définition des position se fait a partir des bordures
  • el=element,//réferene a element pour boucler dessus
  • manageWith,//variable pour ajouter des elements du modele de boite
  • manageLess,//variable pour enlever des elements du modele de boite
  • abs,//si l'element est en absolue (utile seulement pour ie6 et 7 geko et webkit, mais déclarer pour tous pourr éviter tros e test conditionnelle)
  • dp=displayParent(element);//affiche les parents si néccessaire
  • //definit abs
  • if(!isIE8 || !isOpera)
  • abs=_abs=getStyle(element,'position')!='static'?element:false;
  • //ajoute au tab de coor les offsetparent, + break la boucle si un parent opu l'element en position absolue et byPos définit
  • while (el){
  • of[0] += el.offsetLeft || 0;
  • of[1] += el.offsetTop || 0;
  • el = el.offsetParent;
  • if(el && byPos && ((getStyle(el,'position')!='static' && (!el.__position__ || el.__position__!='static')) || abs)){
  • //ie8 et opera beug
  • if(isIE8 || isOpera){
  • of[0] -= toNum(el,'border-left-width');
  • of[1] -= toNum(el,'border-top-width');
  • }
  • break;
  • }
  • };
  • if(!isIE8 && !isOpera){
  • //si l'element est en absolue et que byPos définit, pas besoin de réctifier les valeurs
  • if(!byPos || !abs){
  • var _el=el || document.documentElement,//dernir element parent définit
  • el=element.parentNode;//on commence au 1er parent
  • //beug ie , concerne les prop width, height,et overflow
  • if(isIE)
  • var h=false;
  • do{
  • if(el.tagName=='TR' || el.tagName=='TBODY')//pas de beug sur ses éléments
  • continue;
  • if(el.tagName=='TD' || (isWebKit && el.tagName=='TABLE')){
  • //retranche les bordure si pas en absolue avant
  • if(!abs ){
  • of[0] += toNum(el,'border-left-width');
  • of[1] += toNum(el,'border-top-width');
  • }
  • h=false;
  • continue;
  • }
  • if(!byPos && getStyle(el,'position')!='static'){//si l'élément est pas en static, et que l'oin cherche l'offset depuis le body, en ajoute les bordure (beug)
  • of[0] += toNum(el,'border-left-width');
  • of[1] += toNum(el,'border-top-width');
  • abs=el;
  • }
  • // ajoute les scroll si pas ie6 qui le fait déja ,
  • if(!isIE6 && el!=document.body){
  • of[0] = of[0]-el.scrollLeft || 0;
  • of[1] = of[1]-el.scrollTop || 0;
  • }
  • if(isIE){
  • //si beug de style ie
  • if(!abs && (getStyle(el,'height') || getStyle(el,'width') || (isIE7 && getStyle(el,'overflow')!='visible') )){
  • h=el;
  • }
  • // si beug de style et pas en absolue ajoute les bordure
  • if(!abs && h==el){
  • of[0] += toNum(el,'border-left-width');
  • of[1] += toNum(el,'border-top-width');
  • }
  • }
  • }while((el=el.parentNode) && el!=_el);
  • }
  • }
  • //réctifie les valeurs si le dernier parent visible est body
  • if(!el || el==document.documentElement){
  • if((!isIE8 && !isOpera) && (!abs || isWebKit || isGecko)){
  • of[0] += toNum(document.body,'border-left-width')*(isGecko && !abs?2:1);
  • of[1] += toNum(document.body,'border-top-width')*(isGecko && !abs?2:1);
  • }
  • }
  • //définit les tableau des prop du modele de boite a enlever ou ajouter
  • switch(from){
  • case 'content':
  • manageWith=['padding','border'];
  • break;
  • case 'padding':
  • manageWith=['border'];
  • break;
  • case 'margin':
  • manageLess=['margin'];
  • break;
  • }
  • //enleve ou ajoute les prop du modele de boite
  • if(manageWith)
  • manageBox(element, of, manageWith, false, 1);
  • if(manageLess)
  • manageBox(element, of, manageLess, false, -1);
  • //rétatblie le display des parent
  • unDisplayParent(dp,of,_abs );
  • return of;
  • };
  • /*------------------------------------fonction publique-------------------------------------------------*/
  • window.getOffset=function(/*DOMObject*/element, /*string*/from){
  • return getOffset(element,false,from);
  • };
  • window.getPosition=function(/*DOMObject*/element, /*string*/from){
  • return getOffset(element,true,from);
  • };
  • window.absolutize = function(/*DOMObject*/element){
  • //si pas deja en absolue
  • if (getStyle(element,'position') == 'absolute')
  • return;
  • var es=element.style,//racourcit
  • dp=displayParent(element);//affiche les parents si néccessaire
  • var of=getPosition(element,'margin'),//position de l'élément
  • dim=getSize(element);//dimension de l'élément
  • //rétatblie le display des parent
  • unDisplayParent(dp,of,true);
  • es.position = 'absolute';
  • es.left = of[0] + 'px';
  • es.top = of[1] + 'px';
  • es.width =dim[0] + 'px';
  • es.height = dim[1] + 'px';
  • };
  • window.getSize = function(/*DOMObject*/element, /*string*/from){
  • var dim=[0,0],//tableau de coor à retourné
  • from = from || 'content',//par default taille du contenue (sasn les padding) , car la définition des taille se fait a partir de là
  • manageWith,//variable pour ajouter des elements du modele de boite
  • manageLess,//variable pour enlever des elements du modele de boite
  • op=from=='content' || from=='padding'?'client':'offset',//operation pour récupérer les dimension, utilise la meilleur fonction native
  • dp=displayParent(element);//affiche les parents si néccessaire
  • dim[0] += element[op+'Width'];
  • dim[1] += element[op+'Height'];
  • //définit le tableau des prop du modele de boite a enlever ou ajouter
  • switch(from){
  • case 'margin':
  • manageLess=['margin'];
  • break;
  • case 'content':
  • manageWith=['padding'];
  • break;
  • }
  • //enleve ou ajoute les prop du modele de boite
  • if(manageWith || manageLess)
  • manageBox(element, dim, manageWith || manageLess, true,manageLess?1:-1);
  • //rétatblie le display des parent
  • unDisplayParent(dp);
  • return dim;
  • };
  • })()
(function(){//on encapusle nos donné grace a une fonction anonyme , pour eviter tros de vriables globale ou de faire un namespace
   
   /*------------------------------------fonction privée-------------------------------------------------*/
   
   //definit les versions du navigateur, peux etre mit en globale
   var ua=navigator.userAgent.toLowerCase(),
       isIE=/msie/.test(ua),
       isIE6=/msie 6/.test(ua),
       isIE7=/msie 7/.test(ua),
       isIE8=/msie 8/.test(ua),
       isWebKit = /webkit/.test(ua),
       isGecko = /gecko/.test(ua) && !isWebKit,
       isOpera = /presto/.test(ua);
   
   
   var getStyle = function(/*DOMObject*/element, /*string*/rule){//peux etre definit en globale car très utilise, aucune dépendance...
       var camelRule=rule.replace(/\-(\w)/g, function (strMatch, p1){return p1.toUpperCase();}),//supprime les tiré et met en majuscule la lettre suivante  
           value = element.style[camelRule];
           
       if (!value){ 
           if(document.defaultView && document.defaultView.getComputedStyle){
		       value = document.defaultView.getComputedStyle(element, "").getPropertyValue(/*fait l inverse de camelRule*/rule.replace(/[A-Z]/g, function(match){return '-'+match.charAt(0).toLowerCase();})); 
	       }else{//specifique ie
		       value = element.currentStyle[camelRule] ;
           }
       }
       
       return value == 'auto' ? undefined : value;
   }; 
   
   var toNum = function(el,rule){// convertie une valeur avec des px
       return parseInt(getStyle(el,rule) ,10) || 0;
   };
   
   var manageBox = function(element, of, op, dim, co){//ajoute ou enleve les élement du modele de boite (bordure padding margin)
       for(var i=0,a;(a=op[i]);i++){
           of[0]+=toNum(element,a+'-left'+(a=='border'?'-width':''))*co;
           of[1]+=toNum(element,a+'-top'+(a=='border'?'-width':''))*co;
           if(dim){
              of[0]+=toNum(element,a+'-right'+(a=='border'?'-width':''))*co;
              of[1]+=toNum(element,a+'-bottom'+(a=='border'?'-width':''))*co; 
           }
        }
   };
   
   var displayParent = function(el){//recuepre les parents pas affiché et affiche les, en position absolue (-> plus tard ) et invisible
        var p=[];
        while((el=el.parentNode) && el!=document.documentElement){
           var d=getStyle(el,'display');
           if(d=='none')
               p.push(el);
       }
       if(p.length){
           for(var i=0,el;(el=p[i]);i++){
               el.style.display='';
           }
           var last=p[p.length-1];
           last.__visibility__=getStyle(last,'visibility');
           last.style.visibility='hidden';//on devrait passer en absolue le dernier parrent avec un display none, mais bcp de travaille ... faut modifier les valeurs pour correspondre à la position d'orgine , vue que le taux de rafraichissement (~= 20 millisec) est plus élévé que le temp d'execution de la fonction, on peux faire sans
         /*  last.__position__=getStyle(last,'position');
           last.style.position='absolute';*/
       }
       return p;
   };
   
   var unDisplayParent = function(p,of,abs){//retablie l'affichage des parents
        if(p.length){
            var l=p[p.length-1]; 
             /*if(of && l.__position__=='static'){
               if(abs && (!isIE8 && !isOpera)){
                    of[0] -= toNum(l,'border-left-width');
                    of[1] -= toNum(l,'border-top-width');
                }
                if(abs){
                    of[0] -= l.offsetLeft || 0;
                    of[1] -= l.offsetTop  || 0;
                }
            }
            l.style.position=l.__position__;
            l.__position__=null;*/
            l.style.visibility=l.__visibility__;
            l.__visibility__=null;  
            for(var i=0,el;(el=p[i]);i++){
                el.style.display='none';
            }
        }
   };
   
   var getOffset = function(/*DOMObject*/element, /*bool*/byPos,  /*string*/from){
      
       var of=[0,0],//tab de coordonnées à retourner
           from = from || 'border',//par default offset de la bordure (sasns les marges) , car la définition des position se fait a partir des bordures
           el=element,//réferene a element pour boucler dessus
           manageWith,//variable pour ajouter des elements du modele de boite 
           manageLess,//variable pour enlever des elements du modele de boite 
           abs,//si l'element est en absolue (utile seulement pour ie6 et 7 geko et webkit, mais déclarer pour tous pourr éviter tros e test conditionnelle)
           dp=displayParent(element);//affiche les parents si néccessaire
      
       //definit abs
       if(!isIE8 || !isOpera)
           abs=_abs=getStyle(element,'position')!='static'?element:false;
           
      
       //ajoute au tab de coor les offsetparent, + break la boucle si un parent opu l'element en position absolue et byPos définit
       while (el){
           of[0] += el.offsetLeft || 0;
           of[1] += el.offsetTop  || 0;
           el = el.offsetParent;
           if(el && byPos && ((getStyle(el,'position')!='static' && (!el.__position__ || el.__position__!='static')) || abs)){
              //ie8 et opera beug
               if(isIE8 || isOpera){
                   of[0] -= toNum(el,'border-left-width');
                   of[1] -= toNum(el,'border-top-width');
               }
               break;
           }
       };
       
       if(!isIE8 && !isOpera){
           //si l'element est en absolue et que byPos définit, pas besoin de réctifier les valeurs
           if(!byPos || !abs){
               var _el=el || document.documentElement,//dernir element parent définit 
                   el=element.parentNode;//on commence au 1er parent
               
               //beug ie , concerne les prop width, height,et overflow    
               if(isIE)
                   var h=false;
                   
               do{
                   if(el.tagName=='TR' || el.tagName=='TBODY')//pas de beug sur ses éléments
                       continue;
               
                   if(el.tagName=='TD' || (isWebKit && el.tagName=='TABLE')){
                       //retranche les bordure si pas en absolue avant
                       if(!abs ){
                           of[0] += toNum(el,'border-left-width');
                           of[1] += toNum(el,'border-top-width');
                       }
                       h=false;
                       continue;
                   }
                   
                   if(!byPos  && getStyle(el,'position')!='static'){//si l'élément est pas en static, et que l'oin cherche l'offset depuis le body, en ajoute les bordure (beug)
                       of[0] += toNum(el,'border-left-width'); 
                       of[1] += toNum(el,'border-top-width');
                       abs=el;
                   }
                   
                   // ajoute les scroll si pas ie6 qui le fait déja ,
                   if(!isIE6 && el!=document.body){
                       of[0] = of[0]-el.scrollLeft || 0;
                       of[1] = of[1]-el.scrollTop || 0;
                   } 
               
                   if(isIE){   
                       //si beug de style ie
                       if(!abs && (getStyle(el,'height') || getStyle(el,'width') || (isIE7 && getStyle(el,'overflow')!='visible') )){
                            h=el;
                       }
                       // si beug de style et pas en absolue ajoute les bordure
                       if(!abs && h==el){
                           of[0] += toNum(el,'border-left-width'); 
                           of[1] += toNum(el,'border-top-width');
                       }
                   } 
               
               }while((el=el.parentNode) && el!=_el);
           }
       }
       
       //réctifie les valeurs si le dernier parent visible est body
       if(!el || el==document.documentElement){
           if((!isIE8 && !isOpera) && (!abs || isWebKit || isGecko)){
               of[0] += toNum(document.body,'border-left-width')*(isGecko && !abs?2:1);
               of[1] += toNum(document.body,'border-top-width')*(isGecko && !abs?2:1);
           } 
       }
       
       //définit les tableau des prop du modele de boite a enlever ou ajouter
       switch(from){
           case 'content':
               manageWith=['padding','border'];
           break; 
           case 'padding':
               manageWith=['border'];
           break; 
           case 'margin':
               manageLess=['margin'];
           break; 
       }
       
       //enleve ou ajoute les prop du modele de boite
       if(manageWith)
           manageBox(element, of, manageWith, false, 1);
       if(manageLess)
           manageBox(element, of, manageLess, false, -1);
        
       //rétatblie le display des parent
       unDisplayParent(dp,of,_abs );
       
       return of;
   };
   
   /*------------------------------------fonction publique-------------------------------------------------*/
   
   window.getOffset=function(/*DOMObject*/element, /*string*/from){
       return getOffset(element,false,from);
   };
   
   window.getPosition=function(/*DOMObject*/element, /*string*/from){
       return getOffset(element,true,from);
   };
   
   window.absolutize = function(/*DOMObject*/element){
       //si pas deja en absolue
       if (getStyle(element,'position') == 'absolute')
           return;
           
       var es=element.style,//racourcit
           dp=displayParent(element);//affiche les parents si néccessaire     
           
              
       var of=getPosition(element,'margin'),//position de l'élément
           dim=getSize(element);//dimension de l'élément 
        
        //rétatblie le display des parent
        unDisplayParent(dp,of,true);
           
        es.position = 'absolute';  
        es.left   = of[0] + 'px';
        es.top    = of[1] + 'px';
        es.width  =dim[0] + 'px';
        es.height = dim[1] + 'px'; 
          
   };
   
   window.getSize = function(/*DOMObject*/element,  /*string*/from){
       var dim=[0,0],//tableau de coor à retourné
           from = from || 'content',//par default taille du contenue (sasn les padding) , car la définition des taille se fait a partir de là
           manageWith,//variable pour ajouter des elements du modele de boite 
           manageLess,//variable pour enlever des elements du modele de boite 
           op=from=='content' || from=='padding'?'client':'offset',//operation pour récupérer les dimension, utilise la meilleur fonction native
           dp=displayParent(element);//affiche les parents si néccessaire 
          
       dim[0] += element[op+'Width'];
       dim[1] += element[op+'Height'];  
       
       //définit le tableau des prop du modele de boite a enlever ou ajouter
       switch(from){
           case 'margin':
               manageLess=['margin'];
           break; 
           case 'content':
               manageWith=['padding'];
           break; 
       }
       
       //enleve ou ajoute les prop du modele de boite
       if(manageWith || manageLess) 
           manageBox(element, dim, manageWith || manageLess, true,manageLess?1:-1);
           
       //rétatblie le display des parent
       unDisplayParent(dp);
       
       return dim; 
   };
  
})()


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 mai 2009 21:36:56 :
modification du titre + faute d'orthographe
24 mai 2009 03:33:52 :
ajout d'une nouvelle méthode, demain je finit !! ça lague sous safarie ...
24 mai 2009 16:30:55 :
ajout de force, plus getSize
02 juin 2009 18:58:48 :
...
02 juin 2009 19:56:59 :
....

 Sources du même auteur

Source avec Zip Source avec une capture UID - FRAMEWORK JAVASCRIPT
Source avec Zip DOMBUILDER
Source avec Zip GETELEMENTSBYREG
Source avec Zip OPTIMISER VOS BOUCLES !!
Source avec Zip Source avec une capture QUERYSELECTORALL, SELECTEUR CSS3

 Sources de la même categorie

Source avec Zip Source avec une capture STOCK/FOREX CANDLE CHART USING CANVAS API par BlackWizzard
MODIFIER SES FEUILLES DE STYLES .CSS À LA VOLÉE AVEC JAVASCR... par Phildepantin
Source avec Zip Source avec une capture FARMVILLE - HEURE ET COMBO LIST IMAGES par ym_trainz
Source avec Zip [-CLASS-] -> CARROUSSEL D'IMAGES par TheWeasel47
Source avec Zip Source avec une capture OGG MEDIA PLAYER par kazma

 Sources en rapport avec celle ci

DÉTECTER SI CSS EST ACTIVÉ par jdmcreator
Source avec Zip Source avec une capture MENU AVEC ROULETTE par jdmcreator
OBTENIR L' OFFSET PAR RAPPORT AU PREMIER PARENT POSITIONNÉ par Evangun
Source avec Zip DIV POSITION FIXED SUR LA PAGE par PetoleTeam
"DRAG" DE BLOC <DIV> par slog9

Commentaires et avis

Commentaire de Kimjoa le 24/05/2009 00:58:03

apparemment il reste un beug sous ie6 , je sais pas si je vair arriver a le corriger, ça à l'aire vraiment d'être le grand n'importe quoi, par exemple si un parent définit une hauteur ou de plus si un enfant de l'offset non static a aussi une hauteur ou longueur , sa rend pas le même offset...

Commentaire de kazma le 24/05/2009 22:31:42

j'ai fait des testes aussi sur l'exemple quand on rend un objet en absolute sur IE 5.5 a 8 (IE tester) firefox 3 opera et chrome et aucuns des navigateur a le meme rendu meme pour tous les IE chacuns affiches différemment on peut le dire c'est le gros bazars  tu devrait propose a incorpore la source a acid3 (lol)

Commentaire de Kimjoa le 24/05/2009 23:16:07

lol kazma, merci ; ) , ça fait 4 jours que je suis sur ce script , y a encore des beug, mais je s'en que je touche au but ... et pourtant il s'agit que de récupérer la position d'un élément ... je trouve ça dingue que ce soit à nous de faire se genre de script, les navigateurs devrait le prendre en charge, ils peuvent afficher un élément dans une page, il devrait alors aussi pouvoir nous dire sa position, ca serait triviale pour eux !!!
j'espère finir ce soir, koi kil arrive , je lâcherais pas le morceaux : )

Concernant IE, c'est les plus lamentable, il ont deux mode d'affichage, l'un standard, complètement pas du tout standard !! et l'autre maison , en plus comme tu le précisent aucune version ne donne les même résultat lors d'un offset... quand on fait un logiciel, on fait tjrs en sorte que les versions futurs soit compatible avec les précédentes, surtout un browser  .... c'est comme si un cms, changer le nom de se table sql dans la base, entre différentes versions, ou que les requette vers la base de données renvoyent pas le même résultat, pour un op similaire sur des versions différents...
voila voila , bye !!

Commentaire de labotemplates le 25/05/2009 01:53:12

bonjour bonjour,
Le grand Lama des Andes me succure à l'oreille que les problèmes d'offset seraient dépendants du doctype de la page... Et si c'était vrai ?... Des fois que le DOM ne soit pas le même ;)
Je dis, je dis rien... Bon courage les amis.

Commentaire de Kimjoa le 25/05/2009 03:32:04

bin dit labotemplates , en effet ie, prend en charge 2 types de modèle de boite en fonction du doctype énonce, en mode strict  , ça revient en modèle de boite standard, mais pour les autres mode de doctype, je sais plus, ce qui est sur c'est que sans, ie bascule en mode layout je crois , le modèle de boite maison,  donc exclue de mon script (qui se veux être crossbrowser , donc l'affichage devrait l'etre aussi)... j'ai déjà assé de prise de tête  !! ;) ,pour le moment me reste ie7 qui me bloqe les autres c'est bon (opera aussi mais c est plus simple ) ....vais testé les autres modes de doctype!!

bye

Commentaire de mickaelpfr le 25/05/2009 09:49:44

Quelques fonctions utiles kim , mais pourrais tu préciser quels sont les problèmes de positionnement lié a offsetLeft ??

j'ai toujours utilisé cette méthode :

function getPosition (element) {
var tmpLeft = element.offsetLeft;
var tmpTop = element.offsetTop;
var MyParent = element.offsetParent;
while(MyParent) {
tmpLeft += MyParent.offsetLeft;
tmpTop += MyParent.offsetTop;
MyParent = MyParent.offsetParent;
}
return {"left":tmpLeft,"top":tmpTop};
}
qui se comporte de la même façon sous ie6/7/8 et FF et chrome et safari

Commentaire de Kimjoa le 25/05/2009 15:43:28

salut mikaelpfr , en faite ta fonction nous donnes la hauteur absolue, celle à partir document.body , elle devrait être bonne mais , mais sous ie7, ie6 et opéra sa déconne, fait le test , remplace ma fonction part la tienne et absolutize l'élément (en enlevant toute les autres positions relative du doc ...)
Il existe en css , l'attribut position , ses valeurs sont static (classique) , abolute et relative .
En mode absolute  la position d'un element , ne se fait pas a partir du body, mais du dernier élément parent , avec comme position -> relative.
En mode relative , la position d'un element , se fait pas a partir de sa position d'origine ...
Dans ses deux dernier cas , t'as fonction n'est plus bonne, il lui manquera , un test pour savoir si le parent est en relatif ou absolue , et casser la boucle si oui... le problème reste comment interprète les navigateurs le offsetLeft quand l'un des parent est en relative ou absolue, car aucun ne le fait parreil ...
voilà a++


Commentaire de mickaelpfr le 25/05/2009 16:37:46

en fait je pensais que ma fonction renvoyait ( jusqu'à présent a juste titre )
la position de l'élément par rapport au body justement, ( pour le positionnement d'un absolute dans un relatif oui je connais ^^ )

je vais effectuer quelques test :)

Commentaire de Kimjoa le 02/06/2009 19:03:08

j'oubliais j'ai rajouter la fonction absolutize , qui permet comme sont nom l'indique de mettre en absolue un élement, pratique pour du drag , et des animations ...


Commentaire de amrounix le 11/06/2009 23:16:17

moi j'ai taper un bout de code qui fait le même truc :

var nomove={"TR":0, "CENTER":0, "B":0, "P":0, "U":0, "I":0, "DIV":0, "A":0, "FONT":0, "LI":0, "PRE":0, "SPAN":0, "SUB":0, "SUP":0, "FORM":0};

/*retourne la position en {x,y} d'un element */
function posxy(rst,x,y)
{
if ( rst.style!=null && rst.style.position == 'absolute' )  { return {"x":x + rst.offsetLeft,"y":y + rst.offsetTop} }
else if (rst.parentNode == null )  { return {"x":x,"y":y} }
else  { return (nomove[rst.tagName]==0) ? posxy(rst.parentNode,x,y) : posxy(rst.parentNode,x+rst.offsetLeft,y+rst.offsetTop)   ;  }
}

(avec x & y, un delta par rapport au pt d'origine)

utilisation :
var pos_=posxy(document.getElementById('element'),0,0);

Commentaire de Kimjoa le 16/06/2009 23:21:45

salut amrounix, j'ai testé tas fonction , et elle ne marche pas, j' ai remplacé dans l'exemple que j'ai fournit dans le zip , la fonction testAbsolutize par :

var testAbsolutize = function(el){
            var es=document.getElementById(el).style,
                of=posxy(document.getElementById(el),0,0),
                dim=[document.getElementById(el).clientWidth,document.getElementById(el).clientHeight];
        alert(of.x)
            es.position = 'absolute';  
            es.left   = of.x + 'px';
            es.top    = of.top + 'px';
            es.width  =dim.y + 'px';
            es.height = dim.height + 'px';
       };

et de même pour la fonction placeCoor , et sur tout les navigateurs ça bug ....

me suis rendu compte il y a peu que dojo, avait une fonction assé similaire à la mienne , malgré quelques détails ....

faudrait sans doute faire encore des tests, mais j'ai plus le temps et se script ma découragé, j'ai pas vraiment envie de m'y remettre ...

si tu t'y sent prêt?? c'est le genre de fonctions qui sont vraiment essentiels et pourtant même de grosse librairie, n'arrive pas à les implémenter ....

a++

Commentaire de Kimjoa le 16/06/2009 23:26:23

oups , j'ai bien mit es.top = of.y dans mon code...

de plus, pour le test de mise en absolue c'est normale que t'as fonction ne marche pas, car il aurait fallut cour-circuiter la récursivité de t'as fonction au 1er élement non-static ....

tchaooo ;)

Commentaire de amrounix le 29/06/2009 16:50:04

nouvelle version spécial killer ...

function getProp(x)
{htm=""; for (e in x) if (x[e]==parseInt(x[e],10)) htm+=e+":"+x[e]+"\n";alert(htm);}

/*retourne la position en {x,y} d'un element */
function posxy(rst,xx,yy) {
var cc = { x: xx, y: yy };
while (rst) {
//getProp(rst);
cc.x += rst.offsetLeft;
cc.y += rst.offsetTop;
rst = rst.offsetParent;
}
return cc;
}

mon erreur à été de parcourir la node avec parentNode alors qu'il existe un offsetParent !

Commentaire de Kimjoa le 29/06/2009 23:59:06

salut amrounix, cette nouvelle fonction ressemble un peu plus à celle que l'on retrouve sur le web et que mickaelfr nous a proposé...
en effet, j'avais remarqué que tu avais utilisé parentNode au lieux de offsetParent, mais oublié de te le faire remarquer :( ....

En faite , t'as fonction devrait être bonne (d'ailleur si tu détail mon code j'utilise la même base), mais malheureusement les navigateurs interprètent différemment les offsets, suivant si le offsetParent est en absolue, ou si entre le offsetParent se trouve un tableau ou  qu'il définit une dimension ou un overflow(bug ie).... il y a aussi un problème lié aux offsetParent avec une position relative, mais là y'a tellement de  bug (surtout ie) que j'ai pas réussi a trouver la formule pour débeuger, j'ai cherché sur le web sans résultat :(....

voilà voilà, pour t'en convaincre test t'as fonction dans mon exemple , tu verras les problèmes ....

a plush ;)

Commentaire de mickaelpfr le 30/06/2009 08:39:41

Salut kimjoa :)

Pourrais tu nous donner des exemples sur lesquelles nous pourrions tester la différence ??
j'ai essayé des absolute dans des absolute etc mais ça marche correctement de mon coté ...

Commentaire de Kimjoa le 30/06/2009 17:04:01

salut mickaelpfr , voici un exemple qui te permettra de voir de juger des problèmes des getOffset (la fonction que j'utilise est la même que la tienne mais simplifier grâce à la fonction do{}while(). )

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
   <style>
      body{
           margin : 10px;
           padding :15px;
           border : 5px solid blue;
       }
       .ele{
           position : absolute ;
           border : 6px solid green;
           background-color : yellow;/*z-index : 1010;*/
       }
   </style>
   <title>ID</title>
   <script type="text/javascript" src="position.js"></script>
   <script type="text/javascript">
       function getPosition (element) {
           var o={left:0,top:0};
           do{
              o.left+=element.offsetLeft;
              o.top+=element.offsetLeft;
           }while(element=element.offsetParent)
           return o;
       }
      
       var testPlaceCoor = function(el){
           var of=getPosition(document.getElementById(el)),
               ele=document.createElement('div');
              
           ele.className='ele';
           ele.innerHTML='je suis un div en position absolue placer grace a la fonction getOffset';
           ele.style.position='absolute';
           ele.style.left=of.left+'px';
           ele.style.top=of.top+'px';
           document.body.appendChild(ele);
       };
   </script>
</head>
<body>
  
  <input type='button' value='ajouter un élement au coor' onclick='testPlaceCoor("testAbs2")'>
  <br />
  <div  id='testToggle2' style='position:;left:20px;top:60px;border :13px solid green;padding:13px;margin:23px;'>je suis un div
       <div  style='border :35px solid green;padding:10px;margin:10px;'> je suis un div
            <div  style='border :24px solid yellow;padding:6px;margin:12px;'>je suis un div
                <div   style='position:;left:20px;top:60px;border :40px solid blue;padding:6px;margin:12px;'>je suis un div
                     <div  id='testAbs2' style='border:10px solid red;margin:10px;padding:10px'>je suis un div ABSOLUTIZER MOI !!!!!</div>
                     </div>
                /div>
            </div>
       </div>
  </div>
</body>


tu peux aussi mettre les position parents en absolue , ca bug aussi .
j'ai testé avec et sans doctype , pour le même résultat.
Du coup tu me dit que sa marche chez toi, je voudrais bien que tu me fasse voire ton exemple... mon script à encore des bug (je viens de m'en apercevoir sur chrome) mais juste un léger décalage , quand j'aurais le temps , je mit remetterais , surtout que j'ai vue que dojo avait une fonction semblable , qui devrait me donner des idées ...

a++

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Changer un calque de position"absolute" en position"relative" dans OnClick [ par FoxCoon ] Salut tout le monde !Je voudrais savoir comment je pourrais changer la position de mon calque...en fait, je cherche &#224; cr&#233;er un menu....Quand bug sur zindex [ par originalcompo ] Bonjour à tous.Voilà, j'ai un bug dans l'utilisation de la propriété zindex, dans le cas d'internet explorer (marche très bien sur netscape).Comme je Position relative de calques... problèmeS [ par lunelautre ] [u]Bonjour j'ai des calques de menu (invisibles quand non actifs) dont la position est relative ... en fonction de la taille de la fenêtre du navigate Positionner une <div> par rapport à la résolution d'écran [ par Peexstudio ] Bonsoir, J'ai une vidéo en .flv à mettre en background de mon site, elle se charge automatiquement et se lance. En [b]position:absolute[/b] celle-ci problème de position d'une image lors du survol d'un lien [ par molio ] Bonjour, J'essaie de faire un site internet pour mon laboratoire. je souhaite faire apparaitre une image qui suit la souris au survol d'un lien vers Menu Défilant Vertical ...Problème de récupération de données [ par Romje1 ] Bonjour, J'essaie de faire un menu défilant vertical au click gauche (le menu descends ) ou droite (le menu monte) sans aide de framework, avec un pa pb compatibilité explorer [ par Bestdoud ] Bonjour,J'ai fait cette page web:http://amigagaamp.free.fr/index2.htmCa fonctionne très bien sous IE mais pas sous firefox et j'ai pas esséy les autre TextArea ou Select et position de la souris [ par 6BerYeti ] Bonjour,Je souhaite faire afficher une infobulle là où est le curseur (avec un offset) et à la déplacer qd la souris se déplace.J'ai à peu près tout c Connaître la position d'un input [ par kcin ] Salut à tous.Je vois de partout des codes permettant de connaître la position de la souris, mais existe t-il un code pour connaître la position d'un i recupérer position scroll après un get [ par yebs ] bonjour,j'ai un petit soucis... je construis un site où il y a une longue liste de produits que l'on peut commander. Cependant quand je fais "ajouter


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales