Fermer un bloc lorsque l'on re-clique dessus - HTML

Fermé
Joejoh Messages postés 11 Date d'inscription samedi 20 juillet 2019 Statut Membre Dernière intervention 1 septembre 2022 - 4 juil. 2020 à 11:50
 ARTUROK - 6 juil. 2020 à 09:03
Bonjour à tous,

J'ai réussi en suivant un tutoriel et en le personnalisant à réaliser un système de questions/réponses pour ma page FAQ sur mon site internet. J'utilise Shopify et je ne suis pas experte en code.

Voici ce que cela donne : Toutes les questions sont initialement fermées. Dès que l'on clique sur la question A, elle s'ouvre, puis lorsque l'on clique sur la question B, la question B s'ouvre et la A se ferme. J'aimerais conserver ces fonctionnalités mais également faire en sorte que lorsque l'on clique sur le bandeau de n'importe qu'elle question ouverte, elle se ferme.

J'espère que ma demande est claire ? J'ai essayé de modifier le code mais en vain, quelqu'un a t-il une solution s'il vous plait ?

De ce que je comprends le code que j'ai personnalisé est un "système d'onglet toujours ouvert" et non un "système d'accordéon", mais je garde encore espoir :)

Pour information, j'ai utilisé une balise style directement dans le HTML car c'est plus simple pour moi (et le tutoriel était comme ça). Mon objectif est de tout mettre dans la feuille HTML et de ne pas toucher aux templates CSS, c'est probablement une très mauvaise pratique désolée mais j'essaie de faire au mieux et au plus simple pour moi.

Voici un extrait de mon code (Je vais jusqu'à 10 questions sur mon site, mais là je vous en mets seulement 5 pour exemple) :
<style type="text/css"><!--
.faq {
position: relative;
}
.faq input { display: none; }
.faq input:checked + label {
background: -webkit-linear-gradient(top,#ccc,#ccc);
color: #000;
font-size:100%;
font-weight: bold;
}
.faq label {
font-family: helvetica;
cursor: pointer;
display: block;
height: auto;
text-align: left;
padding:15px;
padding-left:15px;
margin:0;
padding-right: 15px;

color: #333;
font-size:100%;
border:1px solid #ddd;
border-bottom: 0;
font-weight: bold;
background: -webkit-linear-gradient(top,#fff,#eee);
}
.faq label:before {
content:"+";
line-height:21px;
font-size:21px;
margin-right:5px;
}
.faq input:checked + label:before {
content:"-";
}
.faq label:last-child { margin-right: 0; }
.faq label:hover {
background: -webkit-linear-gradient(top,#fff,#eee);
}
.faq article {
max-height: 0;
overflow: hidden;
transition: max-height 0.15s ease-out;
position: relative;
margin-bottom: 0;
top:0;
padding:10px 10px 10px 10px;
color: #333;
opacity: 0;
border:1px solid #ddd;
}
.faq div > input:checked ~ article {
max-height: 500px;
opacity: 1;
margin-bottom:12px;
transition: max-height 0.25s ease-in;
}​
--></style>
<form class="faq">
<h3 class="faq-wrapper"><strong>Section 1</strong></h3>
<div class="faq-wrapper">
<input type="radio" name="size" id="faq1" value="faq1"> <label for="faq1">Question 1</label>
<article>
<p>Réponse 1</p>
</article>
</div>
<div class="faq-wrapper">
<input type="radio" name="size" id="faq2" value="faq2"> <label for="faq2">Question 2</label>
<article>
<p>Réponse 2</p>
</article>
</div>
<div class="faq-wrapper">
<input type="radio" name="size" id="faq3" value="faq3"> <label for="faq3">Question 3</label>
<article>
<p>Réponse 3</p>
</article>
</div>
<div class="faq-wrapper">
<input type="radio" name="size" id="faq4" value="faq4"> <label for="faq4">Question 4</label>
<article>
<p>Réponse 4</p>
</article>
<h3 class="faq-wrapper" style="margin-top: 10px;"><strong>Section 2</strong></h3>
<div class="faq-wrapper">
<input type="radio" name="size" id="faq5" value="faq5"> <label for="faq5">Question 5?</label>
<article>
<p>Réponse 5</p>
</article>
</div>
</div>
</div>
</form>

Un très grand merci par avance pour votre aide !

Bonne journée,

Configuration: Windows / Chrome 83.0.4103.116
A voir également:

2 réponses

Salut,
il faut plutôt aller du côté de la programmation avec JavaScript pour ce genre de chose.
Pour gérer un événement lors du clic:
https://www.w3schools.com/jsref/event_onclick.asp
et dans le cas que vous présentez mettre les valeurs CSS des éléments à fermer à leur valeur initiale(fermé et non visible avec display:none).
Ici c'est la pseudo classe hover qui déclenche l'affichage et on approche des limites de ce que peut faire CSS côté interactivité.
1
Joejoh Messages postés 11 Date d'inscription samedi 20 juillet 2019 Statut Membre Dernière intervention 1 septembre 2022
5 juil. 2020 à 14:33
Bonjour, merci Arturok pour votre réponse ! JavaScript est un peu trop compliqué pour moi, si jamais je ne trouve pas comment faire avec CSS tant pis je laisserais ma foire aux questions comme ça dans un premier temps :)

Je me permets tout de même des questions très naïves :
1/ Avec CSS, il n'y a pas de possibilité d'engendrer une action au "premier" clic (ex : ouvrir) et une action différente au "deuxième" clic (ex : fermer) ?

2/ De ce que je comprends, dans le code que j'ai utilisé c'est la classe hover qui permet un peu d'interactivité, mais aussi l'item "checked" non ? Ici il y a un exemple, quand on clique sur le bouton ça s'ouvre et quand on re-clique ça se ferme : https://developer.mozilla.org/fr/docs/Web/CSS/:checked. Malheureusement je ne comprends rien aux lignes de code de cet exemple, pensez-vous qu'il soit adaptable pour mon cas ?

3/ Avec mon code, quand on clique sur le bandeau de chaque question, la réponse s'ouvre et un "-" apparaît au début du bandeau. Ne pourrait-on pas utiliser cet élément différenciateur ? Avec CSS, n'est-il pas possible de faire comprendre à l'ordinateur qu'il faut fermer la réponse à chaque clique sur les bandeaux contenant un "-" ?

D'avance merci et bonne journée !
0
CSS n'engendre ni ne considère une action(c'est une liste descriptive, tout comme HTML on parle de langage descriptif) mais cible et permet d'indiquer des propriétés des éléments ainsi ciblé.

Voici la liste des sélecteurs CSS:
https://developer.mozilla.org/fr/docs/Web/CSS/S%C3%A9lecteurs_CSS

Qu'est ce qui vous semble compliqué avec JavaScript? L'explication que je donne consiste à changer des valeurs CSS lors du clic.
Un exemple plus concret:
(recopier dans un fichier avec l'extension ".html" ex: "testclick.html" )
<div id='testclick'>
Cliquer ce bloc va le masquer

</div>
<script>
document.getElementById('testclick').addEventListener('click',function(){
    this.setAttribute('style','display:none');
});

</script>
0