logo
コーディング

更新日

clipboard.jsでテキストをクリップボードにコピーする方法

以前「Vue.jsでカラーコードからRGB値にサクッと変換する方法」という記事で紹介した、「Quick HEX to RGB」では、値をクリックすればクリップボードにコピーする機能をつけています。これは「clipboard.js」を使っているので、基本的な使い方と、あまり説明のないツールチップの加え方を紹介します。

Vue.js でカラーコードから RGB 値にサクッと変換する方法

clipboard.js の使い方

Web サイトGitHub

まずは HTML に JavaScript のファイルを読み込ませましょう。ファイルをダウンロードする場合はGitHubから dist フォルダーにある「clipboard.min.js」ファイルを入手します。CDN も用意されているので、便利な方を使ってください。

<script src="https://unpkg.com/clipboard@2/dist/clipboard.min.js"></script>

clipboard.js の Web サイトでも公開されているデモを見てみましょう。ボタンをクリックするとテキストフィールド内のテキストをコピーします。

new ClipboardJS(".btn");

JavaScript に記述しているのはこれだけで OK!btn というクラスのついた要素をクリックすると、ターゲットとなるテキストをコピーします。

<!-- Target -->
<input id="foo" value="https://github.com/zenorocha/clipboard.js.git" />

<!-- Trigger -->
<button class="btn" data-clipboard-target="#foo">Copy</button>

あとはターゲットとなる要素に ID を与え、ボタンの方に data-clipboard-target="#foo" で ID を指定します。簡単ですね!

クリックした部分のテキストをコピーする

要素を指定してテキストをコピーするのではなく、コピーするテキストを直接指定する場合は data-clipboard-text 属性を指定します。例えばこの表のようにデータ部分をクリックするとそのデータをコピーしたいときに使えますね。

<table>
  <tr>
    <th>カロリー</th>
    <td class="copy-value" data-clipboard-text="303kcal">303kcal</td>
  </tr>
</table>
new ClipboardJS(".copy-value");

「コピー完了」のツールチップを表示する

ただ、このままだとコピーできているのかわかりづらいので、「コピー完了」がわかるツールチップを表示したいところ。clipboard.js の Web サイトでは

Each application has different design needs, that’s why clipboard.js does not include any CSS or built-in tooltip solution.

アプリによってデザインって違うよね。だから clipboard.js には CSS を含めてないし、備え付けのツールチップも用意してないよ。

とあっさり書かれているだけなので、ツールチップを表示させるためにちょっとカスタマイズ。

const clipboard = new ClipboardJS(".copy-value");

// Select all .copy-value items
const btns = document.querySelectorAll(".copy-value");

// Remove .tooptip class by mouseout
for (let i = 0; i < btns.length; i++) {
  btns[i].addEventListener("mouseleave", clearTooltip);
}
function clearTooltip(e) {
  e.currentTarget.setAttribute("class", "copy-value");
}

// Add .tooltip class when it's clicked
function showTooltip(elem) {
  elem.setAttribute("class", "copy-value tooltip");
}

clipboard.on("success", function (e) {
  showTooltip(e.trigger);
});

document.querySelectorAll('.copy-value'); で copy-value というクラスを取得。関数で elem.setAttribute('class','copy-value tooltip'); と記述して、クリックしたら tooltip というクラスを加えます。その tooltip クラスの要素に CSS で装飾をしていきます。また、テキストからカーソルが外れたらツールチップを消したいので、addEventListener('mouseleave',clearTooltip); を使って付与されるクラスが copy-value だけになるように設定。

ツールチップの装飾は表示位置をテキストの真下にくるよう position プロパティーを使ってあれこれ書き込んでいます。アニメーションを加えたりしちゃったりして。ツールチップ内のテキストは content プロパティーで指定しています。

.copy-value {
  cursor: pointer;
  position: relative;
}

/* Tooltip */
.tooltip::after {
  content: "Copied!";
  background: #555;
  display: inline-block;
  color: #fff;
  border-radius: 0.4rem;
  position: absolute;
  left: 50%;
  bottom: -0.8rem;
  transform: translate(-50%, 0);
  font-size: 0.75rem;
  padding: 4px 10px 6px 10px;
  animation: fade-tooltip 0.5s 1s 1 forwards;
}

/* Animation */
@keyframes fade-tooltip {
  to {
    opacity: 0;
  }
}

完成!

こんな感じでできあがりました!

公開しているツール「Quick HEX to RGB」でも同じ仕様になっています。ぜひ試してみてくださいね!