Une introduction au développement de diaporamas en JavaScript. Création d'un curseur de photo en utilisant du javascript pur Préparation des images pour le curseur

Si les diapositives ne contiennent que des images, vous pouvez légèrement modifier la structure :

Précédent Suivant

N'oubliez pas d'ajouter une valeur significative à l'attribut alt.

Pour utiliser les liens de page, vous pouvez procéder comme suit :

... ... ... 1 2 3

Précédent Suivant 1 2 3

Notez l'utilisation des attributs « données » : certains diaporamas peuvent insérer des images comme arrière-plan, et ces attributs seront utilisés dans le script comme emplacements pour connecter l'arrière-plan et la diapositive.

Utilisation de listes Une approche sémantiquement correcte consisterait à utiliser les éléments de liste sous forme de diapositives. Dans ce cas, la structure sera la suivante :

Si l'ordre des slides est bien défini (par exemple dans une présentation), vous pouvez utiliser des listes numérotées

CSS Commençons par la structure suivante :

Précédent Suivant

Parce que Étant donné que le diaporama s'exécutera de droite à gauche, le conteneur extérieur aura une taille fixe et celui intérieur sera plus large puisqu'il contient toutes les diapositives. La première diapositive sera visible. Ceci est défini via un débordement :

Slider (largeur : 1 024 px ; débordement : caché ; ) .slider-wrapper ( largeur : 9999px ; hauteur : 683px ; position : relative ; transition : gauche 500 ms linéaire ; )

Les styles d’emballage intérieur incluent :

Grande largeur
- hauteur fixe, hauteur de coulissement maximale
- position : relative, qui permettra de créer un mouvement de diapositive
- Transition CSS vers la gauche, ce qui rendra le mouvement fluide. Par souci de simplicité, nous n'avons pas inclus tous les préfixes. Vous pouvez également utiliser des transformations CSS (avec traduction) pour cela.

Les diapositives ont un attribut float pour les aligner. Ils sont positionnés relativement afin que vous puissiez obtenir leur décalage gauche dans JS. Nous l'utilisons pour créer un effet de glissement.

Diapositive ( float : gauche ; position : relative ; largeur : 1024px ; hauteur : 683px ; )

Bien que nous ayons défini une certaine largeur, dans le script, nous pouvons la modifier en multipliant le nombre de diapositives par la largeur de la diapositive. Vous ne savez jamais de quelle largeur vous pourriez avoir besoin.

La navigation s'effectue via les boutons « Précédent » et « Suivant ». Nous réinitialisons leurs styles par défaut et attribuons les nôtres :

