Vueグローバルカスタム命令の実践 モーダルドラッグ

Vueグローバルカスタム命令の実践 モーダルドラッグ

背景

最近取り組んでいるプロジェクトは、Vue2 で構築されたプロジェクトで、UI フレームワークは antdV を使用しています。プロジェクトでは、モーダル ダイアログ ボックスが多数使用されています。ある日突然、製品が「このダイアログ ボックスは移動できないのはなぜですか? 情報のビューがブロックされています」と言いました。仕方ありません。需要があれば、私たちはそれをやるしかありません。これが新しい世代の労働者です。

まず、antdV 公式サイトにアクセスして、Modal の構成プロパティとメソッドを調べ、この問題を直接解決できるプロパティやメソッドがあるかどうかを確認しましたが、見つかりませんでした。 2 番目のステップは、Baidu に問い合わせを開始することでした。関連するブログはいくつかありましたが、一般的に言えば、多様すぎて理解するのが困難でした。その後、グローバルカスタム仕様を使用する興味深い方法があることがわかり、自分で問題を解決し始めました。

実装のアイデア

まず、主にモーダル ボックスのヘッド部分にマウスを置いたときに左ボタンを押した後にダイアログ ボックスを移動する効果を完成させます。

ここでは、ヘッダー要素を取得してその onmousedown メソッドをリッスンし、onmousedown メソッドの実行中にダイアログ ボックスの高さと幅を計算して境界制限を設定し、ダイアログ ボックスが画面から外れないようにします。次に、document.onmousemove メソッドをリッスンしてマウスの移動方向と距離を計算し、これに基づいてダイアログ ボックスの位置を調整します。

コードの実装

'vue' から Vue をインポートします

// ポップアップウィンドウのドラッグプロパティ/**
 * @directive カスタム属性 * @todo ポップアップドラッグ属性 * @desc ポップアップ内に読み込まれた HTML を使用して v-drag を追加します
 * @param .ant-modal-header ドラッグに使用するポップアップウィンドウのヘッダーのプロパティ* @param .ant-modal ドラッグするプロパティ*/
Vue.directive('drag', (el, binding, vnode, oldVnode) => {
  // 挿入された (el、binding、vnode、oldVnode) {
  Vue.nextTick(() => {
    const isThemeModal = el.classList.contains('grid-theme')
    const dialogHeaderEl = isThemeModal ? el.querySelector('.ant-tabs-bar'): document.querySelector('.ant-modal-header')
    const dragDom = isThemeModal ? el.querySelector('.ant-modal') : document.querySelector('.ant-modal')
    //dialogHeaderEl.style.cursor = 'move';
    dialogHeaderEl.style.cssText += ';cursor:move;'
    // dragDom.style.cssText += ';top:0px;'

    // 元の属性を取得します (例: dom element.currentStyle firefox google window.getComputedStyle(dom element, null);
    const sty = (関数() {
      (window.document.currentStyle)の場合{
        戻り値 (dom, attr) => dom.currentStyle[attr]
      } それ以外 {
        戻り値 (dom, attr) => getComputedStyle(dom, false)[attr]
      }
    })()

    ダイアログヘッダーEl.onmousedown = (e) => {
      // マウスが押されたら、現在の要素と表示領域の間の距離を計算します。const disX = e.clientX - dialogHeaderEl.offsetLeft
      定数 disY = e.clientY - dialogHeaderEl.offsetTop

      const screenWidth = document.body.clientWidth // 本文の現在の幅 const screenHeight = document.documentElement.clientHeight // 表示領域の高さ (本文の高さになるはずですが、環境によっては取得できません)

      const dragDomWidth = dragDom.offsetWidth // ダイアログボックスの幅 const dragDomheight = dragDom.offsetHeight // ダイアログボックスの高さ const minDragDomLeft = dragDom.offsetLeft
      定数 maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth - (isThemeModal ? 10 : 0)

      定数 minDragDomTop = dragDom.offsetTop
      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight - (isThemeModal ? 10 : 0)

      // 置換するpx正規表現で値を取得します。let styL = sty(dragDom, 'left')
      styT = sty(dragDom, 'top') とします。

      // IEでは、最初に取得される値はコンポーネント自身の50%であり、その値は移動後にpxに割り当てられることに注意してください。
      (styL.includes('%'))の場合{
        // eslint は次の行を無効にして、無駄なエスケープを禁止します
        styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
        // eslint は次の行を無効にして、無駄なエスケープを禁止します
        styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
      } それ以外 {
        styL = +styL.replace(/\px/g, '')
        styT = +styT.replace(/\px/g, '')
      };

      document.onmousemove = 関数 (e) {
        // イベント委譲を通じて移動距離を計算する let left = e.clientX - disX
        top = e.clientY - disY とします。

        // 境界処理 if (-(left) > minDragDomLeft) {
          左 = -(minDragDomLeft)
        } そうでない場合 (左 > maxDragDomLeft) {
          左 = maxDragDomLeft
        }

        if (-(top) > minDragDomTop) {
          上 = -(minDragDomTop)
        } そうでない場合 (top > maxDragDomTop) {
          上 = maxDragDomTop
        }
        // 現在の要素を移動する dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
      }

      document.onmouseup = 関数 (e) {
        ドキュメント.onmousemove = null
        document.onmouseup = null
      }
    }
  })
})

