Posts: 打字机效果的 Hitokoto(html+css+js)
打字机效果的 Hitokoto(html+css+js)
效果
讲
文本将写在<span class="text" id="hitokoto_text">:D 获取中...</span>
里
JavaScript 中
1 2 3
| const typingSpeed = 180; const deletingSpeed = 100; const delayBetweenCycles = 2500;
|
完整源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>打字机效果的 Hitokoto</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; display: flex; justify-content: center; align-items: center; background-color: rgb(43, 52, 82); } .text { font-family: 'fangsong'; display: inline-block; position: relative; font-size: 40px; height: 60px; line-height: 60px; color: rgb(245, 245, 245); } .text::after { content: ''; position: absolute; right: -10px; top: 5px; height: 50px; width: 3px; background-color: #fff; animation: blink 0.5s steps(1) infinite; } @keyframes blink { 0%, 100% { background-color: #fff; } 50% { background-color: transparent; } } </style> </head> <body> <h1> <span class="text" id="hitokoto_text">:D 获取中...</span> </h1> <script> const textElement = document.querySelector('.text'); let charIndex = 0; let isDeleting = false; let hitokotoText = ''; let typingInterval; const typingSpeed = 180; const deletingSpeed = 100; const delayBetweenCycles = 2500;
function typeWriter() { if (!shouldRunEffect()) { clearInterval(typingInterval); return; } if (isDeleting) { textElement.innerHTML = hitokotoText.slice(0, charIndex--); } else { textElement.innerHTML = hitokotoText.slice(0, ++charIndex); } if (!isDeleting && charIndex === hitokotoText.length) { setTimeout(() => isDeleting = true, delayBetweenCycles); } else if (isDeleting && charIndex === 0) { isDeleting = false; clearInterval(typingInterval); fetchHitokoto(); return; } const speed = isDeleting ? deletingSpeed : typingSpeed; typingInterval = setTimeout(typeWriter, speed); }
function fetchHitokoto() { if (!shouldRunEffect()) return; fetch('https://v1.hitokoto.cn') .then(response => response.json()) .then(data => { hitokotoText = data.hitokoto; var consoleQuote = hitokotoText; charIndex = 0; typeWriter(); console.log(`%c✨ ${consoleQuote}`,"font-size:20px; background:rgba(225,225,225,0); color:#3aaacf;padding:10px; border: 3px solid #3aaacf;border-radius:10px;"); }) .catch(error => { console.error(error); hitokotoText = "获取失败 ε(┬┬﹏┬┬)3"; charIndex = 0; errortypeWriter(); }); }
function errortypeWriter() { typingInterval = setInterval(() => { textElement.innerHTML = hitokotoText.slice(0, ++charIndex); if (charIndex === hitokotoText.length) { clearInterval(typingInterval); } }, typingSpeed); }
function shouldRunEffect() { return true }
document.addEventListener('DOMContentLoaded', function() { fetchHitokoto(); });
volantis.pjax.push(() => { if (shouldRunEffect()) { fetchHitokoto(); } else { clearInterval(typingInterval); textElement.innerHTML = ''; } }); </script> </body> </html>
|
参考资料
- 打字机效果 html+css+js
- 语句接口 - 一言