ジャンルから探す

Web Design English

Laravelにリッチテキストエディタ『Quill』を実装する【Quill 2.0対応】

Laravel のBladeにリッチテキストエディタ『Quill』を実装する手順を解説します。

結論から書くと、CDNを2行読み込んで new Quill() を1行書くだけで動きます。サーバー側の準備も、ビルドの設定も要りません。

この記事は2021年に公開したあと、2026年9月に見直しました。当時使っていた Quill 1.3.6 は、2024年にリリースされた Quill 2.0 系に置き換わっています。CDNのURLと配布元が変わっているので、コードをすべて2.0.3の書き方に更新しました。1.x から上げるときの注意点も最後にまとめています。

スポンサーリンク

テキストエディタ『Quill』の導入方法

結論:Bladeファイルの head にCDNを読み込み、body にエディタを置く div と初期化のスクリプトを書けば完成です。

Quill.js は GitHub からソースをダウンロードすることもできますが、今回はCDNで実装します。Quill 2.0 系の配布は jsDelivr(cdn.jsdelivr.net/npm/quill@2.0.3/dist/)になりました。1.x で使われていた cdn.quilljs.com のURLは 2.0 系のファイルを配信していないので、そのままでは動きません。

Githubはこちら
https://github.com/quilljs/quill

任意のBladeファイル(例えばindex.blade.php)に、下記を記述します。

<head>
    <script src="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.snow.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.bubble.css" rel="stylesheet">
</head>
<body>
    <div id="quill_editor"></div>
    <script>
      const quill = new Quill('#quill_editor', {
        theme: 'snow'
      });
    </script>
</body>

Quillを導入するコードはこれだけです。

コード解説については後述しますので、一度ページを確認してみましょう。

laravel quill リッチテキストエディタ

こんな感じで表示されてれば成功です。

こんな簡単でいいのかというくらい簡単に実装できましたね。

この後解説を挟んでから、テーマ変更の仕方や、ツールバーのカスタマイズのやり方も解説していきます。

テキストエディタ『Quill』の導入解説

上記で実装したコードの解説をしていきます。

Quill導入に必要な記述はたったの3つです。

headタグ内にcdnを読み込む

headタグ内に、下記コードを記述します。

<head>
    <script src="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.snow.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.bubble.css" rel="stylesheet">
</head>

これで、Quill.jsとcssを読み込むことができます。

cssは2種類あるので、使いたい方を読み込みます。

cssの指定は後述します。

bodyタグ内にテキストエディタタグを記述

bodyタグ内に、テキストエディタを生成するタグを記述します。

必ず、id付きのdivタグを記述してください。idは任意の名前で大丈夫です。

このdivタグの中に、テキストエディタが生成されます。

<body>
    <div id="quill_editor"></div>
</body>

JavaScriptでテキストエディタを生成する

JavaScriptでテキストエディタを生成します。

今回は、body閉じタグ前にテキストエディタを生成するためのscriptを記述します。

<body>
    <script>
      const quill = new Quill('#quill_editor', {
        theme: 'snow'
      });
    </script>
</body>

idの部分は、先ほどdivタグに指定したidを記述します。

themeの部分は、headタグで読み込むcssと同じテーマ名を記述します。用意されているテーマは「snow」と「bubble」があります。

テーマを変更する

用意されているテーマは「snow」と「bubble」があります。

script部分のテーマ名を指定するだけで簡単に変更できます。

snow

「snow」はエディタの上にツールバーが表示されるテーマです。

laravel quill snow

bubble

「bubble」は編集したいテキストをドラッグで範囲指定するとツールチップのように表示されるテーマです。

laravel quill bubble

スポンサーリンク

テキストエディタをカスタマイズする

デフォルトのままだと、文字色や画像の投稿ができません。

ツールバーに表示させる内容を増やすjsコードを作成したので、下記、コピペでどうぞ。

ファイル名を「quillcustom.js」にして保存します。

/**
    関数: テキストエディタの生成
    引数: 作成する場所のid
    戻り値: Quillエディタの生成情報
**/
function quillEditor(make_id) {

    var toolbarOptions;
    var quill;
    var themes = set_themes();

    // ツールバー機能の設定
    toolbarOptions = [
        // 見出し
        [{
            'header': [1, 2, 3, 4, false]
        }],
        // フォント種類
        [{
            'font': []
        }],
        // 文字寄せ
        [{
            'align': []
        }],
        // 太字、斜め、アンダーバー
        ['bold', 'italic', 'underline'],
        // 文字色
        [{
                'color': []
            },
            // 文字背景色
            {
                'background': []
            }
        ],
        // リスト
        [{
                'list': 'ordered'
            },
            {
                'list': 'bullet'
            }
        ],
        // インデント
        [{
            'indent': '-1'
        }, {
            'indent': '+1'
        }],
        // 画像挿入
        ['image'],
        // 動画
        ['video'],
        // 数式
        ['formula'],
        // URLリンク
        ['link']
    ];

    make_id = '#' + make_id;

    // エディタの情報を生成
    quill = new Quill(make_id, {
        modules: {
            toolbar: toolbarOptions
        },
        placeholder: '本文を入力してください',
        theme: themes
    });

    return quill;
}


