首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

開發工具

複製你的hightlight 程式碼

By Kurau·2023-04-19·Updated 2026-05-09·1 分鐘閱讀

Copy 程式碼按鈕(Copy to Clipboard)

TL;DR
部落格 / 文件站常見的「Copy 按鈕」放在 code block 右上角。現代做法:用 navigator.clipboard.writeText()(原生 API,所有現代瀏覽器支援),配合 rehype-pretty-code 或自製 ReactMarkdown component。
主要參考
mdx-js Discussion #1948 — Copy code button 推薦做法

最簡實作

'use client';
import { useState } from 'react';

export function CopyButton({ text }: { text: string }) {
  const [copied, setCopied] = useState(false);

  const handleCopy = async () => {
    await navigator.clipboard.writeText(text);
    setCopied(true);
    setTimeout(() => setCopied(false), 2000);
  };

  return (
    <button onClick={handleCopy} aria-label="Copy code">
      {copied ? '✓ Copied!' : '📋 Copy'}
    </button>
  );
}
tsx

整合到 ReactMarkdown / MDX

<ReactMarkdown
  components={{
    pre: ({ children, ...props }) => {
      const text = typeof children === 'string' ? children : '';
      return (
        <div style={{ position: 'relative' }}>
          <CopyButton text={text} />
          <pre {...props}>{children}</pre>
        </div>
      );
    },
  }}
>
  {markdown}
</ReactMarkdown>
tsx

配 rehype-pretty-code 或 shiki 處理 syntax highlight,組合起來就是業界標準的 code block UI。


進階:從 DOM 抓真實 code 文字

'use client';
import { useRef } from 'react';

function CodeBlock({ children }: { children: React.ReactNode }) {
  const ref = useRef<HTMLPreElement>(null);

  const handleCopy = async () => {
    const code = ref.current?.textContent ?? '';
    await navigator.clipboard.writeText(code);
  };

  return (
    <div className="relative">
      <button onClick={handleCopy}>Copy</button>
      <pre ref={ref}>{children}</pre>
    </div>
  );
}
tsx

適合已經 highlight 過的 code(裡面有 <span> 等 HTML 結構),用 textContent 抓純文字。

目錄

    ◆ 相關文章

    • 讓你網頁的Code語法 Hightlight起來

      2026-05-09
    • 網頁上實現markdown編輯

      2026-05-09
    • github 多個帳戶 SSH登入

      2026-05-09
    • lodash

      2026-05-09
    ← 上一篇方便你的SideProject下一篇 →保護你的API KEY (React 前端)

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章