Accordéon JS

Fermé
Pither2201 Messages postés 8 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 11 janvier 2017 - 11 janv. 2017 à 10:11
Pither2201 Messages postés 8 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 11 janvier 2017 - 11 janv. 2017 à 11:19
Bonjour à tous ! :)

Alors voilà, je suis actuellement en stage en entreprise où je travail sur des mises à jours de sites web.

Je dois aujourd'hui modifier un accordéon. Actuellement, lorsque l'on arrive sur la page où se trouve l'accordéon, le 1er onglet est déroulé, et lorsque l'on clique sur un autre onglet, celui-ci se déroule, et le 1er se ré-enroule.
Ce que j'aimerais c'est que de base, les accordéons soient tous enroulés, mais aussi qu'on puisse les enrouler en cliquant dessus.
En gros, ils sont actuellement tous liés, c'est à dire qu'il y en a toujours un d'ouvert, mais j'aimerais qu'ils puissent être tous fermés.

Je pense avoir isolé le code qui correspond, c'est du JS, chose que je ne maîtrise pas ^^

Ici je comprends que c'est la fonction on-click, qui appelle la fonction accordionSwitch()



$( document ).ready( function () {

// Expand/Collapse accordion sections on click.
$( '.accordion-container' ).on( 'click keydown', '.accordion-section-title', function( e ) {
if ( e.type === 'keydown' && 13 !== e.which ) { // "return" key
return;
}

e.preventDefault(); // Keep this AFTER the key filter above

accordionSwitch( $( this ) );
});

});



Voici donc la fameuse fonction accordionSwitch(), qui je pense est la fonction qui nous intéresse ici.



function accordionSwitch ( el ) {
var section = el.closest( '.accordion-section' ),
sectionToggleControl = section.find( '[aria-expanded]' ).first(),
container = section.closest( '.accordion-container' ),
siblings = container.find( '.open' ),
siblingsToggleControl = siblings.find( '[aria-expanded]' ).first(),
content = section.find( '.accordion-section-content' );

// This section has no content and cannot be expanded.
if ( section.hasClass( 'cannot-expand' ) ) {
return;
}

// Add a class to the container to let us know something is happening inside.
// This helps in cases such as hiding a scrollbar while animations are executing.
container.addClass( 'opening' );

if ( section.hasClass( 'open' ) ) {
section.toggleClass( 'open' );
content.toggle( true ).slideToggle( 150 );
} else {
siblingsToggleControl.attr( 'aria-expanded', 'false' );
siblings.removeClass( 'open' );
siblings.find( '.accordion-section-content' ).show().slideUp( 150 );
content.toggle( false ).slideToggle( 150 );
section.toggleClass( 'open' );
}

// We have to wait for the animations to finish
setTimeout(function(){
container.removeClass( 'opening' );
}, 150);

// If there's an element with an aria-expanded attribute, assume it's a toggle control and toggle the aria-expanded value.
if ( sectionToggleControl ) {
sectionToggleControl.attr( 'aria-expanded', String( sectionToggleControl.attr( 'aria-expanded' ) === 'false' ) );
}
}




Voilà. Donc si l'un de vous aurait une idée, une piste, ou même la solution pour transformer ceci en cela, je suis preneur !

Merci d'avance ! ;)

2 réponses

Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 576
11 janv. 2017 à 10:17
Bonjour,

Tu aurai le lien du site s'il est hebergé en ligne ?
Je travaille mieux avec le code source complet.
0
Pither2201 Messages postés 8 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 11 janvier 2017
11 janv. 2017 à 10:24
Oui bien sûr:

http://game-sputnik.com/sensiblegambler/

Les entêtes de l'accordéon sont les noms des continents comme tu peux le voir.
0
Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 576
Modifié par Nexii le 11/01/2017 à 10:33
Super, peux-tu me préciser chaque fichier ou tu as prélevé les codes sources cités plus haut ?
Pour ton information, voici le script utilisé pour l'accordéon, tu pourra y trouver la documentation officielle :
https://jqueryui.com/accordion/
0
Pither2201 Messages postés 8 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 11 janvier 2017 > Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017
11 janv. 2017 à 10:36
Voici le ficher dans lequel j'ai trouvé le code:

http://game-sputnik.com/sensiblegambler/wp-admin/js/accordion.js

Merci, je vais jeter un coup d'oeil.
0
Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 576
11 janv. 2017 à 10:56
Etonnant, le script accordéon est présent dans le code source mais il n'est pas utilisé. Au vu du script que tu me montre, ce sont des fonctions personnelles qui ne proviennent pas du script car à aucun moment celui de jQuery UI n'est déclenché (via sa méthode .accordion() ).

Moi j'aurais simplement remplacé celle existante afin d'utiliser le script jQuery UI.
Tout est dans la doc : de la création du container en HTML, jusqu'a son déclenchement par JavaScript.
Dans ton cas il faudra ajouter plusieurs options.
1) Pour éviter d'avoir un onglet ouvert par défaut, mais aussi d'activer la fonction d'enroulement lors d'un clic sur le header:
$(function() {
        $( ".myaccordion" ).accordion({ active: false, collapsible: true });
0
Pither2201 Messages postés 8 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 11 janvier 2017 > Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017
11 janv. 2017 à 11:01
Merci, même si je comprends pas tout :$

Concrètement, le code que j'ai trouvé interagi avec l'accordéon de la page ou pas ??
Si je me sers de ton code directement ici, cela aura un impacte ??
0
Nexii Messages postés 338 Date d'inscription jeudi 13 mars 2014 Statut Membre Dernière intervention 14 mars 2017 576
Modifié par Nexii le 11/01/2017 à 11:11
Non ça ne fera rien.
Tu dois aller modifier l'HTML pour qu'il réponde aux règles du script jQuery
https://api.jqueryui.com/accordion/
Au début, il est expliqué que la structure doit-être comme suit :
<!-- Un div avec l'id "accordion" englobant tes sections -->
<div id="accordion">
 <!-- Les sections avec balises h3 -->
  <h3>Section 1</h3>
<!-- Puis un DIV -->
  <div>
<!-- A partir de la tu mets ce que tu veux-->
    <p>
    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
    ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
    amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
    odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
    </p>
  </div>
  <h3>Section 2</h3>
  <div>
    <p>
    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
    purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
    velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
    suscipit faucibus urna.
    </p>
  </div>
<!-- etc......... -->


Ensuite, tu créer une balise "script" à la toute fin de ton code html, avant le
</body>
et tu y met la fonction suivante :
$(function() {
    $( ".myaccordion" ).accordion({ 
        active: false, 
        collapsible: true 
    });

La condition ici, c'est d'appeler la classe du DIV dans la méthode (.accordion). Tu peux donc personnaliser cela à ta guise.
En outre, il te faudra désactiver l'ancienne fonction précédemment développé : supprimer le script (du code juste, tu supprime pas le fichier mais la ligne appelant la source dans le HTML).
0