Hoverllin とは
hvr-fadeIn などのクラスを付けておくだけで、要素にホバーしたときにアニメーションが実行される、CSSのみのホバーアニメーションライブラリです。
特徴:
- CSS only — JavaScriptは不要
- transition ベース — FireShot問題が発生しない
@media (any-hover: hover)で制御 — タッチデバイスではホバーエフェクトが発火しない:where([href], [onclick])を使った詳細度ゼロ設計 — プロジェクト固有のCSSに詳細度で負けない[unhoverllin]属性 — 特定のセクション内でホバーエフェクトを無効化できる
基本的な使い方
1. ファイルを読み込む
<link rel="stylesheet" href="hoverllin.css">2. ホバーエフェクトをつけたい要素にクラスを付ける
<!-- 画像にホバーすると、下からテキストがフェードイン -->
<a href="#">
<img class="hvr-fadeInBottom" src="image.jpg" alt="" />
</a>注意: ホバーエフェクトは a[href] または [onclick] を持つ要素の子孫、あるいはそれら自体に付いた要素が対象です。クリッカブルなコンテキストでのみ発火します。
利用可能なエフェクト一覧
フェードイン系
ホバー前は非表示(opacity: 0)で、ホバー時にフェードインします。
| クラス名 | 効果 |
|---|---|
hvr-fadeIn | フェードイン |
hvr-fadeInBottom | 下から微動しながらフェードイン |
hvr-fadeInTop | 上から微動しながらフェードイン |
hvr-fadeInLeft | 左から微動しながらフェードイン |
hvr-fadeInRight | 右から微動しながらフェードイン |
<!-- 通常時は非表示、ホバーで表示 -->
<figure>
<img src="photo.jpg" alt="" />
<figcaption class="hvr-fadeInBottom">キャプションテキスト</figcaption>
</figure>背景色系(::before を使用)
ホバー時に要素の背後から背景色が出現します。
| クラス名 | 効果 |
|---|---|
hvr-bgFadeIn | 背景色がフェードイン |
hvr-bgInBottom | 背景色が下からスライドイン |
hvr-bgInLeft | 背景色が左からスライドイン |
hvr-bgOpenIn | 背景色が中央から広がる |
<!-- ホバーでボタンの背景色が広がる -->
<a href="#" class="hvr-bgOpenIn">ボタンテキスト</a>背景色は --hover-color CSS変数で上書きできます。
オーバーレイ系(::after を使用)
ホバー時に要素の上にオーバーレイが出現します。
| クラス名 | 効果 |
|---|---|
hvr-layFadeIn | オーバーレイがフェードイン |
hvr-layInBottom | オーバーレイが下からスライドイン |
hvr-layInLeft | オーバーレイが左からスライドイン |
hvr-layOpenIn | オーバーレイが中央から広がる |
幕消去系(::after を使用)
ホバー時に画像などを覆う暗い幕が消えます。通常時は幕がかかっており、ホバーで消えることで「選ばれた感」を演出します。
| クラス名 | 効果 |
|---|---|
hvr-coatFadeOut | 暗幕がフェードアウト |
hvr-coatOutTop | 暗幕が上方向へスケールアウト |
hvr-coatOutBottom | 暗幕が下方向へスケールアウト |
hvr-coatOutLeft | 暗幕が左方向へスケールアウト |
hvr-coatOutRight | 暗幕が右方向へスケールアウト |
<!-- 画像に暗幕がかかっており、ホバーで消える -->
<a href="#">
<figure class="hvr-coatOutBottom">
<img src="photo.jpg" alt="商品画像" />
</figure>
</a>ブラー消去系(::after + backdrop-filter を使用)
| クラス名 | 効果 |
|---|---|
hvr-blurFadeOut | ブラーオーバーレイがフェードアウト |
hvr-blurOutTop / Bottom / Left / Right | ブラーオーバーレイが各方向へスケールアウト |
テキスト押し出し系
ホバー時に別のテキストが押し出されて入れ替わります。
<a href="#" class="hvr-pushOutIn">
<rb>通常テキスト</rb>
<rt>ホバーテキスト</rt>
</a>rb が通常時のテキスト、rt がホバー時に現れるテキストです。
移動系
| クラス名 | 効果 |
|---|---|
hvr-moveToUp | ホバーで上に微動 |
hvr-moveToDown | ホバーで下に微動 |
hvr-moveToBack | ホバーで左に微動 |
hvr-moveToFore | ホバーで右に微動 |
<!-- ホバーで上に浮き上がる -->
<a href="#" class="hvr-moveToUp">もっと見る</a>スケール系
| クラス名 | 効果 |
|---|---|
hvr-grow | ホバーで拡大 |
hvr-shrink | 通常時は少し大きく、ホバーで元のサイズに戻る |
ドロップシャドウ
| クラス名 | 効果 |
|---|---|
hvr-shadowed | ホバーで輝度アップ+ドロップシャドウ |
フィルター Ness(ホバーでフィルターがかかる)
| クラス名 | 効果 |
|---|---|
hvr-brightness | ホバーで明るくなる |
hvr-darkness | ホバーで暗くなる |
hvr-whiteness | ホバーで白飛び |
hvr-blackness | ホバーで黒くなる |
hvr-contrastness | ホバーでコントラスト強調 |
hvr-saturateness | ホバーで彩度アップ |
フィルター Less(通常時にフィルターがかかり、ホバーで解除)
| クラス名 | 効果 |
|---|---|
hvr-grayless | 通常時グレースケール、ホバーでカラーに |
hvr-blurless | 通常時ブラー、ホバーでクリアに |
hvr-brightless | 通常時明るく、ホバーで通常に |
hvr-darkless | 通常時暗く、ホバーで通常に |
<!-- 通常はグレースケール、ホバーでカラーに -->
<a href="#">
<img class="hvr-grayless" src="logo.png" alt="" />
</a>hvr-grayless は特にロゴ一覧やパートナー企業のロゴでよく使います。
backdrop-filter 系
::after に backdrop-filter を適用するため、要素が半透明・ブラー等の場合でも効果が出ます。
| クラス名 | 効果 |
|---|---|
hvr-bdfGrayless | 通常時グレースケール(backdrop-filter版) |
hvr-bdfBlurless | 通常時ブラー(backdrop-filter版) |
hvr-bdfBrightness | ホバーで明るくなる(backdrop-filter版) |
hvr-bdfDarkness | ホバーで暗くなる(backdrop-filter版) |
ホバーエフェクトを無効化する([unhoverllin])
祖先要素に unhoverllin 属性を付けると、その配下のホバーエフェクトを無効化できます。
<!-- このセクション内はホバーエフェクトなし -->
<section unhoverllin>
<a href="#">
<img class="hvr-grayless" src="photo.jpg" alt="" />
</a>
</section>[unhoverllin] を付けると、CSSの初期状態(opacity: 0 や filter: grayscale(1) 等)が解除され、要素が通常表示になります。ホバーしても何も起きません。
CSS変数によるカスタマイズ
| 変数名 | 用途 | デフォルト |
|---|---|---|
--hover-color | 背景色系・オーバーレイ系の色 | inherit |
/* セクション固有の色をセット */
.sect-xxx a {
--hover-color: hsl(220, 80%, 55%);
}技術的な背景:なぜ :where([href], [onclick]) を使うのか
ホバー状態のセレクタは以下のような形です:
@media (any-hover: hover) {
a:where([href], [onclick]):hover :is(.hvr-fadeIn, ...),
:is(.hvr-fadeIn, ...):where([href], [onclick]):hover {
opacity: 1;
transform: translate(0);
}
}:where() を使うことで詳細度がゼロになります。これにより、プロジェクト固有のCSSから詳細度で負けることがありません。
また @media (any-hover: hover) を使うことで、タッチデバイス(スマートフォン・タブレット)ではホバーエフェクトが発火しないようにしています。タッチデバイスでは「ホバー」という操作がないため、エフェクトが意図せず残ってしまうことを防ぐためです。

