Source

accueil.js

// NAVBAR - version fonctionnelle du fichier login
const navbar = document.getElementById("navbar");
const openButton = document.getElementById("openSidebarButton");
const overlay = document.getElementById("overlay");

/**
 * Met à jour la navigation en fonction de la taille de l'écran (responsive)
 * @param {MediaQueryList} mediaQuery - L'objet MediaQueryList pour détecter la taille de l'écran
 * @description Ajoute ou retire l'attribut "inert" à la barre de navigation et gère l'affichage du bouton d'ouverture.
 * @returns {void}
 */
function updateNav(mediaQuery) {
    const isMobile = mediaQuery.matches;
    if (isMobile) {
        navbar.setAttribute("inert", "");
        openButton.style.display = "block";
    } else {
        navbar.removeAttribute("inert");
        openButton.style.display = "none";
        navbar.classList.remove("show");
        overlay.style.display = "none";
    }
}

/**
 * Ouvre la barre latérale (sidebar) de navigation
 * @description Ajoute la classe "show" à la barre de navigation, met à jour l'attribut "aria-expanded" du bouton et retire l'attribut "inert" de la barre de navigation.
 * @returns {void}
 */
function openSideBar() {
    navbar.classList.add("show");
    openButton.setAttribute("aria-expanded", "true");
    navbar.removeAttribute("inert");
    overlay.style.display = "block";
}

/**
 * Ferme la barre latérale (sidebar) de navigation
 * @description Retire la classe "show" de la barre de navigation, met à jour l'attribut "aria-expanded" du bouton et ajoute l'attribut "inert" à la barre de navigation.
 * @returns {void}
 */
function closeSideBar() {
    navbar.classList.remove("show");
    openButton.setAttribute("aria-expanded", "false");
    navbar.setAttribute("inert", "");
    overlay.style.display = "none";
}

document.querySelectorAll("nav a").forEach(link => {
    link.addEventListener("click", closeSideBar);
});

// Initialisation
const media = window.matchMedia("(max-width: 925px)");
updateNav(media);
media.addEventListener("change", updateNav);

/**
 * Gère le scroll fluide vers les ancres internes de la page
 * @param {Event} e - L'événement de clic sur le lien
 * @description Empêche le comportement par défaut du lien et effectue un scroll fluide vers la section cible.
 * @returns {void}
 */
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
    anchor.addEventListener('click', function (e) {
        e.preventDefault();
        const target = document.querySelector(this.getAttribute('href'));
        if (target) {
            target.scrollIntoView({ behavior: 'smooth' });
        }
    });
});

/**
 * Callback de l'IntersectionObserver pour afficher les sections lors de leur apparition à l'écran
 * @param {IntersectionObserverEntry[]} entries - Les entrées observées
 * @description Ajoute la classe "visible" aux sections qui deviennent visibles dans le viewport.
 * @returns {void}
 */
const observer = new IntersectionObserver(entries => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            entry.target.classList.add('visible');
        }
    });
}, {
    threshold: 0.1
});

document.querySelectorAll('section:not(.hero-section)').forEach(section => {
    section.classList.add('hidden');
    observer.observe(section);
});

document.querySelectorAll('.card, .news article').forEach(el => {
    el.classList.add('hidden');
    observer.observe(el);
});

/**
 * Ajoute un événement de clic sur chaque carte de la section "Explorez les grandes rubriques"
 * Redirige vers la page correspondante selon l'index de la carte
 * @description Change la couleur du curseur en pointeur pour indiquer que l'élément est cliquable.
 * @returns {void}
 */
document.querySelectorAll('.rubriques .card').forEach((card, idx) => {
    card.style.cursor = "pointer";
    card.addEventListener("click", () => {
        switch (idx) {
            case 0:
                window.location.href = "comprendreChgt.html";
                break;
            case 1:
                window.location.href = "consequences.html";
                break;
            case 2:
                window.location.href = "solutions.html";
                break;
        }
    });
});

/**
 * Ajoute un événement de clic sur chaque article de la section "Actualités"
 * Ouvre le lien externe correspondant dans un nouvel onglet selon l'index de l'article
 * @description Change la couleur du curseur en pointeur pour indiquer que l'élément est cliquable.
 * @returns {void}
 */
document.querySelectorAll('.news article').forEach((article, idx) => {
    article.style.cursor = "pointer";
    article.addEventListener("click", () => {
        if (idx === 0) {
            window.open("https://unric.org/fr/climat-de-nouveaux-records-et-des-consequences-quasi-irreversibles/", "_blank");
        } else if (idx === 1) {
            window.open("https://uicn.fr/la-liste-rouge-mondiale-de-luicn-vient-detre-publiee-les-poissons-deau-douce-illustrent-lescalade-des-impacts-climatiques-sur-les-especes/", "_blank");
        }
    });
});