ブログパーツ生成ツール:コピペボタン付きソースコードブロック

ブログにコードを載せるときにどうやって載せようか悩みませんか?コードを読者に手軽に使ってもらえるように、コピー機能付きのコードブロックを作りました。また、ブログをスマホで更新することが多い方にも便利なように、コードブロック内をその場で編集できる機能も追加してみました。よければ参考にしてください。

code block


コピペ可能:HTMLのコードブロック

コピーボタン付きのコードブロックを生成するための使用手順を説明します。

手順1: コードを入力
入力フォームに自分のコードを貼り付けます。
手順2: 「コードを反映」ボタンを押す
入力したコードが自動的にHTMLエスケープされ、下のコードブロックに反映されます。
手順3: 「コードをコピー」ボタンを押す
コードブロック内のHTMLがそのままコピーされます。あとはHTMLとしてあなたのサイトに貼り付けするとコピーボタン付きのコードブロックになります。
※入力したデータはサーバーに送信していません(JavaScriptのみで処理)。もう一度反映させたい場合は、再度リロードしてください。


<div class="code-container">
    <button class="copy-btn">コードをコピー</button>
	<pre><code>
YourCode
	</code></pre>
</div>
    

ツール使用例

実際に、このツールを使ってソースコードをブログに貼るところまでの使用例を説明します。

  1. コードに自分のコードを貼ります。
    <div style="display: flex; justify-content: center; margin: auto; max-width: 320px;">
        <a href="画像1" style="width: 45%;margin: 1px;">
            <img src="画像1" style="height: 320px; object-fit: cover; width: 100%;" />
        </a>
        <a href="画像2" style="width: 45%;margin: 1px;">
            <img src="画像2" style="height: 320px; object-fit: cover; width: 100%;" />
        </a>
    </div>
  2. コード反映ボタンを押します。
    変な文字になっているように見えますが、そのままコピペできるようにHTML部分がエスケープされています。
    <div class="code-container">
        <button class="copy-btn">コードをコピー</button>
    	<pre><code>
    &lt;div style=&quot;display: flex; justify-content: center; margin: auto; max-width: 320px;&quot;&gt;
        &lt;a href=&quot;画像1&quot; style=&quot;width: 45%;margin: 1px;&quot;&gt;
            &lt;img src=&quot;画像1&quot; style=&quot;height: 320px; object-fit: cover; width: 100%;&quot; /&gt;
        &lt;/a&gt;
        &lt;a href=&quot;画像2&quot; style=&quot;width: 45%;margin: 1px;&quot;&gt;
            &lt;img src=&quot;画像2&quot; style=&quot;height: 320px; object-fit: cover; width: 100%;&quot; /&gt;
        &lt;/a&gt;
    &lt;/div&gt;
    	</code></pre>
    </div>
  3. コードをコピーのボタンを押します。
  4. HTML編集画面で貼り付けます。
    以下のような表示になります

    
    <div style="display: flex; justify-content: center; margin: auto; max-width: 320px;">
        <a href="画像1" style="width: 45%;margin: 1px;">
            <img src="画像1" style="height: 320px; object-fit: cover; width: 100%;" />
        </a>
        <a href="画像2" style="width: 45%;margin: 1px;">
            <img src="画像2" style="height: 320px; object-fit: cover; width: 100%;" />
        </a>
    </div>
    	

事前設定:JavaScript

HTMLをコピペする前にコピーボタンの動作のためにJavaScriptを設定しておいてください。コードブロックだけあればよくて、コピーボタンは必要ないという方はHTMLから<button class="copy-btn">コードをコピー</button>を削除すればこの設定は必要ありません。



document.addEventListener('DOMContentLoaded', () => {
    // すべてのコピー用ボタンを取得
    const copyButtons = document.querySelectorAll('.copy-btn');

    // 各ボタンにイベントリスナーを追加
    copyButtons.forEach((copyBtn) => {
        copyBtn.addEventListener('click', () => {
            // 対応するコードブロックを取得(親要素内の<code>タグ)
            const codeBlock = copyBtn.closest('.code-container').querySelector('code');

            // コードのテキストを取得
            const codeText = codeBlock.textContent.trim();

            // クリップボードにコピー
            navigator.clipboard.writeText(codeText)
                .then(() => {
                    // コピー完了メッセージを一時的に表示
                    copyBtn.textContent = 'コピーしました!';
                    setTimeout(() => {
                        copyBtn.textContent = 'コードをコピー';
                    }, 2000);
                })
                .catch((err) => {
                    console.error('コピーに失敗しました:', err);
                });
        });
    });
});
	
