我想为文本设置动画,使其逐个字符淡入淡出。实际上,我设法在不保持 DOM 完整的情况下做到了这一点,它看起来像这样:
// make each character an own span element
// abc will become <span>a</span><span>b</span><span>c</span>
var elements = $(elemId).text().split('');
$(elemId).text('');
for (var i = 0; i < elements.length; i++) {
$(elemId).append('<span>' + elements[i] + '</span>');
}
// fade in all spans one by one
$(elemId + " span").each(function(index) {
$(this).delay(speed * index).fadeIn(300);
});
但这打破了我的文本中可能的元素,特别是强大的,但也包括列表或表格。所以我想到了这两种可能的解决方案:
- 使用 jQuery 遍历 DOM 并用 包裹每个字符
<span>
,但不要删除其他元素。然后我们仍然有问题,表格行将始终显示(只是空的) - 使用 jQuery 遍历 DOM 并用 a 包裹每个字符,
<span>
并将其他元素禁用到display: none
. 然后回溯它并在它出现时显示东西(包括span
其他元素)。这可能会破坏 HTML 一段时间(<ul>
没有<li>
内部等,但我想所有浏览器都能很好地处理它)。
我从contents()
方法开始,但我并没有真正开始。
这是我目前拥有的,但它根本没有替换任何东西(即使它至少找到了一些文本):
$(elemId).contents().each(function() {
if (this.nodeType == 3) {
var elements = $(this).text().split('');
alert(elements);
// does not delete anything, but it would also break
// if it deleted something
// because text('') goes over elements like <strong> etc.
$(this).text('');
alert($(this).text());
for (var i = 0; i < elements.length; i++) {
$(this).append('<span>' + elements[i] + '</span>');
}
}
});
那么我该怎么做才能正确获取我的文本和标签呢?如果一切都像上面那样设置,我想这只是contents()
递归使用并再次设置所有元素的可见性的问题。但是正确添加我的<span>
似乎很困难。
一些例子
I am <strong>AB</strong>
应该变成:
<span display="none">I</span><span display="none"> </span>
<span ...>a</span><span ...>m</span><span ...> </span>
<strong ...><span ...>A</span><span ...>B</span></strong>