ブログパーツ生成ツール:コピペボタン付きソースコードブロック
ブログにコードを載せるときにどうやって載せようか悩みませんか?コードを読者に手軽に使ってもらえるように、コピー機能付きのコードブロックを作りました。また、ブログをスマホで更新することが多い方にも便利なように、コードブロック内をその場で編集できる機能も追加してみました。よければ参考にしてください。
コピペ可能:HTMLのコードブロック
コピーボタン付きのコードブロックを生成するための使用手順を説明します。
手順1: コードを入力
入力フォームに自分のコードを貼り付けます。
手順2: 「コードを反映」ボタンを押す
入力したコードが自動的にHTMLエスケープされ、下のコードブロックに反映されます。
手順3: 「コードをコピー」ボタンを押す
コードブロック内のHTMLがそのままコピーされます。あとはHTMLとしてあなたのサイトに貼り付けするとコピーボタン付きのコードブロックになります。
※入力したデータはサーバーに送信していません(JavaScriptのみで処理)。もう一度反映させたい場合は、再度リロードしてください。
<div class="code-container">
<button class="copy-btn">コードをコピー</button>
<pre><code>
YourCode
</code></pre>
</div>
ツール使用例
実際に、このツールを使ってソースコードをブログに貼るところまでの使用例を説明します。
- コードに自分のコードを貼ります。
<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>
- コード反映ボタンを押します。
変な文字になっているように見えますが、そのままコピペできるようにHTML部分がエスケープされています。<div class="code-container"> <button class="copy-btn">コードをコピー</button> <pre><code> <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> </code></pre> </div>
- コードをコピーのボタンを押します。
- 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);
});
});
});
});
DOMContentLoaded イベント:
- ページが完全に読み込まれたタイミングでスクリプトを実行します。
.copy-btn
要素の取得:querySelectorAll
を使い、すべてのコピー用ボタンを取得します。
HTMLでclass="copy-btn"となっているボタンが対象になります。
各ボタンへのイベントリスナーの追加:
forEach
ですべてのボタンにクリックイベントリスナーを追加します。
対応するコードブロックの特定:
- クリックされたボタンの親要素(
.code-container
)内の<code>
タグをclosest
とquerySelector
で取得します。
- クリックされたボタンの親要素(
コードテキストの取得:
- 対応する
<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;
}
.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;
- 固定幅フォントを指定してコードらしさを演出。
まとめ
やりたいことはできたので個人的には満足です。今後、ブログのパーツを作るときは今回のように入力フォーム付きで作っていこうと思います。