コンポーネント呼び出し
AモーダルコンポーネントはVドラッグに設定できる

...
<a-modal v-model="visible" title="プロンプト" :maskClosable="false" @cancel="handleCancle" @ok="handleOk" v-drag>
  <p>フィールドを削除してもよろしいですか?</p>
</a-modal>
...

成果を達成する

Vue グローバルカスタムディレクティブの Modal drag の実践に関するこの記事はこれで終わりです。より関連性の高い Vue Modal drag コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueカスタムディレクティブの詳細
  • Vueのカスタムディレクティブの詳細なガイド
  • Vue2.x および Vue3.x のカスタム命令の使用方法とフック関数の原理を理解する
  • Vue でのカスタムディレクティブの基本的な使用方法
  • Vue.js ディレクティブのカスタム命令の詳細な説明
  • Vueカスタム指示により、ポップアップウィンドウのドラッグ4辺ストレッチと対角ストレッチ効果を実現
  • Vueカスタム命令の詳細な説明

<<:  nginxカスタム変数と組み込み定義済み変数の使用

>>:  一般的な MySQL 関数の例の概要 [集計関数、文字列、数値、時刻と日付の処理など]

推薦する

Vue のローカルコンポーネントの紹介

Vueでは、ローカルコンポーネントを自分で定義(登録)することができます。コンポーネント名を定義する...

Ubuntu で nginx を使用して WebDAV ファイル サーバーを構築する詳細なプロセス

nginxをインストールするnginx-fullをインストールする必要があることに注意してください。...

Linuxサーバー間のリアルタイムファイル同期の実現

使用シナリオ既存のサーバー A と B の場合、サーバー A の指定されたディレクトリ (たとえば、...

Vueはパーセンテージバー効果を実現します

この記事では、パーセンテージバーを実現するためのVueの具体的なコードを参考までに共有します。具体的...

Docker ベースの ELK ログ システムを構築する方法

背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...

ウェブデザインと制作におけるハイパーリンクの効果の向上

ハイパーリンクを使用すると、ページからページへ、またはサイトからサイトへ瞬時に移動できます。このよう...

MySQL データのバックアップと復元のサンプル コード

1. データのバックアップ1. mysqldumpコマンドを使用してバックアップするmysqldum...

弾幕効果を実現するためのjQuery

この記事では、弾幕効果を実現するためのjQueryの具体的なコードを参考までに共有します。具体的な内...

珍しいけれど役に立つJSテクニックをいくつか紹介します

序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...

MySQL が自動的に再起動する問題の解決方法

序文最近、テスト環境で MySQL データベースが自動的に再起動し続ける問題が発生しました。原因は、...

Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します

序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...

Vueタブとキャッシュページを切り替えるいくつかの方法

目次1. 切り替え方法2. タブを動的に生成する3. キャッシュコンポーネント3.1 キープアライブ...

Xftp のダウンロードとインストールのチュートリアル (グラフィック チュートリアル)

Windows と Linux 間でファイルを転送する場合は、Xftp ツールを使用できます。この...

MySql 5.6.36 64 ビット グリーン バージョンのインストール グラフィック チュートリアル

MySQL のインストールについてはインターネット上に多くの記事がありますが、今日ノート PC にイ...

MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

序文プロジェクトの要件は、ユーザーの現在の位置が特定の地理的位置範囲内にあるかどうかを判断することで...