jQuery : script utilisant la fonction toggle pour afficher ou cacher un bloc HTML

Afficher ou cacher un bloc HTML au clic fait partie des petits besoins classiques du web. Pendant longtemps, jQuery réglait cela en trois lignes avec toggle(). C’était simple, lisible, efficace. Et, soyons honnêtes, cela a rendu service à beaucoup de monde.

Aujourd’hui, on peut faire mieux. Dans la plupart des cas, il n’est plus nécessaire de charger jQuery juste pour masquer un bloc de texte. HTML sait déjà le faire avec <details> et <summary>. Et si vous voulez un contrôle plus fin, quelques lignes de JavaScript moderne suffisent.

Voici donc une version modernisée du vieux toggle jQuery : plus légère, plus accessible, et plus facile à maintenir.

Le besoin : afficher un bloc au clic

Sur SkyMinds, j’utilisais ce type de script pour afficher certaines zones de texte dans des articles, notamment dans les articles de la catégorie Music/Séries.

Le principe est simple : un élément visible sert de déclencheur. Quand l’internaute clique dessus, un bloc caché apparaît. Quand il reclique, le bloc disparaît.

Avant, le réflexe était souvent celui-ci : charger jQuery, cibler un ID, puis lancer toggle(). Cela fonctionne toujours. Cependant, ce n’est plus le meilleur point de départ pour un nouveau projet.

La méthode moderne : utiliser details et summary

Pour un simple bloc que l’on veut ouvrir ou fermer, HTML propose une solution native : <details>. Elle fonctionne sans dépendance, sans script, et sans bidouille.

<details class="sky-toggle">
	<summary>Cliquez pour afficher le contenu</summary>

	<div class="sky-toggle__content">
		<p>Ce texte apparaît et disparaît grâce à un élément HTML natif.</p>
	</div>
</details>Code language: HTML, XML (xml)

Le navigateur gère automatiquement l’ouverture et la fermeture. Le contenu du <summary> reste visible. Le reste du bloc apparaît lorsque l’élément <details> passe à l’état ouvert.

Pour beaucoup de tutoriels, FAQ, spoilers, notes complémentaires ou contenus secondaires, cette solution suffit largement. Elle évite aussi d’ajouter du JavaScript pour une interaction que HTML gère déjà très bien.

Distingo, le livret à 2%

Ajouter un style propre au bloc

Par défaut, l’affichage reste très brut. Ajoutons donc un peu de CSS pour rendre le composant plus agréable.

.sky-toggle {
	margin: 1.5rem 0;
	border: 1px solid #d4d4d8;
	border-radius: 0.75rem;
	background: #fafafa;
}

.sky-toggle summary {
	cursor: pointer;
	padding: 1rem 1.25rem;
	font-weight: 700;
}

.sky-toggle summary:hover {
	background: #f4f4f5;
}

.sky-toggle__content {
	padding: 0 1.25rem 1.25rem;
}

.sky-toggle__content > :last-child {
	margin-bottom: 0;
}Code language: CSS (css)

On obtient alors un bloc pliable simple, lisible et maintenable. Il ne dépend d’aucune librairie externe. C’est déjà une petite victoire contre le gras numérique.

Ouvrir le bloc par défaut

Si vous voulez afficher le contenu dès le chargement de la page, ajoutez simplement l’attribut open sur <details>.

<details class="sky-toggle" open>
	<summary>Cliquez pour masquer le contenu</summary>

	<div class="sky-toggle__content">
		<p>Ce bloc est ouvert par défaut.</p>
	</div>
</details>Code language: HTML, XML (xml)

C’est pratique pour une note importante que vous voulez afficher immédiatement, tout en laissant la possibilité de la replier.

Méthode avec JavaScript moderne

Dans certains cas, <details> ne suffit pas. Vous pouvez vouloir utiliser un vrai bouton, changer un libellé, contrôler plusieurs états, ou intégrer le bloc dans une interface plus personnalisée.

Dans ce cas, utilisez un bouton HTML et l’attribut hidden.

<button class="sky-toggle-button" type="button" aria-expanded="false" aria-controls="sky-toggle-panel">
	Afficher le contenu
</button>