// テーマ設定(PCとSPでテーマを切り替える)
function set_themes() {
    var themes;
    if (window.parent.screen.width > 750) {
        themes = "snow";
    } else {
        themes = "bubble";
    }
    return themes;
}

カスタマイズしたテキストエディタを実装する

カスタマイズしたテキストエディタは、下記のように実装します。

<head>
    <script src="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.snow.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.bubble.css" rel="stylesheet">
    <!-- 上記で作成したjsを読み込む -->
    <script type="text/javascript" src="quillcustom.js"></script>
</head>
<body>
    <div id="quill_editor"></div>
    <script>
      var quill = quillEditor("quill_editor")
    </script>
</body>

先ほどに比べて、ツールバーにメニューが増えたと思います。

laravel quill リッチテキストエディタ カスタマイズ

▼Quillのfont-familyをカスタマイズしたい方はこちらの記事をどうぞ

▼Quillのfont-sizeをカスタマイズしたい方はこちらの記事をどうぞ

入力内容をLaravel側に保存する

結論:Quill はエディタの中身を <form> で勝手には送信しません。hidden の input を用意して、送信時にHTMLを詰め込みます。

Quill が編集しているのは <div> の中身なので、そのままでは POST されません。次のように、送信直前に値を移します。

<form method="POST" action="/posts" id="post_form">
    @csrf
    <div id="quill_editor"></div>
    <input type="hidden" name="body" id="body">
    <button type="submit">保存</button>
</form>

<script>
const quill = new Quill('#quill_editor', { theme: 'snow' });

document.getElementById('post_form').addEventListener('submit', function () {
    document.getElementById('body').value = quill.getSemanticHTML();
});
</script>

getSemanticHTML() は Quill 2.0 で追加されたメソッドです。エディタの内部用クラスを取り除いた、保存に向いたHTMLを返します。1.x でよく使われていた quill.root.innerHTML は Quill 内部のクラスまで含んだHTMLを返すので、保存先で使い回すには不向きでした。

保存した値を表示するときは、そのままでは Blade がエスケープします。HTMLとして出す場合は {!! !!} を使いますが、ユーザーの入力をそのまま出力するとXSSになります。保存前か表示前に、必ずサニタイズを挟んでください。

{!! $post->body !!}

編集画面に既存の内容を読み込む場合は、初期化のあとに dangerouslyPasteHTML() で流し込みます。

quill.clipboard.dangerouslyPasteHTML(@json($post->body));

スポンサーリンク

Quill 1.xから2.0へ上げるときの注意点

結論:CDNのURL以外にも、保存済みHTMLの構造が変わる点に注意してください。すでに 1.x で記事を保存している場合は、表示側のCSSが崩れることがあります。

▼1.xから2.0での主な変更

項目 Quill 1.x Quill 2.0
CDN cdn.quilljs.com/1.3.6/ cdn.jsdelivr.net/npm/quill@2.0.3/dist/
箇条書き <ul> と <ol> を使い分け すべて <ol>(種類は属性で持つ)
コードブロック 専用の要素 <div>
HTMLの取得 root.innerHTML getSemanticHTML() が追加
IE対応 あり 打ち切り
型定義 @types/quill が必要 本体に同梱(別途不要)

いちばん影響が出るのは箇条書きです。2.0 では順序なしリストも <ol> で出力され、種類は属性で区別する形になりました。表示側のCSSで ul を対象にスタイルを当てていると、2.0 で保存した記事だけ箇条書きの見た目が変わります。

既存データがある状態で上げる場合は、まず表示側のCSSが ul 前提になっていないかを確認してください。1.x で保存済みのHTMLはそのまま残るので、新旧が混在します。

このほか、strict オプションと scrollingContainer オプションが削除され、クリップボードの pasteHTML も廃止されました。1.x のコードをそのまま持ってくると、この3つで動かなくなることがあります。

まとめ

Laravelにリッチテキストエディタ『Quill』を簡単に実装できる紹介をしました。

Quillは、この記事で紹介した機能だけでなく、カラーパレットに表示させる色のカスタマイズや、書式の指定など、他にもたくさんの拡張機能が備わっています。

オススメのエディタなのでぜひお試しください。


Quill のツールバーや見た目をさらに調整する場合は、エディタ『Quill』のfont-familyをカスタマイズするとfont-sizeをカスタマイズするで、選択肢の増やし方をまとめています。

Laravel の開発環境をこれから作る場合は、Dockerを使ってLaravel/Blade環境構築からscss導入までもあわせてどうぞ。

▼HTML/CSS/JavaScriptの学習本を探してる方はこちらの記事をどうぞ