2016-02-25 1 views
1

Donc, fondamentalement, grâce à une solution que j'ai déjà trouvée sur stackoverflow, j'ai réussi à créer un défilement lisse vers une ancre après 5 secondes.Comment faire défiler en douceur vers une ancre si un utilisateur n'a pas défilé dans 5 secondes?

Le bit que je ne peux pas ajouter à ceci est simplement d'avoir ce déclenchement SEULEMENT si un utilisateur n'a pas déjà défilé dans les 5 secondes car cela peut être une expérience irritante.

J'ai essayé d'ajouter .scrollTo() de différentes façons et de les intégrer dans une autre fonction, mais en dehors de la compréhension de base et de l'ajustement de Javascript, je n'ai pas vraiment de connaissances.

Toute aide serait grandement appréciée.

<script type="text/javascript"> 
/*<![CDATA[*/ 

var zxcScrollTo={ 

Scroll:function(o){ 
    var a=document.getElementById(o.AnchorID),ms=o.Animate,s=!document.body.scrollTop?[document.documentElement.scrollLeft,document.documentElement.scrollTop]:[document.body.scrollLeft,document.body.scrollTop]; 
    if (a){ 
    this.animate(this,s,this.pos(a),new Date(),typeof(ms)=='number'&&ms>0?ms:1000); 
    } 
}, 

animate:function(o,f,t,srt,mS){ 
    clearTimeout(o.to); 
    var ms=new Date()-srt,x=(t[0]-f[0])/mS*ms+f[0],y=(t[1]-f[1])/mS*ms+f[1]; 
    if (isFinite(x)&&isFinite(y)){ 
    window.scrollTo(x,y); 
    } 
    if (ms<mS){ 
    o.to=setTimeout(function(){ o.animate(o,f,t,srt,mS); },10); 
    } 
    else { 
    window.scrollTo(t[0],t[1]); 
    } 
}, 

pos:function(obj){ 
    var rtn=[0,0]; 
    while(obj){ 
    rtn[0]+=obj.offsetLeft; 
    rtn[1]+=obj.offsetTop; 
    obj=obj.offsetParent; 
    } 
    return rtn; 
} 


} 
setTimeout(function(){ 
    zxcScrollTo.Scroll({ 
    AnchorID:'anchor', 
    Animate:2000 
    }); 
},5000); 

/*]]>*/ 
</script> 

RÉPONSE:

Un grand merci à @ByteHamster.

Ce code utilisateur de défilement lisse à une étiquette d'identification après 5000ms mais ne déclenche pas si l'utilisateur a déjà commencé à défiler:

<script type="text/javascript"> 

var zxcScrollTo={ 

Scroll:function(o){ 
    var a=document.getElementById(o.AnchorID),ms=o.Animate,s=!document.body.scrollTop?[document.documentElement.scrollLeft,document.documentElement.scrollTop]:[document.body.scrollLeft,document.body.scrollTop]; 
    if (a){ 
    this.animate(this,s,this.pos(a),new Date(),typeof(ms)=='number'&&ms>0?ms:1000); 
    } 
}, 

animate:function(o,f,t,srt,mS){ 
    clearTimeout(o.to); 
    var ms=new Date()-srt,x=(t[0]-f[0])/mS*ms+f[0],y=(t[1]-f[1])/mS*ms+f[1]; 
    if (isFinite(x)&&isFinite(y)){ 
    window.scrollTo(x,y); 
    } 
    if (ms<mS){ 
    o.to=setTimeout(function(){ o.animate(o,f,t,srt,mS); },10); 
    } 
    else { 
    window.scrollTo(t[0],t[1]); 
    } 
}, 

pos:function(obj){ 
    var rtn=[0,0]; 
    while(obj){ 
    rtn[0]+=obj.offsetLeft; 
    rtn[1]+=obj.offsetTop; 
    obj=obj.offsetParent; 
    } 
    return rtn; 
} 


} 

var wasScrolled = false; 

window.onscroll = function() { 
    wasScrolled = true; 

} 

function doSmoothScrollToAnchor() { 
    if (wasScrolled === false) { 
     zxcScrollTo.Scroll({ 
      AnchorID: 'anchor', 
      Animate: 2000 
     }); 
    } 
} 

setTimeout(doSmoothScrollToAnchor, 5000); 


</script> 
+2

pourquoi avez-vous besoin de faire cela ?? juste dire si l'utilisateur n'a pas fait défiler mais est en train de lire quelque chose sur l'écran? son irritant si la page défile sur son propre – RRR

+0

@RRR, la page a été construite pour être visuellement esthétique au-dessus du pli avec le contenu principal sous le pli. Contre la norme, cela fonctionne bien. Le défilement après un délai est simplement de faire passer les utilisateurs au contenu après environ 5 secondes, ce qui est tout le temps nécessaire pour prendre en charge ce qui est au-dessus du pli après le chargement de la page. Si un utilisateur a déjà fait défiler vers le bas ou a commencé à ne pas déclencher l'autoscroll. – Louis

+0