<div id="sky-toggle-panel" class="sky-toggle-panel" hidden>
	<p>Ce texte apparaît grâce à quelques lignes de JavaScript moderne.</p>
</div>Code language: HTML, XML (xml)

Ensuite, ajoutez le script :

const toggleButton = document.querySelector('.sky-toggle-button');
const togglePanel = document.querySelector('#sky-toggle-panel');

if (toggleButton && togglePanel) {
	toggleButton.addEventListener('click', () => {
		const isExpanded = toggleButton.getAttribute('aria-expanded') === 'true';

		toggleButton.setAttribute('aria-expanded', String(!isExpanded));
		toggleButton.textContent = isExpanded ? 'Afficher le contenu' : 'Masquer le contenu';
		togglePanel.hidden = isExpanded;
	});
}Code language: JavaScript (javascript)

Cette version reste courte, mais elle respecte mieux l’accessibilité. Le bouton annonce son état avec aria-expanded, et aria-controls indique quel bloc il pilote.

Un peu de CSS pour la version JavaScript

.sky-toggle-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin: 1rem 0;
	padding: 0.75rem 1rem;
	border: 0;
	border-radius: 0.5rem;
	background: #111827;
	color: #fff;
	font-weight: 700;
	cursor: pointer;
}

.sky-toggle-button:hover,
.sky-toggle-button:focus-visible {
	background: #374151;
}

.sky-toggle-panel {
	margin: 0 0 1.5rem;
	padding: 1rem;
	border-left: 4px solid #111827;
	background: #f9fafb;
}Code language: CSS (css)

Cette approche convient très bien si vous voulez un composant réutilisable dans une page, un thème WordPress ou un petit module d’interface.

Version réutilisable pour plusieurs blocs

Si vous avez plusieurs blocs à afficher et cacher sur la même page, évitez les IDs fixes comme #toggle et #toggler. Ils ne peuvent servir qu’une seule fois par page. Utilisez plutôt une structure réutilisable.

Pour plusieurs blocs, vous pouvez aussi consulter l’ancien article dédié au toggle jQuery pour afficher et cacher de multiples blocs HTML. L’idée reste bonne, même si la version moderne se passe désormais très bien de jQuery.

<button class="js-toggle" type="button" aria-expanded="false">
	Afficher le premier bloc
</button>

<div class="js-toggle-panel" hidden>
	<p>Contenu du premier bloc.</p>
</div>

<button class="js-toggle" type="button" aria-expanded="false">
	Afficher le second bloc
</button>

<div class="js-toggle-panel" hidden>
	<p>Contenu du second bloc.</p>
</div>Code language: HTML, XML (xml)

Puis utilisez ce JavaScript :

document.querySelectorAll('.js-toggle').forEach((button) => {
	const panel = button.nextElementSibling;

	if (!panel || !panel.classList.contains('js-toggle-panel')) {
		return;
	}

	button.addEventListener('click', () => {
		const isExpanded = button.getAttribute('aria-expanded') === 'true';

		button.setAttribute('aria-expanded', String(!isExpanded));
		panel.hidden = isExpanded;
	});
});Code language: JavaScript (javascript)

Ce script associe chaque bouton au bloc qui le suit immédiatement. Il reste donc très simple à lire. En revanche, il suppose que le HTML garde toujours cette structure : bouton, puis panneau.

Et jQuery toggle dans tout ça ?

Le vieux code jQuery ressemblait à ceci :

jQuery(document).ready(function() {
	jQuery('#toggle').hide();

	jQuery('a#toggler').on('click', function(event) {
		event.preventDefault();

		jQuery('#toggle').toggle(400);
	});
});Code language: JavaScript (javascript)

Ce code fonctionne encore si jQuery est déjà chargé. Mais il a plusieurs limites :

  • il dépend d’une librairie externe pour une action très simple ;
  • il utilise des IDs, donc il se réutilise mal sur plusieurs blocs ;
  • il repose souvent sur un lien vide avec href="#", alors qu’un bouton est plus adapté ;
  • il ne met pas à jour l’état accessible du déclencheur ;
  • il peut ajouter du poids inutile sur une page moderne.

