Transfert partiel du CSS dans plusieurs fichiers avec jQuery

Navbar dans un fichier à part pour l'importer sur toutes les pages

a marqué ce sujet comme résolu.

Bonjour, J’essaie de travailler sur une navbar propre sans contexte, pour la réutiliser facilement plus tard, et j’ai réussi. Voici son code :

<div class="navbar" id="navbar">
    <div class="permanent">
        <img src="../ressources/SVG_Logo.svg" alt="logo" class="logo">
        <div class="burger" onclick="animer()">
            <span class="trait"></span>
            <span class="trait"></span>
            <span class="trait"></span>
        </div>
    </div>
    <div class="menu">
        <a href ="" class="bouton">Elément 1</a>
        <a href ="" class="bouton">Elément 2</a>
        <a href ="" class="bouton">Elément 2</a>
    </div>
</div>
.navbar{
    position: sticky; /* La propriété qui me pose problème */
    position: -webkit-sticky;
    top: 0;
    width: 100%;
    background-color: red;

    .permanent{
        width: 93%;
        margin: auto;
        display: flex;
        flex-direction: row;
        justify-content: space-between;
        align-items: center;

        .logo{
            width: 15%;
        }


        .burger{
            .trait{
                display: block;
                width: 30px;
                height: 4px;
                background-color: white;
                transition-duration: 0.5s;
            }
            .trait:not(:last-child){
                margin-bottom: 9px;
            }
        }
    }

    .menu{
        display: none;
        height: max-content;
        transition-duration: 0.5s; /* L'autre ligne qui me pose problème */
        position: fixed;
        width: 100%;
        background-color: inherit;
        
        .bouton{
            text-align: center;
            text-decoration: none;
            color: white;
            padding-top: 0.5em;
            padding-bottom: 0.5em;
        }
    }

    .montrer{
        /* Affichage du menu quand on clique sur le burger */
        display: flex;
        flex-direction: column;
    }
}

