HTML ドラッグ アンド ドロップ機能の実装コード

HTML ドラッグ アンド ドロップ機能の実装コード

Vueベース

この機能の核となるアイデアは、JavaScript コードを通じてページ上のノードの左余白と上余白を制御することです。異なるスタイルの配置方法には異なるソリューションがあります。

このソリューションはposition: absolute位置決めソリューション

CSS スタイル コア コード

// 親コンテナのコアスタイル幅: 100%;
  高さ: 100%;
//サブコンテナのコアスタイルの位置: absolute;
  上位: 50%;
  左: 50%;
  変換: translate(-50%,-50%);

親コンテナーはwidth && heightフィールドを通じてブラウザーの表示範囲全体を占め、子コンテナーはposition: absolute属性を通じて親コンテナー内での絶対配置を可能にし、 top && left && transform: translate(-50%, -50%)属性を通じて親コンテナー内での子コンテナーの絶対位置を制御します。

ロジック制御用のJavaScriptコアコード

まず、ノードの移動を実現するために必要な手順と対応するイベントを分解してみましょう。

  • 子コンテナが作成されると、親コンテナ内に絶対的に配置されます。
  • マウスボタンが押されると、onmousedownイベントが
  • マウスが動くとonmousemoveイベント
  • マウスボタンが離されると、onmouseupイベントが発生します。

onMousedown、onMousemove、onMouseupの3つのイベントを使用する限り、最も単純な動きを実現できます。

/*
* 子コンテナが作成された際に、親コンテナを基準とした子コンテナの上端と左端の位置を取得します */

マウントされた(){
  this.left = this.$refs.fatherBox.offsetLeft
  this.top = this.$refs.fatherBox.offsetTop
}
/*
* マウスが押されたとき* 1. 子コンテナの移動を許可するフラグを有効にする
* 2. マウスをクリックしたときに位置情報を記録する*/

マウスダウン(e){
  // ポップアップウィンドウの移動を許可するフラグを設定する
  this.moveFlag = true
  // マウスの開始位置を保存します this.startLeft = e.clientX - this.left
  this.startTop = e.clientY - this.top
}
/*
* マウスが移動したとき* 1. フラグが子コンテナの移動を許可するかどうかを判断します* 2. ポップアップ ボックスの左の位置を設定します* 3. ポップアップ ボックスの右の位置を設定します*/

移動(e){
  // フラグが移動を許可するかどうかをチェックします if (!this.moveFlag) return

  // 箇条書きボックスの左の位置を設定します。this.left = e.clientX - this.startLeft
  // 箇条書きボックスの右位置を設定します。this.top = e.clientY - this.startTop

}
/*
*マウスボタンを離したとき* 1.子コンテナの移動を許可するフラグをオフにする
*/

マウスアップ(e){
  this.flag = false
}

これらの方法により、マウスが押されたときと動かされたときのマウスの上と左のオフセットを取得できます。このオフセットを親コンポーネントに公開することで、親コンポーネントは子コンポーネントの上と左の値をリアルタイムで設定し、子コンテナがマウスの動きに追従するようにします。

親コンポーネントコード

親コンポーネントは子コンポーネントの ref 値と zIndex 値を設定し、親コンポーネントの backValue メソッドは子コンポーネントから zIndex 値を受け取り、その zIndex を使用して特定の子コンポーネント インスタンスを識別します。

/*
* 親コンポーネントのコードスニペットの jsx バージョン */

エクスポートデフォルト{
  小道具: {
    プレイリスト: {
      タイプ: 配列、
      必須: true
    }
  },
  与える () {
    戻る (
      <div style={{width: '100%', height: '100%'}} ref={'father'}>
        {
          this.playList && this.playList.map((item, index) => {
            戻る (
              <子コンポーネント
                キー={インデックス}
                ref={インデックス}
                zIndex={インデックス}
                表示={true}
                backValue={this.backValue}
                情報={アイテム}
                幅={600}
                高さ={400}
              />
            )
          })
        }
      </div>
    )
  },
  メソッド: {
    backValue (左、上、zIndex) {
      this.$refs[zIndex].$el.style.top = `${top}px`
      this.$refs[zIndex].$el.style.left = `${left}px`
    }
  }
}
<!-- 親コンポーネント コード スニペットの Vue ファイル バージョン -->

<テンプレート>
  <div
    ref="父"
    スタイル"幅: 100%、高さ: 100%"
  >
    <子コンポーネント
      v-for="(プレイリスト内のアイテム、インデックス)"
      :key="インデックス"
      :ref="インデックス"
      :visible="true"
      :z-index="インデックス"
      :back-value="バック値"
      :info="アイテム"
      :close="閉じる"
      :width="600"
      :高さ= "400"
    />
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  コンポーネント:
    ビデオプレーヤーモーダル
  },
  小道具: {
    プレイリスト: {
      タイプ: 配列、
      必須: true
    }
  },
  メソッド: {
    backValue (左、上、zIndex) {
      this.$refs[zIndex][0].$el.style.top = `${top}px`
      this.$refs[zIndex][0].$el.style.left = `${left}px`
    }
  }
}
</スクリプト>

子コンポーネントのフェンス範囲を設定する

この関数は、onmousemove イベントで子コンテナーの上部と左がブラウザーの表示範囲を超えているかどうかを判断することだけが必要です。

