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>
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
@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
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