Si votre site charge déjà jQuery pour d’autres raisons, ce n’est pas dramatique. Mais si vous démarrez un nouveau composant, partez plutôt sur HTML natif ou Vanilla JavaScript.

Dans WordPress : ne chargez pas jQuery à la main

Dans un thème ou une extension WordPress, évitez d’ajouter directement une balise <script> vers un CDN jQuery dans le contenu, le header ou le footer.

Si vous avez vraiment besoin de jQuery, chargez-le avec wp_enqueue_script(). WordPress gère alors les dépendances et évite les doublons.

<?php
/**
 * Enqueue a frontend script that depends on jQuery.
 *
 * @return void
 */
function skyminds_enqueue_toggle_script(): void {
	wp_enqueue_script(
		'skyminds-toggle',
		get_stylesheet_directory_uri() . '/assets/js/toggle.js',
		array( 'jquery' ),
		'1.0.0',
		true
	);
}
add_action( 'wp_enqueue_scripts', 'skyminds_enqueue_toggle_script' );Code language: HTML, XML (xml)

Cela dit, pour un simple bouton qui affiche ou masque un bloc, vous pouvez éviter cette dépendance et charger un petit fichier JavaScript sans jQuery :

<?php
/**
 * Enqueue the lightweight toggle script.
 *
 * @return void
 */
function skyminds_enqueue_lightweight_toggle_script(): void {
	wp_enqueue_script(
		'skyminds-lightweight-toggle',
		get_stylesheet_directory_uri() . '/assets/js/lightweight-toggle.js',
		array(),
		'1.0.0',
		true
	);
}
add_action( 'wp_enqueue_scripts', 'skyminds_enqueue_lightweight_toggle_script' );Code language: HTML, XML (xml)

Encore mieux : chargez ce script seulement sur les pages qui en ont besoin. Votre front-end vous dira merci. Vos Core Web Vitals aussi, dans leur langage froid et cruel.

Quelle méthode choisir ?

BesoinSolution recommandée
Afficher une note, une FAQ, un spoiler ou un complément<details> et <summary>
Changer le texte du bouton au clicVanilla JavaScript avec hidden
Gérer plusieurs blocs indépendantsClasses réutilisables et JavaScript léger
Ajouter une animation préciseCSS transition ou JavaScript dédié
Maintenir un vieux thème déjà basé sur jQueryjQuery possible, mais proprement enqueued

Conclusion

Le toggle jQuery a eu son heure de gloire. Il reste compréhensible, et il fonctionne encore dans beaucoup de projets. Mais pour afficher ou cacher un simple bloc HTML, les standards modernes font mieux avec moins de code.

Commencez par <details> et <summary>. Passez à Vanilla JavaScript si vous avez besoin d’un comportement plus précis. Gardez jQuery uniquement si votre projet en dépend déjà réellement.

Moins de dépendances, moins de JavaScript, moins de surprises. C’est rarement spectaculaire, mais c’est souvent comme ça qu’un site devient plus propre.

Sources et ressources utiles

Important : si vous voulez gérer plusieurs blocs, utilisez le script jQuery toggle pour afficher et cacher de multiples blocs HTML
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

