Vueはズームイン、ズームアウト、ドラッグ機能を実装しています

Vueはズームイン、ズームアウト、ドラッグ機能を実装しています

この記事では、参考までに、ズームインとズームアウトのドラッグ機能を実現するためのVueの具体的なコードを紹介します。具体的な内容は次のとおりです。

クリックすると全画面に拡大し、もう一度クリックすると元のサイズに縮小します。このポップアップは要素ダイアログに基づいています。

1. utilsフォルダの下に新しいdirectives.jsを作成します(パッケージ化されており、直接使用できます)

'vue' から Vue をインポートします。
'../assets/images/bigChange.png' から bigPic をインポートします。
// v-dialogDrag: ポップアップウィンドウのドラッグ属性 Vue.directive('dialogDrag', {
  bind(el, バインディング, vnode, oldVnode) {
    //箇条書きボックスの最小の幅と高さ let minWidth = 400; 
    minHeight を 300 とします。 
    // 初期非フルスクリーン let isFullScreen = false; 
    //現在の幅と高さ let nowWidth = 0; 
    nowHight = 0 とします。 
    //現在の上端の高さ let nowMarginTop = 0; 
    //ポップアップ ボックスのヘッダーを取得します (この部分はダブルクリックすると全画面表示になります) 
    dialogHeaderEl は el.querySelector('.el-dialog__header') です。 
    //ポップアップウィンドウ const dragDom = el.querySelector('.el-dialog'); 
    // 全画面ボタン dialogHeaderEl.insertAdjacentHTML('beforeEnd', '<div class="bigbtn"><div class="changeBig"></div><div class="changeSmall"></div></div>'); 
    const bigBtn = el.querySelector('.bigbtn'); 
    定数 changeBig = el.querySelector('.changeBig'); 
    定数 changeSmall = el.querySelector('.changeSmall');
    //ポップアップ ウィンドウに overflow auto を追加します。そうしないと、ダイアログが縮小されたときにボックス内のラベルがダイアログを越える可能性があります。 
    dragDom.style.overflow = "自動"; 
    //選択したヘッダーのテキスト効果をクリアします//dialogHeaderEl.onselectstart = new Function("return false"); 
    // ドラッグ可能なカーソルをヘッドに追加します 
    dialogHeaderEl.style.cursor = '移動'; 
    // 元の属性を取得します (例: dom element.currentStyle firefox google window.getComputedStyle(dom element, null); 
    const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null); 
    下へ移動します = (e) => {
      // マウスを押すと、現在の要素と表示領域間の距離が計算されます。const disX = e.clientX - dialogHeaderEl.offsetLeft; 
      const disY = e.clientY - dialogHeaderEl.offsetTop; 
      // 置換する px 正規表現で値を取得します。let styL, styT;
      // IEでは、最初に取得される値はコンポーネント自身の50%であり、その値は移動後にpxに割り当てられることに注意してください。 
      (sty.left.includes('%')の場合){
        styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100); 
        styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
 
      } それ以外 { 
        styL = +sty.left.replace(/\px/g, '');
        styT = +sty.top.replace(/\px/g, '');
 
      };
 
      document.onmousemove = 関数 (e) {
        // イベント委任を通じて移動距離を計算します。const l = e.clientX - disX;
        定数 t = e.clientY - disY; 
        // 現在の要素を移動する dragDom.style.left = `${l + styL}px`;
        dragDom.style.top = `${t + styT}px`;
 
        //現在の位置を渡す //binding.value({x:e.pageX,y:e.pageY})
 
      };
 
      document.onmouseup = 関数 (e) { 
        ドキュメント.onmousemove = null; 
        ドキュメント.onmouseup = null;
 
      };
 
    }
 
    dialogHeaderEl.onmousedown = 下へ移動します。
 
    //ヘッダーをダブルクリックして全画面表示にします bigBtn.onclick = (e) => {
      フルスクリーンの場合 == false { 
        changeBig.style.display = 'なし'; 
        changeSmall.style.display = 'ブロック';
        nowHight = dragDom.clientHeight;
        現在の幅 = dragDom.clientWidth; 
        nowMarginTop = dragDom.style.marginTop; 
        ドラッグアンドドロップ 
        ドラッグアンドドロップスタイル 
        ドラッグDom.style.height = "100VH";
        ドラッグDom.style.width = "100VW"; 
        ドラッグアンドドロップスタイル 
        フルスクリーン = true; 
        dialogHeaderEl.style.cursor = 'initial'; 
        dialogHeaderEl.onmousedown = null;
 
      } それ以外 {
 
        changeBig.style.display = 'ブロック'; 
        changeSmall.style.display = 'なし';
        dragDom.style.height = "自動"; 
        dragDom.style.width = nowWidth + 'px'; 
        dragDom.style.marginTop = nowMarginTop; 
        フルスクリーン = false; 
        dialogHeaderEl.style.cursor = '移動';
 
        dialogHeaderEl.onmousedown = 下へ移動します。
 
      }
 
    }
 
    dragDom.onmousemove = 関数 (e) {
      // console.log(dialogHeaderEl、dragDom.querySelector('.el-dialog__body')、123);
      moveE = e; とします。
 
      (e.clientX > dragDom.offsetLeft + dragDom.clientWidth - 10 || dragDom.offsetLeft + 10 > e.clientX) の場合 {
         dragDom.style.cursor = 'w-resize';
      } そうでない場合 (el.scrollTop + e.clientY > dragDom.offsetTop + dragDom.clientHeight - 10) { 
        dragDom.style.cursor = 's-resize'; 
      } それ以外 { 
        dragDom.style.cursor = 'デフォルト'; 
        ドラッグDom.onmousedown = null;
 
      }
 
      ドラッグDom.onmousedown = (e) => { 
        定数 clientX = e.clientX; 
        定数 clientY = e.clientY; 
        elW = dragDom.clientWidth とします。 
        elH = dragDom.clientHeight とします。 
        EloffsetLeft を dragDom.offsetLeft とします。
        EloffsetTop を dragDom.offsetTop にします。
        dragDom.style.userSelect = 'なし';
        ELscrollTop を el.scrollTop とします。
 
        //クリックされた位置が先頭かどうかを判断しますif (clientX > EloffsetLeft && clientX < EloffsetLeft + elW && clientY > EloffsetTop && clientY < EloffsetTop + 100) {
 
          // ヘッダーの場合、ここでは何もアクションは実行されません。上記は dialogHeaderEl.onmousedown = moveDown; にバインドされています。
 
        } それ以外 {
 
          document.onmousemove = 関数 (e) {
            e.preventDefault(); // 移動時にデフォルトのイベントを無効にする // マウスの左ドラッグ位置 if (clientX > EloffsetLeft && clientX < EloffsetLeft + 10) { 
              //左にドラッグ if (clientX > e.clientX) { 
                dragDom.style.width = elW + (clientX - e.clientX) * 2 + 'px';
 
              }
 
              //右にドラッグ if (clientX < e.clientX) { 
                (dragDom.clientWidth < minWidth)の場合{
                } それ以外 {
                dragDom.style.width = elW - (e.clientX - clientX) * 2 + 'px';
 
                }
 
              }
 
            }
 
            //右マウスドラッグ位置if (clientX > EloffsetLeft + elW - 10 && clientX < EloffsetLeft + elW) { 
              //左にドラッグ if (clientX > e.clientX) {
                (dragDom.clientWidth < minWidth)の場合{ 
                } それ以外 { 
                  dragDom.style.width = elW - (clientX - e.clientX) * 2 + 'px';
 
                }
 
              }
 
              //右にドラッグ if (clientX < e.clientX) {
 
                dragDom.style.width = elW + (e.clientX - clientX) * 2 + 'px';
 
              }
 
            }
 
            //マウスの下ドラッグ位置if (ELscrollTop + clientY > EloffsetTop + elH - 20 && ELscrollTop + clientY < EloffsetTop + elH) {
 
              //上にドラッグ if (clientY > e.clientY) {
                (dragDom.clientHeight < minHeight)の場合{
                } それ以外 {
 
                  dragDom.style.height = elH - (clientY - e.clientY) * 2 + 'px';
 
                }
 
              }
 
              //下にドラッグ if (clientY < e.clientY) { 
                dragDom.style.height = elH + (e.clientY - clientY) * 2 + 'px';
 
              }
 
            }
 
          };
 
          //ストレッチ終了 document.onmouseup = function (e) { 
            ドキュメント.onmousemove = null; 
            document.onmouseup = null;
 
          };
 
        }
 
      }
 
    }
  }
})

