Как сделать зависающий триггер анимацией только в области круга в div с границей радиуса с jquery

Я не программист, и я стараюсь изо всех сил решить эту ситуацию, но после нескольких часов и головной боли я сдаюсь, и я прошу помощи.

У меня есть круговой логотип (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;
  }
};

Ответ 1

Что касается вашего обновления, все выглядит хорошо.

Вы можете получить небольшое повышение производительности, изменив порядок двух параметров if(), чтобы сначала был myHover != "transition1". && является короткозамкнутым, поэтому, если myHover != "transition1" является ложным, дорогая проверка включения круга не требуется вызывать.

Также на else if() может стоить наличие некоторой переменной, заданной для того, что говорит о том, что вы уже установили курсор, чтобы остановить вызов, вызываемый непрерывно.

Глядя на класс SimpleCircle, единственными дорогостоящими операциями, которые он делает, являются два вызова мощности и квадратный корень (Math.pow() x 2 + Math.sqrt()). Будь или не стоит пытаться получить что-либо быстрее спорно, только оптимизация я могу думать, что нужно проверить, если координаты находятся в пределах квадрата в пределах окружности, четыре быстрых сравнения, это покрывает 50% внутренних точек, но, очевидно, замедляет остальные 50% очков. Чтобы убедиться, что это улучшило ситуацию, вам придется протестировать его.

Square inside a circle inside a square