Publié le 5 février 2026 SEO Technique

Technology SEO : guide complet pour optimiser la performance technique de votre site

Introduction

Le technology SEO, que l’on appelle aussi SEO technique, est l’un des piliers majeurs du référencement naturel. Il regroupe l’ensemble des optimisations techniques qui permettent à un site web d’être correctement exploré, compris, indexé et valorisé par les moteurs de recherche, tout en offrant une excellente expérience utilisateur.

Avec l’évolution continue des algorithmes de Google, l’essor de la recherche mobile, de la recherche vocale et l’importance croissante des signaux d’expérience utilisateur, maîtriser le technology SEO est devenu indispensable pour améliorer durablement la visibilité d’un site dans les pages de résultats.

Cet article propose un tour d’horizon complet des concepts clés du SEO technique, des bonnes pratiques à appliquer, ainsi que des outils indispensables pour auditer, suivre et optimiser efficacement votre site web.

Qu’est-ce que le Technology SEO ?

Le technology SEO désigne l’ensemble des actions techniques réalisées sur un site web avec un objectif précis : faciliter le travail des robots d’exploration des moteurs de recherche et améliorer la qualité perçue du site (rapidité, sécurité, structure, accessibilité, compatibilité mobile, etc.).

Contrairement au SEO de contenu, qui se concentre sur les textes, visuels et intentions de recherche, et au SEO off-page, centré sur la popularité et les backlinks, le SEO technique s’intéresse à l’architecture, au code, aux performances et à la manière dont le site est servi aux internautes et aux robots.

Concepts clés du Technology / Technical SEO

Découvrez leséléments fondamentaux du technology SEO :

  • Technical SEO (SEO technique) : s’assure que le site est explorable, indexable et techniquement conforme aux recommandations des moteurs de recherche.
  • Site Speed Optimization : améliore la vitesse de chargement et la réactivité du site, ce qui influence directement l’expérience utilisateur et le classement.
  • SEO Audit : analyse approfondie afin d’identifier les problèmes techniques, de prioriser les actions et de proposer des solutions concrètes.
  • SEO Best Practices : ensemble de méthodeséprouvées pour maintenir un site rapide, stable, sécurisé et bien structuré sur le long terme.

Technical SEO : bases indispensables

