リッチテキストエディタ『Quill』のツールバーに、独自のボタンを追加する方法を解説します。

結論から書くと、ツールバーのHTMLに ql- で始まるクラスのボタンを置き、handlers でそのクラス名に対応する処理を書きます。ボタンの見た目はHTML側、動作はJavaScript側で分担する形です。

この記事は2022年の公開時に誤った実装例を掲載していました。2026年9月に、Quill 2.0.3 で動く正しいコードへ全面的に差し替えています。

Quillにカスタムボタンを追加する

結論:ツールバーを自分でHTMLとして書き、そのコンテナをQuillに渡します。ボタンのクラス名を ql-任意の名前 にしておくと、その名前でハンドラを登録できます。

まずツールバーのHTMLを用意します。

<div id="toolbar">
  <button class="ql-bold"></button>
  <button class="ql-italic"></button>
  <!-- ここが独自のボタン -->
  <button class="ql-insertStar">★</button>
</div>

<div id="editor"></div>

ql-boldql-italic のようにQuillが最初から知っている名前は、中身を空にしておけばアイコンが自動で入ります。独自のボタンはQuillが知らないので、中身に文字やアイコンを自分で書きます。

次に、そのコンテナをQuillに渡し、ハンドラを登録します。

const quill = new Quill('#editor', {
  theme: 'snow',
  modules: {
    toolbar: {
      container: '#toolbar',
      handlers: {
        // クラス名の ql- を除いた部分がキーになる
        insertStar: function () {
          const range = this.quill.getSelection(true);
          this.quill.insertText(range.index, '★');
          this.quill.setSelection(range.index + 1);
        }
      }
    }
  }
});

handlers のキーは、クラス名から ql- を取り除いた文字列です。ql-insertStar なら insertStar になります。ここが一致していないと、ボタンを押しても何も起きません。

ハンドラの中の this はツールバーのモジュールを指すので、エディタ本体には this.quill でアクセスします。

初期化のあとから追加する

すでに動いているエディタにハンドラを足す場合は、addHandler() を使います。

const toolbar = quill.getModule('toolbar');

toolbar.addHandler('insertStar', function () {
  const range = this.quill.getSelection(true);
  this.quill.insertText(range.index, '★');
});

既定のボタンの動作を差し替えたいときにも使えます。たとえば画像ボタンを押したときに、自前のアップロード画面を出す、といった用途です。

toolbar.addHandler('image', function () {
  // 独自の画像アップロード処理を呼ぶ
  openImageUploader();
});

ボタンのCSSスタイルを変更する

結論:追加したボタンは .ql-insertStar というクラスで指定できます。

/* 独自ボタンの見た目 */
.ql-toolbar .ql-insertStar {
  font-size: 18px;
  color: #444;
}

/* ホバー時とアクティブ時 */
.ql-toolbar .ql-insertStar:hover {
  color: #06c;
}

Quillの既定のボタンは中身がSVGです。アイコンの色を変えたい場合は、SVGの strokefill を指定します。

.ql-toolbar button:hover .ql-stroke {
  stroke: #06c;
}

.ql-toolbar button:hover .ql-fill {
  fill: #06c;
}

.ql-stroke は線、.ql-fill は塗りです。ボタンによってどちらが使われているかが違うので、色が変わらないときはもう一方も指定してみてください。

アイコンを画像やアイコンフォントにする

結論:ボタンの中身はただのHTMLなので、<svg> でもアイコンフォントでも入れられます。

<button class="ql-insertStar">
  <i class="fa-solid fa-star"></i>
</button>

Font Awesome を使う場合は、7系のクラス名で書いてください。4系の fa fa-star という書き方は、現在のバージョンでは表示されません。

つまずきやすい点

結論:ボタンが反応しないときは、クラス名とハンドラのキーが一致しているかを最初に確認してください。

▼よくある原因

症状 原因
押しても何も起きない クラス名とハンドラのキーが不一致
ツールバーが二重に出る container を指定せず配列も渡している
ボタンが空欄になる Quillが知らない名前なのに中身を書いていない
選択位置がずれる getSelection(true)true を省いている

getSelection(true) の引数 true は「フォーカスが外れていたら戻す」という指定です。ツールバーのボタンを押すとエディタからフォーカスが外れるため、これを省くと選択範囲が取れずエラーになります。

まとめ

この記事では、Quillのツールバーに独自のボタンを追加する方法を解説しました。

ポイントは、HTMLのクラス名(ql-○○)とハンドラのキー(○○)を一致させることの一点に尽きます。

Quillの導入がまだの場合は、Laravelにリッチテキストエディタ『Quill』を実装するから先にどうぞ。Quill 2.0でCDNの配布元が変わっているので、古い記事のURLでは動きません。

ツールバーの選択肢を増やす方法は、font-familyをカスタマイズするfont-sizeをカスタマイズするにまとめています。

ABOUT ME
りん
このブログでは、Web開発やプログラミングに関する情報を中心に、私が日々感じたことや学んだことをシェアしています。技術と生活の両方を楽しめるブログを目指して、日常で触れた出来事や本、グルメの話題も取り入れています。気軽に覗いて、少しでも役立つ情報や楽しいひとときを見つけてもらえたら嬉しいです。