IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Comment ne pas faire dépasser un ballon tip d'une page?


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut Comment ne pas faire dépasser un ballon tip d'une page?
    Bonjour!

    J'ai une image, et un div placée en absolute, et qui apparait quand on mouse over l'image.

    Mon petit probleme c'est que quand l'image est à droite de la page, le div apparait et depasse un peu de l'écran.

    Comment pourrait-je faire en javascript pour faire en sorte que ca detecte que je suis un peu trop à droite/en bas de l'écran et placer le div à gauche/en haut de l'ecran pour pas que mon balloon tip depasse ?

    Merci d'avance!

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    un petit script qui teste si le offsetLeft+offsetWidth ou offseTop+offsetHeight n'est pas supérieur aux dims de l'ecran si c'est le cas tu recalcules le left ou top ...

    ici un tres bel exemple de tooltips:
    http://www.walterzorn.com/tooltip/tooltip_e.htm
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Bonjour et merci de la réponse

    J'ai cherché offsetLeft etc dans la source de la lib que tu m'as donné mais sans succes.
    J'ai bien compris le principe mais est-ce que tu pourrais me le faire avec le nom exact des attributs de mon div à utiliser ?

    Du genre dans ma fonction appellée sur un mouseover, avant de passer l'attribut style.display en block comment est-ce que

    1/ Je récupere la position actuelle de l'image que je mouseover (nommons la X)
    2/ Je récupere la largeur de l'ecran (nommons la Y)
    3/ Je set la position de mon div (nommons la Z)

    Apres je comprends qu'il faut que je fasse un if X + la largeur de mon ballon > Y alors je met Z à une valeur inferieure.

    Merci d'avance pour ces précisions techniques...

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    Dans la lib donnée pas besoin d'aller trifouiller dans le code c'est une focntionalité incluse ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Oui mais en fait j'utilise des requettes ajax et mon code pour les balloon est deja fait, c'est pourquoi je ne peux pas simplement appeller leur lib pour afficher un texte statique, j'aimerai coder moi meme cette fonctionalité dans mon code.

    Je ré-itère donc mes 3 questions

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    tu peux tout à fait coupler la lib avec des requetes ajax ...
    suffit de renseigner le contenu du span avec ajax ...

    tu peux même dans ce cas là utiliser la librairie window prototype qui permet de mettre le contenu de la tooltip en ajax ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Argh oui mais je travaille sur un projet deja existant où tout est deja implenté, il ne me reste que cette fonction d'affichage au bon endroit à faire.

    Désolé d'être insistant mais j'aimerai juste avoir ces 3 infos que j'ai demandé..

    Merci d'avance

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    si tu tiens à perdre du temps ... il suffirait juste d'ajouter la librairie de walterzorn et de faire les appels comm eil faut .. au pire ça prend 15 minutes ...

    Mais bon si tu veux passer 6 heures à tout redevelopper toit même
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Mais ca prend pas 6h !!

    if ((POSITION_DE_MON_IMAGE + TAILLE_DE_MON_DIV) > TAILLE_DE_LA_PAGE) {
    POSITION_DE_MON_DIV = TAILLE_DE_LA_PAGE - TAILLE_DU_DIV
    }

    voila, il me manque juste ça, c'est plus rapide de faire ça plutot que d'apprendre à utiliser une lib dont je me servirais qu'à 2%. En plus c'est dans le cadre d'une utilisation commerciale, je n'ai pas regardé mais ca peut poser probleme.

    Enfin bref, peux-tu, SI POSSIBLE, me donner ce que je recherche plutot que d'essayer de me convaincre d'utiliser ta lib ? Merci d'avance

    (PS: Evitez de placer en dessous : Bah cherche toi même )

    Merci encore.

  10. #10
    Membre éclairé Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Par défaut
    largeur de la page = window.innerWidth ( ou document.body.offsetWidth pour IE )

    largeur de l'objet = objet.style.width

    position "horizontale" de l'objet = objet.offsetLeft ( attention, position -par rapport à son parent- )

    cas ou ça dépasse : ( position + largeur ) > largeur page

    Donc en pseudo code, ça devrait ressemblait à ça je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    function getWindowWidth () {
      if (ie) return document.body.offsetWidth;
      else return window.innerWitdh;
    }
    var monPadding = 10; // px
    var windowWidth = getWindowWidth() 
    var objWidth = maDiv.style.width // ou maDiv.offsetWidth peut-etre plutôt
    var totalOffsetLeft = maDiv.offsetLeft;
    var parent = maDiv;
    while ( parent = parent.parentNode ) {
        totalOffsetLeft += parent.offsetLeft;
    }
     
    if ( (totalOffsetLeft + objWidth ) > windowWidth ) {
        maToolTip.style.left -= (( ( totalOffsetLeft + objWidth ) - windowWidth ) + monPadding )
     // Enfin, il va de soit que ce petit coup de décalage tu le fait selon la manière dont tu positionne ton infobulle hein, a toi de voir.
    }
    et Voila pour la droite, plus qu'a faire pareil pour le reste ( le bas ? )


    et heu.. hem hem, puis-je me permetre une remarque ? allé oui !
    Je te conseille moi aussi de plutôt utiliser la petite librairie qu'elle est faite pour, tu n'aura pas a "apprendre" a utiliser une lib, ca reste un truc pour faire des infobulles uniquement donc très light l'apprentissage
    Par contre pour ce qui est de prototype, la je trouve que c'est un peu abusé de conseiller l'artillerie lourde, le gros débalage de Ko, les tonnes de fonctions, les tuto a se tapper pour cerner une librairie nouvelle, etc.. juste pour ça. C'est un peu comme utiliser un framework pour faire un helloworld ( bon j'abuse un chouillat )

  11. #11
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Deja merci pour les réponses

    J'ai essayé d'utiliser la lib mais le probleme c'est que j'appelle une fonction en ajax. Du coup si dans l'element onmouseover de mon image j'appelle Tip(MaFonction()) il faut que mafonction retourne un resultat. chose qu'elle ne fait pas vu qu'elle met simplement a jour un div lors du onstatechange

  12. #12
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    alors ca marche bien pour la longueur, mais pour la hauteur j'ai un petit probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var windowHeight = mgetWindowHeight(); 
    						alert(windowHeight); // Renvoie tjs 900!
                            var objHeight = helpTextDiv.offsetHeight;
                            alert(objHeight); // Renvoie tjs 106
                            var totalOffsetTop = helpTextDiv.offsetTop;
                            alert(totalOffsetTop);
                            var mparent = helpTextDiv;
                            while ( mparent == mparent.parentNode ) {
                                totalOffsetTop += mparent.offsetTop;
                            }
     
                            var caca = totalOffsetTop + objHeight;
                            if ( (totalOffsetTop + objHeight ) > windowHeight ) {
     
                                alert('true:' + caca + ' > ' + windowHeight);
                                saveoldY = helpTextDiv.style.top;
                                helpTextDiv.style.top = totalOffsetTop - objHeight - 15;
                            }
    						alert('false:' + caca + ' < ' + windowHeight);
    avec le code de windowHeight
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function mgetWindowHeight () {
      if (navigator.appName == "Microsoft Internet Explorer") {
        return document.body.offsetHeight;
      }
      else {
        return window.innerHeight;
      }
    }
    Le probleme c'est que, si on regarde les 3 alertes que je fais, la hauteur (1ere alerte) de la page ne varie pas même quand je la redimentionne.

    Ai-je un probleme avec le nom des attributs ? (J'ai juste repris l'exemple que tu m'as donné et qui fonctionne avec Width, en remplacant tous les Width par des Heigth

    merci d'avance

  13. #13
    Membre éclairé Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Par défaut
    passage en coup d'vent, juste concernant le redimentionement, look at

  14. #14
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    J'ai aussi un probleme avec la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!(mparent == null)) {
                            alert('boucle');
                            totalOffsetLeft += mparent.offsetLeft;
                            mparent = mparent.parentNode;
                        }
    Je crois que ca part en boucle trop grande, puisque quand j'en sors, TotalOffsetLeft vaut NaN :/

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/04/2010, 00h02
  2. Comment ne pas faire afficher "HTTP/1.1 200 OK"?
    Par fumesec dans le forum Apache
    Réponses: 1
    Dernier message: 18/08/2008, 19h42
  3. Réponses: 2
    Dernier message: 16/07/2007, 10h31
  4. Réponses: 6
    Dernier message: 13/09/2006, 20h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo