グラデーションの背景をホバー時にアニメーションで変化させる!
問題の概要
・ボタンの実装でクライアントより、グラデーションの背景色をマウスホバー時にアニメーションでジワーッと変化させたいという要望がありました。
・単純にホバー時にbackgroundでグラデーションを変えてtransitionを入れただけではNGです。
背景画像は基本アニメーションできないからです。

元の画像

ホバー時の画像
■html
<div class="p-header__contact">
<a href="mailto:support@xxx.xxx" class="btn-contact">
<span class="btn-contact__text ">お問い合わせをする</span>
<div class="btn-arrow-icon btn-arrow-icon--cta">
<img src="./img/icon/arrow.png" alt="矢印アイコン" width="24" height="49"></div>
</a>
</div>
■scss(NG例)
.p-header__contact {
background:linear-gradient(88deg, #ED7600 4.32%, #F5AA01 96.92%);
color:#FFF;
border-radius: 48px;
transition: background 0.5s ease;
&:hover { background: (linear-gradient(90deg,#D45100 0%,#FFD83E 100%));
}
}
対策
疑似要素を利用して、ホバー時のグラデーションの背景色を被せて、opacity:0;からopacity:1;にトランジションさせることによってジワーッと変化させることができます。
■scssコード修正例
.p-header__contact {
position: relative;
overflow: hidden;
border-radius: 48px;
color: #fff;
/* ベースの背景 */
background-image: linear-gradient(88deg, #ED7600 4.32%, #F5AA01 96.92%);
/* 上に“濃いめ”のグラデをかぶせてフェード */
&::before {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
background-image: linear-gradient(90deg, #D45100 0%, #FFD83E 100%);
opacity: 0; /* 初期は非表示 */
transition: opacity 0.5s ease; /* ここが効く */
pointer-events: none;
}
&:hover::before {
opacity: 1; /* ジワッと切替 */
}
/* アンカーをボタン全面クリックに */
.btn-contact {
z-index: 1;
padding: 14px 28px;
}
}

