Vue は水の波紋効果のクリックフィードバック指示を実装します

Vue は水の波紋効果のクリックフィードバック指示を実装します

水波効果

ユーザーがクリックすると、クリックの中心を中心として波紋効果が生成されます。さまざまなシーンに適しており、誇張することなく美しく、ユーザーに非常に直感的なフィードバックを提供できることが鍵です。

実装を見てみましょう

まず、ここでのカプセル化は Vue3 のカスタム命令に基づいています。Vue3 のカスタム命令は、Vue2 と比べてあまり変わっていません。私たちの目標は、水波コマンドの基本的なプロトタイプを完成させることであり、ここでは段階的に進めていきます。

水の波紋のデフォルトスタイルをカスタマイズする

水の波紋は、実際には、ユーザーがクリックした場所に小さな円が生成され、そのサイズがクリックされた要素全体に徐々に拡大するプロセスです。ここでは、まず水の波の基本的なスタイルを策定し、遷移アニメーションを設定します。遷移アニメーションは、ゆっくりと始まり、その後加速するプロセスである必要があります。ここでは、ベジェ曲線のカスタマイズを使用します。

.my-ripple {
  位置: 絶対;
  上: 0;
  左: 0;
  zインデックス: 100;
  境界線の半径: 50%;
  背景色: 現在の色;
  不透明度: 0;
  遷移: 変換 0.2 秒 キュービックベジェ (0.68, 0.01, 0.62, 0.6)、不透明度 0.08 秒 線形;
  will-change: 変換、不透明度;
  ポインタイベント: なし;
}

水の波紋の位置と直径を計算する

水の波の直径、波が作成されるときの (x, y)、およびトランジションアニメーションが終了するときの (x, y) を決定すると、トランジションを使用して水の波のアニメーションをレンダリングできます。 作成されるときの (x, y) はユーザーがクリックする位置ですが、水の波の直径とトランジションアニメーションが終了するときの (x, y) をどのように計算するのでしょうか。私たちの要素はすべて長方形です。ユーザーが要素のどこをクリックしても、長方形の斜辺を直径とする円が要素全体を完全に覆うことができます。斜辺を計算するには、小学校の算数の知識を使用して、両辺の二乗の合計の平方根を求めます。以下は、遷移アニメーションの最後の水波推論図です。

最初の矢印: 予想される水の波 2 番目の矢印: 要素 (0,0) で作成された水の波 3 番目の矢印: 角が丸くない要素 (0,0) で作成された水の波

要素(0,0)点によって生成された水波をオフセットすることで、必要な水波が得られることがわかります。そこから、

アニメーション終了時の水波の大きさ = 円が作成されたときの斜辺の (x,y) = ユーザーがクリックした位置 遷移アニメーション終了時の (x,y) = 要素 (0,0) で作成された水波は x と y でオフセットされます

関数computeRippleStyles(要素、イベント) {
  const { 上、左 } = element.getBoundingClientRect()
  const { clientWidth, clientHeight } = 要素
  
  定数半径 = Math.sqrt(クライアント幅 ** 2 + クライアント高さ ** 2) / 2
  定数サイズ = 半径 * 2
  
  const localX = event.clientX - 左
  const localY = event.clientY - 上部

  定数 centerX = (クライアント幅 - 半径 * 2) / 2
  定数 centerY = (クライアントの高さ - 半径 * 2) / 2

  定数 x = ローカルX - 半径
  定数 y = ローカルY - 半径

  {x、y、centerX、centerY、サイズ}を返します
}

マウスを押すと水の波を作成します

次に、マウスが押されたときに水の波を作成し、マウスの押下イベントをリッスンする必要があります。ここでは、PC 側を例に挙げます。水の波が作成されたばかりのときは、transform を使用して 0.3 に縮小します。これは、作者が試した比較的適切な作成サイズです。次に、transform を変更して、遷移する水の波の拡散アニメーションをトリガーします。ここでは、水の波紋にさらにテクスチャを付けるために、透明度の遷移も追加されています。

関数createRipple(イベント) {
  const コンテナ = this
  const { x, y, centerX, centerY, サイズ } = computeRippleStyles(コンテナ, イベント)
  const リップル = document.createElement('div')
  ripple.classList.add('my-ripple')
  ripple.style.opacity = `0`
  ripple.style.transform = `translate(${x}px, ${y}px) scale3d(.3, .3, .3)`
  ripple.style.width = `${size}px`
  ripple.style.height = `${size}px`
  // 水波の生成時刻を記録します。ripple.dataset.createdAt = String(performance.now())

  const { 位置 } = window.getComputedStyle(コンテナ)
  container.style.overflow = '隠し'
  位置 === '静的' && (this.style.position = '相対')

  コンテナ.appendChild(リップル)

  ウィンドウ.setTimeout(() => {
    ripple.style.transform = `translate(${centerX}px, ${centerY}px) scale3d(1, 1, 1)`
    ripple.style.opacity = `.25`
  })
}

定数VRipple = {
  マウント(el) {
    el.addEventListener('mousedown', リップルを作成します)
  }
}

マウスを持ち上げるときに水の波を破壊する

マウスを離すと、生成された水波ノードを見つけて透明度を変更し、透明度の変更アニメーションが終了したら水波ノードを削除するだけです。

