Exactement comment créer un accordéon jQuery personnalisé

Les accordéons peuvent être très utiles pour montrer beaucoup de sections de données différentes dans un petit espace. L'interface utilisateur de jQuery a une fonction intégrée dans Accordion, mais selon la construction de votre téléchargement pour l'interface utilisateur de jQuery, la taille des scripts Core jQuery UI et Accordion est respectivement de 25 ko et 16,6 ko. Aujourd'hui, je vais vous montrer comment créer un accordéon personnalisé plus "efficace en bande passante".

Téléchargez la pièce jointe à partir de la barre latérale pour jeter un coup d'oeil.

Cela semble beaucoup pour un seul accordéon. Surtout lorsque vous ajoutez le script jQuery normal, qui est 18 Ko minifié et gzippé. Donc, au lieu d’augmenter le temps de chargement de votre page avec les fonctionnalités superflues, pourquoi ne pas créer quelque chose à partir de rien?

Je pense également que l'écriture de choses à partir de zéro vous donne vraiment une bien meilleure compréhension de la manière d'utiliser jQuery efficacement, sans toujours utiliser le code de quelqu'un d'autre..

L’objectif de ce didacticiel est donc de vous montrer comment créer un accordéon à l’aide de la fonction jQuery UI, puis en créer un à l’aide d’un codage personnalisé. Prenons l'exemple de la barre latérale d'un blog.

Le balisage

Le balisage est très simple, juste un élément de liste pour chaque section de l'accordéon:

  • Entrées récentes
    • 19.01.2009 Titre de l'entrée récente
    • 15.01.2009 Titre de l'entrée récente
    • 13.01.2009 Titre de l'entrée récente
    • 01.11.2009 Titre de l'entrée récente
    • 01.10.2009 Titre de l'entrée récente
  • Entrées Populaires
    • 08.16.2008 Titre d'entrée populaire
    • 06.12.2008 Titre d'entrée populaire
    • 04.12.2008 Titre d'entrée populaire
    • 06.12.2007 Titre d'entrée populaire
    • 03.12.2007 Titre d'entrée populaire
  • Les catégories
    • Nom de catégorie 7
    • Nom de catégorie 4
    • Nom de catégorie 15
    • Nom de catégorie 29
    • Nom de catégorie 8
  • Archiver
    • Janvier 2009 4
    • Décembre 2008 14
    • Novembre 2008 12
    • Octobre 2008 8
    • Septembre 2008 18

Le CSS

Nous allons ajouter un style très basique pour que l’accordéon ait l’air plus présentable. Comme ce tutoriel est principalement axé sur le JavaScript, je vais rapidement passer en revue ce que nous faisons avec le CSS..

Puisque je pars toujours de ma propre feuille de style de framework, je vais l’utiliser ici aussi:

/ ***** Réinitialiser ***** / html, corps, div, h1, h3, h3, h4, h5, h6, ul, ol, dl, li, dt, jj, p, blockquote, pre, form , fieldset, table, th, td margin: 0; rembourrage: 0;  / ***** Définitions de base ***** / body background: #fff; couleur: # 333; police: 14px / 20px Georgia, "Times New Roman", Times, serif;  h1 font-size: 24px; hauteur de ligne: 30px; marge inférieure: 18px;  a  a: visité  a: hover text-decoration: none;  img border: none;  p, ul, ol, dl, table margin-bottom: 18px;  ul, ol, jj marge gauche: 36px;  / ***** Classes personnalisées ***** / .clearing clear: both;  .clearfix overflow: hidden;  .last margin-bottom: 0;  .screenReader left: -9999px; position: absolue; en haut: -9999px; 

Ensuite, je vais supprimer la marge et le style de liste de la liste non ordonnée de l'accordéon et des listes de descendants et ajouter une bordure inférieure à la liste non ordonnée de l'accordéon (vous verrez pourquoi il ne s'agit que d'une bordure prochaine).