Le technical SEO repose sur plusieurs axes principaux :

  • Exploration (crawl) : optimisation des fichiers robots.txt, des plans de site XML, et gestion de l’arborescence pour faciliter la découverte des pages importantes.
  • Indexation : gestion des balises meta robots, des réponses HTTP (200, 301, 404, 410, etc.), du contenu dupliqué et des versions canoniques.
  • Structure HTML : utilisation correcte des balises </code>, <code><meta description></code>, <code>h1–h6</code>, listes, tableaux et attributs alt des images.</li> <li><strong>Accessibilité et compatibilité mobile</strong> : design responsive, lisibilité, taille des boutons, contrastes, et bonne prise en charge des différents appareils.</li> <li><strong>Sécurité</strong> : utilisation généralisée du <strong>HTTPS</strong>, certificats valides, absence de ressources mixtes, configuration correcte des en-têtes de sécurité.</li> </ul> <h3 id="site-speed-optimization-performances-et-core-web-vitals">Site Speed Optimization : performances et Core Web Vitals</h3> <p>Un site rapide est à la fois mieux perçu par les utilisateurs et mieux valorisé par Google, notamment via les <strong>Core Web Vitals</strong>. L’optimisation des performances concerne notamment :</p> <ul> <li><strong>Temps de chargement initial</strong> (TTFB, LCP) : temps nécessaire pour afficher l’élément principal de la page.</li> <li><strong>Interactivité</strong> (INP) : réactivité du site lors des interactions (clic, saisie, etc.).</li> <li><strong>Stabilité visuelle</strong> (CLS) : limitation des décalages de mise en page lors du chargement.</li> </ul> <p>Parmi les leviers courants de la <strong>Site Speed Optimization</strong> :</p> <ul> <li>Compression et redimensionnement des images (formats modernes, poids réduit).</li> <li>Minification des fichiers CSS et JavaScript, réduction du nombre de requêtes.</li> <li>Mise en cache côté serveur et côté navigateur.</li> <li>Utilisation d’un <strong>CDN</strong> pour rapprocher le contenu des utilisateurs.</li> <li>Limitation des scripts tiers lourds (widgets, trackers, iframes, etc.).</li> </ul> <h3 id="seo-audit-analyser-avant-d-optimiser">SEO Audit : analyser avant d’optimiser</h3> <p>Un <strong>audit SEO technique</strong> complet permet d’identifier les points forts et les faiblesses de votre site. Il couvre généralement :</p> <ul> <li>La <strong>couverture d’indexation</strong> (pages indexées, pages exclues, erreurs d’exploration).</li> <li>Les <strong>erreurs techniques</strong> (liens brisés, redirections en chaîne, boucles de redirection, erreurs serveur).</li> <li>La <strong>structure des URL</strong> et de l’arborescence (profondeur de clic, maillage interne, pages orphelines).</li> <li>Les <strong>performances</strong> (temps de chargement, Core Web Vitals, poids des pages).</li> <li>La <strong>sémantique du code</strong> (balises de titre, balises de description, schémas de données structurées).</li> <li>La <strong>compatibilité mobile</strong> et l’expérience utilisateur.</li> </ul> <h2 id="bonnes-pratiques-de-technology-seo">Bonnes pratiques de Technology SEO</h2> <p>Pour un <strong>technology SEO</strong> optimal, il est essentiel d’articuler les efforts autour de plusieurs grands axes cohérents.</p> <h3 id="1-optimiser-le-contenu-pour-le-seo-technique">1. Optimiser le contenu pour le SEO technique</h3> <p>Le contenu reste central, mais il doit s’intégrer dans une structure technique solide :</p> <ul> <li><em>Optimiser le contenu</em> : intégrer naturellement les mots-clés principaux et secondaires après une <strong>recherche de mots-clés</strong> approfondie, tout en respectant l’intention de recherche (informationnelle, transactionnelle, navigationnelle).</li> <li>Structurer les pages avec une seule balise <code>h1</code> pertinente et des <code>h2</code>, <code>h3</code> hiérarchisés.</li> <li>Utiliser des <strong>liens internes</strong> contextuels pour relier les contenus entre eux et guider les robots vers les pages stratégiques.</li> <li>Éviter le <strong>contenu dupliqué</strong> en utilisant des balises canoniques et en consolidant les versions proches.</li> </ul> <h3 id="2-ameliorer-la-structure-technique-du-site">2. Améliorer la structure technique du site</h3> <p>Une structure claire facilite à la fois la navigation des utilisateurs et l’exploration par les robots :</p> <ul> <li>Utiliser une <strong>architecture en silo</strong> ou en thèmes, avec des catégories logiques et un maillage interne cohérent.</li> <li>Privilégier des <strong>URLs lisibles et descriptives</strong>, courtes et stables dans le temps (éviter les paramètres inutiles).</li> <li>Mettre en place un <strong>fil d’Ariane</strong> pour améliorer la navigation et renforcer la compréhension de la hiérarchie des contenus.</li> <li>Limiter la profondeur des pages importantes (idéalement accessibles en moins de trois clics depuis la page d’accueil).</li> </ul> <h3 id="3-creer-et-maintenir-un-contenu-de-qualite">3. Créer et maintenir un contenu de qualité</h3> <p>Le contenu de qualité et à forte valeur ajoutée reste un puissant levier de visibilité, soutenu par une base technique solide :</p> <ul> <li><em>Créer du contenu de qualité</em> : publier régulièrement des articles, guides, études de cas et FAQ qui répondent précisément aux questions de votre audience.</li> <li>Mettre à jour les contenus existants pour intégrer les dernières données, clarifier les explications et améliorer la structure.</li> <li>Intégrer deséléments multimédias (images optimisées, schémas, vidéos intégrées) sans nuire à la performance.</li> <li>Adapter le ton et la profondeur des informations à votre public cible (débutants, experts, décideurs, etc.).</li> </ul> <h3 id="4-prendre-en-compte-le-mobile-et-l-experience-utilisateur">4. Prendre en compte le mobile et l’expérience utilisateur</h3> <p>La majorité des utilisateurs accèdent aujourd’hui à Internet depuis un smartphone, et une part importante des recherches Google est effectuée sur mobile. Le <strong>mobile-first indexing</strong> de Google implique que la version mobile de votre site est la référence principale pour l’indexation.</p> <p>Quelques bonnes pratiques essentielles :</p> <ul> <li>Utiliser un <strong>design responsive</strong> qui s’adapte à toutes les tailles d’écran.</li> <li>Veiller à la lisibilité du texte (taille de police suffisante, contrastes adaptés).</li> <li>Optimiser la disposition deséléments pouréviter les clics involontaires (boutons suffisamment espacés, zones cliquables adaptées au doigt).</li> <li>Réduire au maximum les interstitiels et pop-ups intrusifs, notamment sur mobile.</li> </ul> <h3 id="5-securiser-le-site-https-donnees-confiance">5. Sécuriser le site (HTTPS, données, confiance)</h3> <p>Google recommande formellement l’utilisation du <strong>HTTPS</strong> sur l’ensemble du site. Au-del à du signal de classement, c’est unélément clé de la confiance utilisateur :</p> <ul> <li>Installer un certificat SSL moderne et le renouveler automatiquement.</li> <li>Rediriger systématiquement l’ancienne version HTTP vers la version HTTPS.</li> <li>Corriger les contenus mixtes (ressources HTTP appelées sur des pages HTTPS).</li> <li>Mettre en place des en-têtes de sécurité adaptés (HSTS, X-Content-Type-Options, etc.).</li> </ul> <h2 id="outils-et-ressources-pour-le-technology-seo">Outils et ressources pour le Technology SEO</h2> <p>Découvrez les outils recommandés pour le <strong>technology SEO</strong> :</p> <ul> <li><strong>Google Search Console</strong> : surveille la performance de votre site (clics, impressions, requêtes) et détecte les erreurs techniques (problèmes d’indexation, pages exclues, problèmes mobiles, données structurées, Sitemap).</li> <li><strong>Google Analytics</strong> : analyse le trafic, l’origine des visiteurs, leur comportement et les conversions, ce qui permet de mesurer l’impact des optimisations SEO sur les objectifs business.</li> <li><strong>Screaming Frog</strong> : explore votre site comme un robot de moteur de recherche pour identifier les erreurs techniques, liens brisés, redirections, problèmes de balises ou de structure.</li> <li><strong>SEMrush, Ahrefs ouéquivalents</strong> : suivent les mots-clés, les positions, le profil de liens, et fournissent des audits techniques complémentaires.</li> <li><strong>PageSpeed Insights et Lighthouse</strong> : évaluent les performances, les Core Web Vitals et proposent des recommandations concrètes d’optimisation.</li> </ul> <p>Ces ressources vous aident à <strong>monitorer</strong> et à <strong>améliorer continuellement</strong> votre site web, en reliant les aspects techniques, de contenu et de performance business.</p> <h2 id="technology-seo-et-strategie-globale-de-visibilite">Technology SEO et stratégie globale de visibilité</h2> <p>Le <strong>technology SEO</strong> ne doit pasêtre isolé du reste de votre stratégie digitale. Il travaille en synergie avec :</p> <ul> <li>Le <strong>SEO de contenu</strong> (rédaction, maillage, optimisation sémantique).</li> <li>Le <strong>SEO local</strong> (Google Business Profile, fiches locales, avis clients, signaux de proximité).</li> <li>Les <strong>campagnes payantes</strong> (SEA, social ads) qui peuvent bénéficier d’un site plus rapide et mieux structuré.</li> <li>Les actions de <strong>branding</strong> et de <strong>relations publiques digitales</strong>, qui renforcent la notoriété et peuvent générer des backlinks de qualité.</li> </ul> <p>Dans de nombreux secteurs, une grande partie des parcours d’achat commence en ligne. Un site techniquement optimisé permet de capter plus de trafic qualifié, de mieux convertir et d’améliorer le retour sur investissement global de vos actions marketing.</p> <h2 id="foire-aux-questions-faq">Foire Aux Questions (FAQ)</h2> <h3 id="qu-est-ce-que-le-technical-seo-nbsp">Qu’est-ce que le technical SEO ?</h3> <p><em>R : Le technical SEO, ou SEO technique, est l’optimisation technique d’un site web pour garantir son bon fonctionnement, sa rapidité, sa sécurité et sa capacité àêtre correctement exploré et indexé par les moteurs de recherche. Il englobe notamment la structure du site, les performances, le balisage HTML, les redirections, les données structurées et la compatibilité mobile.</em></p> <h3 id="pourquoi-est-ce-important-d-optimiser-la-vitesse-du-site-nbsp">Pourquoi est-ce important d’optimiser la vitesse du site ?</h3> <p><em>R : Une vitesse de chargement lente dégrade l’expérience utilisateur, augmente le taux de rebond et réduit les conversions. Les moteurs de recherche prennent en compte ces signaux d’expérience, notamment via les indicateurs de performance et les Core Web Vitals. Un site plus rapide favorise donc à la fois la satisfaction des visiteurs et un meilleur positionnement dans les résultats de recherche.</em></p> <h3 id="comment-effectuer-un-audit-seo-technique-nbsp">Comment effectuer un audit SEO technique ?</h3> <p><em>R : Pour réaliser un audit SEO technique, commencez par analyser la couverture d’indexation et les rapports de performance dans Google Search Console. Utilisez ensuite un crawler comme Screaming Frog pour identifier les erreurs techniques, liens brisés, redirections, problèmes de balises ou de structure d’URL. Complétez avec des outils de mesure de performances (PageSpeed Insights, Lighthouse) pourévaluer la vitesse et les Core Web Vitals, puis priorisez les actions à mener en fonction de leur impact potentiel sur la visibilité et l’expérience utilisateur.</em></p> <h3 id="quelle-est-la-difference-entre-seo-technique-contenu-et-netlinking-nbsp">Quelle est la différence entre SEO technique, contenu et netlinking ?</h3> <p><em>R : Le SEO technique se concentre sur la base technique du site (architecture, performance, sécurité, balisage). Le SEO de contenu vise à produire et optimiser les textes, visuels et informations pour répondre aux intentions de recherche. Le netlinking, ou SEO off-page, concerne l’obtention de liens externes de qualité pour renforcer l’autorité et la popularité du site. Les trois volets sont complémentaires et doiventêtre travaillés ensemble pour obtenir des résultats durables.</em></p> <h3 id="le-technology-seo-suffit-il-a-bien-se-positionner-sur-google-nbsp">Le technology SEO suffit-il à bien se positionner sur Google ?</h3> <p><em>R : Le technology SEO est une condition nécessaire, mais non suffisante, pour bien se positionner. Un site peutêtre techniquement irréprochable et rester peu visible s’il ne propose pas de contenu pertinent, s’il ne répond pas aux intentions de recherche ou s’il ne bénéficie pas d’une autorité suffisante dans son domaine. L’idéal est donc d’allier SEO technique, contenu de qualité et stratégie de popularité.</em></p> <h3 id="a-quelle-frequence-faut-il-realiser-un-audit-technique-nbsp">À quelle fréquence faut-il réaliser un audit technique ?</h3> <p><em>R : Il est recommandé de réaliser un audit technique complet lors de la création du site, avant et après chaque refonte majeure, puis de le mettre à jour régulièrement (par exemple une à deux fois par an). Entre ces audits complets, un suivi continu via Google Search Console et des contrôles ciblés permettent de détecter rapidement les problèmes (erreurs 404, chute de performance, problèmes d’indexation).</em></p> <h2 id="conclusion">Conclusion</h2> <p>Maîtriser le <strong>technology SEO</strong> est essentiel pour booster la visibilité de votre site web de manière durable. En travaillant l’architecture, la structure des URLs, la performance de chargement, la sécurité, la compatibilité mobile et l’indexation, vous créez une base technique solide qui permet à vos contenus d’exprimer tout leur potentiel.</p> <p>En combinant ces bonnes pratiques techniques avec une stratégieéditoriale pertinente et un travail régulier sur la popularité de votre site, vous maximisez vos chances d’atteindre les premières positions sur les moteurs de recherche et de transformer ce trafic en résultats concrets pour votre activité.</p> <p>N’hésitez pas à partager vos expériences, vos questions ou vos besoins spécifiques liés au <strong>technology SEO</strong> dans les commentaires. Chaque site est unique, et un diagnostic adapté permet souvent de révéler des opportunités d’optimisation insoupçonnées.</p> </div> <!-- Articles similaires --> <div class="mt-12 pt-8 border-t border-gray-200"> <h2 class="text-2xl font-bold text-gray-900 mb-6 flex items-center gap-2"> <i class="fas fa-newspaper text-purple-600"></i> Articles similaires </h2> <div class="grid gap-4"> <a href="/blog/seo-technique-indexable-comprendre-et-optimiser-l-indexabilite-de-votre-site/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">SEO technique indexable : comprendre et optimiser l’indexabilité de votre site</span> </a> <a href="/blog/chaine-de-redirection-guide-complet-pour-optimiser-votre-seo-technique/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Chaîne de Redirection : Guide Complet pour Optimiser Votre SEO Technique</span> </a> <a href="/blog/webseiten-seo-guide-complet-pour-optimiser-la-visibilite-de-votre-site-web/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Webseiten SEO : guide complet pour optimiser la visibilité de votre site web</span> </a> </div> </div> <!-- CTA Section --> <div class="mt-12 pt-8 border-t border-gray-200"> <div class="bg-gradient-to-r from-purple-600 to-blue-600 rounded-xl p-8 text-center text-white"> <h3 class="text-2xl font-bold mb-4">Besoin d'aide avec votre SEO ?</h3> <p class="mb-6 text-purple-100">Notreéquipe d'experts peut vous aider à optimiser votre site e-commerce</p> <div class="flex flex-col sm:flex-row gap-4 justify-center"> <a href="/seo-ecommerce" class="bg-white text-purple-600 px-8 py-3 rounded-lg font-semibold hover:bg-purple-50 transition inline-block"> Découvrir nos services SEO </a> <a href="/#contact" class="bg-purple-800 text-white px-8 py-3 rounded-lg font-semibold hover:bg-purple-900 transition inline-block"> Nous contacter </a> </div> </div> </div> </article> <!-- Section Commentaires --> <div class="mt-12 max-w-4xl mx-auto bg-white rounded-2xl shadow-xl p-8 md:p-12"> <h2 class="text-3xl font-bold text-gray-900 mb-6 flex items-center gap-3"> <i class="fas fa-comments text-purple-600"></i> Commentaires </h2> <!-- Liste des commentaires approuvés --> <div id="comments-list" class="mb-8 space-y-6"> <!-- Les commentaires approuvés seront chargés ici via JavaScript --> </div> <!-- Formulaire de commentaire --> <div class="border-t border-gray-200 pt-8"> <h3 class="text-xl font-semibold text-gray-900 mb-4">Laisser un commentaire</h3> <form id="comment-form" class="space-y-4"> <input type="hidden" id="article-slug" value="technology-seo-guide-complet-pour-optimiser-la-performance-technique-de-votre-site"> <div class="grid md:grid-cols-2 gap-4"> <div> <label for="comment-name" class="block text-sm font-medium text-gray-700 mb-2">Nom *</label> <input type="text" id="comment-name" name="name" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"> </div> <div> <label for="comment-email" class="block text-sm font-medium text-gray-700 mb-2">Email *</label> <input type="email" id="comment-email" name="email" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"> </div> </div> <div> <label for="comment-message" class="block text-sm font-medium text-gray-700 mb-2">Message *</label> <textarea id="comment-message" name="message" rows="5" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"></textarea> </div> <div class="text-sm text-gray-600"> <i class="fas fa-info-circle text-purple-600"></i> Votre commentaire sera soumis à modération avant publication. </div> <button type="submit" class="bg-gradient-to-r from-purple-600 to-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:from-purple-700 hover:to-blue-700 transition inline-flex items-center gap-2"> <i class="fas fa-paper-plane"></i> Publier le commentaire </button> </form> <div id="comment-status" class="mt-4 hidden"></div> </div> </div> <!-- Navigation Articles --> <div class="mt-12 max-w-4xl mx-auto"> <a href="/blog" class="inline-flex items-center gap-2 text-purple-600 hover:text-purple-800 transition font-semibold"> <i class="fas fa-arrow-left"></i> Retour au blog </a> </div> </div> </section> <!-- Script pour les commentaires --> <script> const articleSlug = 'technology-seo-guide-complet-pour-optimiser-la-performance-technique-de-votre-site'; // Charger les commentaires approuvés async function loadComments() { try { const response = await fetch(`/gestion-commentaires/get-comments.php?slug=${articleSlug}`); const data = await response.json(); const commentsList = document.getElementById('comments-list'); if (data.success && data.comments.length > 0) { commentsList.innerHTML = data.comments.map(comment => ` <div class="border-l-4 border-purple-600 pl-4 py-2"> <div class="flex items-center gap-2 mb-2"> <strong class="text-gray-900">${comment.name}</strong> <span class="text-sm text-gray-500">•</span> <span class="text-sm text-gray-500">${new Date(comment.date).toLocaleDateString('fr-FR')}</span> </div> <p class="text-gray-700">${comment.message}</p> </div> `).join(''); } else { commentsList.innerHTML = '<p class="text-gray-500 italic">Aucun commentaire pour le moment. Soyez le premier à commenter !</p>'; } } catch (error) { console.error('Erreur lors du chargement des commentaires:', error); } } // Gérer la soumission du formulaire document.getElementById('comment-form').addEventListener('submit', async function(e) { e.preventDefault(); const formData = { slug: articleSlug, name: document.getElementById('comment-name').value, email: document.getElementById('comment-email').value, message: document.getElementById('comment-message').value }; const submitBtn = this.querySelector('button[type="submit"]'); const originalText = submitBtn.innerHTML; submitBtn.disabled = true; submitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Envoi en cours...'; try { const response = await fetch('/gestion-commentaires/submit-comment.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); const result = await response.json(); const messageDiv = document.getElementById('comment-status'); if (result.success) { messageDiv.className = 'mt-4 p-4 bg-green-100 border border-green-400 text-green-700 rounded-lg'; messageDiv.textContent = 'Merci ! Votre commentaire aété soumis et sera publié après modération.'; messageDiv.classList.remove('hidden'); this.reset(); } else { messageDiv.className = 'mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg'; messageDiv.textContent = result.message || 'Une erreur est survenue. Veuillez réessayer.'; messageDiv.classList.remove('hidden'); } } catch (error) { const messageDiv = document.getElementById('comment-status'); messageDiv.className = 'mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg'; messageDiv.textContent = 'Erreur de connexion. Veuillez réessayer plus tard.'; messageDiv.classList.remove('hidden'); } finally { submitBtn.disabled = false; submitBtn.innerHTML = originalText; } }); // Charger les commentaires au chargement de la page loadComments(); </script> <footer class="bg-gray-950 text-gray-400 py-12"> <div class="container mx-auto px-6"> <div class="flex flex-col md:flex-row justify-between items-center"> <div class="mb-6 md:mb-0 flex items-start gap-4"> <img src="/images/logo.png" alt="Logo VRAIVEX" class="h-32 w-32 md:h-40 md:w-40 object-contain"> <div> <a href="#" class="text-2xl font-bold block"> <span class="gradient-text">VRAIVEX</span> </a> <p class="mt-2 text-sm">Automatisation, IA et SEO au service de la performance e-commerce</p> </div> </div> <div class="flex flex-col items-center md:items-end"> <div class="grid grid-cols-2 md:flex md:flex-wrap gap-3 md:space-x-6 mb-4 text-center md:text-right"> <a href="/#about" class="hover:text-white transition text-sm">À propos</a> <a href="/#services" class="hover:text-white transition text-sm">Services</a> <a href="/#prestations" class="hover:text-white transition text-sm">Prestations</a> <a href="/#bestsellers" class="hover:text-white transition text-sm">Best Sellers</a> <a href="/#brands" class="hover:text-white transition text-sm">Nos marques</a> <a href="/creation-site-ecommerce" class="hover:text-white transition text-sm">Création Sites</a> <a href="/seo-ecommerce" class="hover:text-white transition text-sm">SEO E-commerce</a> <a href="/partenaires" class="hover:text-white transition text-sm">Partenaires</a> <a href="/#contact" class="hover:text-white transition text-sm">Contact</a> </div> <p class="text-sm text-center md:text-right">© 2025 VRAIVEX. Tous droits réservés.</p> </div> </div> </div> </footer> <!-- Back to Top Button --> <button id="backToTop" class="fixed bottom-8 right-8 bg-gradient-to-r from-purple-600 to-blue-600 text-white p-4 rounded-full shadow-lg hover:shadow-xl transform hover:scale-110 transition-all duration-300 z-50 hidden"> <i class="fas fa-arrow-up text-xl"></i> </button> <script> // Header scroll effect window.addEventListener('scroll', function() { const header = document.getElementById('header'); if (window.scrollY > 100) { header.classList.add('header-scrolled'); } else { header.classList.remove('header-scrolled'); } }); // Smooth scrolling for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); document.querySelector(this.getAttribute('href')).scrollIntoView({ behavior: 'smooth' }); }); }); // Mobile menu toggle const mobileMenuButton = document.getElementById('mobileMenuButton'); const mobileMenu = document.getElementById('mobileMenu'); const menuIcon = document.getElementById('menuIcon'); if (mobileMenuButton && mobileMenu) { mobileMenuButton.addEventListener('click', function() { mobileMenu.classList.toggle('hidden'); // Toggle icon between bars and times if (mobileMenu.classList.contains('hidden')) { menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); } else { menuIcon.classList.remove('fa-bars'); menuIcon.classList.add('fa-times'); } }); // Close menu when clicking on a link const mobileLinks = mobileMenu.querySelectorAll('a'); mobileLinks.forEach(link => { link.addEventListener('click', function() { mobileMenu.classList.add('hidden'); menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); }); }); } // Brands Carousel const brandsCarousel = document.getElementById('brandsCarousel'); const brandsContainer = document.getElementById('brandsContainer'); const brandsPrevBtn = document.getElementById('brandsPrevBtn'); const brandsNextBtn = document.getElementById('brandsNextBtn'); const brandsPrevBtnMobile = document.getElementById('brandsPrevBtnMobile'); const brandsNextBtnMobile = document.getElementById('brandsNextBtnMobile'); if (brandsContainer && brandsCarousel) { let currentIndex = 0; const cards = brandsContainer.querySelectorAll('.brand-card'); const cardsPerView = { mobile: 1, tablet: 2, desktop: 3, large: 4 }; function getCardsPerView() { const width = window.innerWidth; if (width >= 1280) return cardsPerView.large; if (width >= 1024) return cardsPerView.desktop; if (width >= 768) return cardsPerView.tablet; return cardsPerView.mobile; } function updateCarousel() { const cardsPerViewCount = getCardsPerView(); const containerWidth = brandsCarousel.offsetWidth; const cardWidth = containerWidth / cardsPerViewCount; const maxIndex = Math.max(0, cards.length - cardsPerViewCount); currentIndex = Math.min(currentIndex, maxIndex); brandsContainer.style.transform = `translateX(-${currentIndex * cardWidth}px)`; // Update button states const isAtStart = currentIndex === 0; const isAtEnd = currentIndex >= maxIndex; if (brandsPrevBtn) { brandsPrevBtn.style.opacity = isAtStart ? '0.5' : '1'; brandsPrevBtn.style.cursor = isAtStart ? 'not-allowed' : 'pointer'; } if (brandsNextBtn) { brandsNextBtn.style.opacity = isAtEnd ? '0.5' : '1'; brandsNextBtn.style.cursor = isAtEnd ? 'not-allowed' : 'pointer'; } if (brandsPrevBtnMobile) { brandsPrevBtnMobile.style.opacity = isAtStart ? '0.5' : '1'; brandsPrevBtnMobile.style.cursor = isAtStart ? 'not-allowed' : 'pointer'; } if (brandsNextBtnMobile) { brandsNextBtnMobile.style.opacity = isAtEnd ? '0.5' : '1'; brandsNextBtnMobile.style.cursor = isAtEnd ? 'not-allowed' : 'pointer'; } } function nextSlide() { const cardsPerViewCount = getCardsPerView(); const maxIndex = Math.max(0, cards.length - cardsPerViewCount); if (currentIndex < maxIndex) { currentIndex++; updateCarousel(); } } function prevSlide() { if (currentIndex > 0) { currentIndex--; updateCarousel(); } } // Event listeners if (brandsNextBtn) brandsNextBtn.addEventListener('click', nextSlide); if (brandsPrevBtn) brandsPrevBtn.addEventListener('click', prevSlide); if (brandsNextBtnMobile) brandsNextBtnMobile.addEventListener('click', nextSlide); if (brandsPrevBtnMobile) brandsPrevBtnMobile.addEventListener('click', prevSlide); // Set responsive width for cards function setCardWidths() { const cardsPerViewCount = getCardsPerView(); const containerWidth = brandsCarousel.offsetWidth; const gap = 24; // 24px gap const cardWidth = (containerWidth - (gap * (cardsPerViewCount - 1))) / cardsPerViewCount; cards.forEach(card => { card.style.width = `${cardWidth}px`; card.style.flexShrink = '0'; }); } // Initialize setCardWidths(); updateCarousel(); // Update on resize let resizeTimeout; window.addEventListener('resize', function() { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function() { setCardWidths(); currentIndex = 0; updateCarousel(); }, 250); }); } </script> <script> // Header scroll effect window.addEventListener('scroll', function() { const header = document.getElementById('header'); if (window.scrollY > 50) { header.classList.add('header-scrolled'); } else { header.classList.remove('header-scrolled'); } }); // Scroll animations const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('visible'); } }); }, observerOptions); // Observe all fade-in-up elements document.querySelectorAll('.fade-in-up').forEach(el => { observer.observe(el); }); // Smooth scroll for anchor links 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', block: 'start' }); } }); }); // Counter animation for stats function animateCounter(element, target, duration = 2000) { let start = 0; const increment = target / (duration / 16); const timer = setInterval(() => { start += increment; if (start >= target) { element.textContent = target + (element.textContent.includes('+') ? '+' : '') + (element.textContent.includes('K') ? 'K€' : ''); clearInterval(timer); } else { element.textContent = Math.floor(start) + (element.textContent.includes('+') ? '+' : '') + (element.textContent.includes('K') ? 'K€' : ''); } }, 16); } // Observe stats section const statsObserver = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting && !entry.target.classList.contains('animated')) { entry.target.classList.add('animated'); const statsCards = entry.target.querySelectorAll('.stats-card'); statsCards.forEach((card, index) => { setTimeout(() => { card.style.opacity = '0'; card.style.transform = 'translateY(20px)'; setTimeout(() => { card.style.transition = 'all 0.6s ease'; card.style.opacity = '1'; card.style.transform = 'translateY(0)'; }, 100); }, index * 100); }); } }); }, { threshold: 0.3 }); const statsSection = document.querySelector('section.bg-gradient-to-r'); if (statsSection) { statsObserver.observe(statsSection); } </script> <script> // Gestion du formulaire de contact const contactForm = document.getElementById('contact-form'); const formMessage = document.getElementById('form-message'); const submitBtn = document.getElementById('submit-btn'); if (contactForm) { contactForm.addEventListener('submit', async function(e) { e.preventDefault(); // Désactiver le bouton pendant l'envoi submitBtn.disabled = true; submitBtn.textContent = 'Envoi en cours...'; // Récupérer les données du formulaire const formData = new FormData(contactForm); try { // Vérifier que les données sont bien dans le FormData const formDataObj = { name: formData.get('name'), email: formData.get('email'), subject: formData.get('subject'), message: formData.get('message') }; console.log('Données du formulaire:', formDataObj); // Vérifier que tous les champs sont remplis if (!formDataObj.name || !formDataObj.email || !formDataObj.subject || !formDataObj.message) { formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; formMessage.textContent = 'Veuillez remplir tous les champs du formulaire.'; submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; return; } // Essayer d'abord avec JSON (plus fiable) // Siça ne fonctionne pas, on essaiera avec FormData let response; try { // Méthode 1 : Envoyer en JSON (plus fiable selon les forums) response = await fetch('gestion-formulaire-contact/send-email-json.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formDataObj) }); } catch (jsonError) { console.warn('Erreur avec JSON, essai avec FormData:', jsonError); // Méthode 2 : Fallback avec FormData response = await fetch('send-email.php', { method: 'POST', body: formData }); } // Lire le texte de la réponse d'abord pour déboguer const responseText = await response.text(); console.log('Réponse serveur:', responseText.substring(0, 500)); // Vérifier si la réponse est OK if (!response.ok) { // Essayer de parser le JSON d'erreur try { const errorResult = JSON.parse(responseText); // Afficher le message d'erreur du serveur directement à l'utilisateur formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; formMessage.textContent = errorResult.message || `Erreur ${response.status}: ${response.statusText}`; submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; return; // Sortir de la fonction pour ne pas continuer } catch (e) { throw new Error(`Erreur HTTP ${response.status}: ${response.statusText}. Réponse: ${responseText.substring(0, 200)}`); } } // Vérifier si PHP n'est pas exécuté (le serveur renvoie le code PHP brut) if (responseText.trim().startsWith('<?php') || responseText.includes('<?php')) { console.error('ERREUR: PHP n\'est pas exécuté par le serveur. Le code PHP est renvoyé brut.'); console.error('Le serveur web n\'est pas configuré pour exécuter PHP.'); // Utiliser la solution de secours : sauvegarder dans localStorage const messageData = { name: formData.get('name'), email: formData.get('email'), subject: formData.get('subject'), message: formData.get('message'), timestamp: new Date().toISOString() }; // Sauvegarder dans localStorage comme solution de secours const savedMessages = JSON.parse(localStorage.getItem('vraivex_messages') || '[]'); savedMessages.push(messageData); localStorage.setItem('vraivex_messages', JSON.stringify(savedMessages)); // Afficher un message spécial formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-yellow-600 text-white'; formMessage.innerHTML = '⚠️ PHP n\'est pas configuré sur le serveur. Votre message aété sauvegardé localement. <br>Veuillez nous contacter directement à <strong>contact@vraivex.fr</strong> ou consulter les messages sauvegardés dans la console du navigateur.'; // Afficher les messages sauvegardés dans la console console.log('Messages sauvegardés localement:', savedMessages); console.log('Pour consulter les messages, tapez dans la console: JSON.parse(localStorage.getItem("vraivex_messages"))'); return; // Sortir de la fonction } // Essayer de parser le JSON let result; try { result = JSON.parse(responseText); } catch (parseError) { console.error('Erreur de parsing JSON:', parseError); console.error('Réponse reçue:', responseText.substring(0, 500)); throw new Error('Le serveur a renvoyé une réponse invalide. Vérifiez la console pour plus de détails.'); } // Afficher le message de résultat formMessage.classList.remove('hidden'); if (result.success) { formMessage.className = 'mb-6 p-4 rounded-lg bg-green-600 text-white'; formMessage.textContent = 'Message envoyé avec succès ! Nous vous répondrons dans les plus brefs délais.'; contactForm.reset(); } else { formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; let errorMsg = result.message || 'Une erreur est survenue. Veuillez réessayer.'; // Afficher le message de debug en développement (à retirer en production) if (result.debug) { console.error('Erreur détaillée:', result.debug); } formMessage.textContent = errorMsg; } } catch (error) { formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; // Message d'erreur plus détaillé pour le débogage let errorMsg = 'Une erreur est survenue lors de la communication avec le serveur. '; errorMsg += 'Veuillez réessayer plus tard ou nous contacter directement à contact@vraivex.fr'; // En mode développement, afficher plus de détails if (error.message) { console.error('Erreur détaillée:', error); console.error('Message:', error.message); console.error('Stack:', error.stack); } formMessage.textContent = errorMsg; } finally { // Réactiver le bouton submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; // Masquer le message après 5 secondes setTimeout(() => { formMessage.classList.add('hidden'); }, 5000); } }); } // Back to Top Button functionality const backToTopButton = document.getElementById('backToTop'); // Show/hide button based on scroll position window.addEventListener('scroll', () => { if (window.pageYOffset > 300) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } }); // Smooth scroll to top when clicked backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); </script> </body> </html>