Fade In и Fade Out текст внутри div

У меня есть div со стилем CSS, чтобы показать его как кнопку:

<div id="Word1" class="btn green" onclick="WordClicked(1);">Word 1</div>

И стили CSS:

.btn {
    display: inline-block;
    background: url(btn.bg.png) repeat-x 0px 0px;
    padding: 5px 10px 6px 10px;
    font-weight: bold;
    text-shadow: 1px 1px 1px rgba(255,255,255,0.5);
    text-align: center;
    border: 1px solid rgba(0,0,0,0.4);
    -moz-border-radius: 5px;
    -moz-box-shadow: 0px 0px 2px rgba(0,0,0,0.5);
    -webkit-border-radius: 5px;
    -webkit-box-shadow: 0px 0px 2px rgba(0,0,0,0.5);
}

.green      {background-color: #CCCCCC; color: #141414;}

Я хочу, чтобы текст внутри div исчезал, менялся текст, а затем снова исчезал текст. Но я не хочу исчезать и исчезать div.

Если я использую этот код javascript:

$('#Word1').fadeOut('fast');

Я уберу div и текст внутри.

Как я могу это сделать?


person VansFannel    schedule 07.06.2011    source источник


Ответы (6)


Вы хотите обернуть текст в диапазон, а затем исчезнуть:

<div class="button"><span>TEXT!</span></div>

и вы не хотите использовать fadeOut, потому что это изменит размер вашей кнопки, так как текст исчезнет, ​​как только fadeOut закончится, и больше не будет занимать место. Вместо этого анимируйте непрозрачность:

$(".button").click(function(){
    $(this).find("span").animate({opacity:0},function(){
        $(this).text("new text")
            .animate({opacity:1});  
    })
});

http://jsfiddle.net/8Dtr6/

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

Возможно, немного чище, используя очередь, чтобы избежать обратных вызовов:

$(".button").click(function(){
    $(this).find("span")
        .animate({opacity:0})
        .queue(function(){
             $(this).text("new text")
                    .dequeue()
        })
        .animate({opacity:1});  
});

http://jsfiddle.net/8Dtr6/2

person James Montagne    schedule 07.06.2011
comment
+1 за анимацию вместо FadeOut. Возможно, имеет смысл задавать текст динамически, вместо того, чтобы жестко кодировать его в операторе jQuery. Что-то вроде: var new_text = $(".button .new-text").text(); -> $(this).text(new_text); - person Wex; 07.06.2011
comment
@ Wex Спасибо, да, я предполагаю, что он каким-то образом решит, каким будет текст. Это было просто для демонстрации анимационной части. - person James Montagne; 07.06.2011
comment
@kingjiv: я использую этот код, чтобы сделать то же самое с тегом <img>, но я получаю «щелчок», когда меняюсь. Любой совет? - person VansFannel; 08.06.2011
comment
С img, вероятно, было бы лучше иметь 2 изображения и постепенно исчезать, пока другое исчезает. Проблема, вероятно, в том, что вы меняете src, и как только вы это сделаете, новое изображение должно загрузиться. Пока он не загружен, он не занимает места. - person James Montagne; 08.06.2011
comment
@kingjiv: Вы можете найти код, который я использую здесь: stackoverflow.com/questions/6277427/ - person VansFannel; 09.06.2011

Попробуйте использовать функцию contents(). И обернуть() содержимое другим элементом. Такие как

$('#Word1').contents().wrap('<div class="temporary">').parent().fadeOut('fast');

Вот простая демонстрация http://jsfiddle.net/7jjNq/.

person John Hartsock    schedule 07.06.2011
comment
вы не можете анимировать такие текстовые узлы. - person Niklas; 07.06.2011
comment
Если я это сделаю, я получу исключение. - person VansFannel; 07.06.2011
comment
@Niklas да, я вижу, что вы не можете так анимировать текстовые узлы. Однако я отредактировал свой ответ, чтобы предоставить простое решение, используя функцию содержимого () и функцию обертывания (). - person John Hartsock; 07.06.2011
comment
@VansFannel ... Я изменил ответ. Теперь это работает, и я предоставил простую демонстрацию - person John Hartsock; 07.06.2011
comment
Это намного лучше, но все равно не работает, так как fadeOut() применяется к contents(), а не к родительскому wrap(). $('#Word1').contents().wrap('<div class="temporary">').parent().fadeOut('fast'); скроет обертку. - person Niklas; 07.06.2011

HTML

<div id="Word1" class="btn green" onclick="WordClicked(1);"><span id="word555">Word 1</span></div>

js

$('#word555').fadeOut('fast');

Надеюсь, поможет

person genesis    schedule 07.06.2011

Вы можете поместить текст «Слово 1» внутри диапазона или div, например:

<div id="Word1" class="btn green" onclick="WordClicked(1);"><span id="Word1Text">Word 1</span></div>

Затем внутри вашей функции WordClicked() выполните:

$("#Word1Text").fadeOut("fast", function()
{
  $("#Word1Text").html("New Text").fadeIn("fast");
});
person ScubaSteve    schedule 07.06.2011

Вам понадобится элемент внутри элемента #Word1, который затемняется/затухает. Это не обязательно должно быть <div>.

person Sonny    schedule 07.06.2011

Здесь полезен promise(), но вам также потребуется обернуть содержимое. В этом примере создается span, но он также удаляется после анимации. Таким образом, вам не придется менять свою разметку, и она не изменится после завершения анимации.

var v = $('#Word1');
$('<span />').text(v.text()).appendTo($(v).empty()).fadeOut('fast').promise().done(function() {
    $(this).text('Word 2').fadeIn().promise().done(function() {
    v.text($(this).text());
        $(this).remove();
  });
  });

пример: http://jsfiddle.net/niklasvh/jkaYr/

редактировать или... мог бы просто сделать это с обратными вызовами затухания. Все еще полезно, если вы собираетесь добавить к нему больше анимационных эффектов.

var v = $('#Word1');
$('<span />').text(v.text()).appendTo($(v).empty()).fadeOut('fast',function() {
    $(this).text('Word 2').fadeIn('fast',function() {
    v.text($(this).text());
        $(this).remove();
  });
  });

пример: http://jsfiddle.net/niklasvh/jkaYr/15/

person Niklas    schedule 07.06.2011