.montrer est la classe qui est retirée ou non au menu, avec une ligne JS, pour afficher ou non ce menu.
la div .navbar n’est pas dans le header, mais dans le main (qui du coup est séparé avec un main_contenu et main_pied car sinon, sa propriété position: sticky ne s’applique pas correctement (portée limitée au wrapper où est la div, ici ça serait portée limitée au header. :( ) Donc j’ai bien le comportement attendu, ma div .navbar rouge en haut, qui passe par dessus le contenu quand je scroll. La classe .menu s’affiche bien par dessus le contenu, sans le décaler (grâce à position: fixed) A un soucis prêt : je n’ai pas de transition fluide pour faire apparaître le menu, malgré transition-duration: 0.5s; qui fonctionne pour le burger;

Mais ce n’est pas mon soucis principal…
Comme c’est une navbar, le but c’est quand même d’avoir la même sur toutes les pages. Mais je n’ai pas envie de la copier-coller sur chaque page… Imaginiez si j’ai beaucoup de pages (genre un site de news, avec une page par news ?) et que je dois modifier cette navbar ? Quel enfer ! Du coup, j’essaye de mettre ma navbar dans un fichier à part, puis de l’importer avec jQuery. Après avoir essayé ça, le html d’une page ressemble à :

<html lang="fr">
    <head>
        <!-- Infos page -->
        <meta charset="utf-8">
        <title>Page par défaut</title>
        
        <!-- CSS -->
        <link rel="stylesheet" href="../css/navbar.css">


        <!-- JS -->
            <!-- API -->
            <script src="../js/API/jquery-3.6.0.js"></script> 
            <!-- scripts perso -->
        

        <!-- Inclusion de la navbar -->
        <script>
            $(function(){
                $("#navbar").load("common/navbar.html" + "#navbar");
            });
        </script>
    </head>

    <body>
        <main>
            <div id="navbar"></div>

            <div class="main_contenu" style="margin: 1em;">


                <p>01. Lorem ipsum dolor sit amet consectetur adipisicing elit. Officiis doloremque soluta odio optio ipsa accusamus omnis deserunt adipisci est error dolor, voluptatibus repellendus repellat magni provident reiciendis ex blanditiis culpa.</p>
                <p>02. Lorem ipsum dolor sit amet consectetur adipisicing elit. At sit perspiciatis non maiores numquam mollitia eaque voluptates laboriosam nihil? Facilis numquam placeat enim, sapiente ex in cumque est error officia?</p>
                <p>03. Lorem ipsum dolor sit amet consectetur adipisicing elit. Incidunt veniam architecto dolores maxime sed fugit! Molestiae dolor quaerat, delectus non, voluptatibus in maiores eveniet nisi suscipit eligendi accusantium, cum molestias!</p>
                <p>04. Lorem ipsum dolor sit amet consectetur adipisicing elit. Deserunt, perferendis. Sed iste perferendis cumque minus sint quo cupiditate inventore recusandae quam sapiente repellendus provident commodi incidunt, atque odit numquam maxime.</p>
                <p>05. Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque, nisi nobis quaerat, nulla officiis quisquam deleniti ipsum architecto adipisci, aliquid repellendus laudantium at pariatur libero repellat quibusdam dicta asperiores neque.</p>
                <p>06. Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsum facilis tenetur modi maxime vel alias quasi non quaerat nam, quidem architecto animi laborum repellendus corrupti reprehenderit velit atque, iste laudantium?</p>
                <p>07. Lorem ipsum dolor sit amet consectetur adipisicing elit. Commodi provident iusto atque deserunt ducimus eligendi culpa tenetur laudantium minus nostrum ipsum rem nam distinctio quaerat, id error non ea et!</p>
                <p>08. Lorem ipsum dolor sit amet consectetur adipisicing elit. Totam dolorum, repellendus alias sapiente officia reiciendis corporis ab adipisci magnam voluptatibus amet! Iste eaque ullam culpa asperiores cumque expedita saepe molestiae?</p>
                <p>09. Lorem ipsum dolor sit amet consectetur adipisicing elit. In dicta amet voluptatum quisquam vel sunt mollitia iure, atque pariatur modi architecto earum ab iste illo a. Laboriosam, nisi. Accusamus, odit?</p>
                <p>10. Lorem ipsum dolor sit amet consectetur, adipisicing elit. Beatae dolorem doloribus iusto eaque veniam rerum? Magnam voluptatem alias voluptatum? Asperiores sit saepe dignissimos necessitatibus libero tenetur cupiditate numquam ea laudantium?</p>
                <p>11. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Officiis cumque reiciendis obcaecati perferendis. Porro, consectetur accusamus minima vero quae ratione, adipisci assumenda doloremque omnis quaerat culpa odio officiis aspernatur harum.</p>
                <p>12. Lorem ipsum dolor sit amet consectetur adipisicing elit. Hic, nemo inventore necessitatibus explicabo nisi accusamus deserunt voluptates, tempore, culpa in incidunt consequuntur dolores nulla laudantium adipisci odit officia quas dolorem.</p>

            </div>

            <div class="main_pied">

            </div>
        </main>
    </body>

</html>

Ce qui fonctionne, j’ai la navbar qui s’affiche là où il faut, avec toutes les propriétés CSS qu’il faut, hormis une : La navbar n’est plus sticky !
Quelle peut être la raison ? Pourquoi certaines propriétés CSS sont appliquées à ma navbar "importée" et pas d’autre ?
Le problème est "résolu" en ajoutant style="position: sticky; top: 0;" à la div avec la classe navbar, mais je n’aime pas cette solution, j’ai l’impression de mettre une bâche par dessus un trou au lieu de le combler en comprenant ce comportement.

Merci pour les avis !

C’est un site web statique. J’avais effectivement vu cette idée, en cherchant sur internet, de laisser php s’occuper de mettre la navbar partout. Cependant je ne le connais, et quand j’ai voulu apprendre, j’ai eu beaucoup de difficultés : rien que l’installation de XAMPP sur un disto arch était une purge de mon point de vue. ^^ (même si ça m’aiderait beaucoup de maîtriser les bases de cet outil, ne serait-ce que pour le multi-langue.)
D’où la recherche de méthodes en statique, mais qui n’ont pas le comportement espéré. :/

Quel est ton objectif, avec tout ça ? Parce que c’est encore possible de faire un site en statique, mais c’est pas franchement maintenable.

Pour la question de la navbar, il est probablement préférable, de toute façon, de la copier-coller sur chaque page (en statique). En fait, il est même préférable de l’inclure dans le template html qui sera dupliqué pour chaque page, avec le footer et j’imagine d’autres trucs encore.

+0 -0

Là dans l’immédiat, j’ai pas vraiment d’objectif. C’est juste relou, à chaque fois que je fait un site, de refaire une navbar. Donc j’en voulait une impeccable, dans un fichier à part, que je pourrai réutiliser facilement. Et aussi m’affranchir de devoir modifier toutes mes pages une par une, si je veux modifier le contenu de la navbar. C’est pour ça que le template html dupliqué à chaque fois, c’est pas spécialement viable une fois que j’ai plusieurs pages et que je veux ajouter des éléments à la navbar…

Sinon la finalité plus lointaine, c’est d’apprendre autant que possible, je suis pas pro, je fait des sites pour des copains seulement. Et là j’ai un truc à apprendre je sens ! Peut-être que c’est "jQuery c’est peu ouf pour singer les sites dynamiques" :’D

Salut,

Je rejoins l’avis de Moté, tu essaies de résoudre une problématique backend dans le front. Je pense que tu devrais mettre les efforts pour surmonter les difficultés dans ton approche du back plutôt que dans la solution workaround que tu prépares. Je ne suis pas sûr que cela représentera moins d’effort, et tu obtiendras quelque chose de plus propres, de plus utilisable, et tu obtiendras des compétences plus utiles.


Comme c’est une navbar, le but c’est quand même d’avoir la même sur toutes les pages. Mais je n’ai pas envie de la copier-coller sur chaque page… Imaginiez si j’ai beaucoup de pages (genre un site de news, avec une page par news ?) et que je dois modifier cette navbar ? Quel enfer !

tsuruba

Pour avoir des bases communes sur les pages, on utilise des moteurs de template, comme Jinja, Twig ou Tera. Et pour les sites qui gèrent du contenu qui vient à changer souvent comme un site de news (articles, commentaires, page de produit, forum …) on utilise fréquemment carrément des CMS tels que Wordpress ou Prestashop.
Je pense que c’est aussi pour ça que Moté insiste sur ton but, car si tu donnes en exemple un site de news, et que tu ne veux pas t’embêter avec le back, c’est qu’il y a très probablement un CMS qui correspondra à ton besoin.


Ensuite pour ton souci de sticky pour lequel tu demandes de l’aide à la base … je sais pas vraiment.

  • Quel navigateur utilises-tu ?
  • As-tu ouvert la page sous plusieurs navigateurs pour voir s’ils se comportaient pareil ?
  • As-tu utilisé la fonction "inspecter l’élément" pour vérifier qu’il a bien les propriétés du css ?

PS: En cherchant mes liens, j’ai vu qu’il est possible d’écrire tes sites sous forme de template puis de run le moteur de template pour compiler ton site et avoir tes pages html statiques à déployer, si tu tiens vraiment à ne pas faire de back. Ça s’appelle des générateurs de site statique (SSG) tels que Pelican ou Hugo.

PPS: on a même un beau tuto pour Pelican ici-même (qui semble être la solution la plus proche de ce que tu cherchais à faire selon moi)

+0 -0

Salut ! désolé de la réponse tardive !

Je rejoins l’avis de Moté, tu essaies de résoudre une problématique backend dans le front. Je pense que tu devrais mettre les efforts pour surmonter les difficultés dans ton approche du back plutôt que dans la solution workaround que tu prépares. Je ne suis pas sûr que cela représentera moins d’effort, et tu obtiendras quelque chose de plus propres, de plus utilisable, et tu obtiendras des compétences plus utiles.

Alors justement, j’ai acheté un hébergement (o2switch) pour pouvoir rassembler tout ce que j’ai fait sur des sous-domaines, puisque beaucoup ont été effacés de leur hébergements originels. Ainsi, je n’ai plus à me prendre la tête sur la configuration d’un serveur local pour apprendre php… Donc je vais sûrement me mettre à apprendre un peu de back end cet été, quand j’aurai un peu plus de temps, sur un sous-domaine dédié.

Pour avoir des bases communes sur les pages, on utilise des moteurs de template, comme Jinja, Twig ou Tera. Et pour les sites qui gèrent du contenu qui vient à changer souvent comme un site de news (articles, commentaires, page de produit, forum …) on utilise fréquemment carrément des CMS tels que Wordpress ou Prestashop.

Comme je disais, je suis pas pro (je suis dans les systèmes embarqués à la base) et je veux apprendre, pour le plaisir. Et pendant mes études, j’ai pris l’habitude de mettre mes mains dans le cambouis avant d’utiliser tous les outils de simplification. Donc je vais attendre de bien maîtriser les briques fondamentales que sont HTML / CSS / JS voire PHP, avant de me plonger dans ce qui semple être les IDE des sites web ? ou les outils no-code pour WP ?

Mais c’est pour ça aussi que ma "solution" d’ajouter un style à un truc importer par jQuerry me frustre… J’ai l’impression de faire un meuble qui remplit sa fonction première, beau de face, mais qui tiens avec du gaffeur derrière ! Les gens le savent pas, moi je sais !! Déjà que j’utilise des pièces de récup' au lieu de les faires découper… (i.e. imports jQuerry au lieu de PHP)

Pour en revenir à sticky : J’ai l’habitude de tester sur Chrome et FireFox. Et effectivement, un inspectant l’élément, il n’a ni position: sticky ni top: 0 quand je me contente d’importer la navbar avec jQuerry. Le plus drôle, c’est que le menu déroulant (qui s’affiche quand on clique sur le burger) lui a bien position: fixed. Donc l’attribut position se transmet, mais pas sa valeur sticky :O

Ainsi, je n’ai plus à me prendre la tête sur la configuration d’un serveur local pour apprendre php…

tsuruba

Pour moi, tu as quand même besoin de faire un serveur local, tu ne vas pas déployer ton site à chaque fois que tu le lances juste pour voir que ton dev vas dans le bon sens.

Comme je disais, je suis pas pro (je suis dans les systèmes embarqués à la base) et je veux apprendre, pour le plaisir.

tsuruba

Tiens, je viens également des systèmes embarqués. ;)
Justement c’est parce que tu n’es pas pro que je suppose que tu ne connais pas assez bien et que je liste tous les outils à ma connaissance qui peuvent t’aider pour le faire proprement, et ça ce n’est pas réservé aux pros (je n’en suis pas un non plus).

je vais attendre de bien maîtriser les briques fondamentales que sont HTML / CSS / JS voire PHP

tsuruba

C’est ce que tu as fait quand tu as écrit ta page web, mais le problème que tu essaies de résoudre maintenant est de la factorisation de code HTML, et ça se résout avec d’autres outils, ce que tu présentais au début du topic ne permets pas de répondre à ce besoin correctement.

Si tu t’orientes sur PHP tu auras des moyens de traiter la construction de la page pour y ajouter ta balise. Ce n’est cependant pas le seul moyen, voilà pourquoi mon message s’étale autant : Pour moi, PHP n’est plus une brique fondamentale, mais un ancêtre qui fait encore vivre trop de vieux projets, il mérite respect et considération mais les autres solutions également.

avant de me plonger dans ce qui semple être les IDE des sites web ? ou les outils no-code pour WP ?

tsuruba

Non ce ne sont pas des IDE, ce sont des frameworks. Et pour me concentrer sur Pelican qui semble être la solution qui répond exactement précisément à ton problème, il te permet simplement d’écrire plusieurs briques de contenu de ton site, et d’assembler ceux-ci dans toutes les pages que tu souhaiterais créer. Une fois cette "compilation" faite, tu obtiens des pages html tout à fait anodines à déployer sur ton server. Et ces briques sont principalement du html avec quelques marques en plus pour pouvoir faire des inclusions et ce genre de chose (c’est à dire utiliser le moteur de template).

Et pour éviter un à priori : Wordpress n’est pas un outil no-code comme wix (encore qu’on peut pas mal customiser quand même dans wix), c’est juste qu’on peut aller très loin juste en ajoutant et configurant les plugins, mais le code de ceux-ci reste accessible, ou bien tu peux développer ton propre module.

ma "solution"

tsuruba

J’ai envie de faire une analogie dans l’embarqué. C’est comme si, en compilant un linux embarqué, tu cherchais à inclure un driver. Seulement ce driver n’a pas le même moteur de build que l’OS. Tu ne veux pas réécrire le fichier de build qui te permettrait de l’intégrer parce que la recette est déjà écrite (bon dans mon analogie le soucis c’est le format alors que dans le cas réel c’est le nombre de copie mais supposons), et tu te refuses d’utiliser buildroot ou yocto parce que "c’est pour les pro, et c’est trop prémaché". Du coup, ta solution, tu finis par écrire un script qui s’exécute au lancement de l’OS pour télécharger et installer le driver.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte