Vueは不規則なスクリーンショットを実装する

Vueは不規則なスクリーンショットを実装する

これまで見てきたもののほとんどは通常のスクリーンショットであり、ほとんどのアプリケーション シナリオに対応できます。ただし、画像処理の場合、ルールをユーザーに引き渡す必要がある場合、通常のスクリーンショットではユーザーを満足させることはできません。では、フロントエンドで任意の定期的な画像キャプチャを実装できるでしょうか。一緒に話し合いましょう。

SVG による画像キャプチャ

SVGのclipPath画像タグを使用して、IDマッピングと動的位置ポリゴンの座標を通じて画像をキャプチャします。

    <div>
        <div class="content" @mousemove="mousemove" @mouseup="(e) => {mouseup(e);}">
          <!-- キャンバス表示 -->
          <svg
            ref="blackSvg"
            クラス="blackSvg"
            xmlns="http://www.w3.org/2000/svg"
            幅="300"
            高さ="300"
          >
            <定義>
              <clipPath id="クリップパス">
                <ポリゴン :points="ポイント"></ポリゴン>
              </クリップパス>
            </defs>
            <画像
              xmlns:link="http://www.w3.org/1999/xlink"
              href="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3228549874,2173006364&fm=26&gp=0.jpg" rel="外部nofollow" 
              幅="300"
              高さ="300"
              preserveAspectRatio="なし"
              スタイル="クリップパス: url(#clippath)"
            </画像>
          </svg>
          <!-- ポイントをドラッグ -->
          <ul class="インターセプション">
            <li
              v-for="4 内の項目"
              :ref="`li${item}`"
              :key="アイテム"
              @mousedown="(e) => {mousedown(e, 項目);}"
            </li>
          </ul>
          <!-- ベースマップの表示 -->
          <画像
            クラス="blackImge"
            src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3228549874,2173006364&fm=26&gp=0.jpg"
            代替案=""
          />
          <!-- マスクレイヤー-->
          <div class="blackDiv"></div>
    </div>
  </div>

CSS部分

<スタイル lang="sass">
.blackDiv
    幅: 100%
    高さ: 100%
    位置: 絶対
    トップ: 0
    Zインデックス: 2
    背景: rgba(0,0,0, 1)
。コンテンツ
    幅:300ピクセル
    高さ:300ピクセル
    テキスト配置: 左
    位置: 相対
    .blackSvg
        位置: 絶対
        トップ: 0
        Zインデックス: 3
    .black画像
        位置: 絶対
        トップ: 0
        残り: 0
        幅: 300ピクセル
        高さ: 300ピクセル
    。傍受
        リストスタイル: なし
        位置: 絶対
        トップ: 0
        マージン: 0
        パディング: 0
        Zインデックス: 3
        >リ
            位置: 絶対
            幅: 10ピクセル
            高さ: 10ピクセル
            背景: 青
            境界線の半径: 50%
            カーソル: ポインタ
            &:ホバー
                変換: スケール(1.2)
                遷移期間: .2
        >li:n番目の子(1)
            上: 10ピクセル
            左: 10ピクセル
        >li:n番目の子(2)
            上: 10ピクセル
            左: 100ピクセル
        >li:n番目の子(3)
            上: 100ピクセル
            左: 100ピクセル
        >li:n番目の子(4)
            上: 100ピクセル
            左: 10ピクセル
</スタイル>
<スクリプト>

