Catégorie : Code en Html

  • Bonne pratiques des nommages en css

    Bonne pratiques des nommages en css

    Dans le projet NextDom, nous sommes confrontés à la refonte du style. Beaucoup de style est directement présent dans le HTML. Il fallait repartir sur de bonnes bases si nous voulions assurer la pérennité de notre développement.
    En premiers lieux, nous avons décidé d’utiliser SASS. On y gagne :

    • les variables,
    • la vérification de syntaxe,
    • une meilleure lisibilité,
    • la possibilité d’utiliser la syntaxe CSS et de la transformer petit à petit en SCSS,
    • la possibilité de découper facilement d’énormes feuilles de styles en de plus petits fichiers plus digestes

    la sortie du style du HTML est un gros morceau que mes collègues ont commencé et ce n’est pas simple. Très vite est apparu le besoin de créer de nouvelles classes et surtout de les nommer correctement.

    C’est un point très compliqué en informatique, savoir nommer les choses et ce n’est pas que moi qui le dit :

    There are only two hard things in Computer Science: cache invalidation and naming things.

    – Phil Karlton

    Lorsque je fais une intégration, j’essaie de concilier deux choses vraiment pas évidentes. Je veux rendre le plus abstrait possible le nom de mes classes et en même temps, il faut ce même nom soit le plus compréhensible possible. Sachant que je ne suis pas un spécialiste du frontend et que j’en fais que quand je suis vraiment obligé…

    Des exemples de ce qu’il ne faut pas faire

    Mon expérience m’a fait rencontrer des choses étranges  :

    .h1, .h2, .h3 ... ⁣/pre>
    Vouloir créer des classes pour faire passer une balise pour ce qu'elle n'est pas n'est pas une bonne pratique. C'est comme si on mettait une étiquette girafe à un éléphant, un éléphant reste un éléphant. Pour l'accessibilité des personnes défaillantes visuelles ou autre, elles perdent la sémantique de l’information qui leur est présentée.
    
    .span_colorblue, .pre_code-php ... ⁣/pre>
    Dans le cas vu ci-dessus, on mélange la sémantique de la balise et le style qu'on veut lui appliquer. Par ailleurs, "span_colorblue" ne donne pas d'information sur l'utilité réelle de cette classe si ce n'est que le texte est en bleu. Pourquoi n'aurait-on pas besoin d'une couleur bleu ailleurs qu'avec un span ?
    
    .toto > div > p > img {
        width: 500px;
    }

    Il faut aussi faire attention de ne pas trop lier l’imbrication des balises avec la feuille de style. Un seul sous niveau est un maximum. Au-delà, l’imbrication est trop forte et le moindre changement est trop long à répercuter.  Si vous voulez atteindre les images, mettez une classe à « img » et le problème est réglé.

    CammelCase ou snake-case ?

    À la lecture de la norme sur le document de référence du W3C on se rend compte que les attributs id et classes sont « case-insensitive », les seuls séparateurs autorisés sont le « – « et le « _ ».

    https://www.w3.org/TR/CSS21/syndata.html#characters

    All CSS syntax is case-insensitive within the ASCII range (i.e., [a-z] and [A-Z] are equivalent), except for parts that are not under the control of CSS. For example, the case-sensitivity of values of the HTML attributes « id » and « class », of font names, and of URIs lies outside the scope of this specification. Note in particular that element names are case-insensitive in HTML, but case-sensitive in XML.

    La symbolique

    la première question à se poser est : « Qu’est-ce que je veux représenter et dans quel contexte« . Si on répond à ces deux questions, on a rapidement des noms qui nous viens à l’esprit.

    Regardons le code HTML suivant :

    <div class="background-blue">
        <h1 class="strong">Un super titre</h1>
        <h2>Un super sous-titre</h2>
    </div>
    <div class="normal">    
        <p>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ratione vero ad repellat ea. Sint, est, eligendi expedita ducimus magnam quae voluptate! 
            Amet possimus error sapiente consectetur dolore qui illo?    
        </p>
    </div>

    Les classes « background-blue », « strong » et « normal » sont instanciées. Le problème, vous l’aurez compris, est qu’elles n’indiquent pas pour quel usage réel, elles sont destinées. La classe « normal » n’a pas de signification. Qu’est-ce qui est normal ?

    Selon moi, voici ce qu’il aurait fallu faire.

    <div class="head">
        <h1 class="head-title">Un super titre</h1>
        <h2>Un super sous-titre</h2>
    </div>
    <div class="content">    
        <p>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ratione vero ad repellat ea. Sint, est, eligendi expedita ducimus magnam quae voluptate! 
            Amet possimus error sapiente consectetur dolore qui illo?    
        </p>
    </div>

    J’ai choisi l’anglais pour nommer mes classes, c’est un choix qui n’engage que moi. Regardons attentivement la première div, la classe « head » indique que nous sommes dans le contexte d’un entête qui contient des titres et sous-titre. On a le schéma suivant A contient A-B, etc.

    Dans la div suivante, « normal » a été remplacé par « content » car c’est l’objet de cette div de contenir un texte.
    J’attends vos retours pour agrémenter cet article…

  • Calculer l’apérage nécéssaire à la charge d’un accu lipo

    Grâce à petit code en javaScript Vous pouvez calculer la valeur optimale de charge de vos accus Lipo.

    function calculerValeurDeCharge(){
    var coefDeCharge = parseInt(document.getElementById('coefDeCharge').value, 10);
    var capacite = parseInt(document.getElementById('capacite').value, 10);
    
        var valeurRaisonable = 1.2;
            capacite /= 1000;
    
        if ((coefDeCharge && capacite ) != 0 ){
                var resultatTheorique = coefDeCharge * capacite;
                var resultatReel = (resultatTheorique)/coefDeCharge * valeurRaisonable;
            } 
            else 
            {
                alert('Merci de renseigner les valeurs');
        }
            alert('Voici la valeur de charge maximum thŽéorique : '+ resultatTheorique+' A');
            alert('Voici la valeur de charge recommandŽée : '+ resultatReel+' A');
    }

    Et voici le html :

    < !DOCTYPE html>
    <html lang="fr">
    <head>
     <meta charset="utf-8">
     <title>Charger des accus LiPo</title>
      <!-- meta -->
        <meta name="description" content=""/>
        <meta name="author" content="luc sanchez"/>
        
     </meta></head>    
     <body>       
                    <input type="number" min="1" max="12" id="coefDeCharge" value="2" />
                <input type="number" id="capacite" value="1110"/>
                <input type="submit" onclick="calculerValeurDeCharge();" name="Calculer"/>
                <script src="./js/accus.js"></script>
        </body>
     
    </html>
    

    Pour le voir en fonctionnement cliquez ici, voici la formule utilisée : (valeur de charge théorique / (capacité totale de l’accu/1000)) * 1,2 .

  • Prévalider un bouton radio en html et php

    Grâce à ce code il est possible de précocher dans un formulaire une valeur.

    Dans cet exemple on va utiliser un bouton radio.
    le html :

    <input name="sexe" type="radio" value="femme" /><?php echo $validf; ?> > Femme :
    <input name="sexe" type="radio" value="homme" /><?php echo $validh; ?> > Homme :

    le Php

    <?php 
    //ici on coche homme ou femme dans un bouton radio en récupérant les données de la bdd 
    if ($sexe == "femme"){ 
        $validf = "checked='checked'"; $validh = ""; 
    } elseif ($sexe == "homme"){ 
        $validf = ""; $validh = "checked='checked'"; 
    }

    Grand Maître L

  • Ce mardi je vous emmène au casino !

    C’est avec ce code source que vous allez pouvoir jouer au « Bandit manchot ». Il est séparé en deux parties, le Html et le JavaScript.

    Pour voir le résultat, cliquez ici.

    Le code Html :

    <body>
    <br />
    <div id="globale">
    <br />
    <div id="contenu">
    <br />
    <div id="levier2">
    
                    <input type="image" value=" " onclick="lancer_jeu();" id="levier"/>
                </div>
    <p>
    <br />
    <div id="resultat">
    <br />
    <p id="affichage_gains">
                    ---
                    </p>
    <p>
                </div>
    <p>
    <br />
    <div id="pot">
    <br />
    <p class="vert">votre pot <br />est de :
                    </p>
    <p>
    
    <br />
    <p id="affichage_pot">100
                    </p>
    <p>
    <br />
    <p class="vert">mise :
                    </p>
    <p>
    <br />
    <p id="affichage_mise">0
                    </p>
    <p>
                </div>
    <p>
    <br />
    <div id="jackpot">
                    <img name="s1" src="media/theme/slot-vide.png" alt="slot-vide"/>
                    <img name="s2" src="media/theme/slot-vide.png" alt="slot-vide"/>
                    <img name="s3" src="media/theme/slot-vide.png" alt="slot-vide"/>
                </div>
    <p>
    
    <br />
    <div id="boutons">
                    <input onclick="miser();" type="image" src="media/theme/mise-plus.png" id="miser1"/>
                    <input onclick="tout_miser();" type="image" src="media/theme/mise-tout.png" id="miserall"/>
                </div>
    <p>
            </div>
    <p>
        </div>
    <p>
    </body>
    

    Le code JavaScript :

    var mise = 0;
    var pot = 100;
    var gains = 0;
    // nombre de slots
    var nombre_slots = 3;
    // declaration d'un tableau avec "slots" comme valeur
    var slots = new Array(nombre_slots);
    //dclaration de la valeur des slots
    var valeur_des_slots = 0;
    
    function lancer_jeu()
    {
        if (mise == 0) return;
    
        // rinitialisation de la valeur des slots
        valeur_des_slots = 0;
    
        // creation et remplissage du tableau
        for (var index = 0; index < nombre_slots; index++) { slots[index] = tirer_aleatoirement_image(); } s1.src=slots[0]; s2.src=slots[1]; s3.src=slots[2]; calculer_gains(); } //Cette fontion sert pour augmenter la valeur du pot function garder_gains() { if (valeur_des_slots > 0)
        {
            //alert('Vous avez Gagné !!!'); // Affiche une box avec le message "Vous avez Gagné"
            pot = pot + gains;
        }
    }
    
    //fonction pour tirer alatoirement une image
    
    function tirer_aleatoirement_image()
    {
        var nombre_images = 4;
        // nom de toutes les images d'un slot
        var images = new Array("./media/slot/slot-euro.png","./media/slot/slot-cerise.png","./media/slot/slot-etoile.png","./media/slot/slot-couronne.png");
        // tirage de l'alea
        var alea = Math.floor(Math.random()*nombre_images);
        // recuperation du nom de l'image dans le tableau
        var slot = images[alea];
        // mise  jour de la valeur des slots
        valeur_des_slots = (Math.pow(10,alea)) + (valeur_des_slots);
        return slot;
    }
    
    function calculer_gains()
    {
        //je fais un switch case pour savoir quels sont mes gains
        switch(valeur_des_slots)
        {
            case nombre_slots:
                gains = mise*20;
                alert('jackpot');
                garder_gains();
                break;
    
            case nombre_slots * 1000:
                gains =  mise*15;
                garder_gains();
                break;
    
            case nombre_slots * 100:
                gains = mise*10;
                garder_gains();
                break;
    
            case nombre_slots * 10:
                gains = mise*5;
                garder_gains();
                break;
    
            case 12:
            case 102:
            case 1002:
                gains = mise*2;
                garder_gains();
                break;
    
            default:
                gains = 0;
                break;
        }
    // rechargement automatique de la mis tant que le pot est plein (plus ergonomique)
        mise = 0;
        if (pot > 0)
        {
            pot -= 1;
            mise = 1;
        }
        document.getElementById("affichage_pot").innerHTML = pot;
        document.getElementById("affichage_gains").innerHTML = gains;
        document.getElementById("affichage_mise").innerHTML = mise;
    }
    
    function miser()
    {
        if (pot > 1)
        {
            pot -= 1;
            mise += 1;
            document.getElementById("affichage_pot").innerHTML = pot;
            document.getElementById("affichage_gains").innerHTML = gains;
            document.getElementById("affichage_mise").innerHTML = mise;
        }
    }
    function tout_miser()
    {
        if (pot > 1)
        {
            mise += pot;
            pot = 0;
            document.getElementById("affichage_pot").innerHTML = pot;
            document.getElementById("affichage_gains").innerHTML = gains;
            document.getElementById("affichage_mise").innerHTML = mise;
        }
    }
    

    Le code css :

    *
    {
        margin: 0;
        padding: 0;
    }
    p
    {
        font-family: Arial;
    }
    /*------------------divs---------------------*/
    #globale
    {
        width: auto;
        height: auto;
    }
    #contenu
    {
        position: relative;
        top:25px;
        margin-left:auto;
        margin-right: auto;
        background: url(../theme/fond.png) no-repeat;
        width: 642px;
        height: 426px;
    }
    #levier
    {
            float: right;
            width: 96px;
            background: url(../theme/levier-depart.png) no-repeat;
            width:100px;
            height:300px;
    }
    #levier2
    {
            float: right;
            width: 96px;
    }
    #levier:hover
    {
        background: url(../theme/levier-milieu.png) no-repeat;
    }
    #levier:active
    {
        background: url(../theme/levier-jouer.png) no-repeat;
    }
    #jackpot
    {
        float:right;
        top:30px;
        position:relative;
        right:30px;
    }
    
    #resultat
    {
        position: relative;
        background:url(../theme/resultat.png) no-repeat;
        width: 532px;
        height: 61px;
        margin-left:6px;
        top:20px;
    }
    #resultat p
    
    {
        font-size: 30px;
        top:15px;
    }
    
    #result-tirage
    
        {
            position: relative;
            float: right;
            width:auto;
            top:35px;
            right:40px;
        }
    #pot
    {
        position: relative;
        background:url(../theme/mise.png) no-repeat;
        width: 149px;
        height: 199px;
        float:left;
        top:40px;
        margin-left: 7px;
    }
    
    #pot p
    {
        font-size: 15px;
        top:35px;
        margin-top: 10px;
    }
    #boutons
    {
        position: relative;
        top:50px;
        float: left;
        left:90px;
        width: auto;
        height: auto;
    }
    #affichage_gains
    {
        position: relative;
        color:green;
        text-align: center;
    }
     #affichage_pot
    {
            position: relative;
            color:green;
            text-align: center;
    }
    
    #affichage_mise
    {
            position: relative;
            color:green;
            text-align: center;
    }
    /*------------------------------classes--------------------*/
    .vert
    {
            position: relative;
            color:green;
            text-align: center;
    }

    Grand maître L