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

Contribuez Discussion :

[truc] Javascript : conversion %/px


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut [truc] Javascript : conversion %/px
    Il s'agit d'une parade. Peut-être que vous avez d'autre solutions, mais j'ai déjà fouillé pas mal sur le net.

    Lorsque vous voulez convertir des % en px en javascript, la solution évidente serait de déterminer la taille de la partie affichable de la fenêtre et de faire un rapport. Mais voilà, la taille de la partie affichable fait partie des valeurs qui est difficilement accessible en JS. Plusieurs navigateurs ont un comportement différent dans ce domaine >.< . J'ai vu ici et là des fonctions JS qui par le biais de tests multiples arrivent à trouver une valeur, mais franchement rien de 100% sûr. Je vais vous avouer que ma méthode n'est p-e pas 100% sûr non-plus; Il faudrait tester en profondeur. Mais j'ai des bonnes raisons de croire qu'elle donne un résultat équivalent au autres valeurs en "%" du css ^^.

    La solution est tout bête:
    Quelque part dans l'html: (Mais obligatoirement à même le body)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img id="echelle" style="width:1%;height:1%;position:absolute;top:0px;left:0px;Visibility: Hidden;" src="">
    Non, vous ne rêvez pas : une image sans source et invisible en plus !

    Proportion px/% en X dans le JS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parseInt(document.getElementById("echelle").offsetWidth)
    Proportion px/% en Y dans le JS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parseInt(document.getElementById("echelle").offsetHeight)
    NB: vous optenez ainsi la valeur en px de 1%, il suffit de multiplier par le nombre de % escompté.

    J'espère être utile a quelqu'un. J'avoue que la solution est simple, mais je ne l'ai jamais vu ailleurs, alors je post .

  2. #2
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut Re:
    Attention que % dépend de la taille du parent, pas de celle de la fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="width: 100px; background: green;"><div style="width: 10%; background: red"></div>
    La meilleure solution est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function percentToPx(percent,element,useWidthInstead) {
      if (!element) { element = document.body; }
      var hType = useWidthInstead?"offsetWidth":"offsetHeight";
      return parseInt(percent * element[hType] / 100);
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut
    Si je ne m'abuse la taille du body retourné peut être différente de celle de l'espace d'affichage puisqu'il peut faire plus d'une page (confirmé je vient de tester). Je me suis p-e mal exprimer, mais je cherche à établir la correspondance exact entre le "%" du CSS et une valeur JS.

    J'ai oublier de préciser effectivement: l'image caché doit absolument être dans le body.

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    J'aurai mis une image de 1px par 1px, histoire d'être sûr que le navigateur ne va redimmensionner le contenu la balise parce qu'elle ne contient rien.


    Si je ne me trompe pas dans certains cas (je crois que ça le fait pour les p, div et les td sous certains navigateurs), une balise vide prend des dimensions par défaut même si les attributs width et height sont définis.

  5. #5
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Si je ne me trompe pas dans certains cas (je crois que ça le fait pour les p, div et les td sous certains navigateurs), une balise vide prend des dimensions par défaut même si les attributs width et height sont définis.
    En gros :

    Ce problème survient quand vous avez spécifié une hauteur inférieure au line-height calculé du div. En effet, IE6 alloue automatiquement l'espace nécessaire à un texte éventuel.

    Vu que le line-height est calculé à partir du font-size, on peut attribuer un font-size de 0 pour le div en question:


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="height:10px;font-size:0"></div>

    Malgré un font-size de 0 il est impossible d'obtenir une hauteur de 1px sur IE6, ce que permet de faire la propriété overflow:


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="height:1px;overflow:hidden"></div>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut
    J'ai effectivement tenter avec une DIV c'était foireux en effet, puis j'ai tenter avec une image. Ça fonctionnait bien avec tout les navigateurs que j'avais à ma disposition (je ne tient pas le registre complet de toutes les versions ). À priori ça fait un transfert de fichier en moins (aussi petit soit-il). Donc, j'ai laisser la source en blanc. Comme je l'ai dit, il serait bien de tester en profondeur, mais jusqu'à présent cette trouvaille est mieux que rien. .

  7. #7
    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 659
    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 659
    Billets dans le blog
    1
    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 !

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/01/2011, 00h14
  2. conversion d'un tableauPHP a une tableau javascript
    Par jack_1981 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/04/2006, 16h37
  3. conversion const truc to truc
    Par dark calculator dans le forum C++
    Réponses: 10
    Dernier message: 26/03/2006, 19h22

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