在一个 div 中实现文字的渐显和渐隐效果

7

我有一个带有CSS样式的div,用于显示为按钮:

<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;}

我希望你能将
标签内的文本淡出,更改文本,然后再淡入文本。但我不想淡入和淡出整个
标签。
如果我使用以下JavaScript代码:
$('#Word1').fadeOut('fast');

我将淡化 div 和其中的文本。
我该怎么做?
返回结果:

我将淡化 div 和其中的文本。

我该怎么做?

6个回答

30
你想将文本包装在一个标签里,然后淡出它:
<div class="button"><span>TEXT!</span></div>

如果您不想使用 fadeOut,因为文本消失后会影响按钮的大小,那么可以使用动画效果来改变透明度:

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

http://jsfiddle.net/8Dtr6/

纠正一下,只要你立即淡入,使用 fadeInfadeOut 应该不会有问题,至少在Chrome中是如此。 可能在较低版本的浏览器中可能会看到轻微的闪烁,但可能是错误的。

可能使用队列更干净一些,避免了回调函数:

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

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


+1 代替 FadeOut 进行动画可能更合适。最好将文本设置为动态的,而不是硬编码到 jQuery 语句中。可以使用以下代码:var new_text = $(".button .new-text").text(); -> $(this).text(new_text); - Wex
@Wex 谢谢,是的,我假设他会有某种决定文本的方式。这只是为了展示其中的动画部分。 - James Montagne
@kingjiv:我正在使用这段代码来操作<img>标签,但是在更改时会出现“闪烁”。有何建议? - VansFannel
使用img元素时,最好有两张图像,一张淡入,另一张淡出,这样看起来可能更漂亮。问题可能是由于您正在更改src,一旦您这样做,新图像必须加载。在加载之前,它不占用空间。 - James Montagne
@kingjiv:你可以在这里找到我正在使用的代码:http://stackoverflow.com/questions/6277427/flicking-while-swiching-from-one-image-to-another - VansFannel

2
尝试使用 contents() 函数。然后,wrap() 将内容与另一个元素包裹起来,例如:
$('#Word1').contents().wrap('<div class="temporary">').parent().fadeOut('fast');

Here is a simple demo http://jsfiddle.net/7jjNq/


2
你不能这样动画化文本节点。 - Niklas
如果我那样做,会出现一个异常。 - VansFannel
@Niklas 是的,我看到你不能像那样动画文本节点。然而,我已经编辑了我的答案,提供了一个简单的解决方案,使用contents()函数和wrap()函数。 - John Hartsock
@VansFannel...我修改了答案。现在它可以工作了,并且我提供了一个简单的演示。 - John Hartsock
这样好多了,但仍然无法正常工作,因为 fadeOut() 应该应用于父级的 wrap() 而不是 contents()$('#Word1').contents().wrap('<div class="temporary">').parent().fadeOut('fast'); 会隐藏包装器。 - Niklas

1

HTML

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

JavaScript

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

希望能有所帮助


1
你可以将文本“Word 1”放在一个span或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");
});

0

你需要在 #Word1 元素内部添加一个淡入淡出的元素。它不一定是一个 <div> 元素。


0

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接