JQuery - исчезать делится и выходит за другим - PullRequest
1 голос
/ 22 ноября 2011

У меня есть следующий HTML:

<ul>
    <li id="about"><a href="#about" class="goto_about">About us<span>who we are</span></a></li>
    <li id="quickfacts">
        <a href="#">Quick facts
            <span class="quickfacts">text 1</span>
            <span class="quickfacts">text 2</span>
            <span class="quickfacts">text 3</span>
        </a>
    </li>
    <li id="blog"><a href="#blog" class="goto_blog">Blog<span>our blog</span></a></li>
    <li id="contact"><a href="#contact" class="goto_contact">Contact<span>get in touch</span></a></li>
</ul>

И CSS для отображения элементов span при наведении:

li a span {
    visibility: hidden;
}
li a:hover span {
    visibility: visible;
}

Теперь я хочу, чтобы при наведении указателя «Быстрые факты» на «Текст 1»; через пару секунд он исчезает, затем появляется текст 2 и т. д. (в той же позиции).

Я пробовал эти предложения из других сообщений:

Первая попытка

jQuery.fn.fadeDelay = function() {
    delay = 0;
    return this.each(function() {
    $(this).delay(delay).fadeIn(350);
    delay += 50;
    });
});

$(".quickfacts").fadeDelay();

Вторая попытка

$(".quickfacts").hide().each(function(i) {
    $(this).delay(i*5000).fadeIn(5000);
});

Третья попытка

$.fn.rollingText = function(number, time){
    for(var i = 0; i < number; i++){
    this.fadeIn(time).fadeOut(time);
    if(i != number - 1) this.delay(time);
}
return this;
}
$(".quickfacts").rollingText(8, 2000);

Проблема первых двух заключается в том, что все тексты появляются при наведении, как и остальные элементы span, и исчезают при наведении мыши.

Проблема с последним, который мне ближе всего подходит, чтобы заставить его работать, состоит в том, что все div'ы исчезают одновременно (но, по крайней мере, они появляются и исчезают), как я могу это изменить? Кроме того, как я могу сделать FadeIn циклическим, в отличие от остановки в этом случае в 8? и могут ли скорости fadeIn и fadeOut быть разными?

Возможно, это не лучшее решение, я также буду признателен, если кто-нибудь посоветует мои первые две попытки и где я ошибся.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Попробуйте на JSFiddle: http://jsfiddle.net/missaghi/FZm3B/10/

CSS

li a span {
    display:none;
}

Сценарий

function rotate(anchor) {
    if ($(anchor).attr("looper") === "true") {
        var nextone = $(anchor).find("span:visible").next();
        nextone.hide();
        if ($(anchor).find("span:visible").index() == ($(anchor).find("span").length - 1)) {
            nextone = $(anchor).find("span:first");
        }
        if ($(anchor).find("span").length > 1) //dont- loop singles
        {
            $(anchor).find("span:visible").fadeOut(400, function() {
                $(this).hide();
                nextone.hide().fadeIn(400);
            });
        }
        if ($(anchor).find("span:visible").length == 0) {
            $(anchor).find("span:first").hide().fadeIn(400);
        }
        setTimeout(function() {
            rotate(anchor);
        }, 1000);
    }
}

$("li").hover(function() {
    $(this).attr("looper", "true");
    rotate(this);
}, function() {
    $(this).attr("looper", "false");
    $(this).find("span").hide();
});
1 голос
/ 22 ноября 2011

РЕДАКТИРОВАНИЕ (уточнил код)

Ну, 5 часов слишком поздно для вечеринки.Вот мой 2c в качестве упражнения:

<style type='text/css' media='screen'>
    li      { list-style: none; }
    li div  { clear:both; float:left; text-align:left; display:block; width:400px; }
    li a    { float:left; text-align:left; width:150px; }
    li span { float:left; text-align:left; display:none; }
</style>

