Vueは複数列レイアウトドラッグを実装します

Vueは複数列レイアウトドラッグを実装します

この記事では、マルチカラムレイアウトドラッグを実装するためのVueの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

1. 目的

Vue は、複数のボックスの自由なドラッグと幅の変更を実装します (ユーザーは実際のシナリオに基づいてボックスの数を決定します)。

2. 応用シナリオ

幅を自由にドラッグできる複数列レイアウト。

最も一般的なケース:エディター(例: vscode、idea など)

コンポーネント設計

このコンポーネントのボックス数は不明なので、コンポーネントの設計にはVuetifyの Form と FormItem の設計を参考にしました。つまり、外側の大きなボックスは分散ドラッグ イベントを処理し、内側のボックスは各アイテムの内容を表示する役割を担います。

コンポーネント設計により、次の目標が達成されます。

<ドラッグボックススタイル="幅: 100%; 高さ: 100%;">
   <ドラッグアイテム>アイテム1</ドラッグアイテム>
   <drag-item>項目2</drag-item>
   <ドラッグアイテム>アイテム3</ドラッグアイテム>
   <ドラッグアイテム>アイテム4</ドラッグアイテム>
</ドラッグボックス>

4. 実装

4.1 dragBox 静的ページ

(サブ要素のネストはスロットを通じて実現されます)

<テンプレート>
    <div ref='dragBox' style='display: flex; 幅: 100%; 高さ: 100%;'>
        <スロット></スロット>
    </div>
</テンプレート>

4.2 ドラッグアイテムページ

(ドラッグアイテムの内部要素のネストはスロットを通じて実現されます)

<テンプレート>
    <div ref="container" class="d-flex" style="min-width: 200px; position: relative;">
        <div スタイル="幅: 100%; 高さ: 100%;">
            <slot>デフォルト情報</slot>
        </div>
  <!-- ドラッグバー -->
        <div v-if="resizeShow" class="resize" />
    </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  小道具: {
  // ドラッグバーを表示するかどうかを制御します。デフォルトでは表示されます resizeShow: {
      タイプ: ブール値、
      デフォルト: true
    }
  }
}
</スクリプト>
<スタイル>
.サイズ変更{
    位置: 絶対;
    上: 0;
    右: 0;
    幅: 4px;
    高さ: 100%;
    カーソル: col-resize;
    背景色: #d6d6d6;
}
</スタイル>

4.3 ドラッグロジック

ドラッグ ロジックは dragItem ではなく dragBox によって処理される必要があります。

4.3.1 ドラッグを実装する前に、子要素 (dragItem など) を適切にレイアウトする必要があります。

ユーザーがdragItem に初期幅を割り当てない場合は、デフォルトの flex:1が使用されます (残りのスペースは均等に分散されます)。具体的なロジックは次のとおりです。

 // dragItem が幅を定義していない場合は、flex=1
    ドラッグアイテムフレックスを設定する(){
      const dragBox = this.$refs.dragBox
      const childrenLen = ドラッグボックスのchildren.length

      (i = 0; i < childrensLen; i++) の場合 {
        定数ノード = dragBox.children[i]
        ノードスタイルの幅が等しい場合
          // 幅が定義されていない場合はflex=1
          ノードスタイルフレックス = 1
        }
      }
    },

4.3.2 ドラッグアンドドロップの実装ロジック

各 dragItem のドラッグ バーにドラッグ イベントを追加する必要があります。完全なドラッグ イベントには、マウスの押下、マウスの移動、マウスのリフト (ドラッグの終了) が含まれます。

各ドラッグ バーにイベントを追加するループ:

ドラッグコントローラDiv() {
  const resize = document.getElementsByClassName('resize') // ドラッグバー // 各ドラッグバーのイベントを追加するためのループ for (let i = 0; i < resize.length; i++) {
    // マウス押下イベント resize[i].addEventListener('mousedown', this.onMouseDown)
  }
},

マウスプレスロジック: マウスの初期位置を取得し、ドラッグバーの色を変更し、移動と上へのリスナーイベントを追加します。

マウスダウン時(e) {
  this.resizeBox = e.target
  this.currentBox = this.resizeBox.parentNode // 現在のボックス this.rightBox = this.getNextElement(this.currentBox) // 現在のボックスの次の兄弟ノード if (!this.rightBox) return
  this.curLen = this.currentBox.clientWidth
  this.otherBoxWidth = this.$refs.dragBox.clientWidth - this.currentBox.clientWidth - this.rightBox.clientWidth // 他のボックスの幅 // 色変更のリマインダー this.resizeBox.style.background = '#818181'
  this.startX = e.clientX
  document.addEventListener('mousemove', this.onMousemove)
  document.addEventListener('mouseup', this.onMouseup)
},

// 次の兄弟要素を取得するcompatible function getNextElement (element) {
  if (要素.nextElementSibling) {
    element.nextElementSibling を返す
  } それ以外 {
    var next = element.nextSibling // 次の兄弟ノード while (next && next.nodeType !== 1) { // 存在するが、必要なものではない next = next.nextSibling
    }
    次へ戻る
  }
}