エクスポートデフォルト{
  名前: 'キャンバス'、
  データ() {
    戻る {
      ポイント: '0 0,300 0,300 300,0 300', // 画像表示初期化ステータス: false,
      インデックス: 0,
      ディスX: 0,
      ディスY: 0,
      座標: { // ドラッグポイント1を初期化: [0, 0],
        2: [300, 0],
        3: [300, 300],
        4: [0, 300],
      },
    };
  },
  マウント() {
    this.$nextTick(() => {
      for (let key in this.coordinates) {
        const left = this.coordinates[key][0];
        const top = this.coordinates[key][1];
        this.$refs[`li${key}`].style.left = `${left}px`;
        this.$refs[`li${key}`].style.top = `${top}px`;
        (キー == 2 || キー == 3) の場合 {
          this.$refs[`li${key}`].style.left = `${left - 10}px`;
        }
        (キー == 3 || キー == 4) の場合 {
          this.$refs[`li${key}`].style.top = `${top - 10}px`;
        }
      }
      ドキュメント.onmouseup = () => {
        this.status = false;
      };
    });
  },
  メソッド: {
    //マウスダウン mousedown(e, index) {
      this.status = true;
      this.index = インデックス;
      this.disX = e.clientX - this.$refs[`li${index}`].offsetLeft;
      this.disY = e.clientY - this.$refs[`li${index}`].offsetTop;
    },
    // マウスアップ mouseup(e) {
      this.status = false;
    },
    //マウスの移動 mousemove(e) {
      if (this.status) {
        left = e.clientX - this.disX とします。
        top = e.clientY - this.disY とします。
        this.$refs[`li${this.index}`].style.left = `${left}px`;
        this.$refs[`li${this.index}`].style.top = `${top}px`;
        this.coordinates[this.index] = [左、上];
        const pointsArr = [];
        for (let item in this.coordinates) {
          ポイントArr.push(
            Array.from(this.coordinates[item], (e) => {
              e + 5 を返します。
            })
          );
        }
        this.points = pointsArr.join(' ');
      }
    },
  },
};

エフェクト画像表示

ソースコードアドレス

GitHub アドレス --> github.com/lgxin/captu…

以上がVueのイレギュラースクリーンショットの実装内容の詳細です。Vueのイレギュラースクリーンショットの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください!

以下もご興味があるかもしれません:
  • Vueをベースにドラッグ効果を実現
  • Vue ベースのドラッグ アンド ドロップ機能を実装する
  • Vue.js でドラッグ アンド ドロップ効果を実装する例
  • Vue.js は画像のランダムドラッグを実装します
  • Vueはdivドラッグアンドドロップを実装します
  • Vue カスタム ディレクティブ ドラッグ関数の例
  • Vueのドラッグスクリーンショット機能を実装する簡単な方法

<<:  MySQLにおける静的変数の役割の詳細な説明

>>:  Linux 編集の開始、停止、再起動の Springboot jar パッケージ スクリプトの例

推薦する

Spring Boot Docker パッケージング ツールの概要

目次スプリングブートDocker spring-boot-maven-プラグインSpotify Ma...

reactにおけるstateの略語の詳細な説明

序文国家とは何か私たちは皆、React はステート マシンであると言います。それはどのように反映され...

Windows で mysql-8.0.18-winx64 をインストールするチュートリアル (画像とテキスト付き)

1. インストールパッケージをダウンロードするインストール パッケージは次の場所にあります:参考:...

JavaScript での && および || 演算子の使用例

目次序文&& 演算子|| 演算子|| 演算子の簡単なデモ章の目的ケース演習(json...

formData 形式タイプを使用してファイルをアップロードする Vue の例

Vue では、一般的にフロントエンドとバックエンドを分離したプロジェクトがあり、データ操作を実装する...

MySQL トランザクション分析

取引トランザクションはビジネス ロジックの基本単位です。各トランザクションは一連の SQL ステート...

小さな画面のモバイルデバイス向けにWebページを設計する際に注意すべきこと

その理由は、このタイプの Web ページが WAP と呼ばれるワイヤレス プロトコルから生成されたた...

MySQL 8.0.18 のインストールと設定方法のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.18のインストールと設定のグラフィックチュートリアルを記...

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

ブログデザイン ウェブデザイン デビュー

私がデザインした最初の Web ページは次のとおりです。 私はこの業界に7年間在籍し、プログラミング...

Linux での MySQL 8.0.25 のインストールと設定のチュートリアル

LinuxにMySQL 8.0.25をインストールするための最新のチュートリアルを参考にしてください...

MySQLのインデックス設計の原則と一般的なインデックスの違いについて簡単に説明します。

インデックス定義: ディスク上に保存される個別のデータベース構造であり、データ テーブル内のすべての...

HTML での非同期ファイルアップロードの例

コードをコピーコードは次のとおりです。 <form action="/hehe&qu...

MySQLユーザー権限テーブルについての簡単な説明

MySQL はインストール時に自動的に mysql という名前のデータベースを作成します。mysql...