パーティクルダイナミックボタン効果を実現するCSS

パーティクルダイナミックボタン効果を実現するCSS

オリジナルリンク

https://github.com/XboxYan/no…

ボタンは、おそらく Web ページ上で最も一般的なコンポーネントの 1 つです。そのほとんどは目立たないものです。そのようなボタンを見つけたら、それを何度かクリックしたくなるでしょうか?

通常、この種の効果に対する最初の反応は、次のケースのようにcanvasを使用することです。

その効果はさらに衝撃的です。もちろん、 canvas実装にも一定の閾値があり、実際に使用するには少し面倒です (すべてのjs実装に共通する問題)。ここでは、 CSS実装方法を試します。

パーティクルを生成する

jsソリューションの他に、 HTMLおよびCSS実装もあります。言うまでもなく、 HTML単なるタグの集まりです。

<ボタン>
    ボタン
    <i></i>
    <i></i>
    <i></i>
    <i></i>
    <i></i>
    ...
</ボタン>

一般的に言えば、私はこのアプローチはあまり好きではありません。タグが多すぎるし、構造が美しくなく、既存のページに他の影響を与える可能性があります(多くの場合、元のHTML構造を変更するのは便利ではありません)。

それでは、 CSS実装方法を見てみましょう。主な方法は 2 つあります。実際には、どの属性を無限に重ね合わせることができるかを考えるだけです。1 つはbox-shadowで、もう 1 つはbackground-imageです (CSS3 は無限の重ね合わせをサポートしています)。

1.ボックスシャドウ

まずはbox-shadowメソッドを見てみましょう。余分なタグの使用を避けるために、ここでは疑似要素が使用されています。

.button::before{
  位置: 絶対;
  コンテンツ: '';
  幅: 5px;
  高さ: 5px;
  境界線の半径: 50%;
  背景色: #ff0081;
  box-shadow: 10px 10px #ff0081,15px 0px 0 2px #ff0081,20px 15px 0 3px #ff0081,...;/*無限オーバーレイ*/
}

ある程度の効果はありますが、デバッグに時間がかかります。パーティクルの位置とサイズは主にオフセットと拡張によって決まります。

しかし、ここでのオフセットはpx単位のみで、ボタンのサイズにうまく適応できないため、ここでは2番目の方法を使用して実現します。

2. 背景画像

CSS3では、 background-image無限に重ねることができます。

.myclass {
  背景: 背景1、背景2、/*...*/ 背景N;
}

ここではradial-gradientを使用して複数の小さなドットを実現できます。