マウス移動イベント: 現在のボックスと右のボックスの幅を計算して設定します。

マウスを動かすと(e){
  定数 endX = e.clientX
  const moveLen = endX - this.startX // (endx-startx) = 移動距離 const CurBoxLen = this.curLen + moveLen // resize[i].left + 移動距離 = 左領域の最終幅 const rightBoxLen = this.$refs.dragBox.clientWidth - CurBoxLen - this.otherBoxWidth // 右幅 = 合計幅 - 左幅 - 他のボックス幅 // 最小幅に達すると、ドラッグは利用できなくなります if (CurBoxLen <= 200 || rightBoxLen <= 200) return
  this.currentBox.style.width = CurBoxLen + 'px' // 現在のボックスの幅 this.resizeBox.style.left = CurBoxLen // 左領域の幅を設定 this.rightBox.style.width = rightBoxLen + 'px'
},

マウスアップイベント: mousedown イベントと mousemove イベントを破棄し、ドラッグバーの色を復元します。

マウスアップ時(){
 // 色の復元 this.resizeBox.style.background = '#d6d6d6'
 document.removeEventListener('mousedown', this.onMouseDown)
 document.removeEventListener('mousemove', this.onMousemove)
},

マウントされたフック関数に対応するイベントを追加します。

マウントされた(){
  this.setDragItemFlex()
  this.dragControllerDiv()
},

コンポーネントをインポートして登録します。

<テンプレート>
  <div id="app" style="幅: 100%; 高さ: 100vh; 境界線: 1px solid #ccc;">
    <ドラッグボックススタイル="幅: 100%; 高さ: 100%;">
      <drag-item style="width: 20%;">項目1</drag-item>
      <drag-item>項目2</drag-item>
      <drag-item style="width: 20%;" :resizeShow='false'>項目3</drag-item>
    </ドラッグボックス>
  </div>
</テンプレート>

<スクリプト>
'./components/dragLayouter' から {DragBox, DragItem} をインポートします。

エクスポートデフォルト{
  名前: 'アプリ'、
  コンポーネント:
    ドラッグボックス、
    ドラッグアイテム
  }
}
</スクリプト>

5. 運用結果

特定のスタイルは後で変更できます。

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

以下もご興味があるかもしれません:
  • Vue3.0はvue-grid-layoutプラグインを使用してドラッグレイアウトを実装します。
  • Vue3 ドラッグ可能な左パネルと右パネルの分割コンポーネントの実装
  • Vue コード分割 (codesplit) の実装
  • Vueはドラッグアンドドロップ分割レイアウトを実装

<<:  Tencent Cloud Serverの構築方法を説明します(グラフィックチュートリアル)

>>:  MySQLが正常にインストールされたかどうかを確認する方法

推薦する

【Webデザイン】E-WebTemplates の美しい海外の Web ページ テンプレート (FLASH+PSD ソース ファイル+HTML) を共有します

これらはすべて海外のE-WebTemplates WebサイトからのWebページテンプレートであり、...

K3s 入門ガイド - Docker で K3s を実行するための詳細なチュートリアル

k3dとは何ですか? k3d は、Docker で K3s クラスターを実行するための小さなプログ...

React Native の基本原則の深い理解 (Bridge of React Native)

この記事では、React Native の基本をすでに理解していることを前提とし、ネイティブと Ja...

Linux\Nginx 環境での仮想ドメイン名の設定とテスト検証

Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...

MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

質問今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そ...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

HTML入力で値が変更されたときにリスナーイベントを追加することの簡単な分析

達成される効果多くの場合、入力ボックスの値の変化をリアルタイムで監視し、ブラウザを誘導してウェブサイ...

Centos6.5 で MySQL 5.7.19 をインストールして設定する方法

Centos6.5にmysql5.7.19をインストールするための詳細な手順は次のとおりです。 1....

ノードにおけるhttpモジュールの使用と実行プロセス

ノードにおけるhttpの役割は何ですか? httpモジュールの役割は、サーバーの作成と記述を支援する...

ログインインターセプションを実装するためのVueルーティング

目次1. 概要2. ログインインターセプションを実装するためのルーティングナビゲーションガード1. ...

CentOS 8 仮想マシンから Windows 10 ホスト フォルダーにアクセスする方法の簡単な分析

VMware Toolsをインストールすると、仮想マシンホスト間で①テキストをコピーして貼り付けるこ...

Tomcat の 404 エラーの解決方法の詳細な説明

Tomcat テストで 404 問題が発生します。問題は次のとおりです。 HTTP ステータス 40...

Ant Design Blazor コンポーネントライブラリのルーティング再利用マルチタブ機能

最近、Ant Design Blazor コンポーネント ライブラリにマルチタブ コンポーネントを実...

ハイパーリンクアイコンの仕様: 記事の読みやすさを向上

1. ハイパーリンクアイコンの仕様とは?<br />ハイパーリンクアイコンの仕様は、「C...