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 パッケージ スクリプトの例

推薦する

Vue3.0 異なる解像度のコンピュータの適応操作

まず依存関係をインストールする必要があります npm i lib-flexible-computer...

MySQLがファントムリードを解決する方法の詳細な説明

1. ファントムリーディングとは何ですか?トランザクションにおいて、複数のクエリの後に結果セットの数...

Vueのdiffアルゴリズムについての簡単な説明

目次概要バーチャルドム原理実装プロセスパッチ方式sameVnode関数patchVnode関数upd...

VMware15/16 VMwareのロックを解除してMacOSをインストールする詳細な手順

VMware バージョン: VMware-workstation-full-16 VMware バー...

nginxリバースプロキシのマルチポートマッピングの実装

コードの説明1.1 http:www.baidu.test.com のデフォルトは 80 で、リバー...

Dockerカスタムネットワーク実装

目次1. コンテナ相互接続を実現するためにネットワークをカスタマイズする2. ネットワーク接続1. ...

HTML_PowerNode 入門 Java アカデミー

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 HTML ...

Node-Redを使用してMySQLデータベースに接続する方法

Node-red をデータベース (mysql) に接続するには、まずコンピューターに MySQL ...

W3C が推奨するモバイル Web マークアップ言語 XHTML Basic 1.1

W3C は最近、「 XHTML Basic1.1 」と「 Mobile Web Best Prac...

Docker インストール Nginx チュートリアル 実装図

Nginx をインストールして試してみましょう。画像はクラスであり、コンテナはオブジェクトであること...

h1、h2、h3タグを適切に使用する

Web ページを作成する過程では、<h1>、<h2>、<h3> ...

Ubuntu 19にTheanoをインストールする際の問題を解決する

解決: pythearn2 パッケージをダウンロードしたディレクトリで、setup.py ファイルを...

MySQL 最適化における B ツリー インデックスの知識ポイントのまとめ

SQL を最適化する必要があるのはなぜですか?当然ですが、SQL ステートメントを記述する場合、次の...

CSS継承方法

次の背景画像を持つ div があるとします。 次の反射効果を作成します。 方法はたくさんありますが、...

IE7でソースファイルを含むページを開くとページが空白になる問題の解決方法

質問:私のブログのエンコーディングは utf-8 です。ページを開くと空白になっていることもあります...