2. main.jsにインポートする

'./utils/directives.js' をインポートします。

3. ページはカスタム属性名(v-dialogDrag)で直接使用されます。

<el-ダイアログ
     v-ダイアログドラッグ
      title="ユーザー情報"
      :visible.sync="ダイアログを表示"
      幅="50%"
      :クリック時に閉じるモーダル="false"
      :before-close="ハンドルを閉じる">
      <div>
        <el-table :data="phoneData" スタイル="width: 100%">
          <el-table-column prop="fullName" label="名前" width="100"></el-table-column>
          <el-table-column prop="sex" label="性別" width="80"></el-table-column>
          <el-table-column prop="idCard" label="ID番号" min-width="120" show-overflow-tooltip></el-table-column>
          <el-table-column prop="mobile" label="連絡先番号" width="150"></el-table-column>
          <el-table-column prop="censusAreaName" label="世帯登録区分" min-width="120" show-overflow-tooltip></el-table-column>
          <el-table-column prop="censusAddr" label="世帯登録住所" min-width="100" show-overflow-tooltip></el-table-column>
          <el-table-column label="操作" width="120" fixed="右" align="中央">
            <テンプレート スロット スコープ="{行}">
              <span @click="chooseInfor(row.id)" class="table-btn">選択</span>
            </テンプレート>
          </el-table-column>
        </el-table>
      </div>
