当前位置: 首页 > 知识库问答 >
问题:

动态内容的打字机效果

祁兴运
2023-03-14

我正在尝试在一个横幅文本上创建一个打字机效果,一旦这个元素出现在视区中。我差一点就把它弄好了,但我还是有一些问题我自己似乎解决不了:

  • 当打字机效果播放时,最后一个字符没有显示(我在网上找到这个代码)
  • 当我检测到元素是否在视口中时,我的打字机动画会一直闪烁

我正在使用ACF获取内容。我还尝试将代码重写为jquery,但这似乎也行不通。

HTML/PHP

echo '<div class="contentBlock featured bg-black">';
    echo '<div class="textWrapper">';
        echo '<h2 id="original" style="display:none;">'. get_sub_field('grote_titel') .'</h2>';
        echo '<h2 id="typewriter"></h2>';
    echo '</div>';
echo '</div>';

jQuery/JS

$.fn.isInViewport = function() {
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
};

$(window).on('resize scroll', function() {
    $('.contentBlock.featured').each(function() {
        if ( $(this).isInViewport()) {
            var str = document.getElementById('original').innerText,
                i = 0,
                isTag,
                text;

            (function type() {
                text = str.slice(0, ++i);
                if (text === str) return;

                document.getElementById('typewriter').innerHTML = text;

                var char = text.slice(-1);
                if( char === '<' ) isTag = true;
                if( char === '>' ) isTag = false;
                
                if (isTag) return type();
                setTimeout(type, 80);
            }());
        }
    });
});

共有1个答案

华展鹏
2023-03-14

对于第一个问题,只需先进行以下测试

  (function type() {
    if (text === str) return;
    text = str.slice(0, ++i);

对于闪烁,您执行打字机,每次您滚动和标题是在视口。这很正常。为了避免闪烁,你有2种解决方案:

>

  • 你可以把打字机的速度稍微提高一点,比如提高到40(不是最好的)

    您可以避免在键入处于活动状态时重新启动键入->使用布尔值(此解决方案在代码片段中)

    null

    $.fn.isInViewport = function() {
    var elementTop = $(this).offset().top;
    var elementBottom = elementTop + $(this).outerHeight();
    var viewportTop = $(window).scrollTop();
    var viewportBottom = viewportTop + $(window).height();
    return elementBottom > viewportTop && elementTop < viewportBottom;
    };
    
    var typing = false;
    $(window).on('resize scroll', function() {
        $('.contentBlock.featured').each(function() {
            if ( $(this).isInViewport() && !typing) {
                typing = true;
                var str = document.getElementById('original').innerText,
                    i = 0,
                    isTag,
                    text;
    
                (function type() {
                    if (text === str) {typing= false;return;}
                    text = str.slice(0, ++i);
    
    
                    document.getElementById('typewriter').innerHTML = text;
    
                    var char = text.slice(-1);
                    if( char === '<' ) isTag = true;
                    if( char === '>' ) isTag = false;
                    
                    if (isTag) return type();
                    setTimeout(type, 80);
                }());
            }
        });
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="contentBlock featured bg-black">
      <div class="textWrapper">
        <h2 id="original" style="display:none;">Big Title ttttttttx</h2>
        <h2 id="typewriter"></h2>
      </div>
      
      <div class="just text to create scroll">
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    <br>the td's are not updated when you select td, its the reason you have older values, i dont see event about that, so i suggest you to wait the value of tds are changed by testing the month, you could add year if needed:
    
      </div>  
      
      
    </div>

  •  类似资料:
    • 问题内容: 我正在尝试使用UILabel创建打字机动画效果,但找不到任何答案。UILabel是正确使用的对象吗?我希望文本将字符串数组打印到屏幕上,例如“登录…正在打开文件夹…正在重新启动系统..”等。我应该提一下,我是编码的新手,并且尝试过搜索文档和API参考,但没有运气。如果值得一提,我目前正在学习SWIFT 问题答案: 更新: Xcode 7.0 GM•Swift 2.0

    • 我对这种方法有一些问题。它工作得很好,但有一个小问题。我叫这个方法的时间太少了。所以标签上只打印最后一个字符串。但我希望下一个字符串开始打印,只有在前一个字符串完成后。对不起我的英语

    • 主要内容:1. 配置Apache以允许CGI,2. 编写CGI程序CGI(公共网关接口)定义了Web服务器与外部内容生成程序交互的方式,这些程序通常被称为CGI程序或CGI脚本。这是一种使用您最熟悉的编程语言将动态内容放在网站上的简单方法。本文档将介绍如何在Apache Web服务器上设置CGI,以及如何编写简单的CGI程序。 1. 配置Apache以允许CGI 为了使CGI程序正常工作,需要配置Apache以允许CGI执行。有几种方法可以做到这一点。 方式1:

    • 本文向大家介绍jQuery实现列表内容的动态载入特效,包括了jQuery实现列表内容的动态载入特效的使用技巧和注意事项,需要的朋友参考一下 采用Jquery实现的列表数据动态更新效果,更新的数据可以是ajax请求的数据。 CSS: HTML JS 附上演示效果 http://demo.jb51.net/js/2015/jquery-dtlb 效果是不是非常棒呢,接下来我们再来看看瀑布流的实现思路和

    • 问题内容: 就像在电影和游戏中一样,位置的位置会显示在屏幕上,就像它是实时输入的一样。我想做一个关于用python逃离迷宫的游戏。在游戏开始时,它提供了游戏的背景信息: 在变量下,我试图为每一行做一个for循环,如下所示: 唯一的问题是每行打印一个字母。时机还可以,但是我怎样才能将它排成一行呢? 问题答案: 因为您用python 3标记了问题,所以我将提供python 3解决方案: 将打印的结束字

    • 问题内容: 我一直在环顾四周,无法看到任何快速相关的方法来执行此操作。我试图让我的UIWebViews高度是动态的。我有一个UIWebView,它使用loadHtmlString函数加载数据。事实是,每次我加载具有不同长度的不同字符串时,都会从sqlite数据库加载数据,并且Web视图自然会获得不同的高度。 现在,我需要知道如何将UIWebView设置为正确的高度,以便将我的下一个内容加载到web