2017-07-06 5 views
0

J'ai regardé autour mais je n'ai rien trouvé, veuillez voir ci-dessous pour mon code. En ayant cela à l'esprit, j'ai juste besoin de pouvoir mettre en pause l'animation sur le pointeur de la souris.Pause jQuery sur Hover (Mouse Over)

Toute aide est grandement appréciée!

(function ($) { 
 
\t $.fn.textSlider = function (options) { 
 

 
\t \t /* Default settings */ 
 
\t \t var settings = $.extend(
 
\t \t \t { 
 
\t \t \t \t timeout: 2000, 
 
\t \t \t \t slideTime: 750, 
 
\t \t \t }, 
 
\t \t \t options 
 
\t \t); 
 

 
\t \t var nextItem; 
 

 
\t \t var currentItem = 0; 
 
\t \t var count = 0; 
 

 
\t \t this.children('.slider-item').each(
 
\t \t \t function() 
 
\t \t \t { 
 
\t \t \t \t $(this).addClass('slide-' + (count)) 
 
\t \t \t \t \t .css(
 
\t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t //opacity: \t 0, 
 
\t \t \t \t \t \t \t //paddingTop: \t '100px', 
 
\t \t \t \t \t \t \t //paddingBottom: '0px' 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t); 
 
\t \t \t \t $(this).hide(); 
 
\t \t \t \t count++; 
 
\t \t \t } 
 
\t \t); 
 

 
\t \t function firstSlide() 
 
\t \t { 
 
\t \t \t $('.slide-' + currentItem).show().animate({ 
 
\t \t \t \t //paddingTop: '0px', paddingBottom: '50px', 
 
\t \t \t \t opacity: 1 }, settings.slideTime); 
 

 
\t \t \t setTimeout (transition, settings.timeout); 
 
\t \t } 
 

 
\t \t function transition() 
 
\t \t { 
 
\t \t \t nextItem = parseInt (currentItem + 1); 
 

 
\t \t \t if (nextItem >= count) 
 
\t \t \t \t nextItem = 0; 
 

 
\t \t \t $('.slide-' + currentItem).animate({ 
 
\t \t \t \t //paddingTop: '100px', paddingBottom: '0px', 
 
\t \t \t \t opacity: 0 }, settings.slideTime, function() { 
 
\t \t \t \t \t $(this).hide(); 
 
\t \t \t \t \t $('.slide-' + nextItem).show().animate({ 
 
\t \t \t \t \t \t //paddingTop: '0px', paddingBottom: '50px', 
 
\t \t \t \t \t \t opacity: 1 }, settings.slideTime); 
 
\t \t \t }); 
 

 
\t \t \t currentItem = nextItem; 
 
\t \t \t setTimeout (transition, settings.timeout); 
 
\t \t } 
 
\t \t return firstSlide(); 
 
\t }; 
 
}(jQuery)); 
 

 
// Start the Text Slider 
 
\t $('.slide').textSlider({ 
 
\t \t timeout: 5000, 
 
\t \t slideTime: 650, 
 
\t \t loop: 1 
 
\t });
/* Main Message & Text */ 
 
.main-message { 
 
\t font-size: 150%; 
 
\t font-weight: bold; 
 
\t padding-bottom: 20px; 
 
\t margin-left: 20px; 
 
} 
 
.main-text { 
 
\t font-size: 110%; 
 
\t margin-left: 20px; 
 
}
<!-- Start Text Slider --> 
 
\t \t <div class="slide"> 
 
\t \t \t <div class="slider-item"> 
 
\t \t \t \t <div class="main-message">Test 1</div> 
 
\t \t \t \t <div class="main-text">Sub text here 1</div> 
 
\t \t \t </div> 
 
\t \t \t <div class="slider-item"> 
 
\t \t \t \t <div class="main-message">Test 2</div> 
 
\t \t \t \t <div class="main-text">Sub text here 2</div> 
 
\t \t \t </div> 
 
\t \t \t <div class="slider-item"> 
 
\t \t \t \t <div class="main-message">Test 3</div> 
 
\t \t \t \t <div class="main-text">Sub text here 3</div> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <!-- End Text Slider --> 
 
    
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

Répondre

2

Dans votre transition de fonction () {... vous pouvez ajouter au début:

// if mouse is hover element call again the settimeout... 
if ($('.slide-' + currentItem + ':hover').length != 0) { 
    setTimeout(transition, settings.timeout); 
    return; 
} 

Un sol différent ution peut être basée sur .hover(), en ajoutant le gestionnaire d'événements suivant:

this.children('.slider-item').hover(
     function (e) { 
      $(this).addClass('hover'); 
     }, 
     function (e) { 
      $(this).removeClass('hover'); 
     } 
); 

et, donc, le changement du premier code proposé avec:

// if element has hover class call again the settimeout... 
if ($('.slide-' + currentItem + '.hover').length != 0) { 
    setTimeout(transition, settings.timeout); 
    return; 
} 

L'extrait:

(function ($) { 
 
    $.fn.textSlider = function (options) { 
 

 
     /* Default settings */ 
 
     var settings = $.extend(
 
       { 
 
        timeout: 2000, 
 
        slideTime: 750, 
 
       }, 
 
       options 
 
     ); 
 

 
     var nextItem; 
 

 
     var currentItem = 0; 
 
     var count = 0; 
 

 
     this.children('.slider-item').each(function() { 
 
        $(this).addClass('slide-' + (count)) 
 
          .css({ 
 
           //opacity: \t 0, 
 
           //paddingTop: \t '100px', 
 
           //paddingBottom: '0px' 
 
          } 
 
        ); 
 
        $(this).hide(); 
 
        count++; 
 
       } 
 
     ); 
 
     
 
     this.children('.slider-item').hover(
 
       function (e) { 
 
        $(this).addClass('hover'); 
 
       }, 
 
       function (e) { 
 
        $(this).removeClass('hover'); 
 
       } 
 
     ); 
 

 

 
     function firstSlide() { 
 
      $('.slide-' + currentItem).show().animate({ 
 
       //paddingTop: '0px', paddingBottom: '50px', 
 
       opacity: 1 
 
      }, settings.slideTime); 
 

 
      setTimeout(transition, settings.timeout); 
 
     } 
 

 
     function transition() { 
 
      if ($('.slide-' + currentItem + '.hover').length != 0) { 
 
       setTimeout(transition, settings.timeout); 
 
       return; 
 
      } 
 
      nextItem = parseInt(currentItem + 1); 
 

 
      if (nextItem >= count) 
 
       nextItem = 0; 
 

 
      $('.slide-' + currentItem).animate({ 
 
       //paddingTop: '100px', paddingBottom: '0px', 
 
       opacity: 0 
 
      }, settings.slideTime, function() { 
 
       $(this).hide(); 
 
       $('.slide-' + nextItem).show().animate({ 
 
        //paddingTop: '0px', paddingBottom: '50px', 
 
        opacity: 1 
 
       }, settings.slideTime); 
 
      }); 
 

 
      currentItem = nextItem; 
 
      setTimeout(transition, settings.timeout); 
 
     } 
 

 
     return firstSlide(); 
 
    }; 
 
}(jQuery)); 
 

 

 
// Start the Text Slider 
 
$('.slide').textSlider({ 
 
    timeout: 1000, 
 
    slideTime: 350, 
 
    loop: 1 
 
});
.main-message { 
 
    font-size: 150%; 
 
    font-weight: bold; 
 
    padding-bottom: 20px; 
 
    margin-left: 20px; 
 
} 
 

 
.main-text { 
 
    font-size: 110%; 
 
    margin-left: 20px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 

 

 
<div class="slide"> 
 
    <div class="slider-item"> 
 
     <div class="main-message">Test 1</div> 
 
     <div class="main-text">Sub text here 1</div> 
 
    </div> 
 
    <div class="slider-item"> 
 
     <div class="main-message">Test 2</div> 
 
     <div class="main-text">Sub text here 2</div> 
 
    </div> 
 
    <div class="slider-item"> 
 
     <div class="main-message">Test 3</div> 
 
     <div class="main-text">Sub text here 3</div> 
 
    </div> 
 
</div>

+1

Merci, cela a fonctionné! Une dernière chose que j'aimerais ajouter est la navigation par balle au bas des textes, alors faites défiler d'un texte à l'autre. Mais sinon c'est génial jusqu'à présent: D –

+0

@LuisM Merci beaucoup. Pour la puce, vous devez faire plus de changements: lecture automatique: marche/arrêt, étapes .... – gaetanoM

+0

@LuisM Pour les balles, vous pouvez prendre un lokk à [Pure CSS Slider - autoplay, kenburns, prev/next, balles - pas de js !] (https://codepen.io/hw/pen/biEBz) – gaetanoM

0

Par défaut, jQuery ne prend pas en charge la pause des animations, mais, comme d'habitude, il y a un plugin pour que: http://tobia.github.io/Pause/

+0

vous pourriez sur hover cloner le '$ ('. Slide-' + cur itemIrem) ', cache le curseur et ajoute l'élément cloné au conteneur du curseur, puis à la souris, supprime l'élément clone et rend le curseur visible ... garde également la trace de' currentItem' pour que vous puissiez assigner la même valeur à le curseur et le fait sembler continu ... –

+1

L'animation originale continuerait à tourner même si l'élément est caché, donc quand vous le montrerez à nouveau, il y aura un saut soudain dans l'opacité. Vous pourriez peut-être contourner ce problème, mais il me semble que le code deviendrait rapidement très complexe. –