</el-ダイアログ>

4. CSSも提供されています(directives.jsのラベル要素に注意してください)

.changeBig{
    幅: 20px;
    高さ: 20px;
    背景: url("../assets/images/bigChange.png") 繰り返しなし 中央;
    背景サイズ: 100% 100%;
    カーソル: ポインタ;
    位置: 絶対;
    上: 14px;
    右: 60px;
}
.changeSmall {
    幅: 20px;
    高さ: 20px;
    背景: url("../assets/images/smallChange.png") 繰り返しなし 中央;
    背景サイズ: 100% 100%;
    カーソル: ポインタ;
    位置: 絶対;
    上: 14px;
    右: 60px;
    表示: なし;
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueコンポーネントを使用して画像のドラッグとズーム機能を実現する
  • Vue は画像プレビュー効果の例 (ズームイン、ズームアウト、ドラッグ) を実装します
  • Vue イメージ ドラッグ アンド ドロップ ズーム コンポーネントの使用方法の詳細な説明
  • Vue 画像のスケーリングの実装 - コンポーネントのドラッグ

<<:  Linux と最もよく使用されるコマンドの紹介 (習得は簡単ですが、問題の 95% 以上を解決できます)

>>:  Ubuntu16.04 インストール mysql5.7.22 グラフィックチュートリアル

推薦する

MySQL のデータ統計に関するヒント

よく使用されるデータベースである MySQL では、多くの操作が必要です。デジタル操作には非常に便利...

Linux の一般的な Java プログラム起動スクリプトのコード例

シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...

CentOS6.8 中国語/英語環境切り替えチュートリアル図

1. はじめに英語に慣れていない人は、システムを英語から中国語に変更したいかもしれません。一方、クラ...

Dockerでのpython3.8イメージのインストールについて

Docker Hub公式サイト1. Pythonミラーを検索するdocker 検索 python 2...

MySQL データ型 DECIMAL の詳細な分析

序文:金額の保存など、小数点数を保存し、精度要件がある場合、通常は DECIMAL フィールド タイ...

JavaScript オブジェクトの 3 つのプロパティ

目次1. 書き込み可能: 書き込み可能2. 列挙可能: 列挙可能3. 設定可能: 設定可能オブジェク...

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...

Vue で jsx 構文を正しく使用する方法

目次序文仮想DOM仮想DOMとは仮想DOMの利点レンダリング関数とは何ですか? jsx Vue3 で...

Linux で MySQL 8.0 サービスを完全に削除する方法

この記事を読む前に、Linuxコマンド、特にcentos7.3環境でyumを使用してインストールされ...

Excel ファイルを MySQL データベースにインポートする方法

この記事では、ExcelファイルをMySQLデータベースにインポートする方法を参考までに紹介します。...

仕事でよく使うLinuxコマンドまとめ

仕事では、docker や kubernetes などのオープンソース ツールをさらに活用しましょう...

曇り空のアイコン効果を実現する純粋な CSS

効果効果は以下のとおりです​実装のアイデアbox-shadow プロパティを使用して、複数の灰色の円...

インターネットウェブデザインにおけるバイオニックデザインの簡単な紹介

バイオニックデザインといえば、飛行機の発明、ドバイのブルジュ・アル・アラブ、平泳ぎなどを思い浮かべる...

Linux 面接で最もよく聞かれる 10 の質問のまとめ

序文Linux システムの運用および保守エンジニア職の面接を受ける場合は、次の 10 個の最も一般的...