CSSとJavaScriptを使用して、ホバーするとキラキラが発生するエフェクトを作成しました。
以下のボタンにマウスカーソルを当ててみてください。
ボタンのエリアにキラキラのエフェクトが表示されるのが確認できたかと思います。
CSSと素のJavaScriptで実装する方法を紹介していきますので、ぜひ参考にしてみてください。
【コピペ用】キラキラが発生するエフェクトの実装コード
まずは全体の実装コードと画像ファイルを用意したので、コピペしてお使いください。
index.html
style.css
script.js
を作成し、それぞれのコードを貼り付けると使用できます。
キラキラ部分の画像は、以下のリンクからダウンロードしてください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ホバーするとキラキラが発生するエフェクトのDEMO</title>
<!-- CSS読み込み -->
<link rel="stylesheet" href="style.css" />
</head>
<body>
<a href="リンクを記入" class="btn js-glitter">Hover Me</a>
<!-- JS読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ボタン本体 */
.btn {
position: relative; /* static以外を指定 */
display: flex;
align-items: center;
justify-content: center;
width: 200px;
height: 60px;
border-radius: 100px;
background-color: #6cc7f4;
color: #fff;
font-family: "Signika";
font-size: 1.2em;
font-weight: bold;
transition: all 0.3s;
cursor: pointer;
}
/* ボタンホバー時 */
.btn:hover {
background-color: #fff;
color: #6cc7f4;
box-shadow: 0 0 20px 0 rgba(108, 199, 244, 0.5);
}
/* キラキラ部分 */
.star {
position: absolute;
display: block;
width: 10px; /* キラキラの横幅を指定 */
height: 10px; /* キラキラの縦幅を指定 */
background-image: url("star.svg"); /* キラキラの画像のパスを記入 */
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
animation: glitter 1s;
pointer-events: none;
}
/* キラキラが発生するアニメーション */
@keyframes glitter {
0% {
transform: scale(0);
opacity: 0;
}
50% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(0);
opacity: 0;
}
}
// js-glitterクラスがついた要素を全て取得
const glitterEls = document.querySelectorAll(".js-glitter");
// 取得した要素をArrayに変換
const glitterElsArr = Array.prototype.slice.call(glitterEls);
// 取得した要素ひとつひとつに処理を行う
glitterElsArr.forEach((glitterEl) => {
let interval;
// マウスホバー時にキラキラを生成
glitterEl.addEventListener("mouseenter", () => {
interval = setInterval(createStar.bind(undefined, glitterEl), 200);
});
// マウスを離すと停止
glitterEl.addEventListener("mouseleave", () => {
clearInterval(interval);
});
});
// キラキラを生成する関数
const createStar = (el) => {
const starEl = document.createElement("span");
starEl.className = "star";
starEl.style.left = Math.random() * el.clientWidth + "px";
starEl.style.top = Math.random() * el.clientHeight + "px";
el.appendChild(starEl);
// 一定時間経つとキラキラを消す
setTimeout(() => {
starEl.remove();
}, 1000);
};
上記のコードをコピペするだけで、ホバー時にキラキラが発生するボタンが実装できたかと思います。
もしキラキラが表示されない場合は、画像のパスが正しいかどうか確認してみてください。
.star {
background-image: url("star.svg"); /* キラキラの画像のパスを記入 */
}
CSSの上記の部分でパスを指定しています。
次からはコードの解説やカスタマイズ方法などを紹介していきますので、気になる方は読んでみてください。
【解説】キラキラが発生するエフェクトの実装コードの解説
ここでは実装コードの解説をしていきます。
- HTMLでボタン要素を作成する
- CSSでボタンの装飾とアニメーションを指定する
- JavaScriptでキラキラを発生させる
上記の順番で説明していきますね。
HTMLでボタン要素を作成する
まずはHTMLからみていきます。
ここではリンクボタンを想定して、a
タグで実装しています。
<a href="リンクを記入" class="btn js-glitter">Hover Me</a>
ボタンのスタイルを指定するためのbtn
クラス、JavaScriptで操作するためのjs-glitter
クラスを付与します。
次にhref
属性にリンク先のURLを記入することで、リンク付きボタンの完成です!
aタグ以外のHTMLタグでも実装可能
DEMOではa
タグを使用しましたが、他のHTMLタグでも実装可能です。
buttonタグで実装する場合
<button type="button" class="btn js-glitter">Hover Me</button>
pタグで実装する場合
p
タグで作成した文章でもキラキラが発生するエフェクトを実装可能です。このテキスト上にマウスカーソルを当てて確認してみてください。
<p class="js-glitter">ここにテキストを入れてください。</p>
以上でHTMLの解説は終わりです!
CSSでボタンの装飾とアニメーションを指定する
続いてはCSSでボタンの装飾と、星の画像がキラキラ光るようなアニメーションを指定していきます。
/* ボタン本体 */
.btn {
position: relative; /* static以外を指定 */
display: flex;
align-items: center;
justify-content: center;
width: 200px;
height: 60px;
border-radius: 100px;
background-color: #6cc7f4;
color: #fff;
font-family: "Signika";
font-size: 1.2em;
font-weight: bold;
transition: all 0.3s;
cursor: pointer;
}
/* ボタンホバー時 */
.btn:hover {
background-color: #fff;
color: #6cc7f4;
box-shadow: 0 0 20px 0 rgba(108, 199, 244, 0.5);
}
/* キラキラ部分 */
.star {
position: absolute;
display: block;
width: 10px; /* キラキラの横幅を指定 */
height: 10px; /* キラキラの縦幅を指定 */
background-image: url("star.svg"); /* キラキラの画像のパスを記入 */
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
animation: glitter 1s;
pointer-events: none;
}
/* キラキラが発生するアニメーション */
@keyframes glitter {
0% {
transform: scale(0);
opacity: 0;
}
50% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(0);
opacity: 0;
}
}
こちらがCSSの全体像です。
- ボタン本体のスタイル
- キラキラ部分のスタイル
- キラキラが発生するアニメーション
上記の3つに分けて説明していきますね。
CSS1. ボタン本体のスタイル
/* ボタン本体 */
.btn {
position: relative; /* static以外を指定 */
display: flex;
align-items: center;
justify-content: center;
width: 200px;
height: 60px;
border-radius: 100px;
background-color: #6cc7f4;
color: #fff;
font-family: "Signika";
font-size: 1.2em;
font-weight: bold;
transition: all 0.3s;
cursor: pointer;
}
/* ボタンホバー時 */
.btn:hover {
background-color: #fff;
color: #6cc7f4;
box-shadow: 0 0 20px 0 rgba(108, 199, 244, 0.5);
}
ボタン本体と、ボタンをホバーした時のスタイルです。
ここでの必須プロパティは2つだけで、それ以外は自由にカスタマイズすることが可能なので、重要な箇所のみ説明します。
ボタン要素のスタイルで、必要なのは以下の2つです。
position
プロパティの値をstatic
以外にするdisplay
プロパティの値をinline
以外にする
まずはposition
プロパティから説明していきますね。
キラキラ部分の要素は、
で絶対位置を指定します。position: absolute
そのため、親要素であるボタンにはposition: static
以外を指定しておく必要がありますね。
次にdisplay
プロパティについてですが、値がinline
だとJavaScriptで横幅と縦幅をうまく取得できません。
そうなるとキラキラの発生場所が左上に固定されてしまい、ランダム表示させることができなくなるので、必ずinline
以外を指定してください。
a
タグやspan
タグはデフォルトでinline
になっていることがあるので、特に注意してくださいね。
この2つのルールさえ守れば、どんなHTMLタグにもキラキラが発生するエフェクトを実装することが可能です!
この部分以外は自由にカスタマイズすることが可能なので、ここでは解説しません。
position
プロパティの値をstatic
以外にするdisplay
プロパティの値をinline
以外にする
ボタン本体のスタイルを指定する際は、このルールだけ守ればOKです。
CSS2. キラキラ部分のスタイル
/* キラキラ部分 */
.star {
position: absolute;
display: block;
width: 10px; /* キラキラの横幅を指定 */
height: 10px; /* キラキラの縦幅を指定 */
background-image: url("star.svg"); /* キラキラの画像のパスを記入 */
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
animation: glitter 1s;
pointer-events: none;
}
続いては、キラキラ部分の星の要素のスタイルです。
まず星の位置指定には、position: absolute
を使用します。
これで親要素を基準にキラキラの発生場所を指定できるようになりました。
left
とtop
に入れる値はJavaScriptで取得するので、CSSでは指定しなくてOKです。
キラキラの大きさの調整は、width
とheight
に値を指定します。
大きすぎると文字が隠れて読めなくなってしまうので、10px ~ 15px
あたりが良いかと思います。
キラキラの部分はsvg画像を使用するので、background
プロパティで指定していきます。
.star {
background-image: url("star.svg"); /* キラキラの画像のパスを記入 */
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
}
url("")
の中には、画像のパスを記入します。
ここが間違っているとキラキラが表示されないので、注意してください。
最後にキラキラが発生するアニメーションを指定したいので、以下の記述をします。
animation: glitter 1s;
このコードは、glitter
という名前のアニメーションを1秒かけて実行するという意味になります。
glitter
の中身は次で説明していきます。
CSS3. キラキラが発生するアニメーション
/* キラキラが発生するアニメーション */
@keyframes glitter {
0% {
transform: scale(0);
opacity: 0;
}
50% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(0);
opacity: 0;
}
}
こちらがアニメーションglitter
の中身です。
0%
の時点では、transform: scale(0)
とopacity: 0
がかかっているので、キラキラ部分が見えない状態ですね。
その後50%
時点までキラキラを徐々に表示していき、100%
になるにつれて徐々に小さく&透明にするという指定をしています。
もう一度DEMOを確認してみましょう。
キラキラが徐々に大きくなり、一定時間を超えると徐々に小さくなるのが確認できましたね。
これでキラキラ部分が発生する際のアニメーションは完成です。
JavaScriptでキラキラを発生させる
最後に、JavaScriptを見ていきましょう。
// js-glitterクラスがついた要素を全て取得
const glitterEls = document.querySelectorAll(".js-glitter");
// 取得した要素をArrayに変換
const glitterElsArr = Array.prototype.slice.call(glitterEls);
// 取得した要素ひとつひとつに処理を行う
glitterElsArr.forEach((glitterEl) => {
let interval;
// マウスホバー時にキラキラを生成
glitterEl.addEventListener("mouseenter", () => {
interval = setInterval(createStar.bind(undefined, glitterEl), 200);
});
// マウスを離すと停止
glitterEl.addEventListener("mouseleave", () => {
clearInterval(interval);
});
});
// キラキラを生成する関数
const createStar = (el) => {
const starEl = document.createElement("span");
starEl.className = "star";
starEl.style.left = Math.random() * el.clientWidth + "px";
starEl.style.top = Math.random() * el.clientHeight + "px";
el.appendChild(starEl);
// 一定時間経つとキラキラを消す
setTimeout(() => {
starEl.remove();
}, 1000);
};
- キラキラを発生させる要素を取得
- ホバー時とホバー終了時の動作を指定
- キラキラを生成する関数を定義
上記の3つのパートに分けて解説していきます!
JavaScript1. キラキラを発生させる要素を取得
まず最初に、キラキラを発生させる要素を全て取得します。
HTMLパートで、ボタン要素にjs-glitter
というクラスを付与しましたね。
このクラスがついた要素をquerySelectorAll
で全て取得して、変数glitterEls
に格納します。
const glitterEls = document.querySelectorAll(".js-glitter");
このとき、querySelectorAll
で取得した要素はNodeList
という型になるので、一部のブラウザでは次で使用するforEach
メソッドを使用することができません。
そのため、NodeList
をArray
に変換するために、以下の記述をします。
const glitterElsArr = Array.prototype.slice.call(glitterEls);
これで、次で使用するforEach
メソッドをどのブラウザでも動作させることが可能になりました。
JavaScript2. ホバー時とホバー終了時の動作を指定
// 取得した要素ひとつひとつに処理を行う
glitterElsArr.forEach((glitterEl) => {
let interval;
// マウスホバー時にキラキラを生成
glitterEl.addEventListener("mouseenter", () => {
interval = setInterval(createStar.bind(undefined, glitterEl), 200);
});
// マウスを離すと停止
glitterEl.addEventListener("mouseleave", () => {
clearInterval(interval);
});
});
ここでは、ホバー時とホバー終了時の動作を指定していきます。
まず取得したすべての要素ひとつひとつに対して処理をするために、forEach
メソッドを使用します。
glitterElsArr.forEach((glitterEl) => {
// ...
}
これで{}
内のコードが、全ての要素に適用されるようになりましたね。
この{}
内には、ホバーした時・ホバーを解除した時の指定をします。
これらには、以下の2つのイベントを使用します。
mouseenter
…マウスカーソルが要素の領域に入ったときmouseleave
…マウスカーソルが要素の領域から出たとき
let interval;
// マウスホバー時にキラキラを生成
glitterEl.addEventListener("mouseenter", () => {
interval = setInterval(createStar.bind(undefined, glitterEl), 200);
});
// マウスを離すと停止
glitterEl.addEventListener("mouseleave", () => {
clearInterval(interval);
});
ホバー時にはsetInterval
を使用して、0.2
秒ごとにキラキラを生成する関数createStar
を呼び出します。
ホバーを解除すると、clearInterval
でタイマーを停止させ、キラキラの生成をストップさせます。
これでホバー時・ホバー解除時の動作は終わりです。
JavaScript3. キラキラを生成する関数を定義
最後に、キラキラを生成する関数createStar
の中身を見ていきましょう。
const createStar = (el) => {
// ①spanタグを生成 & 'star'クラスを付与
const starEl = document.createElement("span");
starEl.className = "star";
// ②親要素のサイズを基準にleftとtopにランダムな数値を指定
starEl.style.left = Math.random() * el.clientWidth + "px";
starEl.style.top = Math.random() * el.clientHeight + "px";
// ③完成したキラキラを親要素に挿入
el.appendChild(starEl);
// ④一定時間経つとキラキラを消す
setTimeout(() => {
starEl.remove();
}, 1000);
};
この関数内では、以下の4つのことが起こっています。
span
タグを生成 &star
クラスを付与- 親要素のサイズを基準に
left
とtop
にランダムな数値を指定 - 完成したキラキラを親要素に挿入
- 一定時間経つとキラキラを消す
順番に解説していきますね。
①spanタグを生成 & starクラスを付与
まずはキラキラ本体の要素を作成していきます。
const starEl = document.createElement("span");
starEl.className = "star";
createElement
でspan
タグを生成して、さらにstar
というクラスをつけます。
CSSパートで、star
クラスに対してキラキラ部分の装飾をしましたね。
.star {
position: absolute;
display: block;
width: 10px;
height: 10px;
background-image: url("star.svg");
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
animation: glitter 1s;
pointer-events: none;
}
上記のスタイルが、キラキラ要素に適用されることになります。
②親要素のサイズを基準にleftとtopにランダムな数値を指定
CSSでは、star
クラスに対してposition: absolute
を指定しましたね。
しかしleft
とtop
は親要素のサイズを基準にランダムに指定したいので、以下のコードを記述します。
starEl.style.left = Math.random() * el.clientWidth + "px";
starEl.style.top = Math.random() * el.clientHeight + "px";
clientWidth
とclientHeight
は、padding
を含む要素の横幅・高さを返すプロパティです。
この数値とMath.random()
を掛け合わせることで、0~親要素の横幅、0~親要素の縦幅の中からランダムな数値を取得することができます。
これらをstyle
属性に直接書き加えることで、キラキラが発生する場所をランダムに指定しているというわけですね。
③完成したキラキラを親要素に挿入
キラキラの要素が完成したので、あとは親要素に追加するだけです。
el.appendChild(starEl);
appendChild
で、生成されたキラキラを親要素に追加します。
このとき、キラキラにはanimation: glitter 1s
をCSSで指定しているので、1秒間で拡大しながら発生し、縮小しながら消えていくアニメーションが実行されます。
④一定時間経つとキラキラを消す
アニメーションが終了すれば、もうDOMに残しておく必要はないので、remove
メソッドでキラキラを取り除きます。
setTimeout(() => {
starEl.remove();
}, 1000);
glitter
アニメーションは1秒で完了するので、1秒後に削除するよう指定します。
これでJavaScriptの解説は終わりです!
キラキラが発生するエフェクトのカスタマイズ方法
ここでは、いくつかのカスタマイズ方法を紹介しておきます。
- キラキラの大きさを変える
- キラキラが発生する頻度を変える
- アニメーションの持続時間を変える
- キラキラの色を変える
もし今回紹介したコードをカスタマイズしたい場合は、ぜひ参考にしてみてください。
キラキラの大きさを変える
キラキラのサイズは、CSSで調整することが可能です。
.star {
position: absolute;
display: block;
width: 10px; /* キラキラの横幅を指定 */
height: 10px; /* キラキラの縦幅を指定 */
background-image: url("star.svg");
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
animation: glitter 1s;
pointer-events: none;
}
star
クラスのwidth
とheight
にサイズを記入してください。
キラキラが発生する頻度を変える
「キラキラの量を増やしたいor減らしたい」という場合は、JavaScriptを編集します。
glitterEl.addEventListener("mouseenter", () => {
interval = setInterval(createStar.bind(undefined, glitterEl), 200);
});
setInterval
の引数の200
となっている箇所の数値を調整してください。
デフォルトでは、200ms = 0.2秒ごとに発生するように設定しています。
この数値を大きくすれば発生間隔が長くなる = キラキラの数が少なくなり、反対に数値を小さくすればするほどたくさんのキラキラが生成されるようになります。
アニメーションの持続時間を変える
キラキラが発生してから消えるまでの時間を指定するには、CSSとJavaScript両方に変更を加える必要があります。
.star {
animation: glitter 1s;
}
setTimeout(() => {
starEl.remove();
}, 1000);
CSSでアニメーションの実行時間を指定できるので、1s
の部分の数値を調整してください。
この時、JavaScriptの該当箇所にも同じ数値を指定する必要があります。
もしanimation
の持続時間を2s
にするなら、JavaScriptには2000
を指定してください。
こうすることで、アニメーションが最後まで完了してからキラキラを削除することができます。
キラキラの色を変える
キラキラの色を変えたい場合は、svgファイルを編集します。
まだキラキラの画像をダウンロードしていない場合は、以下のリンクからダウンロードしてください。
star.svg
ファイルをエディタで開くと、以下のようなコードが記述されています。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 101.154 101.154"><defs><style>.star-svg{fill:#6cc7f4;}</style></defs><path class="star-svg" d="M50.577,0l4.458,13.179A52.549,52.549,0,0,0,87.976,46.12l13.178,4.457L87.976,55.035A52.545,52.545,0,0,0,55.035,87.976l-4.458,13.178L46.12,87.976A52.549,52.549,0,0,0,13.179,55.035L0,50.577,13.179,46.12A52.554,52.554,0,0,0,46.12,13.179Z"/></svg>
このコード内の以下の箇所に、好きなカラーコードを記入してください。
<style>.star-svg{fill:#6cc7f4;}</style>
#6cc7f4
となっている箇所に色を記入してファイルを保存すると、キラキラの色を変更することが可能です。
【まとめ】ボタンをホバーするとキラキラが発生するアニメーションを実装する方法
ボタンにマウスカーソルを当てると、キラキラがランダムに発生するアニメーションを実装してみました。
「ボタンにホバーアニメーションをつけたい」という方は、ぜひ今回紹介したアニメーションを実装してみてください。
コメント
コメント一覧 (4件)
とても素敵でかわいいエフェクトで気に入っています。
この例はホバー時にエフェクトがでますが、マウスのアクションなどなく最初からエフェクトがかかった状態にすることは可能でしょうか?
ありがとうございます!
JSを以下に入れ替えると動くと思うので、試していただけますか?
// js-glitterクラスがついた要素を全て取得
const glitterEls = document.querySelectorAll(".js-glitter");
// 取得した要素をArrayに変換
const glitterElsArr = Array.prototype.slice.call(glitterEls);
// キラキラを生成する関数
const createStar = (el) => {
const starEl = document.createElement("span");
starEl.className = "star";
starEl.style.left = Math.random() * el.clientWidth + "px";
starEl.style.top = Math.random() * el.clientHeight + "px";
el.appendChild(starEl);
// 一定時間経つとキラキラを消す
setTimeout(() => {
starEl.remove();
}, 1000);
};
// 取得した要素ひとつひとつに処理を行う
glitterElsArr.forEach((glitterEl) => {
setInterval(createStar.bind(undefined, glitterEl), 200);
});
Tatsuyaさま
コメントのご返信がとても早くて驚きました・・・!
そして教えていただいたコードでキラキラさせることができました!
とっても嬉しいです♡
本当にありがとうございます・・・!
よかったです!こちらこそブログ参考にしてくださりありがとうございます!