模拟在一个段落自动换行和打字效果

<!DOCTYPE html>
<html>
<head>
<style>
.container {
  font-family: 'Courier New', monospace;
  width: 600px;
  min-height: 200px;
  border: 1px solid #ccc;
  padding: 20px;
  line-height: 1.5;
}

#content {
  white-space: pre-wrap;
  word-break: break-word;
  position: relative;
  color: #333;
}

.cursor {
  display: inline-block;
  width: 10px;
  height: 20px;
  background: #333;
  animation: blink 1s step-end infinite;
  margin-left: 2px;
}

@keyframes blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0; }
}
</style>
</head>
<body>
<div class="container">
  <div id="content"></div>
</div>

<script>
function typeWriter(text, speed = 50) {
  const container = document.getElementById('content');
  const cursor = document.createElement('span');
  cursor.className = 'cursor';
  container.appendChild(cursor);

  let index = 0;
  let currentLineWidth = 0;
  const maxWidth = 600; // 容器宽度 - padding

  function type() {
    if (index >= text.length) {
      cursor.remove();
      return;
    }

    const char = text[index++];
    const span = document.createElement('span');
    span.textContent = char;
    
    // 测量字符宽度
    container.insertBefore(span, cursor);
    const charWidth = span.getBoundingClientRect().width;
    
    // 自动换行处理
    if (currentLineWidth + charWidth > maxWidth || char === '\n') {
      container.insertBefore(document.createElement('br'), cursor);
      currentLineWidth = 0;
      if (char === '\n') return type();
    }

    if (char !== '\n') {
      currentLineWidth += charWidth;
    }

    // 保持光标可见
    container.scrollTop = container.scrollHeight;
    
    setTimeout(type, char === '\n' ? speed * 2 : speed);
  }

  // 初始调用
  setTimeout(type, speed);
}

// 示例文本(包含换行符)
const sampleText = "这是一个模拟自动换行和打字效果的示例文本。\n我们可以在这里添加多行内容,比如:\n1. 第一项内容\n2. 第二项内容\n3. 第三项内容...";
typeWriter(sampleText, 30);
</script>
</body>
</html>

<think>嗯,用户想在Markdown中实现打字机动画效果。首先,我需要了解Markdown本身是否支持动画。Markdown是静态的,通常不支持动态效果,但可以通过结合其他工具或库来实现。 用户提到的React TypistFlutter的Rich Typewriter都是可行的解决方案。React Typist适用于React项目,而Flutter的方案适合移动应用。不过用户可能是在网页环境中使用Markdown,比如在React组件里嵌入Markdown,这时候用React Typist可能更合适。 另外,纯CSS方法也是一个选项,虽然效果简单但不需要依赖库。比如使用CSS动画控制宽度边框闪烁,但可能无法逐字显示。需要用到JavaScript吗?或者有没有其他变通方法? 还需要考虑用户的具体使用场景,比如是在静态网站生成器(如Hexo、VuePress)里,还是需要客户端渲染。不同的平台可能有不同的集成方式。例如,在VuePress中可以通过自定义组件来实现,结合CSS或JavaScript。 用户可能没有编程经验,所以需要给出不同难度级别的方案。比如纯CSS的简单方法,或者基于现有库的解决方案。同时要注意兼容性定制化需求,比如控制每个字符的延迟或动画结束后的回调。 最后,需要验证这些方法是否真的适用于Markdown,比如在React中,可能需要将Markdown内容包裹在React Typist组件里,确保动态渲染。另外,要提供示例代码步骤,帮助用户具体实施。</think># Markdown中实现打字机动画效果的三种方案 ## 一、基于React的解决方案(推荐) 使用`react-typist`库实现动态文本渲染: ```jsx import Typist from 'react-typist'; import ReactMarkdown from 'react-markdown'; function AnimatedMarkdown({ content }) { return ( <Typist cursor={{ show: false }}> <ReactMarkdown children={content} /> </Typist> ); } ``` 此方案支持完整的Markdown语法解析,通过包裹`ReactMarkdown`组件实现逐字渲染效果[^1]。优势包括: - 自动处理段落换行 - 支持代码块同步动画 - 可配置字符间隔(通过`avgTypingDelay`属性) ## 二、纯CSS实现方案(基础版) 通过CSS动画模拟打字效果: ```css @keyframes typing { from { width: 0 } to { width: 100% } } .typist { overflow: hidden; white-space: nowrap; animation: typing 3.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值