Vueでドラッグ可能なコンポーネントを実装する方法

Vueでドラッグ可能なコンポーネントを実装する方法

この記事では、Vueでドラッグ可能なコンポーネントとドラッグ可能なコンポーネントを実装する方法を参考までに紹介します。具体的な内容は次のとおりです。

説明する:

コンポーネントはドラッグ機能のみをカプセル化し、コンテンツは#header、#default、#footerスロットを通じてカスタマイズされます。

効果:

コード:

<テンプレート>
  <div
    ref="ラッパー"
    クラス="ドラッグバーラッパー"
  >
    <div
      ref="ヘッダー"
      クラス="ドラッグバーヘッダー"
    >
      <!-- ヘッダー領域 -->
      <スロット名="ヘッダー" />
    </div>
    <div class="ドラッグバーコンテンツ">
      <!-- メインコンテンツエリア -->
      <スロット名="デフォルト" />
    </div>
    <div class="ドラッグバーフッター">
      <!-- 下部領域 -->
      <スロット名="フッター" />
    </div>
  </div>
</テンプレート>
 
<スクリプト>
エクスポートデフォルト{
  データ() {
    戻る {
      wrapperDom: null、
      ヘッダーDom: null、
 
      ディスX: 0,
      ディスY: 0,
 
      最小左: 0,
      最大左: 0,
 
      最小トップ: 0,
      最大上: 0,
 
      前へ左: 0,
      前へトップ: 0,
    };
  },
  メソッド: {
    初期化ドラッグ() {
      this.wrapperDom = this.$refs.wrapper;
      this.headerDom = this.$refs.header;
      this.headerDom.addEventListener('mousedown', this.onMousedown, false);//ヘッダー領域をクリックしてドラッグします},
    マウスダウン時(e) {
      this.disX = e.clientX - this.headerDom.offsetLeft;
      this.disY = e.clientY - this.headerDom.offsetTop;
 
      this.minLeft = this.wrapperDom.offsetLeft;
      this.minTop = this.wrapperDom.offsetTop;
 
      this.maxLeft =
        window.innerWidth - this.minLeft - this.wrapperDom.offsetWidth;
      this.maxTop =
        window.innerHeight - this.minTop - this.wrapperDom.offsetHeight;
 
      const { left, top } = getComputedStyle(this.wrapperDom, false);
      this.prevLeft = parseFloat(left);
      this.prevTop = parseFloat(top);
 
      document.addEventListener('mousemove', this.onMousemove, false);
      document.addEventListener('mouseup', this.onMouseup, false);
      document.body.style.userSelect = 'none'; //ドラッグ中に選択したテキストの干渉を排除します},
    マウスを動かすと(e) {
      left = e.clientX - this.disX とします。
      top = e.clientY - this.disY とします。
 
      if (-left > this.minLeft) {
        左 = -this.minLeft;
      } そうでない場合 (left > this.maxLeft) {
        左 = this.maxLeft;
      }
 
      if (-top > this.minTop) {
        上 = -this.minTop;
      } そうでない場合 (top > this.maxTop) {
        上 = this.maxTop;
      }
 
      this.wrapperDom.style.left = this.prevLeft + left + 'px';
      this.wrapperDom.style.top = this.prevTop + top + 'px';
    },
    マウスアップ時() {
      document.removeEventListener('mousemove', this.onMousemove, false);
      document.removeEventListener('mouseup', this.onMouseup, false);
      document.body.style.userSelect = 'auto'; //テキストを選択可能に戻す},
  },
  マウント() {
    this.initDrag();
  }
};
</スクリプト>
 
<スタイルスコープ>
.ドラッグバーラッパー{
  位置: 固定;
  zインデックス: 2;
  上位: 50%;
  左: 50%;
  変換: translate(-50%, -50%);
  ディスプレイ: フレックス;
  flex-direction: 列;
}
.ドラッグバーヘッダー{
  背景色: #eee;
  カーソル: 移動; /*マウスドラッグスタイル*/
}
.ドラッグバーコンテンツ{
  背景色: #fff;
}
.ドラッグバーフッター{
  背景色: #fff;
}
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue は div の高さをドラッグ可能にします
  • Vueはドラッグ可能なダイアログボックスを実装します
  • Vue の一時停止されたドラッグ可能なフローティング ボタンのサンプル コード
  • Vueは、element-uiダイアログボックスのドラッグ可能な機能を実装します。
  • Vue プロジェクトで el-dialog コンポーネントのドラッグ可能な効果を実装する

<<:  Linuxのtimeコマンドの使い方の詳しい説明

>>:  数百万のデータボリュームに対する MySQL ページングクエリ方法とその最適化の提案

推薦する

5分でReactルーティングについてお教えします

目次ルーティングとは純粋コンポーネントの基本的な使用純粋なコンポーネントの使用に関する注意事項ルーテ...

Dockerコンテナは定期的にデータベースをバックアップし、指定されたメールボックスに送信します(設計アイデア)

目次1. 背景: 2. デザインのアイデア: 3. 起動スクリプトを書く4. イメージを構築する5....

CSS スタイルの競合を解決するいくつかの方法 (要約)

1. セレクターを調整するコンビネータを使用すると、セレクターの説明をより正確に記述できます (C...

Windows での MySQL 8.0.12 のインストール手順と基本的な使用方法のチュートリアル

この記事では、WindowsでのMySQL 8.0.12のインストール手順と使用方法のチュートリアル...

Linux ファイル記述子、ファイルポインタ、および inode の詳細

目次Linux - ファイル記述子、ファイルポインタ、インデックスノード1. Linux - ファイ...

MySql データベース クエリの特殊コマンド

まずMySQLのインストールMySQLソフトウェアをダウンロードし、インストールパスを変更しますMy...

MySQL 5.7.17 圧縮バージョンのインストールノート

この記事では、参考までにMySQL 5.7.17圧縮版のインストール手順を紹介します。具体的な内容は...

Vue+WebSocket ページでの長時間接続のリアルタイム更新

最近、Vue プロジェクトではデータをリアルタイムで更新する必要があります。折れ線グラフは 1 秒ご...

Vueリクエストインターセプターの設定方法の詳しい説明

以下の手順に従ってください1. request.jsコンテンツ: http リクエスト インターセプ...

Vueを使用して手書き署名機能を実装する

個人的な実装のスクリーンショット:インストール: npm インストール vue-esign --sa...

CSS3のtext-fill-colorプロパティの詳細な説明

text-fill-color とは何を意味しますか?文字通りの意味から言えば、「テキストの塗りつぶ...

Linux で MySQL 5.6 X64 バージョンをインストールする詳細な手順

環境: 1. CentOS6.5 X64 2.mysql-5.6.34-linux-glibc2.5...

Linux のハードリンクとソフトリンクの原理と使用法の分析

Linux システムには、ファイル共有を解決するために使用できるリンク ファイルと呼ばれる種類のファ...

MySQL Shellの紹介とインストール

目次01 レプリ​​カセットアーキテクチャ02 MySQL Shellの紹介とインストール03 My...

React 入門レベルの詳細なメモ

目次1. Reactの基本的な理解1. はじめに2. Reactの特徴3. Reactが効率的な理由...