5545 sujets

Sémantique web et HTML

Bonjour à tous
Existe-t-il à votre connaissance des "best practices" sur l'ordre des attributs d'une balise HTML
Par exemple

<img id="Photo5" class="mainImage" style="..." src="img.jpg" onclick="display('...') ...>

Merci pour vos conseils
Modifié par PapyJP (15 Aug 2018 - 11:35)
Salut

Au niveau de l'ordre de déclaration des attributs, je ne crois pas qu'il y ait une règle précise, mais pour faciliter la maintenance il est important d'adopter un choix. Je place toujours l'ID en tête, puis l'attribut "class", ensuite un "name" éventuel, puis le reste en terminant la série par les attributs "datasets". Voir dans l'exemple ci-dessous.

Il y a déjà bien des années que l'on sépare le CSS et le JS du HTML ! Les attributs "style" et "onclick" n'ont rien à faire ici. Normalement le CSS et le JS doivent être dans des fichiers séparés, mais pour une page de test on peut tolérer trouver le tout ensemble.

Voici un exemple :

<!DOCTYPE html>
<html lang="fr" dir="ltr">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta name="author" content="Daniel Hagnoul">
    <title>Exemple</title>
    <style>
        *,
        *:after,
        *:before {
            box-sizing: border-box;
        }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            font-size: 1rem;
            display: grid;
            grid-template-columns: minmax(20rem, 60rem) 20rem;
            grid-template-rows: repeat(min-content, 4);
            grid-column-gap: 0.6rem;
            grid-row-gap: 0.6rem;
        }

        header {
            grid-column: 1 / span 2;
            grid-row: 1;
            text-align: center;
        }

        main {
            grid-column: 1;
            grid-row: 2;
        }

        aside {
            grid-column: 2;
            grid-row: 2;
        }

        aside>h3 {
            text-align: center;
        }

        footer {
            grid-column: 1 / span 2;
            grid-row: 3;
            text-align: center;
        }

        footer>* {
            margin-left: 2rem;
        }

        .exemple1 {
            color: coral;
        }

        .exemple2 {
            background-color: cyan;
        }
    </style>
    <script defer>
        document.addEventListener('DOMContentLoaded', ev => {
            // le DOM est construit, la page web n'est pas visible
            // début code du test

            // on construit une référence vers notre photo
            const elemPhoto = document.querySelector('#Photo5');

            // on ajoute une marge autour et on change sa taille
            elemPhoto.style.margin = '1.5rem',
                elemPhoto.style.width = '25vh';

            /*
                Bien entendu, cela doit normalement être fait dans le CSS.
                C'est seulement pour montrer ce qui peut être fait avant
                l'affichage de la page web.
            */

            // fin code du test
        }, {
            capture: false,
            passive: true,
            once: false
        });

        window.addEventListener('load', ev => {
            // le DOM est construit et la page web est visible
            // début code du test

            // on construit une référence vers notre photo
            // la référence précédente est inacessible car dans un autre bloc de code
            // En ES2015, avec const ou let, la portée est le bloc de code.
            const elemPhoto = document.querySelector('#Photo5');

            // ajout d'un cadre autour de la photo, le parentNode de la photo est la div
            document.querySelector('#Photo5').parentNode.style.border = '2pt solid yellow';

            // on ajoute un gestionnaire d'événement
            elemPhoto.addEventListener('click', ev => {
                window.open(ev.target.dataset.url);
            }, {
                capture: false,
                passive: true,
                once: false
            });

            // fin code du test
        }, {
            capture: false,
            passive: true,
            once: false
        });
    </script>
</head>

<body>
    <header>
        <h1>Exemple</h1>
    </header>
    <aside>
        <h3>Commentaires</h3>
        <p>Salut !</p>
        <br>
        <p>J'utilise uniquement le JS d'aujourd'hui, ES2015+.</p>
    </aside>
    <main>
        <!-- code du test -->

        <div>
            <img id="Photo5" class="mainImage" data-url="https://www.alsacreations.com/" src="https://danielhagnoul.developpez.com/images/boule1.png">
        </div>

        <!-- fin code du test -->
    </main>
    <footer class="h-entry">
        <time class="dt-published" datetime="2018-08-15">2018-08-15</time>
        <a rel="license" href="http://creativecommons.org/licenses/by/2.0/be/">
            <img alt="Licence Creative Commons" src="https://i.creativecommons.org/l/by/2.0/be/80x15.png">
        </a>
        <a rel="license" href="http://creativecommons.org/licenses/by/2.0/be/">Licence Creative Commons Attribution 2.0 Belgique</a>.
    </footer>
</body>

</html>
Si on supprime l'attribut style de la balise pour le remplacer par du javascript "elemPhoto.style.margin", je ne vois trop où est le progrès et comment on sépare le fond de la forme.
Dans la feuille de style CSS, si on veut appliquer un aspect visuel particulier à un élément, on peut utiliser son id.
Quand une balise a un id, on peut le retrouver très rapidement en javascript avec cette vieille fonction document.getElementById(..). Elle est toujours en vigueur.
Quand on insère du code JS dans une page HTML, ce qui se justifie s'il est simple, on préconise de le déclarer juste avant la balise fermante </body>.
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <title>Exemple</title><
   <style>
       #Photo5 { border: 2px solid transparent; }
       #Photo5:hover { border-color: red; }
    </style>
</head><body>
<div>
    <img id="Photo5" class="mainImage" src="img.jpg">
</div>
<script type="text/javascript">
 (function() (
   'use strict';
  document.getElementById('Photo5').addEventListener('click', function (event) {
      event.preventDefault() // pour éviter que event ne se propage aux parents  
      alert('Tu m\'as cliqué dessus !');
   });
)();
</script>
</body></html>

Modifié par bazooka07 (15 Aug 2018 - 21:20)
"Si on supprime l'attribut style de la balise pour le remplacer par du javascript "elemPhoto.style.margin", je ne vois trop où est le progrès et comment on sépare le fond de la forme."

Vous n'avez pas lu les commentaires du code de l'exemple sinon vous ne diriez pas cela.