ul # accordéon, ul # accordion ul list-style: none; marge: 0;  ul # accordion border-bottom: 1px solid # 000E2E; 

Ensuite, je vais ajouter une bordure autour de chaque section d'accordéon, à l'exception de la bordure inférieure. De plus, je vais supprimer la bordure des éléments de la liste qui sont des descendants de la section accordéon et n’ajouter qu’une bordure inférieure. S'il s'agit du dernier enfant d'une liste non ordonnée par descendant, je vais supprimer la bordure inférieure. Oui, je sais que cela ne fonctionnera pas dans IE, mais ce n'est pas essentiel.

ul # accordion li border: 1px solid # 000E2E; bordure inférieure: aucune;  ul # accordion ul li border: none; border-bottom: 1px solide # C2C8D1; couleur: # 999; rembourrage: 5px 10px;  ul # accordion ul li: dernier-enfant border-bottom: none; 

Ensuite, je vais appeler le lien principal qui va basculer l'accordéon pour qu'il se démarque davantage:

ul # accordion a.heading background: # F4FFF9; couleur: # 999; bloc de visualisation; taille de police: 18px; hauteur de ligne: 18px; rembourrage: 10px 5px; texte-décoration: aucun;  ul # accordion a.heading: hover background: # 00B9D2; couleur: #fff; 

Enfin, je vais juste faire un peu de style sur les sous-listes de l’accordéon pour qu’elles soient un peu plus jolies:

ul # accordéon li ul a border-bottom: 1px solid # 00B9D2; couleur: # 025185; texte-décoration: aucun;  ul # accordion li ul a: hover border-bottom: none;  ul # accordion li ul .date padding-right: 10px;  ul # accordion li ul .count padding-left: 10px; 

Regardons où nous en sommes jusqu'à présent. C’est aussi ce à quoi l’accordéon ressemblera lorsque nous utiliserons l’accordéon jQuery UI et que JavaScript est désactivé.

Il semble que nous devrons ajouter des CSS supplémentaires pour IE6 afin de prendre en compte le bogue d'espacement:

ul # accordion float: left; largeur: 300px;  ul # accordion li float: left; largeur: 298px;  ul # accordion a.heading width: 298px;  ul # accordion ul li float: none; largeur: auto; 

L'accordéon jQuery UI

Maintenant que tout le balisage et le style sont terminés, il est très simple d'implémenter l'accordéon jQuery UI. Tout d'abord, nous devons simplement inclure jQuery et notre Script d'interface utilisateur jQuery.

 

Ensuite, nous devons initialiser l’accordéon sur notre liste non ordonnée avec un identifiant d’accordéon:

Et voilà, un accordéon de travail.

Pour faire ressortir davantage l'élément accordéon actuellement ouvert, j'ai ajouté un peu de CSS supplémentaire:

ul # accordion li.ui-accordéion-selected a.heading background: # 025185; couleur: #fff; 

Le nom de classe de ui-accordéon sélectionné est automatiquement ajouté à la section d'accordéon actuelle.

Notre accordéon jQuery personnalisé

Maintenant que nous avons créé l'accordéon jQuery UI, il est temps de créer le nôtre. Une chose que je n’aime pas forcément dans la version de jQuery UI est la façon dont elle s’affiche lorsque JavaScript est désactivé. Je préférerais l'avoir pour qu'une seule section soit ouverte à la fois.

Pour ce faire, je vais ajouter un peu de PHP. Vous pouvez facilement accomplir cela avec n’importe quel langage de programmation..