51 pensées sur “jQuery : script utilisant la fonction toggle pour afficher ou cacher un bloc HTML”

  1. Bonjour Matt,

    Et merci avant tout pour cet article super accessible sur le toggle.

    J’ai néanmoins une question pour personnaliser l’utilisation de ce Toggle. Comment faut-il faire pour que la zone de texte se déroule non pas depuis le point haut gauche mais depuis une “barre verticale. En d’autres mots, une apparition uniquement de haut en bas?

    Merci beaucoup de ta réponse!

    Viktor

    Reply
      • Bonjour!!!
        Voici le lien d’un nouveau réseau social gloxwell.com
        Je veux avoir vos critiques parce que ce grâce a vos jQuery que nous avons arrive a finir ce réseau social. Enfin Mr. Matt je voulais savoir comment afficher un div après 3 minutes avec jquery merci d’avoir repondre a ma question et de faire partie de membre du gloxwell.

  2. bonjour,
    question de bleu mais comment s’assurer que le texte au dessous se décale bien vers le bas quand le texte apparait et vers le haut quand il disparait?

    Reply
  3. Bonjour Matt,

    Et merci beaucoup de ta réponse, c’est parfaitement ce qu’il me faut!

    J’ai un tout petit peu modifié la fonction pour qu’elle réagisse au mouseover et non pas au click. Juste une petite précision à ce sujet : quel code faut-il mettre sur les autres boutons (liens) pour qu’un mouseover sur ces liens entraîne la fermeture de la boîte déroulée par le toggle présent sur un lien?
    De même manière, avec la fonction mouseover, est-il possible que la boîte se retracte lorsque la souris quitte le bouton (pour le moment, il faut quitter et repasser dessus pour qu’elle se referme)?

    Merci beaucoup de ton aide et de ta réactivité!

    Très bonne journée.

    Reply
    • Salut Vik,

      Jquery Script avec toggle en onmouseover

      HTML

      passez votre souris ici

      show

      CSS

      .desc {display:none}

      JS

      $(document).ready(function() {
          $(".body").hover(function () {
              $(".desc").toggle();
          })
      })

      C’est ce que tu recherches je pense.

      Reply
  4. Bonjour,

    Tout d’abord merci beaucoup pour cette fonction, elle est parfaite pour ce que je veux faire !

    Mais le problème, c’est que lorsque je répète l’opération pour un autre bloc de texte, ça me renvoie toujours à la première description…

    Je m’explique :

    TITRE TEXTE 1

    Je clique, j’ai :

    TITRE TEXTE 1
    
    ----- Texte du titre 1, blabla

    Et lorsque j’utilise la fonction pour une autre “description caché” (que je veux faire), j’obtiens ceci :

    TITRE TEXTE 1
    
    TITRE TEXTE 2
    
    ---- Texte du titre 1 (et qui s'affiche dans le "Titre texte 1")

    Je ne sais pas si j’explique bien, mais en gros je n’arrive pas a répéter l’opération de la fonction ailleurs que pour UNE seule description.

    Comment faire pour avoir plusieurs textes “cachés” ?

    Par avance, merci.

    Cordialement.

    Reply
    • Bonjour Debutant,

      Il faut remplacer les ID par des CLASS dans le code comme dans l’article JQuery : script toggle pour afficher et cacher de multiples blocs HTML.

      Ancienne méthode:

      HTML

      Cliquez sur ce premier lien.
      
      
      
      Maintenant, cliquez sur ce deuxième lien.
      
      

      JQUERY

      
      

      Je vous recommande la nouvelle méthode.

      Reply
      • Bonjour,

        Je réussis bien à afficher un texte caché en suivant les codes proposés dans l’article initial.

        Je ne parviens en revanche pas à afficher de texte caché en modifiant le html et le script tel que proposé ci-dessus.

        Je ne comprends pas pourquoi ça ne marche pas étant donné que ça marche pour 1 toggle et que j’ai bien reporté les modifications.

        Adresse de mon “one page site” sur lequel je teste :
        vmarce.phpnet.org/payfair/meilleur

        Merci pour votre aide !

      • Bonjour,
        désolé de relancer ce sujet mais j’ai un problème.

        mon Toggler est une image et j’ai trois images sur une ligne. Le problème c’est que quand je place le Toggle après le premier Toggler et que l’on clique dessus tout se décale (ce que je ne veux pas puisse que je veux que ce qui apparaissent, arrive en dessous de ma ligne d’image). Pour remédier à cela, j’ai placé le toggle après les trois images mais du coup, le coup du changement de id en class ne marche plus.

        Comment faire pour que les toggle ne se marche pas dessus et qu’ils apparaissent en dessous de la ligne d’images?
        Une idée?

        J’espère que j’ai été clair.
        Merci d’avance pour votre aide

  5. Bonjour
    Tout fonctionne bien pour moi sauf que le bloc s’affiche avec un surplus de lignes blanches en dessous, lignes qui disparaissent très vite ensuite… que se passe-t-il ?
    On dirait qu’il découvre plus de ligne qu’il n’y en a vraiment …
    Comment résoudre ce pb qui apparaît principalement avec IE

    Merci

    Reply
    • pour info, le phénomène se produit lors que la partie que l’on dévoile est constituée d’une table avec des cellules dont la largeur est en %age… mais si la largeur des cellules est en px on n’a pas le phénomène …
      c’est louche non ?

      Reply
    • Bonjour,

      IE a des comportements erratiques, avez-vous utilisé un autre navigateur pour tester?

      Tout dépend de ce que vous voulez afficher mais il pourrait être intéressant de remplacer le tableau par une liste stylisée en CSS.

      Reply
  6. Comment appliquer le hover sur le bloc et sur le lien pour que le bloc reste affiché au survol de la souris.Dès lors que l’un des deux élément n’est plus survolé par la souris que le bloc se remette en position masqué.
    -On survol le lien
    -Le bloc s’affiche
    -Le bloc reste affiché lorsque la souris ne survol plus le lien mais uniquement le bloc
    -Le bloc se dissimule quand il n’est plus survolé
    Ou plus simplement le bloc remplace le lien car le hover fonctionne que sur le lien ce qui est toute a fait légitime avec le code JQuery:$(‘#lienmh’).hover(function().
    Merci d’avance pour votre aide !!

    Reply
  7. Bonjour Matt,

    Ce script est super!!

    J’ai quant à moi un petit soucis je ne sais pas si ma demande est possible.

    En fait au lieu d’afficher du texte quand on clique, pour ma part, j’affiche des images.
    Mais celles-ci doivent se superposer.
    En gros j’ai 4 boutons et un schéma divisé en 4 parties, le milieu du schéma est une image fixe(un background) et par les clics sur les 4 boutons on complète le schéma petit à petit.
    Je ne sais pas si je suis claire mais je rêverai d’une réponse ! :)
    Si vous pouvez m’aider s’il vous plait ?

    Merci par avance !!

    Reply
    • Bonjour,

      Vous pourriez donner une classe à chaque bouton : toggler1, toggler2 etc. Ensuite, il suffit de rajouter des déclarations dans le code jQuery :

      // on cache les blocs
      jQuery('#toggle').hide();
      jQuery('#toggle1').hide();
      
      // on affiche
      jQuery('a#toggler').click(function()
        {
            jQuery('#toggle').toggle(400);
            return false;
         });
      jQuery('a#toggler1').click(function()
        {
            jQuery('#toggle1').toggle(400);
            return false;
         });
      Reply
  8. Bonjour je me suis inspiré de votre tuto pour faire apparaitre une partie d’un site via .fadeToggle(), cela fonctionne très bien mais une fois la partie affichée (show) les ancres (liées au menu) des parties en dessous de celle-ci sont toutes décalées.

    C’est à dire qu’une fois sur la balise suivante :

    Services

    c’est celle du dessous qui est active dans le menu :/

    Avez-vous une solution?
    Merci d’avance

    Reply
  9. bonjour merci pour ce tuto je voudrais savoir comment enlever le trait bleu qui se trouve sous la phrase à cliquer ?

    Reply
    • Bonjour,

      Il suffit d’appliquer la propriété CSS underline sur les liens :

      #toggler a:link {text-decoration:none;}
      #toggler a:visited {text-decoration:none;}
      #toggler a:hover {text-decoration:underline;}
      #toggler a:active {text-decoration:underline;}
      Reply
  10. bonjour,

    merci pour ce tutoriel! ça tombe pile poil avec se que souhaite faire!! ça fonctionne très bien pour un élément.
    Par contre, je rencontre un problème : je voudrais répéter l’action sur chaque élément d’un menu déroulant.
    J’ai remplacé les ID par des CLASS mais ça ne fonctionne pas….

    Au secours please!!!

    Reply
    • Salut Guil,

      Je viens de tester avec plusieurs blocs en classes et cela fonctionne. Je ne suis pas certain que ce soit très adapté à un menu par contre.

      Reply
  11. salut a tous j essaye de cachez un bouton mais impossible je voudrais qu il apparaisse quand on clic sur un lien qui s’ouvre sur une nouvelle page est ce possible je voudrais cachez un bouton du style submit merci de m’aidez

    Reply
  12. bonjour et merci pour ce script car je le trouves bien pour l’utilisation qu’il va m apporter mais j’ai un soucis. c’est vrai que la solution es apporté ds les autres commentaire mais j arrive pas a la mettre en application. ce que je veux réalisé c’est que je veux répéter l’opération de cette fonction toge ailleurs que pour UNE seule description. Je vois qu il faut mettre des class au lieu des id et que c’est expliqué mais j’essaye votre explicationet je n’y arrive bien et le script est bien chargé également

    Reply
  13. Bonjour,

    J’ai testé votre code car j’en ai besoin dans le cadre du rafraichissement d’un vieux site internet.
    Il fonctionne lorsque je suis dans l’éditeur sans problème, y compris lorsque je lance un aperçu.
    Cependant dés que je sauvegarde et retourne sur la page il n’y a plus rien d’afficher, on retrouve bien pourtant les lignes de codes dans le code source mais avec des mentions “désolé pas de script” qui ont remplacé toutes les balises … Avez vous une explication ? Le site internet ne supporte peut être pas cela ?
    Existe t-il une solution alternative sans utiliser ce type de code ?
    Merci d’avance.
    Cordialement.

    Reply
    • Bonjour,

      Cela ressemble fort à un éditeur qui supprime les scripts pour éviter l’injection de code javascript dans les pages. Autre solution : copier le code javascript dans un fichier .js et le code CSS dans la feuille de style.

      Reply
  14. Bonjour,
    J’ai utilisé votre code pour créer une FAQ. Je vous remercie ça marche super.
    Par contre, j’aimerais savoir comment faire pour qu’une question ouverte se ferme automatiquement si on clique sur une autre question ?
    Merci beaucoup
    Cordialement

    Reply
  15. Bonjour,

    Merci pour le tutoriel.
    Lorsque je clique sur lien, la div toggle apparait et les div en dessous laisse la place pendant l’ animation mais dés que celle-ci est finit toutes les div en dessous reviennent à leur place. Il n’ y a que le texte qui reste par dessus les div du dessous). Et lorsque j’ appuie sur le lien la div toggle revient le temps de l’ animation et repart.

    Reply
  16. Hello Math!

    Merci pour ce tuto, ça m’a bien aidé !

    J’aimerais cependant utiliser l’option Flip (j’ai pris le code tout en bas de la page http://api.jquery.com/toggle/) car j’ai un soucis d’affichage de tableau avec la méthode Toggle simple.

    Ca marche super bien, sauf que je trouve un peu burt l’apparition direct. Je préfèrerai que ça s’affiche doucement et partent doucement aussi comme un fadeIn.

    Est-ce que c’est possible tu crois ? Donc en gros, un Toggle Flip avec un fadeIn/fadeOut.

    Merci

    Reply
    • Bonjour Jérémie,

      Il me semble que ce n’est pas possible avec la fonction flip puisque c’est comme si tu retournais une carte ou une pièce de monnaie : c’est soit pile, soit face mais tu ne peux pas gérer la vitesse.

      Je pense que ce qu’il te faut c’est un petit

      fadeToggle( "slow", "linear" );

      Je t’ai fait un petit exemple sur JSFiddle.

      Reply
  17. Bonjour,

    Merci pour ce petit tutoriel.

    Existe-il une solution équivalente pour fermer qu’une seul div ? sur ma page j’ai plusieurs menu, lorsque je clique sur la flèche ayant pour id #drop j’aimerais fermer seulement le menu associé…

    Merci

    Reply
  18. bonjour, je n’arrive pas à faire ce qui est écrit au dessus quand je mets le code à l’endroit indiqué, ça ne fonctionne pas

    je mets mon code.
    Si vous avez une idée merci d’avance

    /* */

    Reply
  19. Bonjour, super tuto ! J’ai juste un petit soucis :
    quand je fais la manoeuvre pour un bloc, cela fonctionne. Mais lorsque je fais la même chose pour un autre bloc se publiera sur la même page de mon site, alors ça ne va plus (en voulant dérouler le deuxième bloc, je déroule en fait le premier). J’ai pourtant regardé votre article pour afficher/cacher plusieurs blocs mais ça me semble différent et en plus ce n’est pas un “Lire la suite” qu’il me faut. Si vous avez une solution, merci d’avance !

    Reply
  20. Bonjour,

    Je tiens à vous remercier pour cet enseignement pratique mais surtout design par sa simplicité!

    Reply

Opinions