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が正常にインストールされたかどうかを確認する方法

推薦する

CentOS 8 システム FTP サーバーのインストールとパッシブ モードの設定の詳細なチュートリアル

目次1. 基本を理解する2. システム環境を確認する3. ftpコマンドをインストールする[オプショ...

Ubuntu 16.04.4LTS に mininet をインストールする際に発生する問題と解決策

ミニネットMininet は軽量のソフトウェア定義ネットワークおよびテスト プラットフォームです。軽...

Explainキーワードに基づいてMySQLインデックス機能を最適化する方法

EXPLAIN は、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合す...

カラーブロックレポート効果の動的な表示を実現する HTML (サンプルコード)

HTMLカラーブロックを使用してデータを動的に表示する <スタイル タイプ="te...

Vue を通じて QR コードスキャン機能を実装する

ヒントこのプラグインは https プロトコルでのみアクセスできます。http プロトコルはうまく機...

MySQL マスタースレーブレプリケーションの実践の詳細説明 - ログポイントに基づくレプリケーション

ログポイントベースのレプリケーション1. マスターデータベースとスレーブデータベースに専用のレプリケ...

js は axios 制限リクエスト キューを実装します

目次背景は次のとおりです。何が起こるでしょうか?背景は次のとおりです。実際の開発では、ネットワークの...

CSS スタイルのリセットとクリア (異なるブラウザで同じ効果を表示するため)

異なるブラウザ間でページの表示を一致させるためには、フロントエンド開発において CSS スタイルのク...

ElementUI ページネーション コンポーネントの使い方 Vue でのページネーション

ElementUIページングコンポーネントPagination in Vueの使用は参考になります。...

CSS3 で作成した本のページめくり効果

結果:実装コード: html <!-- よろしければハートを付けてください! --> &...

VueでTypescriptの設定手順を使用する

目次1. TypeScriptが古いVueプロジェクトに導入されるVue+Typescript プロ...

重複データの処理に関するMySQL学習ノート

MySQLは重複データを処理します一部の MySQL テーブルには重複レコードが含まれている場合があ...

CentOS7 は Docker のバージョン 19 をデプロイします (簡単なので、従ってください)

1. 依存パッケージをインストールする [root@localhost ~]# yum insta...

CSS でのナビゲーション バーとドロップダウン メニューの実装

1. CSSナビゲーションバー(1)ナビゲーションバーの機能ナビゲーション バーを使いこなすことは、...

Linux manコマンドの具体的な使い方

01. コマンドの概要Linux には充実したヘルプ マニュアルが用意されています。コマンドのパラメ...