L’idée derrière cela est que nous allons passer une variable dans l’URL, et si la variable coïncide avec chaque section, nous assignons une classe de actuel à cette section. Il est beaucoup plus facile de voir cela dans le code, alors regardez:

 
    > Entrées récentes
    • 19.01.2009 Titre de l'entrée récente
    • 15.01.2009 Titre de l'entrée récente
    • 13.01.2009 Titre de l'entrée récente
    • 01.11.2009 Titre de l'entrée récente
    • 01.10.2009 Titre de l'entrée récente
    > Entrées populaires
    • 08.16.2008 Titre d'entrée populaire
    • 06.12.2008 Titre d'entrée populaire
    • 04.12.2008 Titre d'entrée populaire
    • 06.12.2007 Titre d'entrée populaire
    • 03.12.2007 Titre d'entrée populaire
    > Catégories
    • Nom de catégorie 7
    • Nom de catégorie 4
    • Nom de catégorie 15
    • Nom de catégorie 29
    • Nom de catégorie 8
    > Archive
    • Janvier 2009 4
    • Décembre 2008 14
    • Novembre 2008 12
    • Octobre 2008 8
    • Septembre 2008 18

Vous devriez également remarquer que j'ai changé l'URL de chacun des liens, basculer les sections d'accordéon pour correspondre à l'instruction if de la section. Donc, fondamentalement, si JavaScript est désactivé, vous serez redirigé vers une nouvelle page avec cette section ouverte.

Nous devons également supprimer le script d'accordéon jQuery UI et inclure notre propre:

CSS supplémentaire

Avec cette légère modification du balisage, nous devons ajouter un peu de CSS supplémentaire. Nous n'avons plus le ui-accordéon sélectionné la classe étant assignée aux éléments de la liste; c'est maintenant une classe de actuel. Nous devons également tenir compte de ce changement de nom de classe dans l'état activé pour l'accordéon:

ul # accordion li.current a.heading background: # 025185; couleur: #fff; 

Nous voulons donc masquer toutes les listes non ordonnées, à moins qu’elles ne descendent de l’élément de liste avec une classe de actuel. J'ai également ajouté un identifiant de corps à cette page de démonstration afin que nous puissions utiliser la même feuille de style pour les deux exemples..

body # customAccordion ul # accordion li ul display: none;  body # customAccordion ul # accordion li.current ul display: block; 

Le JavaScript personnalisé

Tout d'abord, nous voulons exécuter le script une fois le document chargé. Commençons par ceci:

$ (document) .ready (fonction () );

Nous voulons que l'accordéon fonctionne lorsque les liens des en-têtes sont cliqués, mais nous ne voulons pas quitter la page, nous devons donc nous assurer que retourne faux:

$ (document) .ready (fonction ()  $ ('ul # accordion a.heading'). click (function () return false;); );

Ensuite, je n'aime pas le contour qui apparaît autour des liens quand on clique dessus, alors je le règle sur aucun:

$ (document) .ready (fonction () $ ('ul # accordion a.heading'). clic (fonction ()  $ (this) .css ('contour', 'aucun'); retourne faux; ); );

Il y a deux cas différents pour ce script.

  1. Le lien sur lequel vous cliquez est la section déjà ouverte.
  2. Le lien sur lequel vous cliquez est ne pas la section qui est déjà ouverte.

Le premier cas

Ce n'est pas une fonctionnalité de la version de jQuery UI, mais je pense qu'un utilisateur devrait pouvoir fermer toutes les sections s'il le souhaite. Si le lien sur lequel vous avez cliqué a un parent qui a une classe de courant, nous voulons faire défiler la liste non ordonnée vers le haut et supprimer la classe de courant..

$ (document) .ready (fonction () $ ('ul # accordion a.heading'). clic (fonction () $ (this) .css ('contour', 'aucun'); if ($ (this) .parent (). hasClass ('current')) $ (this) .siblings ('ul'). slideUp ('slow', function () $ (this) .parent (). removeClass ('current'););  retourne faux; ); );

Une autre chose qui me gêne au sujet de la version de jQuery UI, est que vous pouvez faire défiler l'accordéon de manière à ce qu'il soit presque invisible, cliquez dessus, puis l'interaction se produit au-dessus de ce que vous pouvez voir. Faites défiler vers le bas sur l'exemple de l'interface utilisateur jQuery et essayez-le.