関数removeRipple() {
  const コンテナ = this
  const リップル = container.querySelectorAll('.my-ripple')
  波紋の長さが等しい場合
    戻る
  }

  const lastRipple = ripples[ripples.length - 1]
  // 水の波の作成時間に基づいて拡散アニメーションの実行にかかる時間を計算して、各水の波が拡散アニメーションを完了するようにします。const delay = 300 - performance.now() + Number(lastRipple.dataset.createdAt)

  タイムアウトを設定する(() => {
    lastRipple.style.opacity = `0`
    
    タイムアウトを設定します(() => lastRipple.parentNode?.removeChild(lastRipple), 300)
  }、 遅れ)
}

定数VRipple = {
  マウント(el) {
    el.addEventListener('mousedown', リップルを作成します)
    document.addEventListener('mouseup', リップルを削除)
  },
  アンマウント(el) {
    el.removeEventListener('mousedown', createRipple)
    document.removeEventListener('mouseup', リップルの削除)
  }
}

コマンドバインディングで水波オプションを拡張

また、バインディングを通じて指示を拡張することもできます。たとえば、色の変更、ステータスの無効化などのオプションを提供できますが、ここでは詳しく説明しません。結果を見てみましょう。

最後に

これまで、単純なリップル命令を実装してきました。当社のコンポーネント ライブラリにも同様の命令がありますので、より完全なバージョンについては当社のソース コードをご覧ください。 まず、Nuggets コミュニティに感謝したいと思います。何人かの友人はすでに私たちのウェアハウスにいくつかのコードを PR し始めています。私たちもコミュニティの友人たちとこのようなことをできることをとても嬉しく思っています。また、私たちのコンポーネント ライブラリ チームは、貢献に参加する熱心なファンを募集しています。興味のある友人は、ぜひディスカッションに参加してください。参加方法は、ウェアハウスに直接行って問題を提起し、メールを残すことです。できるだけ早く対処します。興味があるかどうかにかかわらず、私たちにスターを付けて注目していただければ幸いです。コミュニティ パートナーのサポートと関心が私たちの最大のモチベーションです。

倉庫住所 書類住所

上記は、水波効果を実現するためのVueのクリックフィードバック命令の詳細です。Vueのクリックフィードバック命令の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue でポップアップ ウィンドウをクリックしたときにクリック イベントを自動的にトリガーするソリューション (シミュレーション シナリオ)
  • Vue.jsはアイコンをクリックしてズームインし、
  • Vueの空白部分をクリックしてポップアップウィンドウを閉じる2つの方法
  • Vueは現在の行をクリックして色を変更することを実装しています
  • Vue3.0はクリックして切り替える検証コード(コンポーネント)と検証を実装します
  • Vue の親コンポーネントのボタンをクリックして子コンポーネントをトリガーするイベントの詳細な説明
  • Vueは、短時間に連続してクリックされた後に複数のトリガーリクエストが発生するのを防ぎます。
  • VueはIDの動的な割り当てと、現在クリックされている要素のID操作を取得するクリックイベントを実装しています。
  • クリックしてポップアップボックスを表示するVueの例
  • Vueはantデザインのテーブルを使用して、行をクリックしたときにイベント操作をトリガーします。

<<:  CentOS7.3 での MySQL 8.0.13 のインストールと設定のチュートリアル

>>:  Linuxカーネルで中国語の文字を出力する方法

推薦する

MySQLの大規模テーブル最適化ソリューションについての簡単な説明

背景Alibaba Cloud RDS for MySQL(MySQL バージョン 5.7)データベ...

CSS の Display、Visibility、Opacity、rgba、z-index: -1 の違い

ウェブページ上のいくつかの要素の非表示、透明、その他のプロパティを制御する必要があることがよくありま...

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

MySQL 5.7.17 のインストールと設定方法の概要最初のステップは、MySQL公式サイトから...

Layuiはログインインターフェース検証コードを実装します

この記事の例では、ログインインターフェース検証コードを実装するためのlayuiの具体的なコードを参考...

1行のコードでLinuxのプロセスを隠す方法を学ぶ

友人たちはいつも、Linux のプロセスを隠す方法を私に尋ねます。私は、どの程度隠したいのか、カーネ...

Ubuntu環境でのPHP関連のパスと変更方法

Ubuntu環境におけるPHP関連パスPHP パス /usr/bin/php phpize5 /us...

MySQL レプリケーション問題の 3 つのパラメータの分析

目次01 sql_slave_skip_counter パラメータ02 スレーブスキップエラーパラメ...

Linux ディレクトリ切り替え実装コード例

ファイルの切り替えは Linux でよく行われる操作です。Linux を初めて学ぶときに最初に触れる...

Jenkins Docker 静的エージェント ノードのビルド プロセス

静的ノードはマシン上に固定されており、いくつかの固定コマンドを通じて起動されます。動的ノードには複数...

MySQLプリコンパイル機能の詳細な説明

この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...

MySQL のストレージ エンジンの違いと比較

MyISAM ストレージエンジンMyISAM は ISAM ストレージ エンジンに基づいており、それ...

Navicat for MySQL 11 登録コード\アクティベーションコードの概要

おすすめの読み物: Navicat12.1シリーズのクラッキングとアクティベーションのチュートリアル...

MySQL における distinct と group by の違い

簡単に言うと、distinct は重複を削除するために使用され、group by は統計を集計するよ...

JSはreduce()メソッドを使用してツリー構造データを処理します

目次意味文法例1. 初期値initが渡されない2. 初期値を渡す場合3. アレイの重複排除4. Re...

Vmware での Ubuntu サーバーのインストール チュートリアル

この記事では、Ubuntuサーバーバージョンのインストールグラフィックチュートリアルを参考までに紹介...