Vueベース この機能の核となるアイデアは、JavaScript コードを通じてページ上のノードの左余白と上余白を制御することです。異なるスタイルの配置方法には異なるソリューションがあります。 このソリューションは CSS スタイル コア コード // 親コンテナのコアスタイル幅: 100%; 高さ: 100%; //サブコンテナのコアスタイルの位置: absolute; 上位: 50%; 左: 50%; 変換: translate(-50%,-50%); 親コンテナーは ロジック制御用のJavaScriptコアコードまず、ノードの移動を実現するために必要な手順と対応するイベントを分解してみましょう。
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 列レイアウトを実装する複数の方法
1. SpringBoootプロジェクトを作成し、jarパッケージにパッケージ化する2. Linux...
1. シーケンステーブルを作成する テーブル `sequence` を作成します ( `name` ...
要件: ページに画像を表示する必要がありますが、さまざまな理由により、画像はサーバー 2 にあります...
目次1. ブラウザのローカルストレージ技術1.1、セッションストレージ1.2、ローカルストレージ2....
目次1. 前処理2. 前処理塗布方法A. 例: B. 実行計画の変更を追跡するための前処理C. スト...
netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...
目次フロントエンドルーティングとは何ですか?フロントエンドルーティングを実装するにはどうすればいいで...
目次序文方法1: 高コントラスト方法2: getBoundingClientRect() APIを使...
シナリオ: ページAがページBを開くと、ページBで操作した後、ページAは変更されたデータを同期する必...
1: グループ化関数の記述順序 1 選択 ... 2 から ... 3 どこで ... 4 グループ...
目次プロジェクトを初期化するサーバーの作成クライアントを初期化するコンポーネントの記述ファイルアップ...
概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...
目次Dockerを起動するDockerを停止するPython 呼び出しスクリプト最近、日々のテストで...
目次ネット上の質問から生まれた思考MySQL ソースコマンドネット上の質問から生まれた思考今日仕事中...
解決策1: msvcr100.dll ファイルをダウンロードし (インターネットからソース ファイル...