dans ce cas après 5 secondes, vous devriez vérifier si le 'scrollTop <= element.height' si vrai défilement ne fait rien car l'utilisateur a déjà fait défiler – RRR

Répondre

0

// Set a variable that gets changed as soon as the user scrolls: 
 
var wasScrolled = false; 
 
window.onscroll = function() { 
 
    wasScrolled = true; 
 
} 
 

 
// Before actually scrolling via Javascript, check if the page was scrolled manually: 
 
function doSmoothScrollToAnchor() { 
 
    if(wasScrolled === false) { 
 
     alert("Was not scrolled"); 
 
    } else { 
 
     alert("The user scrolled manually"); 
 
    } 
 
} 
 
setTimeout(doSmoothScrollToAnchor, 3000);
Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br /> 
 
Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br /> 
 
Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br /> 
 
Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />Text<br />

+0

Merci pour votre réponse. Ironiquement, même si cela semble faux, je veux forcer le défilement si un utilisateur n'a pas lancé le défilement parce qu'il n'y a pas beaucoup à lire au-dessus du pli. Il se compose d'un logo et d'un curseur court. Je m'excuse, j'aurais dû expliquer cela mieux. Est-il possible de modifier votre solution pour faire presque le contraire? En d'autres termes, ne faites défiler que si un utilisateur n'a pas encore commencé à défiler? – Louis

+0

En outre, je cherche à être une chose une fois que la page a chargé après quoi l'utilisateur peut défiler librement sans plus de direction forcée. – Louis

+0

On dirait que j'ai mal compris votre question.Jetez un oeil à ma réponse mise à jour;) – ByteHamster

0

Essayez la fonction clearTimeout(). Il efface la minuterie et il définit à nouveau pour qu'il recommence :)

var timer = setTimeout(doSmoothScrollToAnchor, 5000); 
 
var scrolled = false; 
 
var zxcScrollTo={ 
 

 
Scroll:function(o){ 
 
    var a=document.getElementById(o.AnchorID),ms=o.Animate,s=!document.body.scrollTop?[document.documentElement.scrollLeft,document.documentElement.scrollTop]:[document.body.scrollLeft,document.body.scrollTop]; 
 
    if (a){ 
 
    this.animate(this,s,this.pos(a),new Date(),typeof(ms)=='number'&&ms>0?ms:1000); 
 
    } 
 
}, 
 

 
animate:function(o,f,t,srt,mS){ 
 
    clearTimeout(o.to); 
 
    var ms=new Date()-srt,x=(t[0]-f[0])/mS*ms+f[0],y=(t[1]-f[1])/mS*ms+f[1]; 
 
    if (isFinite(x)&&isFinite(y)){ 
 
    window.scrollTo(x,y); 
 
    } 
 
    if (ms<mS){ 
 
    o.to=setTimeout(function(){ o.animate(o,f,t,srt,mS); },10); 
 
    } 
 
    else { 
 
    window.scrollTo(t[0],t[1]); 
 
    } 
 
}, 
 

 
pos:function(obj){ 
 
    var rtn=[0,0]; 
 
    while(obj){ 
 
    rtn[0]+=obj.offsetLeft; 
 
    rtn[1]+=obj.offsetTop; 
 
    obj=obj.offsetParent; 
 
    } 
 
    return rtn; 
 
} 
 

 

 
} 
 
function doSmoothScrollToAnchor() { 
 
     zxcScrollTo.Scroll({ 
 
      AnchorID: 'anchor', 
 
      Animate: 2000 
 
     }); 
 
     scrolled = true; 
 
} 
 
window.onscroll = function(e){ 
 
    if(!scrolled){ 
 
\t clearInterval(timer); 
 
    } 
 
}
#div1 { 
 
    width: 100%; 
 
    height: 650px; 
 
    background-color: #444; 
 
} 
 
#anchor{ 
 
    width: 100%; 
 
    height: 650px; 
 
    background-color: red; 
 
} 
 
#div3{ 
 
    width: 100%; 
 
    height: 650px; 
 
    background-color: blue; 
 
} 
 
#div4{ 
 
    width: 100%; 
 
    height: 650px; 
 
    background-color: green; 
 
}
<div id="div1"> 
 
</div> 
 
<div id="anchor"> 
 
</div> 
 
<div id="div3"> 
 
</div> 
 
<div id="div4"> 
 
</div>

Espoir il a aidé :)

EDIT Je lis que tu voulais que ce soit un un événement de temps, donc j'ai modifié mon code

+0

Merci pour votre aide. Essentiellement, il remplit la fonction de retarder le défilement si un utilisateur défile déjà dans les 5 secondes. Cependant, il défilera au point où un utilisateur s'arrête pour une période de temps supérieure à 5 secondes. C'est finalement ce que j'essaie d'éviter. Donc, si un utilisateur fait défiler une fois dans les 5 premières secondes (ou «x» secondes), aucune fonction n'est déclenchée. Merci encore, ce serait très utile pour quiconque cherche à déclencher une action si un utilisateur est inactif pendant un certain temps. – Louis

+0

Ah je comprends maintenant, je vois que vous avez déjà une bonne réponse mais je vais mettre à jour mon code de toute façon: P – Evochrome