説明
JavaScriptのコードを簡単に説明します。
  • DOMContentLoaded イベント:

    • ページが完全に読み込まれたタイミングでスクリプトを実行します。
  • .copy-btn要素の取得:

    • querySelectorAllを使い、すべてのコピー用ボタンを取得します。
      HTMLでclass="copy-btn"となっているボタンが対象になります。
  • 各ボタンへのイベントリスナーの追加:

    • forEachですべてのボタンにクリックイベントリスナーを追加します。
  • 対応するコードブロックの特定:

    • クリックされたボタンの親要素(.code-container)内の<code>タグをclosestquerySelectorで取得します。
  • コードテキストの取得:

    • 対応する<code>要素からテキストを取得し、trimで余計な空白を除去します。
  • クリップボードへのコピー:

    • navigator.clipboard.writeTextを使って、取得したコードテキストをクリップボードにコピーします。
  • コピー完了メッセージの表示:

    • コピー成功後、ボタンのテキストを「コピーしました!」に変更し、2秒後に「コードをコピー」に戻します。

事前準備:CSS設定

HTMLをコピペする前にCSSを事前に設定しておいてください。


.code-container {
    position: relative;
    background-color: #ececec; /* 背景を薄い灰色に */
    padding: 2px;
    border-radius: 5px;
    border: 1px solid #dcdcdc; /* 枠を薄灰色に */
    overflow: auto;
    max-width: 800px;
    margin: 20px auto;
    box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
}

.code-container .copy-btn {
    position: absolute;
    top: 10px;
    right: 10px;
    background-color: #10a37f;
    color: #fff;
    border: none;
    border-radius: 3px;
    padding: 8px 12px;
    cursor: pointer;
    font-size: 12px;
    opacity: 0.9;
    transition: opacity 0.3s, transform 0.2s;
}

.code-container .copy-btn:hover {
    opacity: 1;
    transform: scale(1.05); /* ボタンを少し大きく */
}
.code-container .copy-btn:focus {
    outline: none; /* フォーカス時のアウトラインを削除 */
}
/* コードのスタイル */
.code-container pre {
    margin: 0;
    font-size: 14px;
    line-height: 1.5;
    font-family: 'Courier New', Courier, monospace;
}
	
説明
CSSの設定意図を説明します。
  • .code-container(コードブロック全体)
    • position: relative;
      • 子要素(コピー用ボタン)の位置指定を行いやすくするため、相対位置を設定。
    • background-color: #ececec;
      • 背景色を薄い灰色に設定して目立たせる。
    • padding: 2px;
      • 内側の余白を少し確保して、内容が枠に接しないようにする。
    • border-radius: 5px;
      • 角を5pxの半径で丸くして柔らかいデザインに。
    • border: 1px solid #dcdcdc;
      • 枠線を薄灰色にして控えめな区切りを追加。
    • overflow: auto;
      • コードブロック内のテキストが長い場合、スクロールバーを表示。
    • max-width: 800px;
      • 最大幅を800pxに制限し、大きすぎないように調整。
    • margin: 20px auto;
      • 上下に20pxの余白を追加し、左右を中央寄せ。
    • box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
      • 薄い影を追加して立体感を演出。
  • .code-container .copy-btn(コピー用ボタン)
    • position: absolute;
      • 親要素内で絶対位置を指定できるように設定。
    • top: 10px; right: 10px;
      • コードブロックの右上に配置。
    • background-color: #10a37f;
      • ボタンの背景色を緑系の色にして視認性を向上。
    • color: #fff;
      • ボタンテキストを白にしてコントラストを高める。
    • border: none;
      • ボタンの枠線を削除してシンプルな見た目に。
    • border-radius: 3px;
      • ボタンの角を3pxの半径で丸くして統一感を持たせる。
    • padding: 8px 12px;
      • ボタンの内側の余白を設定し、クリックしやすい大きさに。
    • cursor: pointer;
      • ホバー時にポインター(手形)を表示。
    • font-size: 12px;
      • ボタンの文字サイズを12pxに設定。
    • opacity: 0.9;
      • 少し透明にして控えめなデザインに。
    • transition: opacity 0.3s, transform 0.2s;
      • 透明度とサイズの変化にアニメーション効果を追加。
  • .code-container .copy-btn:hover(ボタンのホバー時)
    • opacity: 1;
      • 完全に透明度を無効にして目立たせる。
    • transform: scale(1.05);
      • ボタンを少し大きくして視覚的フィードバックを提供。
  • .code-container .copy-btn:focus(ボタンのフォーカス時)
    • outline: none;
      • フォーカス時のデフォルトアウトラインを削除。
  • .code-container pre(コードの表示部分)
    • margin: 0;
      • デフォルトの余白を削除。
    • font-size: 14px;
      • コードの文字サイズを14pxに設定。
    • line-height: 1.5;
      • 行間を1.5倍にして読みやすく。
    • font-family: 'Courier New', Courier, monospace;
      • 固定幅フォントを指定してコードらしさを演出。

まとめ

やりたいことはできたので個人的には満足です。今後、ブログのパーツを作るときは今回のように入力フォーム付きで作っていこうと思います。


Next Post Previous Post
No Comment
Add Comment
comment url