JavaScript实现打字机效果

效果图

在这里插入图片描述

html代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">

</head>

<body>
    <main>
        <h1>
            <span>A developer platform for building </span>
            <span id="text" data-text='["web","mobile","desktop","game","loT","all your"]'></span>
            <span class="mark"></span>
            <span>apps</span>
        </h1>
    </main>
    <script src="index.js"></script>
</body>

</html>

css代码

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

main {
    display: flex;
    background-color: #2f3542;
    align-items: center;
    justify-content: center;
    height: 100vh;
}

h1 {
    color: #ffffff;
    font-size: 2rem;
    font-weight: 500;
}

.mark {
    border-right: 2px solid #ffffff;
    animation: blink 0.6s step-end infinite;
}

@keyframes blink {

    from,
    to {
        border-color: transparent;
    }

    50% {
        border-color: #ffffff;
    }
}

js代码

const textEl = document.querySelector('#text');
const texts = JSON.parse(textEl.getAttribute('data-text'));

let index = 0;
let charIndex = 0;
let delta = 200;

let start = null;
let flag = false;

function type(time) {
    window.requestAnimationFrame(type);
    if (!start) {
        start = time;
    }
    let progress = time - start;

    if (progress > delta) {
        let text = texts[index];
        if (!flag) {
            textEl.innerHTML = text.slice(0, ++charIndex);
            // delta = 500 - Math.random() * 400;
            delta = 200;
        } else {
            textEl.innerHTML = text.slice(0, charIndex--);
        }

        start = time;

        if (charIndex === text.length) {
            flag = true;
            delta = 200;
            start = time + 1200;
        }
        if (charIndex < 0) {
            flag = false;
            start = time + 200;
            index = ++index % texts.length;
        }
    }
}
window.requestAnimationFrame(type);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值