/*
* 1. this.width データは、親コンポーネントから渡された幅の値、または子コンポーネント自体によって設定されたデフォルト値です。* 2. this.height データは、親コンポーネントから渡された高さの値、または子コンポーネント自体によって設定されたデフォルト値です。*/

移動(e){
  // フラグが移動を許可するかどうかをチェックします if (!this.moveFlag) return

  // 左ビューを超えているかどうかを判定します if (this.$refs.fatherBox.offsetLeft < this.width / 2) {
        // ポップアップボックスの移動を無効にする this.moveFlag = false
        // 箇条書きボックスの左の位置を設定します this.left = this.width / 2 + 10
        // コールバック関数を呼び出して、親コンポーネントへのオフセットを公開します。this.backValue(this.left, this.top, this.zIndex)
        戻る
      }

      // 右ビューを超えているかどうかを判断します if (this.$refs.fatherBox.offsetLeft > document.body.clientWidth - this.width / 2) {
        // ポップアップボックスの移動を無効にする this.moveFlag = false
        // 箇条書きボックスの右位置を設定します this.left = document.body.clientWidth - this.width / 2 - 10
        // コールバック関数を呼び出して、親コンポーネントへのオフセットを公開します。this.backValue(this.left, this.top, this.zIndex)
        戻る
      }

      // トップビューを超えているかどうかを判定します if (this.$refs.fatherBox.offsetTop < this.height / 2 + 70) {
        // ポップアップボックスの移動を無効にする this.moveFlag = false
        // 箇条書きボックスの上の位置を設定します this.top = this.height / 2 + 70 + 10
        // コールバック関数を呼び出して、親コンポーネントへのオフセットを公開します。this.backValue(this.left, this.top, this.zIndex)
        戻る
      }

      // 下部ビューを超えているかどうかを判断します if (this.$refs.fatherBox.offsetTop > document.body.clientHeight - this.height / 2 - 50) {
        // ポップアップボックスの移動を無効にする this.moveFlag = false
        // 箇条書きボックスの下の位置を設定します this.top = document.body.clientHeight - this.height / 2 - 50 - 10
        // コールバック関数を呼び出して、親コンポーネントへのオフセットを公開します。this.backValue(this.left, this.top, this.zIndex)
        戻る
      }

      // 箇条書きボックスの左の位置を設定します。this.left = e.clientX - this.startLeft
      // 箇条書きボックスの右位置を設定します。this.top = e.clientY - this.startTop

      // コールバック関数を呼び出して、親コンポーネントへのオフセットを公開します。this.backValue(this.left, this.top, this.zIndex)
}

サブコンポーネントでは、予期しないバグを防ぐために、マウスがサブコンテナを超えたときに onmouseout イベントを設定する必要もあります。

マウスアウト(e) {
  this.moveFlag = false
}

HTML ドラッグ アンド ドロップ機能に関するこの記事はこれで終わりです。HTML ドラッグ アンド ドロップ機能に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  Chrome タブバーを実装するための CSS のヒント

>>:  CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する複数の方法

推薦する

Dockerfile を使用して SpringBoot プロジェクトをデプロイする方法

1. SpringBoootプロジェクトを作成し、jarパッケージにパッケージ化する2. Linux...

MySQL で自動インクリメントシーケンスを実装するためのサンプルコード

1. シーケンステーブルを作成する テーブル `sequence` を作成します ( `name` ...

IIS web.config でクロスドメイン アクセスを設定する方法

要件: ページに画像を表示する必要がありますが、さまざまな理由により、画像はサーバー 2 にあります...

Web Storage APIの使用に関する簡単な説明

目次1. ブラウザのローカルストレージ技術1.1、セッションストレージ1.2、ローカルストレージ2....

Mysqlのprepare前処理の具体的な使用法

目次1. 前処理2. 前処理塗布方法A. 例: B. 実行計画の変更を追跡するための前処理C. スト...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

ブラウザの自動更新を実装するReactサンプルコード

目次フロントエンドルーティングとは何ですか?フロントエンドルーティングを実装するにはどうすればいいで...

ネイティブJSを使用した遅延読み込みlazyLoadの3つの方法の概要

目次序文方法1: 高コントラスト方法2: getBoundingClientRect() APIを使...

js を使用して 2 つの HTML ウィンドウ間で通信する方法

シナリオ: ページAがページBを開くと、ページBで操作した後、ページAは変更されたデータを同期する必...

MySQL データベース グループ クエリの group by ステートメントの詳細な説明

1: グループ化関数の記述順序 1 選択 ... 2 から ... 3 どこで ... 4 グループ...

Node.jsはexpress-fileuploadミドルウェアを使用してファイルをアップロードします

目次プロジェクトを初期化するサーバーの作成クライアントを初期化するコンポーネントの記述ファイルアップ...

MySQLクエリのソートとページング関連

概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...

シェルスクリプトを使用して Docker サービスを一括で開始および停止する

目次Dockerを起動するDockerを停止するPython 呼び出しスクリプト最近、日々のテストで...

MySQLソースコマンドの使い方の紹介

目次ネット上の質問から生まれた思考MySQL ソースコマンドネット上の質問から生まれた思考今日仕事中...

Windows サービス 2012 Alibaba Cloud サーバーで MySQL をビルドするときに msvcr100.dll ファイルが見つからないという問題を解決します

解決策1: msvcr100.dll ファイルをダウンロードし (インターネットからソース ファイル...