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 :

Gestion de rectangles par CANVAS


Sujet :

JavaScript

  1. #1
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut Gestion de rectangles par CANVAS
    Bonjour
    J'ai besoin de positionner 9 rectangles sur ma page HTML puis de les contr�ler en JS apr�s r�ception d'infos du serveur.
    L'id�e est de refl�ter � l'int�rieur de chaque rectangle l'�tat d'ouverture de volets (ex 20%, 60%, fermeture,...)
    Il me faut aussi les rep�rer (ex volet cuisine, salle,....)
    J'ai trouver une solution pour les afficher sur ma page HTML de base:
    Code html : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            <canvas id="v1" width="50" height="100"></canvas>
            <canvas id="v2" width="50" height="100"></canvas>
            <canvas id="v3" width="50" height="100"></canvas>
            <canvas id="v4" width="50" height="100"></canvas>
            <canvas id="v5" width="50" height="100"></canvas>
            <canvas id="v6" width="50" height="100"></canvas>
            <canvas id="v7" width="50" height="100"></canvas>
            <canvas id="v8" width="50" height="100"></canvas>
            <canvas id="v9" width="50" height="100"></canvas>

    J'ai bien compris que tout le contr�le doit se faire par JS.
    Mais, est-il possible de contr�ler individuellement chaque rectangle en mettant une variable, par exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    let vn = "";
    canvas = document.getElementById(vn);
    Merci d'une aide �clair�e.

  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 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
    Par d�faut
    C'est bien compliqu� ...
    Perso je serai pass� par des divs imbriqu�s en g�rant le width
    https://jsfiddle.net/6hbdfy2o/

    Pour des gaines circulaires ^^ : https://jsfiddle.net/6hbdfy2o/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 !

  3. #3
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    oui en effet c'est tr�s compliqu�.
    Alors je tente comme vous le pr�conis�, une autre solution:
    Code html : 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
    20
    21
    22
    23
    24
    25
    26
    27
            <div id="tableau">
                <table>
                    <caption>Etat des volets</caption>
                    <tr>
                        <th>v1</th>
                        <th>v2</th>
                        <th>v3</th>
                        <th>v4</th>
                        <th>v5</th>
                        <th>v6</th>
                        <th>v7</th>
                        <th>v8</th>
                        <th>v9</th>
                    </tr>
                    <tr id="vol">
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                    </tr>
                </table>
            </div>
    et
    Code CSS : 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
    table{
      border-collapse: separate;
      border-spacing: 20px;
    }
    td, th{
      border: 1px solid black;
      padding: 10px;
    }
    #tableau{
      display: flex;
      justify-content: center;
      margin: auto;
    }
    td{
      height: 60px;
    }
    Mais c'est encore compliqu� car comment remplir les cellules d'une couleur en fonction du pourcentage d'ouverture??

    Et puis une remarque sur le centrage du tableau sur la page: avant c'�tait simple de le faire avec <table align="center"> mais ce n'est pas dans les r�gles. Il faut passer par CSS et l� cela devient aussi tr�s compliqu�! Pouquoi ce cas de figure n'a pas �t� pr�vu simplement?

  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 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
    Par d�faut
    As tu �t� voir les liens propos�s dans mon post pr�c�dent ...

    si tu pr�f�res passer par un table ... tu peux tout de m�me utiliser le m�me principe avec des divs ...
    https://jsfiddle.net/5n4c79xg/1

    avec l'indication du pourcentage
    https://jsfiddle.net/5n4c79xg/2/
    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 chevronn� Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte
    Inscrit en
    Novembre 2002
    Messages
    235
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activit� : Autodidacte

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Par d�faut
    Salut � tous,

    Ou alors ?

    Les nombres al�atoires repr�sentent les infos du serveur.

    Code html : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
     
        <style>
          .divCanvas {
            display: inline-block;
            margin: 10px 10px;
          }
     
          canvas {
            width: 50px;
            height: 100px;
            border: 1px solid #000000;
            background: gray;
          }
     
          button {
            display: block;
            width: 50px;
            height: 35px;
            cursor: pointer;
          }
        </style>
      </head>
     
      <body>
        <div id="container"></div>
     
        <script>
          var mescanvas = ''
     
          for (let i = 1; i < 10; i++) {
            let aleat = Math.floor(Math.random() * 100)
            mescanvas += `<div class="divCanvas"><canvas id="v${i}"></canvas><button>${aleat}%</button></div>`
          }
     
          document.getElementById('container').innerHTML = mescanvas
     
          for (const bouton of document.getElementsByTagName('button')) {
            bouton.addEventListener('click', () => {
              let pourcent = bouton.innerText,
                canvasselet = bouton.parentElement.firstChild
     
              canvasselet.style.backgroundImage = `linear-gradient(to top, #a8eb12 ${pourcent}, gray 0%)`
            })
          }
        </script>
      </body>
    </html>

  6. #6
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    merci SpaceFrog mais avec je n'ai que des tirets verts qui apparaissent et comme je ne comprends pas le JQuery, je n'arrive pas a d�bugger.

    merci ASCIIFOND pour cet exemple qui correspond (sans les boutons) � ce que je voudrais faire. Par contre je ne comprends pas la syntaxe:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
               canvasselet = bouton.parentElement.firstChild 
    canvasselet.style.backgroundImage = `linear-gradient(to top, #a8eb12 ${pourcent}, gray 0%)`

  7. #7
    Membre chevronn� Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte
    Inscrit en
    Novembre 2002
    Messages
    235
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activit� : Autodidacte

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Par d�faut
    Citation Envoy� par mormic Voir le message
    ... Par contre je ne comprends pas la syntaxe:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
               canvasselet = bouton.parentElement.firstChild 
    canvasselet.style.backgroundImage = `linear-gradient(to top, #a8eb12 ${pourcent}, gray 0%)`
    On ajoute au style de la balise <canvas> s�lectionn�e un background-image.
    Ce qui correspondra en HTML
    Code html : S�lectionner tout - Visualiser dans une fen�tre � part
    <div id="v1" style="background-image: linear-gradient(to top, rgb(168, 235, 18) 23%, rgb(159, 156, 156) 0%);">23%</div>

    Ici nous avons 23% du background de la balise <canvas> qui sera de couleur verte (#a8eb12 ou rgb(168, 235, 18)) et les 77% restant seront de couleur gray (rgb(159, 156, 156)) qui est d'ailleurs la couleur par d�faut.
    La symbole % pour la deuxi�me couleur est important sinon il y aura un effet gradient entre les deux couleurs.


    Plus d'infos sur linear-gradient()
    https://developer.mozilla.org/en-US/...inear-gradient

  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 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
    Par d�faut
    je n'ai que des tirets verts qui apparaissent et comme je ne comprends pas le JQuery, je n'arrive pas a d�bugger.
    Ce n'est pas niveau JQUERY que �a se passe
    c'est niveau CSS ...
    il te faut mettre un &nbsp; dans le div et g�rer sa hauteur ...

    Sinon bien vi ASCIIDEFOND le fait de passer par le background radient te dispense m�me d'imbriquer des div, tu peux directement mettre le css sur les td...
    https://jsfiddle.net/7juebsLz/

    C'est tr�s facilement convertible en JS pur sans JQUERY (c'est juste que je code beaucoup plus vite avec )
    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 �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    J'opte pour la solution de ASCIIFOND qui m'est plus facile � g�rer.
    J'ai eu un peu de mal � comprendre le chargement des balises HTML par JavaScript mais cela est int�ressant.
    Il me faut maintenant l'int�grer dans mon projet global en l'occurence lire un tableau qui contient l'�tat des volets et afficher le r�sultat sur r�ception du serveur.
    Je vous remercie pour l'aide tr�s riche que vous m'avez apport�e.
    D�s que cela fonctionnera, j'enverrai mon script.
    Bien cordialement
    Michel

  10. #10
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    Bonjour
    je reviens vers vous pour une question subsidiaire.
    Voici comment j'ai adapt� le script:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let etatVol = [50,25,75,10,100,100,100,100,100];
    let mescanvas = '';
    for (let i = 1; i < 10; i++) {
        mescanvas += `<div class="divCanvas"><canvas id="v${i}"></canvas><span>${etatVol[i-1]}%</span></div>`;
    }
    document.getElementById('container').innerHTML = mescanvas;
    for (const taux of document.getElementsByTagName('span')) {
        let pourcent = taux.innerText, canvasselet = taux.parentElement.firstChild;
        canvasselet.style.backgroundImage = `linear-gradient(to top, #a8eb12 ${pourcent}, gray 0%)`;       
    }
    Il me suffit d'adapter un �l�ment du tableau etatVol pour afficher le nouvel �tat des volets.
    Ma question: est-il possible d'ajouter V1, V2,... au dessus de chaque rectangle?

  11. #11
    Membre chevronn� Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte
    Inscrit en
    Novembre 2002
    Messages
    235
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activit� : Autodidacte

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Par d�faut
    Salut mormic,

    En ajoutant une balise <span> et en englobant le tout dans une nouvelle balise <div>

    Code html : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <style>...
            /* Seulement sur la première balise <span> --> nth-child(1) */      
            div span:nth-child(1) {
              display: inline-block;
              width: 100%;
              text-align: center;
              font-size: 40px;
            }</style>
    ...
    for (let i = 1; i < 10; i++) {
        mescanvas += `<div><span>V${i}</span><div class="divCanvas"><canvas id="v${i}"></canvas><span>${etatVol[i-1]}%</span></div></div>`;
    }
    ...

  12. #12
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    merci ASCIIDEFOND mais cela ne semble pas fonctionner: les rectangles se mettent verticalement et le label au dessus de chaque rectangle est: $V(i).
    Le fait que j'ai d�j� un span dans l'�criture n'est-ce pas source de confusion pour le style:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    span {
      display: block;
      width: 50px;
      height: 35px;
      cursor: pointer;
    }
    div span:nth-child(1) {
      display: inline-block;
      width: 100%;
      text-align: center;
      font-size: 40px;
    }
    J'ai essay� d'ajouter des id sur chaque span, sans r�sultat.

  13. #13
    Membre chevronn� Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte
    Inscrit en
    Novembre 2002
    Messages
    235
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activit� : Autodidacte

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Par d�faut
    Et en simplifiant un peu comme �a ?

    Code html : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <!DOCTYPE html>
    <html lang="en">
     
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
     
        <style>
            .divParent {
                display: inline-block;
                margin: 10px 10px;
            }
     
            .divParent div {
                width: 50px;
                height: 100px;
                border: 1px solid #000000;
                background: gray;
                color: black;
                text-align: center;
                vertical-align: middle;
                display: table-cell;
            }
     
            .divParent span {
                display: inline-block;
                width: 50px;
                text-align: center;
            }
        </style>
    </head>
     
    <body>
        <div id="container"></div>
        <script>
            let etatVol = [50, 25, 75, 10, 100, 10, 100, 100, 100], mescanvas = ''
     
            for (let i = 1; i < 10; i++) {
                //#1 - Affichage du pourcentage en bas dans une balise <span> 
                mescanvas += `<div class="divParent"><span>V${i}</span><div class="position" id="v${i}"></div><span>${etatVol[i - 1]}%</span></div>`
     
                //#2 - Affichage du pourcentage au centre
                //mescanvas += `<div class="divParent"><span>V${i}</span><div class="position" id="v${i}">${etatVol[i - 1]}%</div></div>`
            }
            document.getElementById('container').innerHTML = mescanvas
     
            for (const taux of document.getElementsByClassName('position')) {     
                let pourcent = taux.parentElement.lastChild.innerText
                taux.style.backgroundImage = `linear-gradient(to top, #a8eb12 ${pourcent}, gray 0%)`
            }
        </script>
    </body>
     
    </html>

    Il y a deux solutions pour afficher le pourcentage.

  14. #14
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    Super ASCIIDEFOND le r�sultat est exactement ce que j'esp�rais. Dommage que je n'ai pas trouv� la solution moi-m�me.
    Mais tous ces conseils diffus�s sur ces forums sont tellement b�n�fiques pour l'apprentissage.
    Merci encore pour cette aide.
    Nom : Capture.PNG
Affichages : 70
Taille : 27,9 Ko

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Installation] Gestion des droits par dossier ?
    Par Glob dans le forum CVS
    R�ponses: 3
    Dernier message: 13/03/2006, 15h04
  2. [VB6] gestion des feuilles par des onglets
    Par kitsune dans le forum VB 6 et ant�rieur
    R�ponses: 3
    Dernier message: 04/02/2006, 16h17
  3. Gestion d'arbres par repr�sentation intervallaire
    Par brice01 dans le forum Langage SQL
    R�ponses: 4
    Dernier message: 23/01/2006, 21h20
  4. gestion d'alarme par SMS
    Par kitsune dans le forum D�veloppement
    R�ponses: 2
    Dernier message: 19/07/2005, 12h31
  5. R�ponses: 9
    Dernier message: 17/04/2004, 16h32

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