【Vue3】vue.draggable.next でドラッグ時にスクロールと判定される領域を拡張する方法

記事タイトルとURLをコピーする

こんにちは!アプリケーションサービス部ディベロップメントサービス 1 課の滝澤です。

本記事をご覧いただき、ありがとうございます。

本記事では、vue.draggable.next を使用している際、ドラッグ時にスクロールと判定される領域を拡張する方法をご紹介します。

はじめに

本記事では、vue.draggable.next についてある程度の知識があることを前提に進めます。

もし vue.draggable.next についての概要が知りたい場合は、以下の記事をご参照ください。

blog.serverworks.co.jp

やりたいこと

以下に記載しますが、デフォルトの状態でスクロールと判定される領域はかなり狭いです。

デフォルトのスクロールと判定される領域

変更前

スクロールと判定される領域を拡張したい

今回目指すのは、以下のようなドラッグ時にスクロールと判定される領域を拡張することです。

変更後

[結論] vue.draggable.next を使用している際、ドラッグ時にスクロールと判定される領域を拡張する方法

vue.draggable.next を使用している際、ドラッグ時にスクロールと判定される領域を拡張する方法は、以下の通りです。

  • forceFallback を true に設定して、scroll-sensitivity に任意の値を設定する
<draggable ... :forceFallback="true" :scroll-sensitivity="100"> ... </draggable>

それぞれのプロパティの説明

forceFallback によって HTML のネイティブなスクロールを無効にする

※ vue.draggable.next は、Sortable.js をベースに作成されているため Sortable.js のオプションをそのまま使用できます。

forceFallback は、HTML のネイティブなスクロールを無効にするオプションです。

参考:https://github.com/SortableJS/Sortable?tab=readme-ov-file#options

scroll-sensitivity によってスクロールと判定される領域(高さ)を設定する

scroll-sensitivity は、スクロールと判定される領域(高さ)を設定するオプションです。(px 単位)

参考:https://github.com/SortableJS/Sortable/tree/master/plugins/AutoScroll#scrollsensitivity-option

はまりポイント

2 つ以上の draggable を使用している場合

2 つ以上の draggable を使用している場合、一方の draggable に forceFallback を true に設定すると、他方の draggable からのドラッグができなくなります。

その際はドラッグ元の draggable にも forceFallback を true に設定する必要があります。

また、他の draggable からドラッグした時にもスクロールと判定される領域を拡張させたい場合は、ドラッグ元の draggable にも scroll-sensitivity を設定する必要があるので注意が必要です。

forceFallback を true にすると、文字列が選択されてしまう。

発生環境

  • chrome version:127.0.6533.120
  • vue.draggable.next version:4.1.0

暫定的な対処として、以下のように draggable に CSS を記述することで文字列の選択を無効にすることができます。

参考:https://developer.mozilla.org/ja/docs/Web/CSS/user-select

<draggable
  ...
  style="user-select: none"
  :forceFallback="true"
  :scroll-sensitivity="100"
>
  ...
</draggable>

まとめ

vue.draggable.next を使用している際、ドラッグ時にスクロールと判定される領域を拡張する方法についてご紹介しました。 この記事が、誰かのお役に立てれば幸いです。

滝澤 稜(執筆記事の一覧)

アプリケーションサービス部ディベロップメントサービス1課

2022年に新卒で入社しました。 うどんが大好物です。