Ma solution consiste donc à utiliser ce merveilleux petit script appelé jQuery ScrollTo. C'est un très petit script qui ajoute un défilement de page lisse.

Ajoutons cela à la tête du document avant notre script accordéon:

  

Lorsque la section défile vers le haut, je souhaite faire défiler la fenêtre vers le haut de l'accordéon:

$ (document) .ready (fonction () $ ('ul # accordion a.heading'). clic (fonction () $ (this) .css ('outline', 'none'); if ($ (this ) .parent (). hasClass ('current')) $ (this) .siblings ('ul'). slideUp ('slow', function () $ (this) .parent (). removeClass ('current' ) $ .scrollTo ('# accordéon', 1000); );  return false; ); );

Le premier paramètre de la fonction est la cible à laquelle faire défiler, et le second est le temps qu'il faut.

Le deuxième cas

Ce cas se produit lorsque la section sur laquelle vous cliquez n'est pas actuellement ouverte. Donc, la première chose à faire est de cacher la section actuellement ouverte et de supprimer la classe de courant (cette partie du code est très similaire au premier cas):

$ (document) .ready (fonction () $ ('ul # accordion a.heading'). clic (fonction () $ (this) .css ('outline', 'none'); if ($ (this ) .parent (). hasClass ('current')) $ (this) .siblings ('ul'). slideUp ('slow', function () $ (this) .parent (). removeClass ('current' ); $ .scrollTo ('# accordion', 1000);); else  $ ('ul # accordion li.current ul'). slideUp ('slow', function () $ (this) .parent (). removeClass ('current'););  return false; ); );

Ensuite, nous voulons ouvrir la section sur laquelle nous avons cliqué et ajouter la classe de current:

$ (document) .ready (fonction () $ ('ul # accordion a.heading'). clic (fonction () $ (this) .css ('outline', 'none'); if ($ (this ) .parent (). hasClass ('current')) $ (this) .siblings ('ul'). slideUp ('slow', function () $ (this) .parent (). removeClass ('current' ); $ .scrollTo ('# accordion', 1000);); autre $ ('ul # accordion li.current ul'). slideUp ('slow', function () $ (this) .parent ( ) .removeClass ('current');); $ (this) .siblings ('ul'). slideToggle ('slow', function () $ (this) .parent (). toggleClass ('current'););  return false; ); );

Enfin, faisons défiler la fenêtre vers le haut de l'accordéon, comme dans le premier cas:

$ (document) .ready (fonction () $ ('ul # accordion a.heading'). clic (fonction () $ (this) .css ('outline', 'none'); if ($ (this ) .parent (). hasClass ('current')) $ (this) .siblings ('ul'). slideUp ('slow', function () $ (this) .parent (). removeClass ('current' ); $ .scrollTo ('# accordion', 1000);); autre $ ('ul # accordion li.current ul'). slideUp ('slow', function () $ (this) .parent ( ) .removeClass ('current');); $ (this) .siblings ('ul'). slideToggle ('slow', function () $ (this) .parent (). toggleClass ('current'); ); $ .scrollTo ('# accordéon', 1000);  return false; ); );

C'est tout. Sérieusement. Avez-vous pensé que créer un accordéon pourrait être aussi simple?

Conclusion

Maintenant, comparons les tailles de fichier JavaScript en utilisant l’onglet Net de Firebug.

Dans l'exemple de l'interface utilisateur jQuery, le nombre total de fichiers JavaScript sur 73 kb. Dans notre exemple personnalisé, avec le défilement supplémentaire de la fenêtre, le nombre de fichiers JavaScript s’élève à environ 57 kb. Maintenant, cela peut sembler peu, mais imaginez si vous avez un site très fréquenté. Cela pourrait être beaucoup d'octets sauvés. De plus, vous en savez plus sur jQuery.

Maintenant, sors et écris ton propre jQuery.