При наведении на скрывающий элемент анимация скрытия воспроизводится вскоре после - PullRequest
1 голос
/ 23 февраля 2012

У меня есть 2 элемента рядом друг с другом, оба абсолютно расположены.

<div class="vizual">
  <h1 class="typo">...</h1>
  <a href="#" class="typo">...</a>
</div>

Когда я наводю курсор на первый элемент, рядом с ним появляется другой элемент. Существуют некоторые эффекты и таймеры.

function hoverTransfer(trigger,content){
  var t;
  $(trigger).hover(
    function(){
      clearTimeout(t);
      if ($(content).css("display") == "none") {
        $(content).show('slide', {direction: 'left'}, 500);
      }
    }, function(){
      t = setTimeout(function() {$(content).hide('slide', {direction: 'left'}, 500)}, 550);
  });
  $(content).hover(
    function(){
      clearTimeout(t);
    }, function(){
        t = setTimeout(function() {$(content).hide('slide', {direction: 'left'}, 500)}, 550);
  });
};

Это должно работать таким образом, чтобы, когда я удерживал мышь над одним из двух элементов, второй элемент оставался отображенным. Когда я убираю мышь, через некоторое время она снова скользит.

РЕДАКТИРОВАТЬ: Если я наведу курсор на один из элементов, а второй скрывается, он должен сдвинуть обратно на полную ширину. Но это я тоже не могу произвести ...

ПРОБЛЕМА - Он также ведет себя нежелательным образом: Когда я наведите на вход и выход одного из этих элементов , пока скрывает второй элемент, он снова воспроизводит скрытую анимацию вскоре после его завершения.

Я пробовал много разных «решений» (проверял, анимированы ли элементы, пытался .stop () их и т. Д., Но я никогда не мог произвести желаемую функциональность.

1 Ответ

3 голосов
/ 23 февраля 2012

Объяснение

Хорошо, я составил то, что, как вы думаете, вы просите.Если это не то, о чем вы просили, надеюсь, вы или кто-то еще узнаете что-то из этого.:) hovering stuff

  1. Начальный макет
  2. Пользователь наводит курсор на элемент 1, после чего элемент 2 выскакивает и начинает скользить
  3. В этот момент пользователь наводит курсор на элементмежду элементами, и не должно произойти сброса
  4. Пользователь наводит курсор на один из элементов, в моем примере, элемент 1
  5. Мышь не была над одним из элементов в течение n секунд и должнаскользите как в 2. но в обратном направлении.

Мне легче узнать, что нужно сделать, если вы сначала набросаете, что нужно.

Пройдя по шагам, мы можем теперьОпределите, что нам нужно:

  1. Таймер, который проверяет, как долго мышь находилась вне элементов, которые выполняют «обратную анимацию», когда n секунды прошли события
  2. MouseIn, MouseOut дляочистите таймер, чтобы он не выполнял обратную анимацию, пока пользователь все еще держит один из элементов
  3. Нам нужны уникальные таймеры для каждого экземпляра группы, который я называю созданием экземпляра.Значение: мы хотим иметь возможность сделать это на более чем 1 блоке из 2 элементов

Решение

Во-первых, вот вам JSFiddle для игрывокруг с ( вот один без комментариев ).Надеюсь, у вас будет достаточно комментариев, чтобы помочь вам пройти через это.

И, конечно, вот код.

Javascript

//default variables
var Distance = 300; //px
var BetweenOffset = 10; //px
var MouseOut = 550; //ms
var AnimationTime = 500; //ms
var Timers = new Array();

$(document).ready(function(){
    //this is just to add the default distance. I didn't specify it in the CSS, but you can do it just as well
    $("div.container div.element_2").css("left", Distance);
    //adds an attribute "unique-id" with a number, so that the timer can be associated with an element. This is necessary to be able to clear the timer, and is the basics in "instantiation 101"
    $("div.container").each(function(index, parent){
        $(parent).attr("unique-id", index);
    });

    //here's were all the magic happens
    $("div.container div.element_1, div.container div.element_2").mouseenter(function(e){
        //define some local variables
        var parent = $(this).parent();
        var id = parent.attr("unique-id");
        var element1 = parent.children(".element_1");
        var element2 = parent.children(".element_2");
        var destination = element1.width()+BetweenOffset;

        //if element2 isn't visible or is being animated, we're going to stop whatever it's doing and do a beginning animation
        if(!element2.is(":visible") || element2.is(":animated") ){
            element2.stop(true).show().animate(
                {
                    left: destination,
                    opacity: 1
                },
                AnimationTime,
                "swing"
            );
        }

        //then we're gonna clear the timer associated with this parent
        Timers[id]= clearTimeout(Timers[id]);
    }).mouseleave(function(e){
       var parent = $(this).parent();
       var id = parent.attr("unique-id");
       var element1 = parent.children(".element_1");
       var element2 = parent.children(".element_2");

       //here we set the timer using an anonymous function
       Timers[id] = setTimeout(function(){
            //Only animate if it's already showing
            if(element2.is(":visible")){
                //stop whatever it's doing and remove the animation queue
                element2.stop(true).animate(
                    {
                        "left": Distance,
                        opacity: 0
                    },
                    AnimationTime,
                    "swing",
                    function(){
                        //here we make sure it's not being displayed
                        element2.css("display", "none");
                    }
                );
            }           
       }, MouseOut);
    });
});

HTML

<div class="container">
    <div class='element_1'>Element 1</div>
    <div class='element_2'>Element 2</div>
</div>
<div class="container">
    <div class='element_1'>Element 1</div>
    <div class='element_2'>Element 2</div>
</div>
<div class="container">
    <div class='element_1'>Element 1</div>
    <div class='element_2'>Element 2</div>
</div>
<div class="container">
    <div class='element_1'>Element 1</div>
    <div class='element_2'>Element 2</div>
</div>
<div class="container">
    <div class='element_1'>Element 1</div>
    <div class='element_2'>Element 2</div>
</div>

CSS

.container{
    position: relative;
    height: 50px;
    margin-top: 20px;
}

.element_1, .element_2{
    position: absolute;
    height: 50px;
    left: 0px;
    top: 0px;
}

.element_1{
    border: 1px solid blue;
}

.element_2{
    border: 1px solid red;
    display: none;
}

Ссылки

Некоторые ссылки на используемые мной функции

Заключительные мысли

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

Редактировать

После краткого обсуждения,ОТ уведомил меня о своем JSFiddle.Я посмотрел на это, и это то, что я получил .Единственная проблема, которая остается, заключается в том, что он не анимируется, пока он уже анимируется, но это небольшая проблема, которую замечают не многие пользователи.

...