Я не программист, и я стараюсь изо всех сил решить эту ситуацию, но после нескольких часов и головной боли я сдаюсь, и я прошу помощи.
У меня есть круговой логотип (div с достаточным радиусом px, чтобы стать кругом и некоторым текстом в нем), и у меня есть анимация, которая выходит из-за логотипа, когда я наводил на него.
Я заметил, что моя анимация запускается в "пустой области" между круговым логотипом и div, которые удерживают логотип (что он все еще квадрат). На данный момент мой script заключается в следующем:
$("#logo").hover(function(event){ // Hovering
myHover = "transition";
$("#black").stop().animate({"top":"-200px"}, speed/2, function(){
myHover = 1;
});
},function(event){ // Finish hovering
myHover = "transition";
$("#black").stop().animate({"top":"0px"}, speed/2, function(){
myHover = 0;
});
});
Я попробовал посмотреть в Интернете и, чтобы найти что-то, что мне поможет, и самое ближайшее, что я нашел:
http://jsbin.com/oqewo - из этого другого вопроса Точно определить событие mouseover для div с закругленным углы
Я попытался реализовать его, и у меня получилось что-то, что оно не достаточно гладко, как анимация (я пытался отлаживать попытку переместить назад и вперед с помощью мыши на логотип, чтобы увидеть реакцию script)
$(".myCircle").hover(
// when the mouse enters the box do...
function(){
var $box = $(this),
offset = $box.offset(),
radius = $box.width() / 2,
circle = new SimpleCircle(offset.left + radius, offset.top + radius, radius);
$box.mousemove(function(e){
if(circle.includesXY(e.pageX, e.pageY) && myHover != "transition"){
$(this).css({"cursor":"pointer"});
myHover = "transition";
$("#black").stop().animate({"top":"-200px"}, speed/2, function(){
myHover = 1;
});
}else if(!circle.includesXY(e.pageX, e.pageY)){
$(this).css({"cursor":"default"});
myHover = "transition";
$("#black").animate({"top":"0px"}, speed/2, function(){
myHover = 0;
});
}
});
},
// when the mouse leaves the box do...
function() {
//alert("in")
//$(this).includesXY(e.pageX, e.pageY)
myHover = "transition";
$(this).css({"cursor":"default"});
$("#black").stop().animate({"top":"0px"}, speed/2, function(){
myHover = 0;
});
}
)
Я вставил переменную myHover = 0; в начале моих функций, потому что мне нужна переменная, которая сообщит мне, когда анимация будет завершена, она будет скрыта за логотипом или в процессе перехода.
И я не знаю, КОГДА И КАК использовать свойство .unbind, поэтому я не буду сосать достаточно процессора. Есть ли что-то лучше, чем событие mouseenter? Он запускает разное время, и только когда я перемещаю мышь на эмблеме, а не когда я наводил указатель мыши на логотип во время анимации. Во всяком случае, любое предложение или пересмотр любого рода при подходе к этой проблеме более чем приветствуется:)
==========================
UPDATE
Я мог бы найти способ, он работает, но я не уверен, можно ли его оптимизировать/очистить, или если я использую unbind правильно, кто-то может проверить мой код?
$(".myCircle").hover(
// when the mouse enters the box do...
function(){
var $box = $(this),
offset = $box.offset(),
radius = $box.width() / 2,
circle = new SimpleCircle(offset.left + radius, offset.top + radius, radius);
$box.mousemove(function(e){
if(circle.includesXY(e.pageX, e.pageY) && myHover != "transition1"){
$(this).css({"cursor":"pointer"});
myHover = "transition1";
$("#black").stop().animate({"top":"-200px"}, speed/2, function(){
myHover = 1;
});
}
else if(!circle.includesXY(e.pageX, e.pageY)){
$(this).css({"cursor":"default"});
if(myHover == 1 || myHover == "transition1"){
myHover = "transition0";
$("#black").stop().animate({"top":"0px"}, speed/2, function(){
myHover = 0;
});
}
}
});
},
// when the mouse leaves the box do...
function() {
if(myHover == 1 || myHover == "transition1"){
myHover = "transition0";
$(this).css({"cursor":"default"});
$("#black").stop().animate({"top":"0px"}, speed/2, function(){
myHover = 0;
})
};
$("#container").unbind('mousemove');
}
)
Класс SimpleCircle
, используемый в этом коде, из демонстрации, упомянутой выше, определяется как:
function SimpleCircle(x, y, r) {
this.centerX = x;
this.centerY = y;
this.radius = r;
}
SimpleCircle.prototype = {
distanceTo: function(pageX, pageY) {
return Math.sqrt(Math.pow(pageX - this.centerX, 2) + Math.pow(pageY - this.centerY, 2));
},
includesXY: function(x, y) {
return this.distanceTo(x, y) <= this.radius;
}
};