CSSで作るホバーで円が展開するアニメーションボタン

ホバー

CSSで作るホバーで円が展開するアニメーションボタン

投稿日2026/01/31

更新日2026/1/27

ボタンのホバー演出は、UI全体の印象を大きく左右します。
ただ色が変わるだけではなく、「どう動くか」によって質感や完成度が伝わります。

本デモでは、CSSとSVGのみを使用し、円形が広がりながら切り替わるボタン表現を実装しました。
JavaScriptを使わず、軽量で扱いやすい構成を意識しています。

Preview プレビュー

Code コード

<div class="kumonosu-wrapper">
    <a href="#" class="kumonosu-btn-more">
        <span class="kumonosu-btn-more__txt">BUTTON</span>
        <span class="kumonosu-btn-more__ico">
            <svg viewBox="0 0 52 52">
                <circle class="kumonosu-btn-more__bg" cx="26" cy="26" r="30" />
                <circle class="kumonosu-btn-more__circle-dashed" cx="26" cy="26" r="25" />
                <circle class="kumonosu-btn-more__circle-solid" cx="26" cy="26" r="25" />
                <g transform="translate(19, 19)">
                    <path class="kumonosu-btn-more__arrow-path" d="M2 12L12 2M12 2H6M12 2V8" />
                </g>
            </svg>
        </span>
    </a>
</div>
:root {
    --text-color: #2b2b2b;
    --circle-border: #2b2b2b;
    --hover-bg: #ffd6d6;
    --arrow-color: #2b2b2b;
}
body {
    margin: 0;
}
.kumonosu-wrapper {
    background-color: #f7f4ef;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    font-family: "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN", "Hiragino Sans", sans-serif;
}
.kumonosu-btn-more {
    display: inline-flex;
    align-items: center;
    text-decoration: none;
    color: var(--text-color);
    font-weight: 600;
    font-size: 16px;
    position: relative;
    padding: 10px 0;
}
.kumonosu-btn-more__txt {
    position: relative;
    z-index: 2;
    margin-right: 15px;
    letter-spacing: 0.05em;
}
.kumonosu-btn-more__ico {
    position: relative;
    z-index: 1;
    width: 52px;
    height: 52px;
    overflow: visible;
}
.kumonosu-btn-more__ico svg {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    overflow: visible;
}
.kumonosu-btn-more__circle-dashed {
    fill: none;
    stroke: var(--circle-border);
    stroke-width: 1;
    stroke-dasharray: 1.5 3.5;
    transition: opacity 0.2s ease;
}
.kumonosu-btn-more__bg {
    fill: var(--hover-bg);
    opacity: 0;
    transform: scale(0.5);
    transform-origin: 26px 26px;
    transition: opacity 0.2s ease, transform 0.5s cubic-bezier(0.15, 0.85, 0.35, 1.15);
}
.kumonosu-btn-more__circle-solid {
    fill: none;
    stroke: var(--circle-border);
    stroke-width: 1.2;
    stroke-dasharray: 160;
    stroke-dashoffset: 160;
    transform: rotate(-90deg);
    transform-origin: 26px 26px;
    transition: stroke-dashoffset 0.6s cubic-bezier(0.2, 1, 0.2, 1);
}
.kumonosu-btn-more__arrow-path {
    fill: none;
    stroke: var(--arrow-color);
    stroke-width: 1.6;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.kumonosu-btn-more:hover .kumonosu-btn-more__circle-dashed {
    opacity: 0;
}
.kumonosu-btn-more:hover .kumonosu-btn-more__bg {
    opacity: 1;
    transform: scale(1.5);
}
.kumonosu-btn-more:hover .kumonosu-btn-more__circle-solid {
    stroke-dashoffset: 0;
}
.kumonosu-btn-more:active {
    opacity: 0.8;
}

Explanation 詳しい説明

仕様

このボタンは、HTMLとCSS、SVGのみで構成されています。
テキスト部分とアイコン部分を分離し、アイコン側にSVGを配置することで、アニメーションの制御を明確にしています。

SVG内では、破線の円、実線の円、背景用の円を重ね、それぞれに異なるアニメーションを適用しています。

アニメーションの仕組み

ホバー時には、以下の変化が同時に発生します。

  • 破線の円がフェードアウト
  • 背景の円がスケールアップしながら表示
  • 実線の円がストロークアニメーションで描画される

これらを組み合わせることで、円が奥から手前に展開してくるような印象を作っています。

SVGの stroke-dasharraystroke-dashoffset を使うことで、線が描かれていく動きをCSSだけで実現しています。

カスタマイズ

CSSの変数とスタイルを調整することで、見た目を変更できます。

  • 文字色・線色
    --text-color--circle-border--arrow-color を変更すると、全体の配色を簡単に切り替えられます。
  • ホバー時の背景色
    --hover-bg を変更することで、円が広がる際の色を調整できます。
  • サイズ感
    SVGのサイズや円の半径を変更することで、ボタン全体の大きさを調整できます。
  • アニメーション速度
    transition の時間やイージングを変更すると、動きのキレや柔らかさを調整できます。

注意点

SVGを使用しているため、アイコンサイズや拡大率を大きく変更する場合は、円の中心位置や半径の再調整が必要になります。

また、ホバー前提の演出のため、タッチデバイスではhoverの代替としてfocusactive状態への対応を検討すると安心です。

まとめ

CSSとSVGを組み合わせることで、JavaScriptを使わなくても質感のあるボタン表現が可能です。

円形の展開とストロークアニメーションを活かした本実装は、シンプルながら印象に残るUIを作りたい場面に向いています。