jQuery animation pour une survolez avec la souris dans la direction"
Je suis en train de simuler l'effet où j'ai passez la souris sur une image, une superposition semi-transparente de l'image va s'estomper dans le sens où votre souris est venue. Vice-versa lors de votre souris sort de l'image (fadeout + déplace loin)
Je vous ai préparé un page de test pour cela. Aller de l'avant et de le vérifier, il permettra de clarifier ce que l'effet désiré est.
J'ai défini une structure HTML pour ceci:
<div class="overlayLink">
<img src="assets/work/thumbnails/kreatude.jpg" alt="Kreatude" />
<div class="overlayLink_overlay_bg"> </div>
<div class="overlayLink_overlay_fg">
<span class="overlayLink_overlay_link"><a href="#">View Case Study</a></span>
<div class="top"> </div>
<div class="left"> </div>
<div class="right"> </div>
<div class="bottom"> </div>
</div>
</div>
et suivants JS (je suis en utilisant jQuery):
jQuery(document).ready(function () {
ourWork();
});
function ourWork(){
var inHandler = function(){
var blue_bg = jQuery(this).find('.overlayLink_overlay_bg');
var divClass = inClass;
blue_bg.stop(true,true).fadeIn();
var ml,mt;
if(divClass == 'left'){
ml = -260;
mt = 0;
}
else if(divClass == 'right'){
ml = 260;
mt = 0;
}
else if(divClass == 'top'){
ml = 0;
mt = -140;
}
else if(divClass == 'bottom'){
ml = 0;
mt = 140;
}
//positioning
jQuery(this).find('a').css({
'marginLeft': ml + 'px',
'marginTop' : mt + 'px'
});
//animation
jQuery(this).find('a').stop(true,true).animate({
"marginLeft": "0px",
"marginTop": "0px"
}, "slow");
}
var outHandler = function(){
var blue_bg = jQuery(this).find('.overlayLink_overlay_bg');
var divClass = outClass;
blue_bg.stop(true,true).fadeOut();
var ml,mt;
if(divClass == 'left'){
ml = -260;
mt = 0;
}
else if(divClass == 'right'){
ml = 260;
mt = 0;
}
else if(divClass == 'top'){
ml = 0;
mt = -140;
}
else if(divClass == 'bottom'){
ml = 0;
mt = 140;
}
//animation
jQuery(this).find('a').stop(true,true).animate({
"marginLeft": ml + "px",
"marginTop": mt + "px"
}, "slow");
}
var inClass, outClass;
jQuery('.overlayLink_overlay_fg div').hover(function(){
inClass = jQuery(this).attr('class');
},function(){
outClass = jQuery(this).attr('class');
});
jQuery('.overlayLink').mouseenter(inHandler).mouseleave(outHandler);
}
explication:
Fondamentalement, je n'ai quatre absolue positionné divs sur le haut de l'image, à savoir la direction (à gauche,en haut,en bas,à droite) quand j'ai passez la souris sur l'un de ces 4 div (.overlayLink_overlay_fg div), j'ai mis le nom de la classe de la planait div dans une variable (var théorique en classe et var surclasser)
Une fois que j'ai passez la souris sur la div qui couvre la zone de l'image.overlayLink) je demande à la direction de l'théorique en classe ou surpassent variable et l'exécution de l'animation (inHandler,outHandler)
cependant tout cela semble fonctionner, c'est un petit glitch lorsque vous déplacez votre souris vraiment rapide, maintenant, je me demande quel est le problème (qui est à l'origine des problèmes) et comment il pourrait être fixé avec mon code actuel.
Merci d'avance
vous avez raison, ne savais pas que c'était si glitchy. Et oui c'est ma page. Cependant il doit y avoir une raison logique de ce qui se passe. Si je passe en revue mon code je ne vois pas l'erreur de logique, ce qui me dérange un peu lol.
Il suffit de ne pas. Il n'est pas juste pour toucher les utilisateurs.
OriginalL'auteur | 2010-09-02
Vous devez vous connecter pour publier un commentaire.
Peut-être vous devriez envisager de ne pas utiliser des divs comme des "points chauds", mais l'utilisation de Maths et Javascript pour trouver le point où la souris entre et sort un div. Cela permet d'éviter le chevauchement et les lacunes des problèmes. Le code ci-dessous fondamentalement divise un div à 4 triangled zones. Chaque zone renvoie un nombre lorsque la souris passe au-dessus d'elle. Le code a besoin de quelques réglages, et vous aurez à décider pour vous-même, où à se lier et à délier les événements. Mais je pense qu'il enlève la plupart de vos problèmes de scintillement.
bien sûr, le court de notation pour obtenir le sens de rotation doit être:
où 1.57... est les Mathématiques.PI /2 C'est beaucoup plus efiicient peu plus difficile pour moi d'expliquer puisqu'il ignore les degrés de conversion.
aussi, si le javascript natif.offsetTop n'est pas correctement signalés, à l'aide de $(this).offset().top travaillé. Je me déplace le corps sur une translateY axe, qui mess avec le décalage correct lectures. Juste un avis.
Salut Gaspard, je peux comprendre le concept de calculer la valeur de x et y pour obtenir un angle au centre de la div, mais je ne sais pas pourquoi devez
( w > h ? (h/w) : 1 )
? pouvez-vous s'il vous plaît aider à comprendre cela? J'ai pensé à normaliser(e.pageX - this.offsetLeft - (w/2))
c'est assezil s'agit d'une correction sur l'orientation de la DIV; paysage ou portrait orienté.
merci Gaspard, qui font de sence
OriginalL'auteur Caspar Kleijne
Fondamentalement, le mouvement de la souris événements se produisent, comme une séquence de points, non pas comme une ligne courbe telle que nous la percevons le mouvement sur l'écran. Le plus vite vous vous déplacez la souris le plus large de l'espacement entre les points et la plus grande de la des objets de la souris peut se déplacer au-dessus sans le toucher. Idéalement, vous avez besoin de savoir la direction de la dernière position de la souris avant de débarquer sur votre objet et de calcul de la direction à partir de laquelle il a approché. c'est à dire Vous avez besoin de constamment suivre la position de la souris sur l'ensemble de la page pour être certain d'obtenir votre effet de travailler correctement à chaque fois.
OriginalL'auteur soid
Plutôt qu'autour de l'image avec des divs en position absolue, vous pouvez essayer de le faire avec une image de la carte, de l'attachement des gestionnaires pour les zones définies. Il suffit de définir les zones frontalières à être suffisamment épaisse pour que le mouvement de souris serait détecté, même si c'est déplacé assez rapidement.
Remarque assurez-vous de ce que vous entendez par "juste une pensée". Autour de vos images avec des divs en position absolue est un habile hack. Alors que l'image de la carte et de l'image font partie intégrante de l'un à l'autre et d'offrir une conception plus claire et avec une meilleure encapsulation et un moins compliqué de mise en page.
Aussi, avec une image de la carte, vous pouvez plus facilement ajuster l'épaisseur de l'invisible "à chaud" des zones frontalières, afin de mieux détecter le passage de la souris, sans affecter la mise en page.
OriginalL'auteur Tim
Si vous faites glisser votre souris rapidement de gauche à droite, de sorte qu'il traverse 3 rectangles
la souris d'entrer rectangle #3 par l'intermédiaire de son bord gauche div immédiatement après qu'il a quitté le rectangle #2 par le biais de sa bordure droite de la div. Toutefois, l'attribution théorique en classe="left" surclasser="gauche" rectangle #3 est entrée sur son bord gauche de la div se produit AVANT la outHandler pour rectangle #2 a été déclenché.
OriginalL'auteur Tim
Si je devais mettre en œuvre cette fonctionnalité, voici comment j'allais l'aborder:
a) de suivre la sideEntered -- cette valeur est affectée à une fois et une seule fois; à chaque fois qu'une image-carte de la zone frontalière est entré dans sa mouseover gestionnaire de consulter sideEntered et l'affecter seulement si elle n'a pas encore été attribué;
b) de suivre la lastSideTouched -- chaque fois qu'une image de la carte de la zone est entré dans sa mouseoverhandler réassigne cette variable
c) lorsque la souris quitte le rectangle, le congé gestionnaire consulte lastSideTouched et réinitialise sideEntered null
Chaque rectangle doit avoir ses propres gestionnaires de sorte que les deux valeurs importantes, sideEntered et lastSideTouched, sont encapsulé dans le cadre de son maître.
OriginalL'auteur Tim
Ce code (et l'utilisation de l'théorique en classe & surclasser) sont problématiques. Vous êtes à la modification de l'état des variables globales qui sont utilisés dans les gestionnaires d'événements.
Ce code suppose que surclasser a été définie par le "local" div, mais coulsd ont été fixés par un voisin de dessus div
Ne pas gérer cela comme une seule variable globale, essayez de le gérer Isolé mannor.
Ici est un apprach:
Je n'ai pas testé ce code
Dans vos gestionnaires, en refrence de ces nouvelles données.
ce woulod l'adresse de la variable globale problème. Je ne suis pas sûr de ce qui va se passer si le hover' événement se produit avant que l'animation est terminée.
EDIT:
Correction de problèmes avec le code.
OriginalL'auteur brian chandley