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 ページングクエリ方法とその最適化の提案

推薦する

JavaScript でタブバーの切り替え効果を実装する

フロントエンド開発者が必ず知っておくべきケースとして、タブバーの切り替え効果があります。タブバー自体...

Linux コマンドラインのクイックヒント: ファイルの検索方法

私たちのコンピューターには、ディレクトリ、写真、ソース コードなどのファイルが保存されています。たく...

リストループスクロールを実現するための HTML+CSS+JavaScript サンプルコード

説明: 指定された時間内に前のノードのコンテンツを置き換えるタイマーを設定します。 1. キーコード...

MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

MySQL Limit はセグメント内のデータベース データをクエリでき、主にページングで使用されま...

select @@session.tx_read_only が DB に大量に出現するのはなぜですか?

問題を見つける上位の SQL ステートメントを取得すると、DB が大量のselect @@sessi...

uniAppエディタWeChatスライド問題について

ユニアプリアプレットはWeChatでも同様のドロップダウン問題を抱えることになる解決策は、app.v...

MySQL 全文インデックスガイド

全文インデックスには特別なクエリ構文が必要です。全文検索はインデックスの有無にかかわらず実行できます...

CSS3 オーバーフロープロパティの説明

1. オーバーフローOverflow はオーバーフロー(コンテナ)です。コンテンツがコンテナを越える...

クリエイティブな会社概要ウェブページデザイン

ユニークな「About」ページ自分を他の人たちと差別化する素晴らしい方法は、本当にユニークな自己紹介...

React でインデックスをキーとして使用することが推奨されないのはなぜですか?

1. 古い仮想DOMと新しい仮想DOMを比較し、まずキーが同じかどうかを確認します。 2. 引き続...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...

nginx proxy_cache キャッシュ設定の詳細な説明

序文:私は仕事柄、オンラインライブストリーミングの分野に携わっており、ビデオの再生やダウンロードには...

uni-app WeChatアプレット認証ログイン実装手順

目次1. appIDの申請と設定1. appidの取得方法2. AppIDの設定2. 基本的なユーザ...

Tomcat8はcronologを使用してCatalina.Outログを分割します

背景tomcat によって生成された catalina.out ログ ファイルが分割されていない場合...

JS の toFixed() メソッドの丸め精度の問題の詳細な説明

目次落とし穴充填方法何の穴ですか?要約する落とし穴最近、仕事で商品の割引価格を計算すると、いつも1セ...