Slider-nav (hauteur : 40 px ; largeur : 100 % ; marge supérieure : 1,5 em ; ) .slider-nav bouton ( bordure : aucune ; affichage : bloc ; largeur : 40 px ; hauteur : 40 px ; curseur : pointeur ; retrait du texte : -9999em ; couleur d'arrière-plan : transparent ; répétition d'arrière-plan : pas de répétition ; ) .bouton de navigation slider.slider-previous ( float : gauche ; image d'arrière-plan : url (previous.png); ) bouton .slider-nav .slider-next ( float: right; background-image: url(next.png); )

Lorsque vous utilisez des liens de page au lieu de boutons, vous pouvez créer les styles suivants :

Slider-nav (alignement du texte : centre ; marge en haut : 1,5em ; ) .slider-nav a (affichage : bloc en ligne ; décoration du texte : aucun ; bordure : 1px solide #ddd ; couleur : #444 ; largeur : 2em ; hauteur : 2em ; hauteur de ligne : 2 ; alignement du texte : centre ; ) .slider-nav a.current ( couleur de la bordure : #000 ; couleur : #000 ; poids de la police : gras ; )

Ces classes seront attribuées dynamiquement à partir du script.

Cette approche est adaptée à l'effet de glissement. Si nous voulons obtenir l'effet de fondu, nous devons modifier les styles, car float ajoute un remplissage horizontal entre les diapositives. Autrement dit, nous n'avons pas besoin de diapositives sur une seule ligne - nous avons besoin d'un « pack » de diapositives :

Slider ( largeur : 1024 px ; marge : 2em auto ; ) .slider-wrapper ( largeur : 100 % ; hauteur : 683 px ; position : relative ; /* Crée un contexte pour le positionnement absolu */ ) .slide ( position : absolue ; /* Positionnement absolu de toutes les slides */ largeur : 100% ; hauteur : 100% ; opacité : 0 ; /* Toutes les slides sont masquées */ transition : opacité 500ms linéaire ; ) /* Initialement seule la première est visible */ .slider- emballage >
Nous utilisons la propriété opacity pour masquer les diapositives, car les lecteurs d'écran ignoreront le contenu des éléments qui ont display: none (voir CSS en action : contenu invisible réservé aux utilisateurs de lecteurs d'écran).

Grâce au positionnement contextuel CSS, nous avons créé une « pile » de slides, la dernière slide du source étant devant les autres. Mais ce n'est pas ce dont nous avons besoin. Pour conserver l'ordre des diapositives, nous devons masquer toutes les diapositives sauf la première.

JS utilise la transition CSS, modifiant la valeur de la propriété d'opacité de la diapositive actuelle et réinitialisant cette valeur à zéro pour toutes les autres.

Code JavaScript Diaporama sans pagination Le diaporama sans pagination fonctionne en cliquant sur les boutons « Suivant » et « Précédent ». Ils peuvent être considérés comme des opérateurs d’incrémentation et de décrémentation. Il y a toujours un pointeur (ou curseur) qui augmentera ou diminuera chaque fois que vous appuierez sur les boutons. Sa valeur initiale est 0 et le but est de sélectionner la diapositive actuelle de la même manière que les éléments du tableau sont sélectionnés.

Ainsi, lorsque nous cliquons sur Suivant une première fois, le pointeur augmente de 1 et nous obtenons une deuxième diapositive. En cliquant sur Précédent, nous réduisons le pointeur et obtenons la première diapositive. Etc.

Avec le pointeur, nous utilisons la méthode .eq() de jQuery pour obtenir la diapositive actuelle. En JS pur, cela ressemble à ceci :

Fonction Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.slides = this.el.querySelectorAll(".slide") ; //... ), _slideTo: function(pointer) ( var currentSlide = this.slides; //... ) );

N'oubliez pas : NodeList utilise les index comme un tableau. Une autre façon de sélectionner la diapositive actuelle consiste à utiliser les sélecteurs CSS3 :

Slideshow.prototype = ( init: function() ( //... ), _slideTo: function(pointer) ( var n = pointeur + 1; var currentSlide = this.el.querySelector(".slide:nth-child(" + n + ")"); //... ) );

Le sélecteur CSS3:nth-child() compte les éléments à partir de 1, vous devez donc ajouter un 1 au pointeur. Après avoir sélectionné une diapositive, son conteneur parent doit être déplacé de droite à gauche. Dans jQuery, vous pouvez utiliser la méthode .animate() :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", slides : ".slide", //... vitesse : 500, assouplissement : "linéaire" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $(options.wrapper, element). animate(( gauche : - $currentSlide.position().left ), options.speed, options.easing); ); //... ); ))(jQuery);

Il n'y a pas de méthode .animate() dans le JS standard, nous utilisons donc des transitions CSS :

Slider-wrapper ( position : relative ; // transition requise : gauche 500 ms linéaire ; )

Vous pouvez maintenant modifier la propriété left de manière dynamique via l'objet style :

Fonction Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector(".slider-wrapper "); this.slides = this.el.querySelectorAll(".slide"); //... ), _slideTo: function(pointer) ( var currentSlide = this.slides; this.wrapper.style.left = "- " + currentSlide.offsetLeft + "px"; ) );

Nous devons maintenant créer un événement click pour chaque contrôle. Dans jQuery, vous pouvez utiliser la méthode .on() et dans JS pur, vous pouvez utiliser la méthode addEventListener().

Vous devez également vérifier si le pointeur a atteint les limites de la liste - 0 pour « Précédent » et le nombre total de diapositives pour « Suivant ». Dans chaque cas, vous devez masquer le bouton correspondant :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", slides : ".slide", précédent : ".slider-previous", suivant : ".slider-next", //... vitesse : 500, assouplissement : "linear" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element). eq(slide); $(options.wrapper, element).animate(( left: - $currentSlide.position().left ), options.speed, options.easing); ); return this.each(function() ( var $element = $(this), $previous = $(options.previous, $element), $next = $(options.next, $element), index = 0, total = $(options.slides).length; $next.on("clic", function() ( index++; $previous.show(); if(index == total - 1) ( index = total - 1; $next.hide(); ) slideTo(index, $element); )); $previous.on("click", function() ( index--; $next.show(); if(index == 0) ( index = 0; $previous.hide(); ) slideTo(index, $element); )); )); ); ))(jQuery);

Et en JS pur, cela ressemble à ceci :

Fonction Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector(".slider-wrapper "); this.slides = this.el.querySelectorAll(".slide"); this.previous = this.el.querySelector(".slider-previous"); this.next = this.el.querySelector(".slider -next"); this.index = 0; this.total = this.slides.length; this.actions(); ), _slideTo: function(pointer) ( var currentSlide = this.slides; this.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; ), actions : function() ( var self = this; self.next.addEventListener("click", function() ( self.index++; self.previous.style. display = "block"; if(self.index == self.total - 1) ( self.index = self.total - 1; self.next.style.display = "none"; ) self._slideTo(self.index ); ), false); self.previous.addEventListener("click", function() ( self.index--; self.next.style.display = "block"; if(self.index == 0) ( self .index = 0;self.previous.style.display = "aucun"; ) self._slideTo(self.index); ), FAUX); ) );

Diaporama paginé Dans ce type de diaporama, chaque lien est responsable d'une diapositive, il n'y a donc pas besoin d'index. Les animations ne changent pas, contrairement à la façon dont l'utilisateur se déplace dans les diapositives. Pour jQuery nous aurons le code suivant :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", slides : ".slide", navigation : ".slider-nav", vitesse : 500, assouplissement : "linéaire" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $(options.wrapper, element). animate(( left: - $currentSlide.position().left ), options.speed, options.easing); ); return this.each(function() ( var $element = $(this), $navigationLinks = $( "a", options.nav); $navigationLinks.on("click", function(e) ( e.preventDefault(); var $a = $(this), $slide = $($a.attr("href ")); slideTo($slide, $element); $a.addClass("current").siblings(). removeClass("current"); )); )); ))(jQuery);

Dans ce cas, chaque ancre correspond à l’ID d’une diapositive spécifique. En JS pur, vous pouvez l'utiliser à la fois ainsi que l'attribut data, qui stocke l'index numérique des diapositives dans la NodeList :

Fonction Slider(element) ( this.el = document.querySelector(element); this.init(); ) Slider.prototype = ( init: function() ( this.links = this.el.querySelectorAll("#slider-nav a"); this.wrapper = this.el.querySelector("#slider-wrapper"); this.navigate(); ), naviguer : function() ( for (var i = 0; i< this.links.length; ++i) { var link = this.links[i]; this.slide(link); } }, slide: function(element) { var self = this; element.addEventListener("click", function(e) { e.preventDefault(); var a = this; self.setCurrentLink(a); var index = parseInt(a.getAttribute("data-slide"), 10) + 1; var currentSlide = self.el.querySelector(".slide:nth-child(" + index + ")"); self.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; }, false); }, setCurrentLink: function(link) { var parent = link.parentNode; var a = parent.querySelectorAll("a"); link.className = "current"; for (var j = 0; j < a.length; ++j) { var cur = a[j]; if (cur !== link) { cur.className = ""; } } } };

Depuis IE10, vous pouvez gérer les classes via classList :

Link.classList.add("actuel");

Et avec IE11, les attributs de données peuvent être obtenus via la propriété dataset :

Var index = parseInt(a.dataset.slide, 10) + 1;

Diaporamas paginés avec contrôles Ces diaporamas présentent une certaine complexité dans le code : vous devez combiner l'utilisation de hachages d'index et de page. Autrement dit, la diapositive actuelle doit être sélectionnée en fonction à la fois de la position du pointeur et de la diapositive sélectionnée via des liens.

Cela peut être synchronisé via l'index numérique de chaque lien dans le DOM. Un lien - une diapositive, donc leurs index seront 0, 1, 2, etc.

En jQuery, le code ressemblera à ceci :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( //... pagination : ".slider-pagination", //... ), options); $. fn.slideshow.index = 0; renvoie this.each(function() ( var $element = $(this), //... $pagination = $(options.pagination, $element), $paginationLinks = $(" a", $pagination), //... $paginationLinks.on("click", function(e) ( e.preventDefault(); var $a = $(this), elemIndex = $a.index(); // Index numérique DOM $.fn.slideshow.index = elemIndex; if($.fn.slideshow.index > 0) ( $previous.show(); ) else ( $previous.hide(); ) if($. fn.slideshow.index == total - 1) ( $.fn.slideshow.index = total - 1; $next.hide(); ) else ( $next.show(); ) slideTo($.fn.slideshow. index, $element); $a.addClass("current"). siblings().removeClass("current"); )); )); ); //... ))(jQuery);

Vous pouvez immédiatement voir que la visibilité du curseur a changé - l'index est désormais déclaré comme propriété de l'objet diaporama. De cette façon, nous évitons les problèmes de portée qui peuvent être créés par les rappels dans jQuery. Le curseur est désormais disponible partout, même en dehors de l'espace de noms du plugin, puisqu'il est déclaré comme propriété publique de l'objet slideshow.

La méthode .index() donne l'index numérique de chaque lien.

Il n'existe pas de méthode de ce type en JS pur, il est donc plus facile d'utiliser les attributs de données :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector( ".slider-wrapper"); this.slides = this.el.querySelectorAll(".slide"); this.previous = this.el.querySelector(".slider-previous"); this.next = this.el. querySelector(".slider-next"); this.navigationLinks = this.el.querySelectorAll(".slider-pagination a"); this.index = 0; this.total = this.slides.length; this.setup() ; this.actions(); ), //... configuration : function() ( var self = this; //... for(var k = 0; k< self.navigationLinks.length; ++k) { var pagLink = self.navigationLinks[k]; pagLink.setAttribute("data-index", k); // Или pagLink.dataset.index = k; } }, //... }; })();

Nous pouvons maintenant connecter nos procédures avec des références et utiliser les attributs de données que nous venons de créer :

Actions : function() ( var self = this; //... for(var i = 0; i< self.navigationLinks.length; ++i) { var a = self.navigationLinks[i]; a.addEventListener("click", function(e) { e.preventDefault(); var n = parseInt(this.getAttribute("data-index"), 10); // Или var n = parseInt(this.dataset.index, 10); self.index = n; if(self.index == 0) { self.index = 0; self.previous.style.display = "none"; } if(self.index >0) ( self.previous.style.display = "block"; ) if(self.index == self.total - 1) ( self.index = self.total - 1; self.next.style.display = "aucun "; ) else ( self.next.style.display = "block"; ) self._slideTo(self.index); self._highlightCurrentLink(this); ), FAUX); ) )

Comprendre les dimensions Revenons à la règle CSS suivante :

Slider-wrapper (largeur : 9999 px ; hauteur : 683 px ; position : relative ; transition : gauche 500 ms linéaire ; )

Si nous avons beaucoup de diapositives, 9999 ne suffiront peut-être pas. Vous devez ajuster la taille des diapositives à la volée en fonction de la largeur de chaque diapositive et du nombre de diapositives.

En jQuery c'est simple :

// Le diaporama pleine largeur renvoie this.each(function() ( var $element = $(this), total = $(options.slides).length; //... $(options.slides, $element ).width ($(window).width()); $(options.wrapper, $element).width($(window).width() * total); //... ));

Prenez la largeur de la fenêtre et définissez la largeur de chaque diapositive. La largeur totale du wrapper interne est obtenue en multipliant la largeur de la fenêtre et le nombre de diapositives.

// Le diaporama à largeur fixe renvoie this.each(function() ( var $element = $(this), total = $(options.slides).length; //... $(options.wrapper, $element) .width ($(options.slides).eq(0).width() * total); //... ));

Ici, la largeur initiale est définie sur la largeur de chaque diapositive. Il vous suffit de définir la largeur totale du wrapper.

Le conteneur intérieur est désormais suffisamment large. En JS pur, cela se fait à peu près de la même manière :

// Diaporama pleine largeur Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector(".slider-wrapper"); this.slides = this.el.querySelectorAll(".slide "); //... this.total = this.slides.length; this.setDimensions(); this.actions(); ), setDimensions: function() ( var self = this; // Largeur de la fenêtre var winWidth = window .innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var wrapperWidth = winWidth * self.total; for(var i = 0; i< self.total; ++i) { var slide = self.slides[i]; slide.style.width = winWidth + "px"; } self.wrapper.style.width = wrapperWidth + "px"; }, //... }; // Слайд-шоу фиксированной ширины Slideshow.prototype = { init: function() { this.wrapper = this.el.querySelector(".slider-wrapper"); this.slides = this.el.querySelectorAll(".slide"); //... this.total = this.slides.length; this.setDimensions(); this.actions(); }, setDimensions: function() { var self = this; var slideWidth = self.slides.offsetWidth; // Single slide"s width var wrapperWidth = slideWidth * self.total; self.wrapper.style.width = wrapperWidth + "px"; }, //... };

Effets de fondu Les effets de fondu sont souvent utilisés dans les diaporamas. La diapositive actuelle disparaît et la suivante apparaît. jQuery a les méthodes fadeIn() et fadeOut() qui fonctionnent à la fois avec les propriétés d'opacité et d'affichage, de sorte que l'élément est supprimé de la page une fois l'animation terminée (affichage : aucun).

En JS pur, il est préférable de travailler avec la propriété opacity et d'utiliser la pile de positionnement CSS. Puis dans un premier temps la slide sera visible (opacité : 1), et les autres seront masquées (opacité : 0).

L'ensemble de styles suivant illustre cette méthode :

Slider ( largeur : 100 % ; débordement : caché ; position : relative ; hauteur : 400 px ; ) .slider-wrapper ( largeur : 100 % ; hauteur : 100 % ; position : relative ; ) .slide ( position : absolue ; largeur : 100 % ; hauteur : 100 % ; opacité : 0 ; ) .slider-wrapper > .slide:first-child ( opacité : 1 ; )

En JS pur, vous devez enregistrer la transition CSS de chaque diapositive :

Diapositive (flottant : gauche ; position : absolue ; largeur : 100 % ; hauteur : 100 % ; opacité : 0 ; transition : opacité 500 ms linéaire ; )

Avec jQuery, pour utiliser les méthodes fadeIn() et fadeOut(), vous devez modifier l'opacité et l'affichage :

Diapositive ( float : gauche ; position : absolue ; largeur : 100 % ; hauteur : 100 % ; affichage : aucun ; ) .slider-wrapper > .slide:first-child ( affichage : bloc ; )

En jQuery, le code est le suivant :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", précédent : ".slider-previous", suivant : ".slider-next" , diapositives : ".slide", navigation : ".slider-nav", vitesse : 500, accélération : "linéaire" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides , element).eq(slide); $currentSlide.animate(( opacity: 1 ), options.speed, options.easing). siblings(options.slides). css("opacity", 0); ); //. .. ); ))(jQuery);

Lors de l'animation de l'opacité, vous devez également modifier les valeurs de cette propriété pour les diapositives restantes.

En JavaScript, ce serait :

Slideshow.prototype = ( //... _slideTo: function(slide) ( var currentSlide = this.slides; currentSlide.style.opacity = 1; for(var i = 0; i< this.slides.length; i++) { var slide = this.slides[i]; if(slide !== currentSlide) { slide.style.opacity = 0; } } }, //... };

Éléments multimédia : vidéo Nous pouvons inclure de la vidéo dans un diaporama. Voici un exemple de diaporama vidéo de Vimeo :

Les vidéos sont incluses via iframe. Il s'agit du même bloc en ligne remplaçable que sur la photo. Remplaçable – parce que le contenu provient d’une source externe.

Pour créer un diaporama pleine page, vous devez modifier les styles comme suit :

Html, corps ( marge : 0 ; remplissage : 0 ; hauteur : 100 % ; hauteur min : 100 % ; /* La hauteur doit être la page entière */ ) .slider ( largeur : 100 % ; débordement : caché ; hauteur : 100 %; min-height: 100%; /* Hauteur et largeur au maximum */ position: absolue; /* Positionnement absolu */ ) .slider-wrapper ( width: 100%; height: 100%; /* Hauteur et largeur au maximum full */ position : relative; ) .slide ( float : gauche ; position : absolue ; largeur : 100 % ; hauteur : 100 % ; ) .slide iframe ( affichage : bloc ; /* Élément de bloc */ position : absolue ; /* Positionnement absolu */ largeur : 100 % ; hauteur : 100 % ; /* Pleine hauteur et largeur */ )

Diaporamas automatiques Les diaporamas automatiques utilisent des minuteries. Chaque fois que la fonction timer setInterval() est rappelée, le curseur sera incrémenté de 1 et ainsi la diapositive suivante sera sélectionnée.

Lorsque le curseur atteint le nombre maximum de diapositives, il doit être réinitialisé.

Les diaporamas interminables deviennent vite ennuyeux pour les utilisateurs. La meilleure pratique consiste à arrêter l'animation lorsque l'utilisateur la survole et à la reprendre lorsque le curseur s'éloigne.

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( diapositives : ".slide", vitesse : 3000, assouplissement : "linéaire" ), options); var timer = null; // Minuterie var index = 0; // Curseur var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $currentSlide.stop(true, true). animer (( opacity: 1 ), options.speed, options.easing). siblings(options.slides). css("opacity", 0); ); var autoSlide = function(element) ( // Initialiser le timer de séquence = setInterval ( function() ( index++; // Augmente le curseur de 1 if(index == $(options.slides, element).length) ( index = 0; // Réinitialise le curseur ) slideTo(index, element); ), options.speed ); // Le même intervalle que dans la méthode.animate() ); var startStop = function(element) ( element.hover(function() ( // Arrête l'animation clearInterval(timer); timer = null; ), function () ( autoSlide(element); // Reprendre l'animation )); ); return this.each(function() ( var $element = $(this); autoSlide($élément); startStop($élément); )); ); ))(jQuery);

Les deux paramètres de la méthode .stop() sont définis sur true, car nous n'avons pas besoin de créer une file d'attente d'animation à partir de notre séquence.

En JS pur, le code devient plus simple. Nous enregistrons une transition CSS pour chaque diapositive d'une certaine durée :

Diapositive ( transition : opacité 3s linéaire ; /* 3 secondes = 3000 millisecondes */ )

Et le code sera comme ceci :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.slides = this.el.querySelectorAll( ".slide"); this.index = 0; // Curseur this.timer = null; // Minuterie this.action(); this.stopStart(); ), _slideTo: function(slide) ( var currentSlide = this. diapositives; currentSlide.style.opacity = 1; for(var i = 0; i< this.slides.length; i++) { var slide = this.slides[i]; if(slide !== currentSlide) { slide.style.opacity = 0; } } }, action: function() { var self = this; // Initializes the sequence self.timer = setInterval(function() { self.index++; // Увеличим курсор на 1 if(self.index == self.slides.length) { self.index = 0; // Обнулим курсор } self._slideTo(self.index); }, 3000); // Тот же интервал, что и у перехода CSS }, stopStart: function() { var self = this; // Останавливаем анимацию self.el.addEventListener("mouseover", function() { clearInterval(self.timer); self.timer = null; }, false); // Возобновляем анимацию self.el.addEventListener("mouseout", function() { self.action(); }, false); } }; })();

Navigation au clavier Les diaporamas avancés offrent une navigation au clavier, c'est-à-dire Faites défiler les diapositives en appuyant sur les touches. Pour nous, cela signifie simplement que nous devons enregistrer la gestion de l'événement keypress.

Pour ce faire, nous accéderons à la propriété keyCode de l'objet événement. Il renvoie le code de la touche enfoncée (liste des codes).

Les événements que nous avons attachés aux boutons « Précédent » et « Suivant » peuvent désormais être attachés aux touches « gauche » et « droite ». jQuery :

$("body").on("keydown", function(e) ( var code = e.keyCode; if(code == 39) ( // Flèche gauche $next.trigger("click"); ) if( code == 37) ( // Flèche droite $previous.trigger("click"); ) ));

En JS pur, au lieu de la simple méthode .trigger(), vous devrez utiliser dispatchEvent() :

Document.body.addEventListener("keydown", function(e) ( var code = e.keyCode; var evt = new MouseEvent("click"); // clic de souris if(code == 39) ( // Flèche gauche auto .next.dispatchEvent(evt); ) if(code == 37) ( // Flèche droite self.previous.dispatchEvent(evt); ) ), false);

Dans les projets décents, cela n'est pas habituel. Nous aurions besoin de définir la fonctionnalité qui permet le retournement dans une méthode publique, puis de l'appeler lorsque vous cliquez sur le bouton. Ensuite, si une autre partie du programme avait besoin d'implémenter cette fonctionnalité, il ne serait pas nécessaire d'émuler les événements DOM, mais pourrait simplement appeler cette méthode.

Rappels Ce serait bien de pouvoir attacher du code à n'importe quelle action de diaporama qui serait exécutée lorsque cette action est effectuée. C'est le but des fonctions de rappel : elles ne sont exécutées que lorsqu'une certaine action se produit. Disons que notre diaporama comporte des légendes et qu'elles sont masquées par défaut. Au moment de l'animation, nous devons afficher une légende pour la diapositive actuelle ou même en faire quelque chose.

Dans jQuery, vous pouvez créer un rappel comme celui-ci :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( //... callback: function() () ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $currentSlide. animate(( opacity: 1 ), options.speed, options.easing, // Rappel pour la diapositive actuelle options.callback($ currentSlide)). siblings(options.slides). css("opacity", 0); ); //... ); ))(jQuery);

Dans ce cas, le rappel est une fonction de .animate() qui prend la diapositive actuelle comme argument. Voici comment vous pouvez l'utiliser :

$(function() ( $("#main-slider").slideshow(( callback: function(slide) ( var $wrapper = slide.parent(); // Affiche la légende actuelle et masque les autres $wrapper.find (" .slide-caption").hide(); slide.find(".slide-caption").show("lent"); ) )); ));

En JS pur :

(function() ( function Slideshow(element, callback) ( this.callback = callback || function()); // Notre rappel this.el = document.querySelector(element); this.init(); ) Slideshow. prototype = ( init: function() ( //... this.slides = this.el.querySelectorAll(".slide"); //... //... ), _slideTo: function(slide) ( var self = ceci ; var currentSlide = self.slides ; currentSlide.style.opacity = 1 ; for(var i = 0 ; i< self.slides.length; i++) { var slide = self.slides[i]; if(slide !== currentSlide) { slide.style.opacity = 0; } } setTimeout(self.callback(currentSlide), 500); // Вызывает функцию по окончанию перехода } }; // })();

La fonction de rappel est définie comme deuxième paramètre du constructeur. Vous pouvez l'utiliser comme ceci :

Document.addEventListener("DOMContentLoaded", function() ( var slider = new Slideshow("#main-slider", function(slide) ( var wrapper = slide.parentNode; // Affiche la légende actuelle et masque les autres var allSlides = wrapper.querySelectorAll(".slide"); var caption = slide.querySelector(".slide-caption"); caption.classList.add("visible"); for(var i = 0; i< allSlides.length; ++i) { var sld = allSlides[i]; var cpt = sld.querySelector(".slide-caption"); if(sld !== slide) { cpt.classList.remove("visible"); } } }); });

API externes Jusqu'à présent, notre scénario de travail est simple : toutes les diapositives sont déjà dans le document. Si nous devons y insérer des données de l'extérieur (YouTube, Vimeo, Flickr), nous devons remplir les diapositives à la volée au fur et à mesure que nous recevons du contenu externe.

Étant donné que la réponse du serveur tiers peut ne pas être immédiate, vous devez insérer une animation de chargement pour montrer que le processus est en cours :

Précédent Suivant

Il peut s'agir d'un gif ou d'une pure animation CSS :

#spinner ( border-rayon : 50 % ; bordure : 2px solide #000 ; hauteur : 80px ; largeur : 80px ; position : absolue ; haut : 50 % ; gauche : 50 % ; marge : -40px 0 0 -40px ; ) # spinner:after ( contenu : " " ; position : absolue ; couleur d'arrière-plan : #000 ; haut : 2px ; gauche : 48 % ; hauteur : 38px ; largeur : 2px ; rayon-bordure : 5px ; -webkit-transform-origin : 50 % 97 % ; origine de transformation : 50 % 97 % ; -webkit-animation : angulaire 1s linéaire infini ; animation : angulaire 1s linéaire infini ; ) @-webkit-keyframes angulaire ( 0%(-webkit-transform:rotate(0deg );) 100%(-webkit-transform:rotate(360deg);) ) @keyframes angulaire ( 0%(transform:rotate(0deg);) 100%(transform:rotate(360deg);) ) #spinner:avant ( contenu : "" ; position : absolue ; couleur d'arrière-plan : #000 ; haut : 6 px ; gauche : 48 % ; hauteur : 35 px ; largeur : 2 px ; rayon de bordure : 5 px ; -webkit-transform-origin : 50 % 94 % ; transformation-origine : 50 % 94 % ; -webkit-animation : ptangulaire 6s linéaire infini ; animation : ptangulaire 6s linéaire infini ; ) @-webkit-keyframes ptangulaire ( 0%(-webkit-transform:rotate(0deg);) 100 %(-webkit-transform:rotate(360deg);) ) @keyframes ptangulaire ( 0%(transform:rotate(0deg);) 100%(transform:rotate(360deg);) )

Les étapes seront les suivantes :
- demander des données à l'extérieur
- cacher le chargeur de démarrage
- analyser les données
- construire du HTML
- afficher un diaporama
- traiter les diaporamas

Disons que nous sélectionnons les vidéos YouTube les plus récentes d'un utilisateur. jQuery :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", //... chargeur : "#spinner", //... limite : 5, nom d'utilisateur : "learncodeacademy" ), options); //... var getVideos = function() ( // Récupérer des vidéos de YouTube var ytURL = "https://gdata.youtube.com/feeds/api/ videos?alt=json&author=" + options.username + "&max-results=" + options.limit; $.getJSON(ytURL, function(videos) ( // Récupère la vidéo en tant qu'objet JSON $(options.loader). hide( ); // Cacher le chargeur var inputs = videos.feed.entry; var html = ""; for(var i = 0; i< entries.length; ++i) { // Разбираем данные и строим строку HTML var entry = entries[i]; var idURL = entry.id.$t; var idVideo = idURL.replace("http://gdata.youtube.com/feeds/api/videos/", ""); var ytEmbedURL = "https://www.youtube.com/embed/" + idVideo + "?rel=0&showinfo=0&controls=0"; html += ""; html += ""; html += ""; } $(options.wrapper).html(html); // Выведем слайд-шоу }); }; return this.each(function() { //... getVideos(); // Обрабатываем слайд-шоу }); }; })(jQuery);

En JavaScript pur, il y a une étape supplémentaire : créer une méthode pour obtenir JSON :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector( ".slider-wrapper"); this.loader = this.el.querySelector("#spinner"); //... this.limit = 5; this.username = "learncodeacademy"; ), _getJSON : function(url , rappel) ( callback = callback || function() (); var request = new XMLHttpRequest(); request.open("GET", url, true); request.send(null); request.onreadystatechange = function() ( if (request.status == 200 && request.readyState == 4) ( var data = JSON.parse(request.responseText); // Rappel d'objet JSON(data); ) else ( console.log(request.status) ; ) ); ), //... ); ))();

Les procédures sont alors similaires :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector( ".slider-wrapper"); this.loader = this.el.querySelector("#spinner"); //... this.limit = 5; this.username = "learncodeacademy"; this.actions(); ) , _getJSON : function(url, callback) ( callback = callback || function(); var request = new XMLHttpRequest(); request.open("GET", url, true); request.send(null); request .onreadystatechange = function() ( if (request.status == 200 && request.readyState == 4) ( var data = JSON.parse(request.responseText); // Rappel d'objet JSON(data); ) else ( console. log( request.status); ) ); ), //... getVideos: function() ( var self = this; // Obtenir une vidéo YouTube var ytURL = "https://gdata.youtube.com/feeds/api /videos ?alt=json&author=" + self.username + "&max-results=" + self.limit; self._getJSON(ytURL, function(videos) ( // Récupère la vidéo en tant qu'objet JSON var inputs = videos.feed.entry ; varhtml = ""; self.loader.style.display = "aucun"; // Cacher le chargeur pour (var i = 0; i< entries.length; ++i) { // Разбираем данные и строим строку HTML var entry = entries[i]; var idURL = entry.id.$t; var idVideo = idURL.replace("http://gdata.youtube.com/feeds/api/videos/", ""); var ytEmbedURL = "https://www.youtube.com/embed/" + idVideo + "?rel=0&showinfo=0&controls=0"; html += ""; html += ""; html += ""; } self.wrapper.innerHTML = html; // Выводим слайд-шоу }); }, actions: function() { var self = this; self.getVideos(); // Обрабатываем слайд-шоу } }; })(); Добавить метки

Si les diapositives ne contiennent que des images, vous pouvez légèrement modifier la structure :

Précédent Suivant

N'oubliez pas d'ajouter une valeur significative à l'attribut alt.

Pour utiliser les liens de page, vous pouvez procéder comme suit :

... ... ... 1 2 3

Précédent Suivant 1 2 3

Notez l'utilisation des attributs « données » : certains diaporamas peuvent insérer des images comme arrière-plan, et ces attributs seront utilisés dans le script comme emplacements pour connecter l'arrière-plan et la diapositive.

Utilisation de listes Une approche sémantiquement correcte consisterait à utiliser les éléments de liste sous forme de diapositives. Dans ce cas, la structure sera la suivante :

Si l'ordre des slides est bien défini (par exemple dans une présentation), vous pouvez utiliser des listes numérotées

CSS Commençons par la structure suivante :

Précédent Suivant

Parce que Étant donné que le diaporama s'exécutera de droite à gauche, le conteneur extérieur aura une taille fixe et celui intérieur sera plus large puisqu'il contient toutes les diapositives. La première diapositive sera visible. Ceci est défini via un débordement :

Slider (largeur : 1 024 px ; débordement : caché ; ) .slider-wrapper ( largeur : 9999px ; hauteur : 683px ; position : relative ; transition : gauche 500 ms linéaire ; )

Les styles d’emballage intérieur incluent :

Grande largeur
- hauteur fixe, hauteur de coulissement maximale
- position : relative, qui permettra de créer un mouvement de diapositive
- Transition CSS vers la gauche, ce qui rendra le mouvement fluide. Par souci de simplicité, nous n'avons pas inclus tous les préfixes. Vous pouvez également utiliser des transformations CSS (avec traduction) pour cela.

Les diapositives ont un attribut float pour les aligner. Ils sont positionnés relativement afin que vous puissiez obtenir leur décalage gauche dans JS. Nous l'utilisons pour créer un effet de glissement.

Diapositive ( float : gauche ; position : relative ; largeur : 1024px ; hauteur : 683px ; )

Bien que nous ayons défini une certaine largeur, dans le script, nous pouvons la modifier en multipliant le nombre de diapositives par la largeur de la diapositive. Vous ne savez jamais de quelle largeur vous pourriez avoir besoin.

La navigation s'effectue via les boutons « Précédent » et « Suivant ». Nous réinitialisons leurs styles par défaut et attribuons les nôtres :

Slider-nav (hauteur : 40 px ; largeur : 100 % ; marge supérieure : 1,5 em ; ) .slider-nav bouton ( bordure : aucune ; affichage : bloc ; largeur : 40 px ; hauteur : 40 px ; curseur : pointeur ; retrait du texte : -9999em ; couleur d'arrière-plan : transparent ; répétition d'arrière-plan : pas de répétition ; ) .bouton de navigation slider.slider-previous ( float : gauche ; image d'arrière-plan : url (previous.png); ) bouton .slider-nav .slider-next ( float: right; background-image: url(next.png); )

Lorsque vous utilisez des liens de page au lieu de boutons, vous pouvez créer les styles suivants :

Slider-nav (alignement du texte : centre ; marge en haut : 1,5em ; ) .slider-nav a (affichage : bloc en ligne ; décoration du texte : aucun ; bordure : 1px solide #ddd ; couleur : #444 ; largeur : 2em ; hauteur : 2em ; hauteur de ligne : 2 ; alignement du texte : centre ; ) .slider-nav a.current ( couleur de la bordure : #000 ; couleur : #000 ; poids de la police : gras ; )

Ces classes seront attribuées dynamiquement à partir du script.

Cette approche est adaptée à l'effet de glissement. Si nous voulons obtenir l'effet de fondu, nous devons modifier les styles, car float ajoute un remplissage horizontal entre les diapositives. Autrement dit, nous n'avons pas besoin de diapositives sur une seule ligne - nous avons besoin d'un « pack » de diapositives :

Slider ( largeur : 1024 px ; marge : 2em auto ; ) .slider-wrapper ( largeur : 100 % ; hauteur : 683 px ; position : relative ; /* Crée un contexte pour le positionnement absolu */ ) .slide ( position : absolue ; /* Positionnement absolu de toutes les slides */ largeur : 100% ; hauteur : 100% ; opacité : 0 ; /* Toutes les slides sont masquées */ transition : opacité 500ms linéaire ; ) /* Initialement seule la première est visible */ .slider- emballage >
Nous utilisons la propriété opacity pour masquer les diapositives, car les lecteurs d'écran ignoreront le contenu des éléments qui ont display: none (voir CSS en action : contenu invisible réservé aux utilisateurs de lecteurs d'écran).

Grâce au positionnement contextuel CSS, nous avons créé une « pile » de slides, la dernière slide du source étant devant les autres. Mais ce n'est pas ce dont nous avons besoin. Pour conserver l'ordre des diapositives, nous devons masquer toutes les diapositives sauf la première.

JS utilise la transition CSS, modifiant la valeur de la propriété d'opacité de la diapositive actuelle et réinitialisant cette valeur à zéro pour toutes les autres.

Code JavaScript Diaporama sans pagination Le diaporama sans pagination fonctionne en cliquant sur les boutons « Suivant » et « Précédent ». Ils peuvent être considérés comme des opérateurs d’incrémentation et de décrémentation. Il y a toujours un pointeur (ou curseur) qui augmentera ou diminuera chaque fois que vous appuierez sur les boutons. Sa valeur initiale est 0 et le but est de sélectionner la diapositive actuelle de la même manière que les éléments du tableau sont sélectionnés.

Ainsi, lorsque nous cliquons sur Suivant une première fois, le pointeur augmente de 1 et nous obtenons une deuxième diapositive. En cliquant sur Précédent, nous réduisons le pointeur et obtenons la première diapositive. Etc.

Avec le pointeur, nous utilisons la méthode .eq() de jQuery pour obtenir la diapositive actuelle. En JS pur, cela ressemble à ceci :

Fonction Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.slides = this.el.querySelectorAll(".slide") ; //... ), _slideTo: function(pointer) ( var currentSlide = this.slides; //... ) );

N'oubliez pas : NodeList utilise les index comme un tableau. Une autre façon de sélectionner la diapositive actuelle consiste à utiliser les sélecteurs CSS3 :

Slideshow.prototype = ( init: function() ( //... ), _slideTo: function(pointer) ( var n = pointeur + 1; var currentSlide = this.el.querySelector(".slide:nth-child(" + n + ")"); //... ) );

Le sélecteur CSS3:nth-child() compte les éléments à partir de 1, vous devez donc ajouter un 1 au pointeur. Après avoir sélectionné une diapositive, son conteneur parent doit être déplacé de droite à gauche. Dans jQuery, vous pouvez utiliser la méthode .animate() :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", slides : ".slide", //... vitesse : 500, assouplissement : "linéaire" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $(options.wrapper, element). animate(( gauche : - $currentSlide.position().left ), options.speed, options.easing); ); //... ); ))(jQuery);

Il n'y a pas de méthode .animate() dans le JS standard, nous utilisons donc des transitions CSS :

Slider-wrapper ( position : relative ; // transition requise : gauche 500 ms linéaire ; )

Vous pouvez maintenant modifier la propriété left de manière dynamique via l'objet style :

Fonction Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector(".slider-wrapper "); this.slides = this.el.querySelectorAll(".slide"); //... ), _slideTo: function(pointer) ( var currentSlide = this.slides; this.wrapper.style.left = "- " + currentSlide.offsetLeft + "px"; ) );

Nous devons maintenant créer un événement click pour chaque contrôle. Dans jQuery, vous pouvez utiliser la méthode .on() et dans JS pur, vous pouvez utiliser la méthode addEventListener().

Vous devez également vérifier si le pointeur a atteint les limites de la liste - 0 pour « Précédent » et le nombre total de diapositives pour « Suivant ». Dans chaque cas, vous devez masquer le bouton correspondant :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", slides : ".slide", précédent : ".slider-previous", suivant : ".slider-next", //... vitesse : 500, assouplissement : "linear" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element). eq(slide); $(options.wrapper, element).animate(( left: - $currentSlide.position().left ), options.speed, options.easing); ); return this.each(function() ( var $element = $(this), $previous = $(options.previous, $element), $next = $(options.next, $element), index = 0, total = $(options.slides).length; $next.on("clic", function() ( index++; $previous.show(); if(index == total - 1) ( index = total - 1; $next.hide(); ) slideTo(index, $element); )); $previous.on("click", function() ( index--; $next.show(); if(index == 0) ( index = 0; $previous.hide(); ) slideTo(index, $element); )); )); ); ))(jQuery);

Et en JS pur, cela ressemble à ceci :

Fonction Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector(".slider-wrapper "); this.slides = this.el.querySelectorAll(".slide"); this.previous = this.el.querySelector(".slider-previous"); this.next = this.el.querySelector(".slider -next"); this.index = 0; this.total = this.slides.length; this.actions(); ), _slideTo: function(pointer) ( var currentSlide = this.slides; this.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; ), actions : function() ( var self = this; self.next.addEventListener("click", function() ( self.index++; self.previous.style. display = "block"; if(self.index == self.total - 1) ( self.index = self.total - 1; self.next.style.display = "none"; ) self._slideTo(self.index ); ), false); self.previous.addEventListener("click", function() ( self.index--; self.next.style.display = "block"; if(self.index == 0) ( self .index = 0;self.previous.style.display = "aucun"; ) self._slideTo(self.index); ), FAUX); ) );

Diaporama paginé Dans ce type de diaporama, chaque lien est responsable d'une diapositive, il n'y a donc pas besoin d'index. Les animations ne changent pas, contrairement à la façon dont l'utilisateur se déplace dans les diapositives. Pour jQuery nous aurons le code suivant :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", slides : ".slide", navigation : ".slider-nav", vitesse : 500, assouplissement : "linéaire" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $(options.wrapper, element). animate(( left: - $currentSlide.position().left ), options.speed, options.easing); ); return this.each(function() ( var $element = $(this), $navigationLinks = $( "a", options.nav); $navigationLinks.on("click", function(e) ( e.preventDefault(); var $a = $(this), $slide = $($a.attr("href ")); slideTo($slide, $element); $a.addClass("current").siblings(). removeClass("current"); )); )); ))(jQuery);

Dans ce cas, chaque ancre correspond à l’ID d’une diapositive spécifique. En JS pur, vous pouvez l'utiliser à la fois ainsi que l'attribut data, qui stocke l'index numérique des diapositives dans la NodeList :

Fonction Slider(element) ( this.el = document.querySelector(element); this.init(); ) Slider.prototype = ( init: function() ( this.links = this.el.querySelectorAll("#slider-nav a"); this.wrapper = this.el.querySelector("#slider-wrapper"); this.navigate(); ), naviguer : function() ( for (var i = 0; i< this.links.length; ++i) { var link = this.links[i]; this.slide(link); } }, slide: function(element) { var self = this; element.addEventListener("click", function(e) { e.preventDefault(); var a = this; self.setCurrentLink(a); var index = parseInt(a.getAttribute("data-slide"), 10) + 1; var currentSlide = self.el.querySelector(".slide:nth-child(" + index + ")"); self.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; }, false); }, setCurrentLink: function(link) { var parent = link.parentNode; var a = parent.querySelectorAll("a"); link.className = "current"; for (var j = 0; j < a.length; ++j) { var cur = a[j]; if (cur !== link) { cur.className = ""; } } } };

Depuis IE10, vous pouvez gérer les classes via classList :

Link.classList.add("actuel");

Et avec IE11, les attributs de données peuvent être obtenus via la propriété dataset :

Var index = parseInt(a.dataset.slide, 10) + 1;

Diaporamas paginés avec contrôles Ces diaporamas présentent une certaine complexité dans le code : vous devez combiner l'utilisation de hachages d'index et de page. Autrement dit, la diapositive actuelle doit être sélectionnée en fonction à la fois de la position du pointeur et de la diapositive sélectionnée via des liens.

Cela peut être synchronisé via l'index numérique de chaque lien dans le DOM. Un lien - une diapositive, donc leurs index seront 0, 1, 2, etc.

En jQuery, le code ressemblera à ceci :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( //... pagination : ".slider-pagination", //... ), options); $. fn.slideshow.index = 0; renvoie this.each(function() ( var $element = $(this), //... $pagination = $(options.pagination, $element), $paginationLinks = $(" a", $pagination), //... $paginationLinks.on("click", function(e) ( e.preventDefault(); var $a = $(this), elemIndex = $a.index(); // Index numérique DOM $.fn.slideshow.index = elemIndex; if($.fn.slideshow.index > 0) ( $previous.show(); ) else ( $previous.hide(); ) if($. fn.slideshow.index == total - 1) ( $.fn.slideshow.index = total - 1; $next.hide(); ) else ( $next.show(); ) slideTo($.fn.slideshow. index, $element); $a.addClass("current"). siblings().removeClass("current"); )); )); ); //... ))(jQuery);

Vous pouvez immédiatement voir que la visibilité du curseur a changé - l'index est désormais déclaré comme propriété de l'objet diaporama. De cette façon, nous évitons les problèmes de portée qui peuvent être créés par les rappels dans jQuery. Le curseur est désormais disponible partout, même en dehors de l'espace de noms du plugin, puisqu'il est déclaré comme propriété publique de l'objet slideshow.

La méthode .index() donne l'index numérique de chaque lien.

Il n'existe pas de méthode de ce type en JS pur, il est donc plus facile d'utiliser les attributs de données :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector( ".slider-wrapper"); this.slides = this.el.querySelectorAll(".slide"); this.previous = this.el.querySelector(".slider-previous"); this.next = this.el. querySelector(".slider-next"); this.navigationLinks = this.el.querySelectorAll(".slider-pagination a"); this.index = 0; this.total = this.slides.length; this.setup() ; this.actions(); ), //... configuration : function() ( var self = this; //... for(var k = 0; k< self.navigationLinks.length; ++k) { var pagLink = self.navigationLinks[k]; pagLink.setAttribute("data-index", k); // Или pagLink.dataset.index = k; } }, //... }; })();

Nous pouvons maintenant connecter nos procédures avec des références et utiliser les attributs de données que nous venons de créer :

Actions : function() ( var self = this; //... for(var i = 0; i< self.navigationLinks.length; ++i) { var a = self.navigationLinks[i]; a.addEventListener("click", function(e) { e.preventDefault(); var n = parseInt(this.getAttribute("data-index"), 10); // Или var n = parseInt(this.dataset.index, 10); self.index = n; if(self.index == 0) { self.index = 0; self.previous.style.display = "none"; } if(self.index >0) ( self.previous.style.display = "block"; ) if(self.index == self.total - 1) ( self.index = self.total - 1; self.next.style.display = "aucun "; ) else ( self.next.style.display = "block"; ) self._slideTo(self.index); self._highlightCurrentLink(this); ), FAUX); ) )

Comprendre les dimensions Revenons à la règle CSS suivante :

Slider-wrapper (largeur : 9999 px ; hauteur : 683 px ; position : relative ; transition : gauche 500 ms linéaire ; )

Si nous avons beaucoup de diapositives, 9999 ne suffiront peut-être pas. Vous devez ajuster la taille des diapositives à la volée en fonction de la largeur de chaque diapositive et du nombre de diapositives.

En jQuery c'est simple :

// Le diaporama pleine largeur renvoie this.each(function() ( var $element = $(this), total = $(options.slides).length; //... $(options.slides, $element ).width ($(window).width()); $(options.wrapper, $element).width($(window).width() * total); //... ));

Prenez la largeur de la fenêtre et définissez la largeur de chaque diapositive. La largeur totale du wrapper interne est obtenue en multipliant la largeur de la fenêtre et le nombre de diapositives.

// Le diaporama à largeur fixe renvoie this.each(function() ( var $element = $(this), total = $(options.slides).length; //... $(options.wrapper, $element) .width ($(options.slides).eq(0).width() * total); //... ));

Ici, la largeur initiale est définie sur la largeur de chaque diapositive. Il vous suffit de définir la largeur totale du wrapper.

Le conteneur intérieur est désormais suffisamment large. En JS pur, cela se fait à peu près de la même manière :

// Diaporama pleine largeur Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector(".slider-wrapper"); this.slides = this.el.querySelectorAll(".slide "); //... this.total = this.slides.length; this.setDimensions(); this.actions(); ), setDimensions: function() ( var self = this; // Largeur de la fenêtre var winWidth = window .innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var wrapperWidth = winWidth * self.total; for(var i = 0; i< self.total; ++i) { var slide = self.slides[i]; slide.style.width = winWidth + "px"; } self.wrapper.style.width = wrapperWidth + "px"; }, //... }; // Слайд-шоу фиксированной ширины Slideshow.prototype = { init: function() { this.wrapper = this.el.querySelector(".slider-wrapper"); this.slides = this.el.querySelectorAll(".slide"); //... this.total = this.slides.length; this.setDimensions(); this.actions(); }, setDimensions: function() { var self = this; var slideWidth = self.slides.offsetWidth; // Single slide"s width var wrapperWidth = slideWidth * self.total; self.wrapper.style.width = wrapperWidth + "px"; }, //... };

Effets de fondu Les effets de fondu sont souvent utilisés dans les diaporamas. La diapositive actuelle disparaît et la suivante apparaît. jQuery a les méthodes fadeIn() et fadeOut() qui fonctionnent à la fois avec les propriétés d'opacité et d'affichage, de sorte que l'élément est supprimé de la page une fois l'animation terminée (affichage : aucun).

En JS pur, il est préférable de travailler avec la propriété opacity et d'utiliser la pile de positionnement CSS. Puis dans un premier temps la slide sera visible (opacité : 1), et les autres seront masquées (opacité : 0).

L'ensemble de styles suivant illustre cette méthode :

Slider ( largeur : 100 % ; débordement : caché ; position : relative ; hauteur : 400 px ; ) .slider-wrapper ( largeur : 100 % ; hauteur : 100 % ; position : relative ; ) .slide ( position : absolue ; largeur : 100 % ; hauteur : 100 % ; opacité : 0 ; ) .slider-wrapper > .slide:first-child ( opacité : 1 ; )

En JS pur, vous devez enregistrer la transition CSS de chaque diapositive :

Diapositive (flottant : gauche ; position : absolue ; largeur : 100 % ; hauteur : 100 % ; opacité : 0 ; transition : opacité 500 ms linéaire ; )

Avec jQuery, pour utiliser les méthodes fadeIn() et fadeOut(), vous devez modifier l'opacité et l'affichage :

Diapositive ( float : gauche ; position : absolue ; largeur : 100 % ; hauteur : 100 % ; affichage : aucun ; ) .slider-wrapper > .slide:first-child ( affichage : bloc ; )

En jQuery, le code est le suivant :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", précédent : ".slider-previous", suivant : ".slider-next" , diapositives : ".slide", navigation : ".slider-nav", vitesse : 500, accélération : "linéaire" ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides , element).eq(slide); $currentSlide.animate(( opacity: 1 ), options.speed, options.easing). siblings(options.slides). css("opacity", 0); ); //. .. ); ))(jQuery);

Lors de l'animation de l'opacité, vous devez également modifier les valeurs de cette propriété pour les diapositives restantes.

En JavaScript, ce serait :

Slideshow.prototype = ( //... _slideTo: function(slide) ( var currentSlide = this.slides; currentSlide.style.opacity = 1; for(var i = 0; i< this.slides.length; i++) { var slide = this.slides[i]; if(slide !== currentSlide) { slide.style.opacity = 0; } } }, //... };

Éléments multimédia : vidéo Nous pouvons inclure de la vidéo dans un diaporama. Voici un exemple de diaporama vidéo de Vimeo :

Les vidéos sont incluses via iframe. Il s'agit du même bloc en ligne remplaçable que sur la photo. Remplaçable – parce que le contenu provient d’une source externe.

Pour créer un diaporama pleine page, vous devez modifier les styles comme suit :

Html, corps ( marge : 0 ; remplissage : 0 ; hauteur : 100 % ; hauteur min : 100 % ; /* La hauteur doit être la page entière */ ) .slider ( largeur : 100 % ; débordement : caché ; hauteur : 100 %; min-height: 100%; /* Hauteur et largeur au maximum */ position: absolue; /* Positionnement absolu */ ) .slider-wrapper ( width: 100%; height: 100%; /* Hauteur et largeur au maximum full */ position : relative; ) .slide ( float : gauche ; position : absolue ; largeur : 100 % ; hauteur : 100 % ; ) .slide iframe ( affichage : bloc ; /* Élément de bloc */ position : absolue ; /* Positionnement absolu */ largeur : 100 % ; hauteur : 100 % ; /* Pleine hauteur et largeur */ )

Diaporamas automatiques Les diaporamas automatiques utilisent des minuteries. Chaque fois que la fonction timer setInterval() est rappelée, le curseur sera incrémenté de 1 et ainsi la diapositive suivante sera sélectionnée.

Lorsque le curseur atteint le nombre maximum de diapositives, il doit être réinitialisé.

Les diaporamas interminables deviennent vite ennuyeux pour les utilisateurs. La meilleure pratique consiste à arrêter l'animation lorsque l'utilisateur la survole et à la reprendre lorsque le curseur s'éloigne.

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( diapositives : ".slide", vitesse : 3000, assouplissement : "linéaire" ), options); var timer = null; // Minuterie var index = 0; // Curseur var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $currentSlide.stop(true, true). animer (( opacity: 1 ), options.speed, options.easing). siblings(options.slides). css("opacity", 0); ); var autoSlide = function(element) ( // Initialiser le timer de séquence = setInterval ( function() ( index++; // Augmente le curseur de 1 if(index == $(options.slides, element).length) ( index = 0; // Réinitialise le curseur ) slideTo(index, element); ), options.speed ); // Le même intervalle que dans la méthode.animate() ); var startStop = function(element) ( element.hover(function() ( // Arrête l'animation clearInterval(timer); timer = null; ), function () ( autoSlide(element); // Reprendre l'animation )); ); return this.each(function() ( var $element = $(this); autoSlide($élément); startStop($élément); )); ); ))(jQuery);

Les deux paramètres de la méthode .stop() sont définis sur true, car nous n'avons pas besoin de créer une file d'attente d'animation à partir de notre séquence.

En JS pur, le code devient plus simple. Nous enregistrons une transition CSS pour chaque diapositive d'une certaine durée :

Diapositive ( transition : opacité 3s linéaire ; /* 3 secondes = 3000 millisecondes */ )

Et le code sera comme ceci :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.slides = this.el.querySelectorAll( ".slide"); this.index = 0; // Curseur this.timer = null; // Minuterie this.action(); this.stopStart(); ), _slideTo: function(slide) ( var currentSlide = this. diapositives; currentSlide.style.opacity = 1; for(var i = 0; i< this.slides.length; i++) { var slide = this.slides[i]; if(slide !== currentSlide) { slide.style.opacity = 0; } } }, action: function() { var self = this; // Initializes the sequence self.timer = setInterval(function() { self.index++; // Увеличим курсор на 1 if(self.index == self.slides.length) { self.index = 0; // Обнулим курсор } self._slideTo(self.index); }, 3000); // Тот же интервал, что и у перехода CSS }, stopStart: function() { var self = this; // Останавливаем анимацию self.el.addEventListener("mouseover", function() { clearInterval(self.timer); self.timer = null; }, false); // Возобновляем анимацию self.el.addEventListener("mouseout", function() { self.action(); }, false); } }; })();

Navigation au clavier Les diaporamas avancés offrent une navigation au clavier, c'est-à-dire Faites défiler les diapositives en appuyant sur les touches. Pour nous, cela signifie simplement que nous devons enregistrer la gestion de l'événement keypress.

Pour ce faire, nous accéderons à la propriété keyCode de l'objet événement. Il renvoie le code de la touche enfoncée (liste des codes).

Les événements que nous avons attachés aux boutons « Précédent » et « Suivant » peuvent désormais être attachés aux touches « gauche » et « droite ». jQuery :

$("body").on("keydown", function(e) ( var code = e.keyCode; if(code == 39) ( // Flèche gauche $next.trigger("click"); ) if( code == 37) ( // Flèche droite $previous.trigger("click"); ) ));

En JS pur, au lieu de la simple méthode .trigger(), vous devrez utiliser dispatchEvent() :

Document.body.addEventListener("keydown", function(e) ( var code = e.keyCode; var evt = new MouseEvent("click"); // clic de souris if(code == 39) ( // Flèche gauche auto .next.dispatchEvent(evt); ) if(code == 37) ( // Flèche droite self.previous.dispatchEvent(evt); ) ), false);

Dans les projets décents, cela n'est pas habituel. Nous aurions besoin de définir la fonctionnalité qui permet le retournement dans une méthode publique, puis de l'appeler lorsque vous cliquez sur le bouton. Ensuite, si une autre partie du programme avait besoin d'implémenter cette fonctionnalité, il ne serait pas nécessaire d'émuler les événements DOM, mais pourrait simplement appeler cette méthode.

Rappels Ce serait bien de pouvoir attacher du code à n'importe quelle action de diaporama qui serait exécutée lorsque cette action est effectuée. C'est le but des fonctions de rappel : elles ne sont exécutées que lorsqu'une certaine action se produit. Disons que notre diaporama comporte des légendes et qu'elles sont masquées par défaut. Au moment de l'animation, nous devons afficher une légende pour la diapositive actuelle ou même en faire quelque chose.

Dans jQuery, vous pouvez créer un rappel comme celui-ci :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( //... callback: function() () ), options); var slideTo = function(slide, element) ( var $currentSlide = $(options.slides, element).eq(slide); $currentSlide. animate(( opacity: 1 ), options.speed, options.easing, // Rappel pour la diapositive actuelle options.callback($ currentSlide)). siblings(options.slides). css("opacity", 0); ); //... ); ))(jQuery);

Dans ce cas, le rappel est une fonction de .animate() qui prend la diapositive actuelle comme argument. Voici comment vous pouvez l'utiliser :

$(function() ( $("#main-slider").slideshow(( callback: function(slide) ( var $wrapper = slide.parent(); // Affiche la légende actuelle et masque les autres $wrapper.find (" .slide-caption").hide(); slide.find(".slide-caption").show("lent"); ) )); ));

En JS pur :

(function() ( function Slideshow(element, callback) ( this.callback = callback || function()); // Notre rappel this.el = document.querySelector(element); this.init(); ) Slideshow. prototype = ( init: function() ( //... this.slides = this.el.querySelectorAll(".slide"); //... //... ), _slideTo: function(slide) ( var self = ceci ; var currentSlide = self.slides ; currentSlide.style.opacity = 1 ; for(var i = 0 ; i< self.slides.length; i++) { var slide = self.slides[i]; if(slide !== currentSlide) { slide.style.opacity = 0; } } setTimeout(self.callback(currentSlide), 500); // Вызывает функцию по окончанию перехода } }; // })();

La fonction de rappel est définie comme deuxième paramètre du constructeur. Vous pouvez l'utiliser comme ceci :

Document.addEventListener("DOMContentLoaded", function() ( var slider = new Slideshow("#main-slider", function(slide) ( var wrapper = slide.parentNode; // Affiche la légende actuelle et masque les autres var allSlides = wrapper.querySelectorAll(".slide"); var caption = slide.querySelector(".slide-caption"); caption.classList.add("visible"); for(var i = 0; i< allSlides.length; ++i) { var sld = allSlides[i]; var cpt = sld.querySelector(".slide-caption"); if(sld !== slide) { cpt.classList.remove("visible"); } } }); });

API externes Jusqu'à présent, notre scénario de travail est simple : toutes les diapositives sont déjà dans le document. Si nous devons y insérer des données de l'extérieur (YouTube, Vimeo, Flickr), nous devons remplir les diapositives à la volée au fur et à mesure que nous recevons du contenu externe.

Étant donné que la réponse du serveur tiers peut ne pas être immédiate, vous devez insérer une animation de chargement pour montrer que le processus est en cours :

Précédent Suivant

Il peut s'agir d'un gif ou d'une pure animation CSS :

#spinner ( border-rayon : 50 % ; bordure : 2px solide #000 ; hauteur : 80px ; largeur : 80px ; position : absolue ; haut : 50 % ; gauche : 50 % ; marge : -40px 0 0 -40px ; ) # spinner:after ( contenu : " " ; position : absolue ; couleur d'arrière-plan : #000 ; haut : 2px ; gauche : 48 % ; hauteur : 38px ; largeur : 2px ; rayon-bordure : 5px ; -webkit-transform-origin : 50 % 97 % ; origine de transformation : 50 % 97 % ; -webkit-animation : angulaire 1s linéaire infini ; animation : angulaire 1s linéaire infini ; ) @-webkit-keyframes angulaire ( 0%(-webkit-transform:rotate(0deg );) 100%(-webkit-transform:rotate(360deg);) ) @keyframes angulaire ( 0%(transform:rotate(0deg);) 100%(transform:rotate(360deg);) ) #spinner:avant ( contenu : "" ; position : absolue ; couleur d'arrière-plan : #000 ; haut : 6 px ; gauche : 48 % ; hauteur : 35 px ; largeur : 2 px ; rayon de bordure : 5 px ; -webkit-transform-origin : 50 % 94 % ; transformation-origine : 50 % 94 % ; -webkit-animation : ptangulaire 6s linéaire infini ; animation : ptangulaire 6s linéaire infini ; ) @-webkit-keyframes ptangulaire ( 0%(-webkit-transform:rotate(0deg);) 100 %(-webkit-transform:rotate(360deg);) ) @keyframes ptangulaire ( 0%(transform:rotate(0deg);) 100%(transform:rotate(360deg);) )

Les étapes seront les suivantes :
- demander des données à l'extérieur
- cacher le chargeur de démarrage
- analyser les données
- construire du HTML
- afficher un diaporama
- traiter les diaporamas

Disons que nous sélectionnons les vidéos YouTube les plus récentes d'un utilisateur. jQuery :

(function($) ( $.fn.slideshow = function(options) ( options = $.extend(( wrapper : ".slider-wrapper", //... chargeur : "#spinner", //... limite : 5, nom d'utilisateur : "learncodeacademy" ), options); //... var getVideos = function() ( // Récupérer des vidéos de YouTube var ytURL = "https://gdata.youtube.com/feeds/api/ videos?alt=json&author=" + options.username + "&max-results=" + options.limit; $.getJSON(ytURL, function(videos) ( // Récupère la vidéo en tant qu'objet JSON $(options.loader). hide( ); // Cacher le chargeur var inputs = videos.feed.entry; var html = ""; for(var i = 0; i< entries.length; ++i) { // Разбираем данные и строим строку HTML var entry = entries[i]; var idURL = entry.id.$t; var idVideo = idURL.replace("http://gdata.youtube.com/feeds/api/videos/", ""); var ytEmbedURL = "https://www.youtube.com/embed/" + idVideo + "?rel=0&showinfo=0&controls=0"; html += ""; html += ""; html += ""; } $(options.wrapper).html(html); // Выведем слайд-шоу }); }; return this.each(function() { //... getVideos(); // Обрабатываем слайд-шоу }); }; })(jQuery);

En JavaScript pur, il y a une étape supplémentaire : créer une méthode pour obtenir JSON :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector( ".slider-wrapper"); this.loader = this.el.querySelector("#spinner"); //... this.limit = 5; this.username = "learncodeacademy"; ), _getJSON : function(url , rappel) ( callback = callback || function() (); var request = new XMLHttpRequest(); request.open("GET", url, true); request.send(null); request.onreadystatechange = function() ( if (request.status == 200 && request.readyState == 4) ( var data = JSON.parse(request.responseText); // Rappel d'objet JSON(data); ) else ( console.log(request.status) ; ) ); ), //... ); ))();

Les procédures sont alors similaires :

(function() ( function Slideshow(element) ( this.el = document.querySelector(element); this.init(); ) Slideshow.prototype = ( init: function() ( this.wrapper = this.el.querySelector( ".slider-wrapper"); this.loader = this.el.querySelector("#spinner"); //... this.limit = 5; this.username = "learncodeacademy"; this.actions(); ) , _getJSON : function(url, callback) ( callback = callback || function(); var request = new XMLHttpRequest(); request.open("GET", url, true); request.send(null); request .onreadystatechange = function() ( if (request.status == 200 && request.readyState == 4) ( var data = JSON.parse(request.responseText); // Rappel d'objet JSON(data); ) else ( console. log( request.status); ) ); ), //... getVideos: function() ( var self = this; // Obtenir une vidéo YouTube var ytURL = "https://gdata.youtube.com/feeds/api /videos ?alt=json&author=" + self.username + "&max-results=" + self.limit; self._getJSON(ytURL, function(videos) ( // Récupère la vidéo en tant qu'objet JSON var inputs = videos.feed.entry ; varhtml = ""; self.loader.style.display = "aucun"; // Cacher le chargeur pour (var i = 0; i< entries.length; ++i) { // Разбираем данные и строим строку HTML var entry = entries[i]; var idURL = entry.id.$t; var idVideo = idURL.replace("http://gdata.youtube.com/feeds/api/videos/", ""); var ytEmbedURL = "https://www.youtube.com/embed/" + idVideo + "?rel=0&showinfo=0&controls=0"; html += ""; html += ""; html += ""; } self.wrapper.innerHTML = html; // Выводим слайд-шоу }); }, actions: function() { var self = this; self.getVideos(); // Обрабатываем слайд-шоу } }; })(); Добавить метки

Parfois, je dois résoudre des problèmes liés au frontend, même si je n'aime pas ça :)

En fait, vous pouvez évaluer mon attitude envers tout ce qui touche au « beau » à partir de la conception de ce site, qui a été développé par moi seul :)

Cependant, relativement récemment, j'ai été confronté à la nécessité d'implémenter un curseur en JavaScript, et cela a dû être fait sans aucune bibliothèque prête à l'emploi et même sans le jQuery préféré de tous.

Ce besoin était dû au fait que le résultat aurait dû être un script JS qui serait connecté au site via un service tiers. Par conséquent, les carrousels prêts à l'emploi en JavaScript n'étaient plus nécessaires, car Pour les intégrer, il fallait ajouter une connexion bibliothèque au code HTML du site via une balise de script et copier les fichiers eux-mêmes soit sur le serveur, soit les extraire via cdn, mais cela nécessiterait encore une fois de modifier le code de la ressource.

Comment créer un slider JavaScript : le début

Aujourd'hui, je pense que tous ceux qui se sont retrouvés dans une situation similaire ont commencé par rechercher des développements existants, car... lorsque la tâche de création d'un carrousel JS entre dans le cadre du travail, elle doit toujours être effectuée le plus rapidement possible. Et dans de telles conditions, personne ne vous permettra de vous asseoir et d'inventer vos propres vélos.

Les clients ne se soucient toujours pas de la façon dont le code est écrit, de son architecture, l’essentiel est de voir le résultat !

Du coup, comme vous l'avez compris, avant d'écrire un slider en JavaScript sans jQuery, j'ai décidé d'en trouver un tout fait et de le modifier en fonction de mes besoins. Pourquoi pas de jQuery ? Oui, car sur la ressource cible, où j'avais prévu de connecter mon slider via le service, l'appel jQuery dans le code était postérieur au script connecté par le service. Par conséquent, les constructions jQuery dans mon code n'étaient tout simplement pas perçues.

Comme base, j'ai pris ce curseur d'image JavaScript - https://codepen.io/gabrieleromanato/pen/pIfoD.

J'ai décidé de m'arrêter là, parce que... son code JS a été écrit selon les principes de la POO et ses classes sont basées sur des prototypes et non sur des fonctions banales.

Pour être honnête, je ne comprends absolument pas et ne reconnaisse pas le battage médiatique actuel autour de JavaScript utilisant la POO, des frameworks et d'autres éléments architecturaux dans un langage qui était à l'origine destiné à être un simple langage de script dynamique. Tout comme JS lui-même, je ne l'aime franchement pas avec sa vinaigrette syntaxique, qui permet d'écrire les mêmes constructions de plusieurs manières.

Mais malheureusement, dans le monde moderne, peu de gens partagent mes positions, car... ce langage se développe à un rythme fou et tente même de conquérir l'esprit des développeurs backend utilisant Node.js comme alternative à Java, PHP, C#, Ruby et autres monstres.

En conséquence, pour ne pas se retrouver sans travail, il faut comprendre tranquillement JavaScript. Et dans l'implémentation pure du curseur JavaScript que j'ai choisie, j'ai rencontré quelque chose que, comme vous le comprenez, je méprise dans ce langage. C'est pourquoi je l'ai choisi, pour qu'il y ait au moins une raison de travailler et de comprendre JavaScript POO et les classes prototypes - sinon je ne les aurais jamais volontairement touchés de ma vie :)

Sur la base du code que j'ai trouvé, j'avais besoin de développer un slider en JS pur dans une fenêtre pop-up (cette chose est aussi appelée popup, popup, etc.), qui aurait des boutons pour changer de diapositive et des indicateurs cliquables du courant glisser. Il a fallu aussi faire un bouton pour fermer cette fenêtre.

C'est ce avec quoi je me suis retrouvé.

Créer une bibliothèque Slider JS

Tout d'abord, j'ai décidé de tout implémenter judicieusement et de créer un slider JavaScript pour le site sous la forme d'une bibliothèque, connectée au site avec un seul script, dans laquelle les composants du slider, divisés en sous-répertoires, seront appelés. J'ai décidé de l'appeler popupSlider.js en l'honneur de son objectif initial.

Son code est disponible sur GitHub à cette adresse - https://github.com/Pashaster12/popupSlider.js

La structure de la bibliothèque est la suivante :

Le dossier des diapositives est destiné aux images de diapositives. Les contrôles contiennent des images de contrôles du carrousel JS (boutons pour fermer le curseur et changer de diapositive). Et dans les actifs, il y a des éléments statiques du curseur JS : un balisage HTML et un fichier avec des styles CSS.

Eh bien, le fichier popupSlider.js est le cœur de la bibliothèque elle-même, dans laquelle les actions JavaScript du carrousel sont écrites et une connexion est établie avec d'autres fichiers. C'est celui-ci que l'on connectera sur le site, et il appellera les autres.

J'ai décidé de commencer par le balisage HTML de notre carrousel d'images JS, qui dans mon cas ressemble à ceci :

Texte 1 Texte 2 Texte 3

Pour concevoir le slider en JavaScript sous forme de popup, j'ai utilisé les styles suivants :

#slider ( marge : auto ; largeur : 600 px ! important ; débordement : caché ; ) #slider-wrapper ( largeur : 9999 px ; hauteur : 343 px ; position : relative ; transition : gauche 400 ms linéaire ; ) .slide ( float : gauche ; largeur : 600px; position: relative; débordement: caché; ) .caption (largeur: 600px; hauteur: 110px; hauteur de ligne: 1,5; taille de police: 15px; poids de police: 300; alignement du texte: centre; couleur: # 000; display:table; ) .caption-container ( display: table-cell; vertical-align: middle; padding: 0 20px; ) #slider-nav ( position: absolue; bottom: -36px; text-align: center; gauche : 50 % ; transformation : traduireX (-50 %); ) #slider-nav a (largeur : 8 px ; hauteur : 8 px ; décoration de texte : aucune ; couleur : #000 ; affichage : bloc en ligne ; rayon de bordure : 50 % ; marge : 0 5 px ; couleur d'arrière-plan : #fafafa ; ) #slider-nav a.current (couleur d'arrière-plan : #337ab7 ; ) .contrôles horizontaux (position : absolue ; affichage : bloc en ligne ; largeur : 12 px ; hauteur : 20 px ; haut : 50 % ; marge supérieure : -10 px ; ) #prev ( arrière-plan : url(../controls/arrow_left_inactive.png); gauche : -40px ; ) #prev:hover ( arrière-plan: url(../controls/arrow_left_active.png); ) #next ( arrière-plan: url(../controls/arrow_right_inactive.png); right: -40px; ) #next:hover ( arrière-plan : url(../controls/arrow_right_active.png); ) #cq-popup ( largeur : 600px ; z-index : 23 ; gauche : calc(50 %) ; haut : calc(50 %) ; position : fixe !important ; répétition d'arrière-plan : pas de répétition ; position d'arrière-plan : droite ; couleur d'arrière-plan : #fff ; famille de polices : "Roboto", "Segoe UI", "Helvetica", "Georgia", "Calibri", "Verdana" ; transform: translation(-50%, -50%) scale(1); ) #cq-popup .header ( affichage : bloc en ligne ; taille de police : 17px ; poids de police : 500 ; ) #cq-popup > div ( largeur : 500 px ; taille de police : 22 px ; hauteur de ligne : 36 px ; ) #cq-popup-btclose ( décoration de texte : aucune ; position : absolue ; droite : -40 px ; haut : 0 ; arrière-plan : url (. ./controls/btn_delete_inactive.png); hauteur: 16px; largeur: 16px; ) #cq-popup-btclose:hover ( arrière-plan: url(../controls/btn_delete_active.png); ) #cq-popup-bg ( position : fixe ; haut : 0 ; largeur : 100 % ; hauteur : 100 % ; arrière-plan : rgba(51,51,51,0.8) ; indice z : 22 ; )

Suite à l’application de ces styles JS, le carrousel ressemble à ceci :

J'ai déplacé le balisage HTML et les styles CSS dans des fichiers distincts popupSlider.html et popupSlider.css, qui se trouvent dans le répertoire des ressources de la bibliothèque de curseurs JavaScript. J'ai fait cela exprès pour que lors de l'utilisation de ce code, les utilisateurs puissent facilement ajuster le balisage et la conception sans se soucier du code JS, où ce qui devrait être écrit devrait être écrit directement.

De plus, de nombreuses personnes aiment encore minimiser JS pour accélérer le chargement du site. Il serait donc très difficile de personnaliser cette solution dans les conditions spécifiées.

En conséquence, j'ai décidé d'inclure simplement des fichiers prêts à l'emploi dans le fichier de bibliothèque principal popupSlider.js, qui pour ma tâche prenait la forme suivante :

Fonction Slider(element) ( this.loadStatic(); this.el = document.querySelector(element); this.init(); ) Slider.prototype = ( init: function() ( this.links = this.el.querySelectorAll ("#slider-nav a"); this.wrapper = this.el.querySelector("#slider-wrapper"); this.nextBtn = this.el.querySelector("#next"); this.prevBtn = this. el.querySelector("#prev"); this.navigate(); ), naviguer: function() ( var self = this; for (var i = 0; i< this.links.length; ++i) { var link = this.links[i]; link.addEventListener("click", function (e) { self.slide(this); }); } self.prevBtn.style.display = "none"; self.nextBtn.addEventListener("click", function (e) { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var nextSlide = document.querySelector(""); nextSlide.click(); }, false); self.prevBtn.addEventListener("click", function (e) { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var prevSlide = document.querySelector(""); prevSlide.click(); }, false); self.close(); }, slide: function (element) { this.setCurrentLink(element); var index = parseInt(element.getAttribute("data-slide"), 10) + 1; var currentSlide = this.el.querySelector(".slide:nth-child(" + index + ")"); this.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; if (index < this.links.length) this.nextBtn.style.display = "block"; else if (index == this.links.length) this.nextBtn.style.display = "none"; if (index >1) this.prevBtn.style.display = "bloc" ; sinon if (index == 1) this.prevBtn.style.display = "none"; ), setCurrentLink : fonction (lien) ( var parent = link.parentNode; var a = parent.querySelectorAll("a"); link.className = "current"; this.currentElement = link; for (var j = 0; j< a.length; ++j) { var cur = a[j]; if (cur !== link) { cur.className = ""; } } }, loadStatic: function () { var self = this; var link = document.createElement("link"); link.rel = "stylesheet"; link.href = "assets/popupSlider.css"; document.head.appendChild(link); var sliderHTML = ""; var xhr = new XMLHttpRequest(); xhr.open("GET", "assets/popupSlider.html", false); xhr.send(); if (xhr.status != 200) { alert("Can not load the popupSlider.html. Got the error " + xhr.status + ": " + xhr.statusText); } else { sliderHTML = xhr.responseText; } var div = document.createElement("div"); div.innerHTML = sliderHTML; document.body.appendChild(div); }, close: function () { document.getElementById("cq-popup-btclose").onclick = function () { document.getElementById("cq-popup-bg").remove(); document.getElementById("cq-popup").remove(); } } };

Quelques commentaires sur le code ci-dessus. Le contenu du fichier popupSlider.js est une seule classe JavaScript Slider qui, comme en PHP, contient un constructeur et des méthodes de classe. Uniquement en JS, la définition d'un constructeur, contrairement à PHP, est obligatoire.

Le constructeur est défini à l'aide de la construction suivante :

Fonction Slider(élément) ( //code constructeur)

A l'intérieur du constructeur, les actions qui seront effectuées lors de la création d'un objet de classe doivent être spécifiées.

Les méthodes de classe elles-mêmes seront situées à l'intérieur du prototype et seront disponibles pour toutes les instances de cette classe JavaScript. Le prototype JS dans mon cas est décrit par la conception suivante :

Slider.prototype = ( //méthodes)

Ils seront appelés en dehors du corps de classe comme suit :

Curseur Var = nouveau Slider(); slider.class_method();

Et à l’intérieur du code de classe lui-même, la méthode suivante est disponible :

This.class_method();

L'essentiel est de ne pas oublier qu'en JavaScript la valeur de this dépend du contexte de l'appel, donc dans les corps de certaines méthodes dans lesquelles il était nécessaire d'appeler des méthodes et des propriétés d'une classe, il existe une telle construction :

Var soi = ceci; self.class_method(); //pour accéder à une méthode d'un niveau supérieur au code de la méthode décrite

Il semble que j'ai parlé de toutes les nuances de l'écriture de code. Quelques mots maintenant sur les méthodes de notre classe JavaScript, qui contiennent des descriptions des actions JS du carrousel d'images.

chargerStatique()

La toute première méthode appelée lors de la création d'une instance d'une classe dans le constructeur. Responsable de l'ajout d'un balisage de curseur et d'un fichier avec des styles au code HTML de la page du site Web.

Tout d'abord, une nouvelle balise de lien est créée en mémoire à l'aide de la fonction JavaScript document.createElement() et les valeurs de tous les attributs nécessaires lui sont attribuées, y compris le chemin d'accès au fichier CSS avec les styles de curseur JS. Et enfin, il est ajouté à la page HTML à l'aide de la méthode JavaScript appendChild() à la fin de la section head, là où les styles doivent se trouver.

Ensuite, nous faisons de même pour le fichier avec le balisage HTML de notre slider en JavaScript pur. Il y a juste une petite nuance ici : vous ne pouvez pas simplement inclure un fichier HTML dans le même fichier, comme nous l'avons fait avec un fichier CSS. Il existe des bibliothèques spéciales pour cela, par exemple, afin d'inclure du HTML dans HTML, la bibliothèque de w3.org est excellente - https://www.w3schools.com/howto/howto_html_include.asp

Mais il faudrait alors soit l'inclure dans la bibliothèque de curseurs elle-même, soit demander aux utilisateurs de l'installer eux-mêmes. Mais tout cela n’est pas optimal, parce que… nécessite beaucoup de mouvements corporels et ralentit la vitesse de chargement du site en raison de scripts supplémentaires.

En fin de compte, j'ai décidé de prendre le contenu du fichier HTML dans le code JavaScript et de le charger dans un nouvel élément div créé en mémoire, tout comme je l'ai fait plus tôt pour inclure un fichier CSS dans JavaScript. L'élément généré est inclus à la toute fin de la section corps du code HTML de la page du site.

Si vous souhaitez insérer un div avec un balisage de curseur non seulement à la fin du corps, mais dans un conteneur spécifique, vous pouvez utiliser le code suivant :

Var div = document.createElement("div"); div.innerHTML = sliderHTML; document.body.appendChild(div);

Saisissez ce qui suit en précisant l'identifiant souhaité du conteneur cible (dans mon cas, le slider HTML JS sera situé dans l'élément avec l'identifiant popupSlider) :

Var target = document.querySelector("#popupSlider"); cible.innerHTML = sliderHTML;

La méthode, qui est appelée dans le constructeur après loadStatic(), est nécessaire pour initialiser les propriétés de classe correspondant aux principaux éléments HTML auxquels nous accéderons dans le code suivant.

A la fin, la méthode naviguer() est appelée.

naviguer()
Dans cette méthode, les actions qui se produisent lorsque vous cliquez sur les boutons du curseur et les éléments de navigation situés sous le curseur lui-même sont indiquées sous forme de cercles.

Pour plus de commodité, j'ai déplacé le code JavaScript permettant de modifier les diapositives dans une méthode slide() distincte, mais dans celle-ci, je l'attache simplement à l'événement click pour chaque bouton rond de la boucle.

Lorsque vous cliquez sur les boutons « diapositive précédente » / « diapositive suivante », comme vous pouvez le voir, j'ai décidé de simplement émuler un clic sur le cercle correspondant, en définissant celui souhaité par rapport à celui actuel, qui a une classe CSS actuelle.

diapositive (élément)

La méthode « responsable de la magie » du carrousel JavaScript lui-même, qui contient le code qui modifie la position des diapositives. Au tout début, la méthode setCurrentLink() est appelée, dont nous parlerons un peu plus tard.

L'objet bouton de navigation du curseur JS sous la forme d'un cercle lui est transmis en tant que paramètre d'entrée.

L'interrupteur à glissière lui-même fonctionne comme ceci :

  • Tous nos toboggans sont conçus sous forme de blocs de même taille, les uns à la suite des autres. La fenêtre du curseur n'est que la partie visible de l'élément qui contient toutes les diapositives.
  • Nous définissons le décalage du bord gauche de la diapositive actuelle par rapport au bord gauche de l'élément parent à l'aide de la propriété offsetLeft.
  • Et nous décalons l'élément parent de cette valeur pour que l'élément requis soit affiché dans la fenêtre du curseur.
  • A la fin de la méthode, le comportement des boutons « diapositive précédente »/« diapositive suivante », respectivement conçus comme des flèches gauche/droite, est décrit. Si la diapositive actuelle est la première de toute la liste, alors le bouton permettant d'accéder à la diapositive précédente est masqué. Dans ce dernier cas, retirez le bouton pour passer à la diapositive suivante.

    setCurrentLink(lien)

    Cette méthode de notre classe JavaScript slider se charge de mettre en évidence le bouton rond de navigation correspondant à l'élément courant. Ceux. si la deuxième diapositive est sélectionnée, le deuxième bouton sera mis en surbrillance.

    L'objet du bouton qui doit être sélectionné comme objet actuel est transmis comme paramètre d'entrée à la fonction.

    La logique pour mettre en évidence l'élément actuel est simple :

  • Nous obtenons l'objet de l'élément parent, qui dans notre cas est le conteneur avec l'identifiant slider-nav .
  • Nous obtenons tous les éléments de navigation sous forme de tableau de liens.
  • On sélectionne l'élément reçu en entrée en l'ajoutant à la classe actuelle.
  • Dans une boucle, nous parcourons tous les éléments de navigation et effaçons la valeur de classe pour tous sauf celle actuelle. Ceci est nécessaire pour désélectionner l'élément qui était courant avant cet appel de fonction.
  • La toute dernière méthode de la classe, qui définit l'action en cliquant sur le bouton de fermeture du curseur en forme de croix. Ici, en fait, le code est le plus compréhensible de tous ceux contenus dans la classe slider JS.

    Lorsque vous cliquez sur le bouton de fermeture, auquel on accède par son identifiant, l'élément slider et l'élément qui définit le fond translucide sont supprimés de la page. Ils sont également, à leur tour, obtenus par des identifiants uniques.

    La méthode elle-même est appelée dans le navigateur décrit précédemment (), qui contient tous les scénarios d'actions se déroulant sur notre curseur JavaScript.

    À propos, si vous souhaitez fermer le curseur lorsque vous cliquez en dehors de celui-ci, ajoutez simplement le code suivant à cette méthode :

    Document.getElementById("cq-popup-bg").onclick = function () ( document.getElementById("cq-popup-bg").remove(); document.getElementById("cq-popup").remove() ;

    Diaporama JavaScript basé sur la bibliothèque développée

    Parfois, dans la pratique, vous devrez peut-être créer un carrousel à défilement JS, souvent appelé diaporama. Dans mon cas, cela n'était pas obligatoire, mais j'ai quand même décidé d'en créer un basé sur le code final de la bibliothèque pour un cas où cela pourrait être utile.

    En fait, l'implémentation JavaScript d'un diaporama diffère légèrement d'un slider classique. La seule différence est que dans un diaporama, les diapositives changent automatiquement à un intervalle de temps donné, tandis que dans le cas d'un carrousel JS classique, elles changent manuellement à l'aide d'éléments de navigation.

    SlideShow : fonction (délai d'attente) ( var sliderCount = this.links.length; var self = this; this.slideCycle = setInterval(function () ( var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute ("data-slide"); var slideId = parseInt(currentSlideNumber, 10) + 1; self.slide(document.querySelector("")); ), timeout); )

    Je pense que ce qui se passe ici est clair. Pour créer cette méthode, j'ai copié le code de l'événement click des boutons coulissants manuels et je l'ai placé dans un appel JavaScript à la fonction setInterval(), qui effectue l'action spécifiée après une période de temps spécifiée.

    Le script d'action est passé comme premier argument en tant que fonction anonyme, et l'intervalle de temps est passé en second, ce que j'ai décidé de faire en tant que variable dont la valeur est transmise lorsque slideShow() est appelé.

    La seule modification requise du code à l'intérieur de setInterval() était de déterminer le nombre de diapositives et de comparer l'index de la diapositive actuelle avec celui-ci pour effectuer la commutation automatique.

    Eh bien, pour que ce code fonctionne, la méthode elle-même doit être appelée. J'ai décidé de faire tout cela dans le même navigateur(), qui est précisément une collection de toutes sortes de scripts. J'ai passé l'appel à la toute fin, en passant comme argument la valeur de l'intervalle de temps de changement automatique des diapositives dans notre diaporama JS (j'ai choisi 2000 millisecondes ou 2 secondes, vous pouvez modifier ce nombre si nécessaire) :

    self.slideShow(2000);

    Après cela, vérifiez le fonctionnement du curseur JavaScript, sans oublier de nettoyer votre navigateur.

    En théorie, tout devrait fonctionner. Sinon, étudiez les erreurs dans la console du navigateur et partagez-les dans les commentaires.

    En conséquence, nous avons obtenu un diaporama JS dans lequel les diapositives changent automatiquement et en cercle, c'est-à-dire lorsque la dernière diapositive est atteinte, le spectacle passe dans une nouvelle boucle et le spectacle recommence depuis le tout premier élément.

    Lorsque je travaillais avec diverses bibliothèques JS pour les carrousels d'images et les critiques, j'ai remarqué que les développeurs utilisaient activement cette pratique, mais avec quelques ajouts. Dans toutes les solutions que j'ai vues, le diaporama automatique est interrompu si l'utilisateur effectue un changement manuel. J'ai donc décidé de faire la même chose dans ma bibliothèque.

    Pour interrompre l'affichage automatique des slides du carrousel JavaScript, j'ai décidé d'utiliser la fonction standard JS clearInterval(), à laquelle je passe en argument l'identifiant de l'intervalle de temps renvoyé par la fonction setInterval() lorsqu'elle est définie.

    En conséquence, j'ai obtenu le code suivant, que j'ai décidé de ne pas écrire comme méthode distincte :

    ClearInterval(self.slideCycle);

    Et placé aux endroits où les actions sont décrites en cliquant sur divers éléments de navigation, c'est-à-dire dans ce qui suit:

    Link.addEventListener("clic", fonction (e) (...)); self.prevBtn.addEventListener("clic", function (e) (...)); self.nextBtn.addEventListener("clic", fonction (e) (...));

    Il est préférable d'appeler clearInterval() plus près de l'événement click lui-même, l'essentiel est avant et non après.

    Intégration du slider JavaScript sur le site

    Ainsi, notre slider en JS pur est prêt. Il ne reste plus qu'à le connecter au site.

    Pour ce faire, vous devez effectuer les étapes suivantes de manière séquentielle, qui sont des actions standard lors de l'intégration de bibliothèques JavaScript tierces en général.

    Étape 1 . Nous copions les fichiers de la bibliothèque sur notre site Web dans un répertoire séparé.
    Étape 2. Ajoutez le code suivant au HTML des pages où le slider devra être affiché, en le plaçant avant la balise body de fermeture :

    Étape 3. Nous plaçons le code suivant pour appeler le carrousel JS dans n'importe quel fichier JavaScript existant, qui est inclus sur la page après avoir connecté le curseur lui-même :

    Var aSlider = new Slider("#slider");

    Comme vous pouvez le voir, ce code crée essentiellement un objet de la classe Slider, contenu dans popupSlider.js. C'est pourquoi il ne doit être appelé qu'après avoir connecté le fichier de classe lui-même à la page.

    Ajouter de nouvelles diapositives à un carrousel JavaScript

    Tout est très simple ici. Étant donné que nos diapositives sont extraites d'un répertoire séparé de la bibliothèque de diapositives, lors de l'ajout de nouvelles images, il vous suffira d'y ajouter les fichiers nécessaires, en leur donnant d'abord la même taille que les autres.

    Et puis dans le code du fichier assets/popupSlider.html ajoutez un nouveau bloc au conteneur avec l'identifiant slider-wrapper :

    Texte

    En principe, vous pouvez simplement copier un fichier similaire existant et modifier le chemin d'accès au fichier image et le texte de la signature (si cela est nécessaire).

    Vous devrez également ajouter un nouvel élément de navigation sous la forme d'un cercle, car... Pour le moment, son ajout automatique n'a pas encore été mis en œuvre. Pour ce faire, vous devrez ajouter le code suivant au conteneur avec l'identifiant slider-nav, en l'écrivant à la toute fin :

    La valeur de l'attribut data-slide doit être supérieure à la plus grande valeur des autres éléments. Il suffit simplement d'augmenter le courant maximum de un.

    Emballer le carrousel JS dans un seul script

    Ça y est, le slider JavaScript est prêt et connecté. Personnellement, je recommande d'utiliser cette option dans la pratique si vous en avez besoin :)

    Pour accélérer son fonctionnement, vous pouvez d'ailleurs compresser davantage les composants statiques : fichiers CSS, HTML et JavaScript. Je n'ai pas fait cela et je vous ai proposé du code minifié, car il existe désormais de nombreux systèmes de build frontend : Gulp, Grunt, Webpack et autres. Et chacun d'eux possède ses propres algorithmes pour compresser et connecter des fichiers.

    De plus, les résultats réduits peuvent fonctionner différemment selon les systèmes d’exploitation. En général, il y a plusieurs raisons.

    Et les codes sources eux-mêmes, je pense, ne sont pas si lourds qu'ils nécessitent cette procédure. Mais si vous en avez besoin, configurez vous-même la minification, en tenant compte de votre système d'exploitation et de votre collecteur.

    Comme je l'ai écrit au tout début, afin de résoudre la tâche initialement fixée pour moi, j'avais besoin d'obtenir un seul fichier JS pour l'utilisation correcte de mon slider via un service tiers sur le site. Pour cette raison, à proprement parler, je n’ai pas utilisé de bibliothèques tierces toutes faites.

    Ensuite, l'option d'un seul script carrousel JavaScript vous sera utile, car... tout le contenu y sera contenu directement, y compris le code HTML/CSS, qui dans le cas d'une bibliothèque est stocké dans des fichiers séparés.

    Le script dans mon cas se compose de deux parties. La première partie contenait le contenu du fichier popupSlider.js, que je ne présenterai pas une seconde fois. Insérez-le vous-même, en supprimant la description de la méthode loadStatic() et son appel du code de la classe, car nous n'en aurons pas besoin.

    La deuxième partie d'un script de curseur JavaScript unique pour le site est un gestionnaire pour l'événement DOMContentLoaded, qui se produit lorsque le contenu de la page est chargé.

    Là, nous ajouterons le code JS du carrousel à la page HTML/CSS et créerons un objet de la classe Slider, ce qui équivaut à activer le slider lui-même.

    Schématiquement, le code ressemble à ceci :

    /* contenu de popupSlider.js sans décrire la méthode loadStatic() et son appel */ document.addEventListener("DOMContentLoaded", function())( var str = "\ \ /*code css*/ \ /* code html * / "; var div = document.createElement("div"); div.innerHTML = str; document.body.appendChild(div); var aSlider = new Slider("#slider");

    Étant donné que dans mon cas, l'option de téléchargement de fichiers sur le serveur était complètement fermée, j'ai dû télécharger les fichiers image des contrôles du carrousel JavaScript sur le cloud et au lieu des chemins d'accès dans le code HTML et CSS, écrire les liens générés lors économie.

    Si vous ne rencontrez pas de telles difficultés, vous n'avez rien à changer, mais n'oubliez pas de copier les répertoires de la bibliothèque de diapositives et de contrôles sur le serveur et de spécifier les chemins d'accès corrects.

    Slider JS personnalisé - perspectives de développement

    Pour être honnête, je n'ai pas l'intention de m'engager dans un support ciblé et dans le développement de la solution que j'ai créée :) Pour le moment, il existe un tas de curseurs similaires et un petit chariot qui, contrairement au mien, ont leur propre histoire, sont minutieusement testés et sont pris en charge par une large communauté d'utilisateurs et de développeurs.

    Ce n’est en quelque sorte pas intéressant pour moi de commencer tout ce voyage à partir de zéro et de créer un autre vélo, et je n’ai pas vraiment le temps pour cela. Mais, d'un autre côté, ce curseur JavaScript est une excellente opportunité de pratiquer le développement en refactorisant son code et en implémentant de nouvelles fonctions intéressantes qui n'existent peut-être pas encore.

    Donc, si, comme moi, vous avez besoin d'une base de code pour vos expériences et que vous disposez d'au moins un peu de temps libre supplémentaire, copiez le code du curseur JavaScript que j'ai décrit ou rejoignez les contributeurs sur GitHub. Le référentiel est ouvert et j'ai fourni un lien vers celui-ci au début de l'article.

    Si vous souhaitez améliorer vos compétences front-end sur ma création, je peux même vous donner une petite liste de modifications et améliorations dont le code a besoin et qui pourraient vous intéresser au niveau de leur mise en œuvre :

  • créez une configuration externe afin de pouvoir configurer facilement le curseur ;
  • permettre d'intégrer un slider à l'intérieur de la page (actuellement il est conçu uniquement sous forme de pop-up) ;
  • chargement asynchrone du code HTML (désormais synchrone, marqué comme obsolète par de nombreux navigateurs) ;
  • packager la bibliothèque sous forme de package, NPM, Bower ou autre package afin qu'elle puisse être installée et les dépendances gérées à l'aide de gestionnaires de packages ;
  • rendre la mise en page adaptative pour l'utilisation du carrousel JS sur divers appareils ;
  • effectuer un changement de diapositive en fonction de l'événement Swipe pour les utilisateurs mobiles.
  • La liste des modifications que j'ai apportées n'est bien entendu pas définitive et peut être complétée. Écrivez vos suggestions, pensées et souhaits dans les commentaires sous l'article et partagez-les avec vos amis via les réseaux sociaux pour les impliquer également dans le développement.

    Je vous demande de ne pas juger strictement mon code, car, comme je l'ai déjà dit, je ne me considère pas comme un spécialiste du Frontend et je ne le suis pas. Je suis également ouvert à tous vos commentaires sur le style de codage et j'espère pouvoir apprendre quelque chose de vous et de moi, c'est-à-dire remplir l'objectif principal de développer et de prendre en charge des produits OpenSource.

    Rejoignez les communautés du projet, abonnez-vous aux mises à jour et vous pouvez même m'aider financièrement en utilisant le formulaire juste sous l'article lui-même, si j'ai pu vous aider avec quelque chose ou si vous aimez simplement ce que je fais :)

    C'est tout ce que je voulais dire ! Tous mes vœux! 🙂

    P.S. : si vous avez besoin d'un site Internet ou si vous devez apporter des modifications à un site existant, mais que vous n'avez ni le temps ni l'envie pour cela, je peux vous proposer mes services.

    Plus de 5 ans d'expérience dans le développement de sites Web professionnels. Travailler avec PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular et d'autres technologies de développement Web.

    Expérience dans le développement de projets à différents niveaux : pages de destination, sites Web d'entreprise, boutiques en ligne, CRM, portails. Y compris le support et le développement de projets HighLoad. Envoyez vos candidatures par email [email protégé].

    Bonjour à tous!
    Les développeurs de tous bords, lors de la création de leur prochain projet Web, s'intéressent souvent à la question de savoir comment présenter à leurs utilisateurs différents types d'images, qu'il s'agisse de photographies ou d'ensembles d'images. Pour cela, les esprits curieux de l'espace en ligne, pour la plupart bien sûr un espace « bourgeois », recherchent de plus en plus de nouvelles solutions pour créer des diaporamas et des galeries de photos spectaculaires, colorés et surtout fonctionnels. Pour la plupart, ils sont personnalisés par les développeurs pour s'adapter à la conception du modèle du projet Web en cours de création, ou sous forme de plugins et de modules pour un moteur de gestion de site spécifique. Cela vaut la peine d’examiner les modèles modernes car aucun thème, à de rares exceptions près, ne peut se passer d’une sorte de curseur de plug-in ou d’un simple rotateur d’image. Il est donc compréhensible que de nombreux développeurs Web souhaitent avoir quelque chose comme ça dans leur arsenal et surprendre au maximum leurs lecteurs en présentant efficacement des images sur leurs sites.

    Poursuivant la série en cours d'examen des nouvelles solutions émergentes lors de la création, j'ai décidé de rassembler une collection plus complète des diaporamas et des galeries de photos les plus intéressants et les plus efficaces que j'ai jamais rencontrés, créés en utilisant la magie de jQuery.
    Je tiens à vous prévenir tout de suite que les ressources évoquées dans la revue sont principalement en anglais, mais je pense que celui qui en a besoin le comprendra intuitivement ou avec l'aide de traducteurs, qui sont au nombre de dix cents. Et si vous cherchez assez, vous pouvez trouver des descriptions de la technique de création de certaines galeries et sliders en russe, puisque beaucoup de nos développeurs Web traduisent tout en travaillant sur un projet particulier, d'abord pour eux-mêmes, puis publient des descriptions détaillées de toutes leurs manipulations. pour un accès gratuit.
    Par exemple, c'est ce que j'ai fait, lorsque je travaillais sur le mécanisme de création, j'ai d'abord trouvé une option de galerie qui me convenait dans le burzhunet, je l'ai traduite pour une meilleure compréhension de ce que je faisais, et à l'avenir il s'est avéré, je l'espère, un bon article sur l'utilisation du script Highslide, avec des exemples de travail dans diverses variantes d'application.
    Et donc, assez de paroles inutiles, passons directement à la critique, regardons, lisons de brèves explications et choisissons parmi un grand nombre de nouveaux plugins et scripts jQuery pour implémenter des curseurs d'images, des galeries de photos, des diaporamas intéressants sur vos sites : avec curseurs de changement automatique et manuel, curseurs d'image de fond, avec et sans vignettes, etc. et ainsi de suite...

    Du.Site | Démo

    Une galerie d'images jQuery complète et personnalisable avec des éléments de diaporama, des effets de transition et plusieurs options d'album. Compatible avec tous les navigateurs de bureau et mobiles modernes.

    Un tutoriel sur la façon de créer une galerie plein écran à l'aide de jQuery. L'idée est qu'une vignette de l'image plein écran présentée apparaisse sur le côté, avec un reflet lorsque vous vous déplacez dans les images à l'aide des flèches ou d'un clic de souris. Les grandes images montent ou descendent dans un style de diaporama en fonction de la transition que vous choisissez. La possibilité de redimensionner l'image, ce qui rend l'image en arrière-plan visible en mode plein écran ou ajustée à la taille de la page.

    Curseur de parallaxe

    Parallax Slider est une solution intéressante pour organiser l'affichage d'images sous forme de diaporama avec des éléments de contrôle manuels. Le placement original des images miniatures attire l'attention. Le site officiel présente une description complète de la façon d'intégrer et de configurer le curseur.

    La galerie de diaporamas minimalistes avec jQuery est une excellente galerie d'images avec des éléments permettant de changer automatiquement les images, ainsi que la possibilité de contrôler manuellement l'affichage et de sélectionner des images dans un bloc déroulant avec une grille de vignettes. L'un des inconvénients est le manque de visualisation d'images en taille réelle, mais c'est le minimalisme de cette galerie.

    Il s'agit d'un diaporama plein écran avec des images qui changent automatiquement, sans effets époustouflants, tout est simple et de bon goût.

    Minimit Gallery est un plugin jQuery hautement personnalisable avec un large choix de transitions d'images. À l'aide de la galerie Minimit, vous pouvez organiser un affichage d'images sous la forme d'un carrousel, d'un diaporama, d'un simple rotateur et d'un défileur d'images classique.

    est un petit plugin jQuery (2 Ko) qui fournit un moyen simple et pratique d'afficher des images sous forme de diaporama.

    est une jolie galerie javascript, avec des commandes intuitives et une compatibilité transparente sur tous les ordinateurs, iPhones et appareils mobiles. Très facile à installer et à configurer

    Contrairement à de nombreux curseurs d'images Javascript et jQuery, Slider.js est une solution hybride, alimentée par des transitions et des animations CSS3.

    Il s'agit d'un modèle d'une page permettant de créer diverses présentations en HTML5 et CSS3.

    Diapo slideshow est un projet open source. Si vous le souhaitez, vous pouvez suggérer des modifications ou des améliorations. Vous pouvez le télécharger et l'utiliser gratuitement, et rien ni personne ne vous empêche d'utiliser ce slider dans vos projets. Le curseur est facile à personnaliser, il y a des transitions intéressantes entre le contenu présenté, et vous pouvez placer n'importe quoi dans le curseur, cela fonctionne assez rapidement, sans aucun montant.

    n'est rien de plus qu'un autre outil pour créer des diaporamas sur des sites Web et autres projets Web. Prend en charge tous les navigateurs modernes, les animations horizontales et verticales, la prise en charge des transitions personnalisées, l'API de rappel et bien plus encore. Vous pouvez utiliser n'importe quel élément HTML dans vos diapositives, il est compréhensible et accessible aux débutants et est distribué entièrement gratuitement.

    Diaporama JavaScript pour le développement agile

    Implémentez vos diaporamas avec ce génial plugin jQuery. Outil hautement personnalisable vous permettant de créer votre présentation de contenu en fonction de vos besoins. Pour faciliter l'intégration avec des données externes ou des données de votre CMS, le . Il s'agit d'une nouvelle version écrite à partir de zéro. Les développeurs ont essayé de décrire l'ensemble du processus de travail avec leur idée de manière très claire et intelligible.

    est un plugin jQuery qui permet de transformer des listes non ordonnées en diaporamas avec des effets d'animation attrayants. Dans un diaporama, vous pouvez afficher une liste de diapositives, soit à l'aide de chiffres ou de vignettes, soit à l'aide des boutons Précédent et Suivant. Le curseur propose de nombreux types d'animation originaux, notamment un cube (avec différents sous-types), un tuyau, un bloc et bien plus encore.

    Un ensemble complet d'outils pour organiser toutes sortes de présentations de contenus variés sur vos projets Web. Les gars bourgeois ont fait de leur mieux, y compris presque tous les types de curseurs et de galeries en utilisant la magie de jQuery. Curseur de photos, galerie de photos, diaporama dynamique, carrousel, curseur de contenu, menu à onglets et bien plus encore, en général, il y a de la place pour que notre imagination irrépressible puisse se déchaîner.

    Il s'agit d'un plugin de diaporama jQuery conçu dans un souci de simplicité. Seul l'ensemble des fonctions les plus utiles est proposé, à la fois pour les développeurs débutants et avancés, offrant la possibilité de créer des diaporamas simples, mais en même temps très efficaces et conviviaux.

    — un simple slider construit sur jQuery, simple à tous égards, ne nécessitant pas de compétences particulières, je pense que beaucoup le trouveront utile pour implémenter des diaporamas sur leurs sites Web. Le plugin a été testé dans tous les navigateurs modernes, y compris le lent navigateur IE.

    jbgallery est une sorte de widget d'interface utilisateur écrit en javascript de la bibliothèque jQuery. Sa fonction est d'afficher une grande image en arrière-plan du site en mode plein écran, plusieurs images sous forme de curseur. Tous les modes d'affichage ont des commandes d'affichage. C’est une solution intéressante à sa manière, et dans certains cas, elle n’est même pas standard.

    Il s'agit d'un plugin jQuery facile à utiliser pour afficher vos photos sous forme de diaporama avec des effets de transition entre les images (vous en avez vu des plus intéressantes). jqFancyTransitions est compatible et largement testé avec Safari 2+, Internet Explorer 6+, Firefox 2+, Google Chrome 3+, Opera 9+.

    est un plugin jQuery distribué gratuitement pour visualiser des images et d'autres informations sous la forme Lightbox. Fenêtre popup avec contrôles, fond ombré et tout ça, simple et de bon goût.

    Un autre plugin jQuery de la série Lightbox, bien qu'il pèse scandaleusement peu (9 Ko), mais possède une tonne de fonctionnalités. Il existe une interface bien conçue que vous pouvez toujours améliorer ou personnaliser à l'aide de CSS.

    Déjà d'après le nom, il devient clair qu'il n'y a rien d'extraordinaire, nous avons un défileur d'image automatique très simple, avec des commandes complètement manquantes. Qui sait, peut-être que ce slider attirera votre attention précisément par son minimalisme.

    Rotateur d'image avec différents types de transitions. Il fonctionne à la fois automatiquement et en cliquant, et est assez simple à configurer.

    - une galerie d'images à part entière plutôt qu'un simple curseur. Aperçu des vignettes et possibilité de sélectionner des effets de transition, prise en charge complète de tous les navigateurs, description détaillée de l'intégration dans un projet Web et distribution gratuite.

    Il s'agit d'une implémentation de diaporamas prêts à l'emploi utilisant scriptaculous/prototype ou jQuery. Horinaja est une solution quelque peu innovante car elle permet d'utiliser une molette pour faire défiler le contenu placé dans le slider. Lorsque le pointeur de la souris se trouve en dehors de la zone du diaporama, le défilement s'effectue automatiquement ; lorsque le pointeur est placé sur le diaporama, le défilement s'arrête.

    Il s'agit d'une fonctionnalité issue d'une série de défileurs d'images simples, bien qu'avec des commandes de visualisation, et fonctionne donc en mode automatique et manuel.

    s3Slider est un plugin jQuery qui crée un diaporama à partir d'une liste non ordonnée d'images et peut être facilement implémenté sur n'importe quelle plateforme Web.

    Il s'agit d'un plugin jQuery optimisé pour traiter de gros volumes de photos tout en économisant de la bande passante.

    Fond de Las Vegas

    Le plugin Vegas Background jQuery vous permet d'ajouter de superbes images d'arrière-plan en plein écran aux pages Web, le tout avec des éléments de diaporama. Si vous étudiez attentivement les subtilités du travail avec le plugin, vous pouvez trouver de nombreuses solutions intéressantes, bien sûr, uniquement si vous en avez besoin.

    — un slider comme un slider, ni plus, ni moins, avec des légendes d'images ou des annonces d'articles et des contrôles simples, au hasard.

    est un javascript léger (environ 5 Ko) pour organiser la visualisation des images. Le redimensionnement et la mise à l'échelle automatiques des grandes images vous permettent de visualiser l'image en taille réelle dans la fenêtre du navigateur.

    La version 4 de la galerie d'images PikaChoose jQuery est disponible ! Pikachoose est un diaporama jQuery léger avec d'excellentes fonctionnalités ! Intégration avec Fancybox, d'excellents thèmes (mais pas gratuits) et bien plus encore sont proposés à votre attention par les développeurs de plugins.

    Vérifie le nombre d'images dans votre annonce et crée dynamiquement un ensemble de liens photo comme navigation numérique. De plus, cliquer sur chaque image vous fera avancer ou reculer, et vous pourrez également faire défiler les images en fonction de la zone sur laquelle vous cliquez sur l'image (par exemple : cliquer sur le côté gauche de l'image déplacera les diapositives d'avant en arrière, respectivement, pour le côté droit de l’image).

    Un autre curseur jQuery qui s'intégrera parfaitement dans n'importe quel modèle WordPress.

    Un autre développement de "Nivo", comme tout ce que font les gars de ce studio, le plugin est réalisé avec une haute qualité, contient 16 effets de transition uniques, une navigation au clavier et bien plus encore. Cette version inclut un plugin dédié directement pour WordPress. Alors pour tous les fans de ce moteur de blog, Nivo Slider sera fait pour vous.

    Plugin jQuery qui vous permet de créer rapidement un slider simple, efficace et esthétique pour des images de toute taille.

    Pirobox est un script jQuery « lightbox » léger, la visualisation s'effectue dans un bloc pop-up qui s'ajuste automatiquement à la taille de l'image, avec tous les contrôles.

    Les créateurs de cette galerie proposent une présentation des clichés assez originale. Les images sont affichées en miniatures sous forme de vague, lorsque vous cliquez sur la vignette, nous verrons une version de taille moyenne de l'image, cliquez une seconde fois et vous verrez une grande image. Vous pouvez considérer cela comme une expérience, mais vous devez admettre que quelque chose de nouveau et d'inhabituel est toujours intéressant.

    Diaporama plein écran avec HTML5 et jQuery

    Pour créer des diaporamas et afficher des images en mode plein écran, les développeurs ont utilisé le plugin Vegas jQuery déjà familier, qui contient de nombreuses idées et techniques précédemment décrites en détail dans les articles du groupe. La présence d'éléments audio HTML5 et le style des transitions entre les images sont attrayants.

    Encore un développement de l'équipe Codrops, une galerie d'images à part entière et fonctionnelle, mais ça ne sert à rien de la décrire, il faut la voir.

    Diaporama d'images, les images disparaissent sous vos yeux, l'effet est tout simplement merveilleux.

    Est un framework de galerie d'images JavaScript construit sur la bibliothèque jQuery. L'objectif est de simplifier le processus de développement d'une galerie d'images professionnelle pour le Web et les appareils mobiles. Vous pouvez le visualiser dans une fenêtre pop-up ou en mode plein écran.

    Nous commençons tranquillement à nous y habituer et attendons de nouvelles œuvres de l'équipe Codrops. Veuillez obtenir un excellent curseur d'image avec un magnifique effet de transition 3D pour afficher les images en mode plein écran.

    Un autre plugin WordPress de la série des organisateurs de diaporamas. S'intègre facilement dans presque n'importe quelle conception et offre de nombreuses options de personnalisation pour les utilisateurs expérimentés et non expérimentés.

    Autre plugin écrit pour WordPress, il facilitera grandement l'organisation d'un diaporama d'images ou de tout autre contenu sur vos blogs.

    Un bon plugin de diaporama pour l'intégration dans WordPress. Xili-foom-slideshow est installé automatiquement et les paramètres personnels sont également autorisés.

    Slimbox2 est un plugin WordPress bien établi pour afficher des images avec un effet Lightbox. Prend en charge le diaporama automatique et le redimensionnement des images dans la fenêtre du navigateur. Et en général, ce plugin présente de nombreux avantages par rapport aux autres plugins de cette série.

    Ce plugin/widget vous permet de créer des diaporamas et des présentations dynamiques et contrôlés pour votre site Web ou blog fonctionnant sur le moteur WordPress.

    Ce plugin WordPress transforme les images de galerie intégrées en un diaporama simple et flexible. Le plugin utilise le curseur d'image FlexSlider jQuery et les paramètres personnels de l'utilisateur.

    est un plugin WordPress permettant d'organiser des diaporamas de photos, des images provenant de flux RSS SmugMug, Flickr, MobileMe, Picasa ou Photobucket, des travaux et des affichages en Javascript pur.

    Un simple curseur pour WordPress et plus encore. Rien de superflu ni d'encombrant, le travail est réalisé dans un style minimaliste, l'accent est mis sur la stabilité et la rapidité, il se connecte parfaitement au moteur de gestion du blog.

    À mon avis, Skitter est l'un des meilleurs curseurs prenant en charge le travail avec WordPress. Je suis attiré par la stabilité et la rapidité de fonctionnement, les commandes pas trop proéminentes, les effets de transition et une connexion assez simple avec le thème.

    est un plugin pour WordPress avec lequel vous pouvez organiser facilement et rapidement une galerie d'images sur votre site Web avec la possibilité de la visualiser en mode diaporama. L'affichage peut être soit automatique, soit entièrement contrôlé avec démonstration de vignettes et de légendes d'images.

    Du.Site | Démo

    Affiche toutes les images d'un article/d'une page sous forme de diaporama. Installation facile. Ce plugin nécessite Adobe Flash pour la version avec animations de transition, si Flash n'est pas trouvé le slider fonctionne comme d'habitude.

    Un autre curseur simple pour WordPress, il affiche des images pour les publications et de courtes annonces d'articles. J'utilise de temps en temps un tel plugin sur ce blog.

    Meteor Slides est un curseur WordPress jQuery proposant plus de vingt styles de transition. L'auteur a qualifié le plugin de « météore », ce qui implique probablement la rapidité de fonctionnement ; peut-être que je n'ai rien remarqué de météore.

    oQey Gallery est une galerie d'images à part entière avec des éléments de diaporama pour WordPress, avec des fonctionnalités vidéo et musicales intégrées.

    Il s'agit d'un diaporama avec des éléments d'animation flash permettant de visualiser des images et des vidéos sur des sites Web et des blogs. Vous pouvez placer ce curseur sur n'importe quel site Web, dans n'importe quelle taille et avec n'importe quel contenu que vous aimez.

    Le plugin Flash Gallery transforme vos galeries habituelles en superbes murs d'images, avec prise en charge de plusieurs albums par publication, affichage plein écran et mode diaporama.

    WOW Slider est un curseur d'image jQuery pour WordPress avec des effets visuels étonnants (Explosion, Fly, Blinds, Squares, Fragments, Basic, Fade, Stack, Vertical Stack et Linear) et des modèles conçus par des professionnels.

    Promotion Slider est un plugin jQuery qui facilite la création d'un simple diaporama ou la mise en œuvre de plusieurs zones d'annonces tournantes sur une page, car il s'agit d'un outil hautement personnalisable, vous aurez un contrôle total sur ce que vous affichez dans le curseur et sur comment le module fonctionne généralement.

    | Démo

    Nouveau dans la version 2.4 : prise en charge du tri des photos par glisser-déposer directement via l'éditeur WordPress, ainsi que la possibilité d'ajouter des liens de photos vers les images principales. (IE8 peut avoir quelques bugs, fonctionne bien dans tous les principaux navigateurs. Les auteurs promettent une prise en charge complète d'IE8 à l'avenir.)

    | Démo

    L'accord final de cette revue sera ce plugin pour WordPress, un autre curseur avec des effets visuels intéressants pour sélectionner et modifier des images.

    Je regarde tout ce qui est décrit ci-dessus et je suis étonné de voir quelle envolée de fantaisie ces gens ont, mais ce n'est pas tout ce que divers développeurs Web ont proposé ces derniers temps sur le thème de l'organisation des images sur des projets Web. C'est formidable qu'il soit désormais possible de mettre en œuvre des solutions aussi merveilleuses pour créer des galeries et des diaporamas.
    J'ose espérer tranquillement que dans cette collection vous trouverez quelque chose d'intéressant pour vous-même, créerez votre propre galerie ou slider unique, pour le plus grand plaisir de vos utilisateurs et, bien sûr, de votre moi bien-aimé, et que serions-nous sans cela...

    Lorsque vous développez un projet Web, vous vous surprenez probablement à penser qu'il serait bien de trouver des galeries de photos ou des diaporamas simples mais utiles. Mais imaginez qu'un grand nombre de galeries développées en AJAX, CSS, javascript, Lightbox et Flash soient déjà entre vos mains ! Nous espérons que cet article vous sera extrêmement utile et que vous pourrez trouver exactement ce que vous cherchiez.

    Scripts de diaporama et lightbox gratuits

    Il s'agit d'une galerie Flash gratuite conçue par Christopher Einarsrud.


    Créez des présentations, des diaporamas et des bannières éblouissants à l'aide d'Active Slideshow Pro. L'utilitaire vise à augmenter les chances de succès lors de la création de diaporamas et vous permet de contrôler les diapositives, le texte, les transitions et l'audio.


    Sélectionnez vos images préférées pour remplir tout l'écran. Cette application, basée sur une combinaison des technologies PicLens et Media RSS, vous permet d'ajouter facilement des diaporamas à votre propre site Web. Ces galeries exportées peuvent également être utilisées comme pages Web à part entière.


    Il s'agit d'une nouvelle génération de systèmes de galerie de photos gratuits. L'application Web n'est pas encombrée de fonctions et de paramètres inutiles. Mais cela ne veut pas dire que l'utilitaire est mauvais : il peut vous offrir ce dont vous avez besoin pour travailler avec des images.


    Il s'agit d'un service en ligne permettant de visualiser presque tous les formats multimédias publiés sur Internet. Le service est écrit en javascript et CSS, c'est pourquoi il est facile de le concevoir comme vous le souhaitez.


    Créer des transitions entre les images.


    Galleriffic s'est inspiré du plugin Cycle créé par Mike Alsup. Mais avec des fonctionnalités permettant de produire de gros volumes de photographies.



    Un utilitaire permettant d'afficher des images, du contenu HTML et du multimédia dans un style lightbox Mac qui flotte à la surface d'une page Web.


    Si vous créez une jolie petite galerie, une mise en page faite à la main fera très bien l'affaire. Mais si nous parlons de grandes galeries, il est peu probable que vous souhaitiez écrire tout cela manuellement ; il existe d'autres moyens, à savoir la génération automatique de galerie !

    Galerie d'images dynamiques et diaporama - ne fonctionne plus



    Tout le monde a probablement déjà vu le site Web de Barack Obama, qui est clairement le meilleur de ces sites Web conçus pour les candidats à la présidentielle. Il illustre non seulement un design créatif moderne, mais offre également une facilité d'utilisation et de navigation.


    Un plugin jQuery qui détecte automatiquement l'extension de chaque fichier multimédia et l'ajoute au lecteur approprié.


    Une galerie gratuite développée sur une plateforme compacte, modulaire et orientée objet utilisant la bibliothèque javascript MooTools. Pointez-le vers un dossier contenant des images et il les téléchargera automatiquement en utilisant PHP.


    Flickrshow est un diaporama JavaScript léger et multi-navigateur qui offre un moyen simple d'afficher des images Flickr sur les pages de votre site.

    Protoflow - la ressource a cessé d'exister


    L'application est écrite en javascript en utilisant Prototype et Scriptaculous pour faire le gros du travail. Il utilise également Reflection.js pour créer un reflet de l'image.


    Un très beau modèle développé en Flash. Chaque image que vous retournez laisse un petit reflet sur le sol. Les dimensions des images affichées sont modifiées dans les fichiers modèles. Il est également très simple d'ajouter une image d'arrière-plan.


    Une galerie de photos développée en AJAX et destinée à faciliter la gestion. Basé sur javascript et la bibliothèque AJAX pour MooTools. Aucun script côté serveur requis ! La connaissance de Flash n'est pas non plus requise. Même si vos images se trouvent sur Flickr, SmugMug ou sur votre propre serveur, cet utilitaire pourra les afficher.



    Une application Web gratuite qui vous permet d'afficher des images Flickr ou Picasa sur votre blog ou site Web.


    Galerie de photos avec des transitions fluides, des pictogrammes et des reflets agréables.


    Visionneuse d'images Flash gratuite avec la possibilité de modifier le design. L'interface se compose d'un grand nombre de cartes postales éparpillées autour de la table.


    Une plateforme javascript qui vous permet de développer rapidement des pages Web en utilisant AJAX. Vous ne comprenez rien au javascript ? Ce n'est plus un problème. L'application est conçue pour ressembler davantage à HTML et CSS, afin que toute personne ayant une connaissance de base en création de sites Web puisse également créer la prochaine génération d'applications Web en utilisant AJAX.






    Ce modèle utilise l'excellent javascript Lightbox développé par Lakesh Dakar.


    Un créateur d'albums photo qui vous permet de créer et de publier des galeries de photos riches et interactives sur votre site Web.


    Cette application vous permet de publier des galeries de photos sur votre site internet, même si vous n'y comprenez rien à la programmation web. Tout cela grâce à la plateforme javascript MooTools. Ajoutez simplement quelques fichiers javascript et CSS.



    Visionneuse d'images Flash 3D gratuite avec la possibilité de modifier le design.

    Publications sur le sujet