.button::before{
  位置: 絶対;
  コンテンツ: '';
  左: -2em;
  右: -2em;
  上: -2em;
  下: -2em;
  ポインタイベント: なし;
  背景繰り返し: 繰り返しなし;
  背景画像: 放射状グラデーション(円、#ff0081 20%、透明度 0)、 
  放射状グラデーション(円、#ff0081 20%、透明度0)、
  放射状グラデーション(円、#ff0081 20%、透明度0)、 
  放射状グラデーション(円、#ff0081 20%、透明度0)、 
  ...;
  背景サイズ: 10% 10%、20% 20%、15% 15%、...;
  背景位置: 18% 40%、20% 31%、30% 30%、...;
}

ここで、 background-sizebackground-position主に原点のサイズと位置を制御するために使われます。複雑に思えますが、実際にはbackground-sizebackground-position background-image位置に一つずつ対応していれば大丈夫です。実際の開発ではデバッグが少し難しいかもしれません。キーボードの上下左右のキーを使ってコンソール上で直接リアルタイムプレビュー効果を微調整することができます(可視化ツールを作ることも検討できます)。

これにより、単純なパーティクル効果が作成されます。

動き出そう

background-image CSSアニメーションをサポートしていませんが、他の 2 つのbackground-sizebackground-positionサポートしているため、 CSS transitionCSS animationを使用できます。

アニメーション効果は非常にシンプルで、粒子が中心から外側に広がり、徐々に消えていくというプロセスです。

遷移

まず:hoverインタラクションを見てみましょう

.button::before{
  遷移:.75秒の背景位置のイーズインアウト、75秒の背景サイズのイーズインアウト;
}
.button:hover::before{
  背景位置: 5% 44%、-5% 20%、7% 5%...;
  背景サイズ: 0% 0%;
}

もちろん、このように直接設定するのは決して理想的ではありません。マウスが離れると縮みます。効果は次のようになります

マウスが立ち去るときに縮まないようにする必要があります。どうすればこれを実現できるでしょうか?

とても簡単です。 :hoverの下にtransitionを設定するだけです。つまり、マウスがその上を通過したときにのみトランジションが発生し、マウスがその上を離れたときには発生しません。

.button:hover::before{
  背景位置: 5% 44%、-5% 20%、7% 5%...;
  背景サイズ: 0% 0%;
  遷移:.75秒の背景位置のイーズインアウト、75秒の背景サイズのイーズインアウト;
}

少しは気分が良くなりましたか?表示するにはここをクリックしてください。

クリック時にパーティクルアニメーションを表示したい場合はどうすればよいでしょうか?ここでは:active疑似クラスを使用する必要があります。

:hoverロジックに従うと、

.button:active::before{
  背景位置: 5% 44%、-5% 20%、7% 5%...;
  背景サイズ: 0% 0%;
  遷移:.75秒の背景位置のイーズインアウト、75秒の背景サイズのイーズインアウト;
}

残念ながら、これはボタンを押した時にしか発動しません。マウスを離すと消えてしまいます。このとき、角度を変える必要があります。次のように想像できます。デフォルトでは発散しており、クリックすると収束し、持ち上げると以前の発散状態に戻ります。同時に、クリック時に遷移効果をキャンセルする必要があります。

.button::before {
    /*...*/
    背景位置: 5% 44%...;/*拡散状態*/
    背景サイズ: 0% 0%;
    遷移: background-position .5s の easy-in-out、background-size .75s の easy-in-out;
}

.button:active::before {
  transition:0s;/**トランジションをキャンセルするための注意**/
  背景サイズ: 10% 10%、20% 20%...;
  背景位置: 18% 40%、20% 31%、...;
}

このデモをチェックしてみてください

なぜ:activetransition:0s必要なのでしょうか?追加せずに試してみると、次のように効果がわかります。

アニメーション

animationtransitionの実装原理は似ています。利点は、より洗練されたアニメーションを作成できることです。 :activeメソッドを例に挙げてみましょう。

.button::before{
  /*...*/
  アニメーション: 泡が 0.75 秒早送りでイーズイン アウトします。
}
.button:active::before {
  animation: none; /*ここでアニメーションをキャンセルできることに注意してください*/
  背景サイズ: 0;
}
@keyframes バブル {
  0% {
    背景位置: 18% 40%、...;
  }
  50% {
    背景位置: 10% 44%、...;
  }
  100% {
    背景位置: 5% 44%、...;
    背景サイズ: 0% 0%;
  }
}

ソースコードはここでご覧いただけます。

唯一の欠点は、初期化アニメーションが 1 回実行されることです。

まとめ

上記では、パーティクル アニメーション ボタンの純粋な CSS 実装を紹介しています。利点は明らかです。ネイティブ プロジェクトでもreactプロジェクトでも、 CSSをコピーしてプロジェクトに直接投入し、使用することができます。イベントや追加のロジック処理をバインドする必要がないため、既存のエクスペリエンスが向上します。想像してみてください、これが「購入」ボタンだったら、もっと買うきっかけになるでしょうか?とにかく、私は間違いなくそれに惹かれます、ハハハ〜

まだいくつか欠点があります。例えば、上記の配置は作業負荷が密集しています。プロジェクト全体が完了した後にこれらの機能を微調整することをお勧めします。また、作業負荷を軽減するためにいくつかの視覚化ツールを作成してみることもできます。それだけです。

要約する

上記はエディターが紹介した CSS パーティクル ダイナミック ボタン エフェクトです。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残していただければ、エディターがすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

<<:  el-table ヘッダーでテキストを折り返す 3 つの方法の詳細な説明

>>:  複雑なウェブサイトのナビゲーションを簡素化

推薦する

MySQL ステートメントを使用して、さまざまな整数が占めるバイト数とその最大値と最小値を調べる例

直接コード: タイプとして「bigint unsigned」、バイトとして「8」、max_numとし...

MySQL カウントを向上させる方法のまとめ

多くのプログラマーは MySQL に精通していると思います。多くの人が count の使い方と、最適...

IE 8/Chrome/Firefox と互換性のあるコメント返信ポップアップマスク効果実装アイデア

平日はニュースに注目して、テンセントをよく閲覧しています。しかし、コメントへの返信はほとんど見られま...

記事では、js を使用して弾幕効果を実現する方法を説明します

目次新しい HTML ファイルを作成します。初期テンプレートを作成するHTML の追加CSS パディ...

mysql order by in の文字順序の詳細な説明 (推奨)

//MySQL ステートメント SELECT * FROM `MyTable` WHERE `id...

Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します

VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...

ウェブページ内の 2 つのボックス モデル (W3C ボックス モデル、IE ボックス モデル)

Web ページ ボックス モデルには 2 種類あります。 1: 標準 W3C ボックス モデル。2:...

MySqlサブクエリINの実装と最適化

目次IN が遅いのはなぜですか? INとEXISTSのどちらが速いでしょうか?効率を向上させるにはど...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

SpringbootはDockerデプロイメントを統合し、Dockerイメージを構築する2つの方法を実装します。

Docker は、あらゆるアプリケーション用の軽量でポータブルな自己完結型コンテナーを簡単に作成で...

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス...

Centos7でmysql5.7.19のデータ保存場所を移動する方法

シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...

Rancher のデプロイメントと K8S クラスターのインポートに関する問題

Rancher のデプロイメントには、次の 3 つのアーキテクチャがあります。高可用性 Kubern...

CentOS 環境で NFS リモート ディレクトリ マウントを使用する手順の紹介

目次1. NFS の概要2. NFS構築1. NFSサーバーの構築2. NFSクライアントの構築3....

MySQLでビューを作成する方法

基本的な構文CREATE VIEW ステートメントを使用してビューを作成できます。構文の形式は次のと...