<script type='text/javascript' src='jquery-1.7.1.min.js'></script>
<script type='text/javascript'>

    jQuery( function () {
        $('.nav').on( { 
            mouseenter : function () {
                var $this = $(this);
                $this.addClass('mouseIN');
                if ($this.hasClass('mouseOUT')) $this.removeClass('mouseOUT');
                setTimeout( function () {
                    if ($this.hasClass('mouseIN')) {
                        var iCount = $this.find('span').length;
                        function showItem(i) {
                            if ($this.hasClass('mouseIN')) {
                                $this.find('span:eq('+i+')').slideDown(500).delay(1000).slideUp(1000);
                                if ((i<iCount) && (iCount > 1)) setTimeout( function () {
                                    i++;
                                    i = (i < iCount) ? i : 0;
                                    showItem(i);
                                },2501);
                            }
                        };
                        if (iCount > 1) 
                            showItem(0) 
                        else $this.find('span:eq(0)').slideDown(500);
                    }
                },200);
            },
            mouseleave: function () {
                var $this = $(this);
                $this.addClass('mouseOUT');
                if ($this.hasClass('mouseIN')) $this.removeClass('mouseIN');
                setTimeout( function () {
                    if ($this.hasClass('mouseOUT')) {
                        $this.find('span').slideUp(1000);
                    }
                },200);
            }
        }); //li .nav
    });

</script>

</head>

<body>
    <ul>
        <li id="about" class='nav' >
            <div>
                <a href="#about" class="goto_about">About us</a>
                <span>who we are</span>
            </div>
        </li>
        <li id="quickfacts" class='nav' >
            <div>
                <a href="#">Quick facts</a>
                <span>text 1</span>
                <span>text 2</span>
                <span>text 3</span>
            </div>
        </li>
        <li id="blog" class='nav' >
            <div>
                <a href="#blog" class="goto_blog">Blog</a>
                <span>our blog</span>
            </div>
        </li>
        <li id="contact" class='nav' >
            <div>
                <a href="#contact" class="goto_contact">Contact</a>
                <span>get in touch</span>
            </div>
        </li>
    </ul>
</body>

Пример: http://zequinha -bsb.int-domains.com / menuing.html

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

40 000 + лет назад «мы» смогли построить пирамиды.Сегодня, когда доступны все технологии (плагины), мы даже не можем имитировать их.Как насчет еще 40000 лет?Программа 40 ТБ для отображения «Добро пожаловать»?

Я понимаю, что это не форум, и поэтому мы поддерживаем его, и они очень правы.Существует три + способа выполнения зависания:

hover

mouseover / mouseout

mouseenter / mouseleave

Все они имеют свои небольшие недостатки.Благодаря jQuery их можно легко подключить к одному и тому же коду с единственным отличием, присуждаемым при наведении.

Отличное упражнение!

0 голосов
/ 22 ноября 2011

Хорошо, я собрал фрагмент кода, который может работать.

сначала добавьте класс "hoverme" к a, который содержит span

   <a class="hoverme" href="#">Quick facts
        <span class="quickfacts">text 1</span>
        <span class="quickfacts">text 2</span>
        <span class="quickfacts">text 3</span>
    </a>

CSS

.quickfacts {display: none; }

JavaScript, скрипка http://jsfiddle.net/JBzNm/1/

var isFadeable = false;
var position = 0;
var quickfacts = $(".quickfacts");
var qlength = quickfacts.length;

function fadeMe() {
    if (!isFadeable) {
        return;
    }
    var element = quickfacts.get(position); //get element to fade in
    $(element).fadeIn(function() {
        $(element).delay(2000).fadeOut(function() {            
            position++; //move position to get next element
            if (position == qlength) {
                position = 0; //start over
            }
            fadeMe();
        });
    });
}


//bind mouse events

$(".hoverme").mouseover(function(e) {
    isFadeable = true;
    fadeMe();

});
$(".hoverme").mouseout(function(e) {
    isFadeable = false;
    quickfacts.fadeOut();
});
...