- Web制作
- グラデーションを使ったホバーアニメーションを設定する
グラデーションを使ったホバーアニメーションを設定する

ボタンタグにホバーしたときに、アニメーションを使って色を変化させるサンプルを作ってみました。
サンプルページを見てもらうとわかると思いますが、ボタンタグにホバーすると、アニメーションで色が変化します。そして、その色が、左上を起点にしたグラデーションになっています。

グラデーションもアニメーションも、単独で使う分には難しくないのですが、同時に行うとなると少し工夫が必要になるので、もしよければ、参考にしてください。
プロパティの確認
使用するプロパティに関して、グラデーションの配色にする際には、「background-color」ではなく「background-image」を使います。ですが、この「background-image」では、アニメーションで色を変化させることができません。また、現在のCSSグラデーションは、色が変化する起点を自由に決めることができません(ですよね?)。
そこで、今回のサンプルでは、グラデーションを設定した擬似要素を任意の位置に配置し、opacityを使ってアニメーションを設定させています。
ボタンタグの設定
まず、基本となるボタンタグの設定です。ここでは、特に難しい設定は行っていません。
<div class="box">
<button class="button">button sample</button>
</div>
.box{
width: 400px;
height: 400px;
margin: 30px auto;
display: flex;
justify-content: center;
align-items: center;
background-color: #CCC;
}
.button{
width: 160px;
padding: 16px;
background-color: hsl(173, 80%, 80%);
box-shadow: 0 0 10px #b6b6b6;
border: none;
border-radius: 9999px;
cursor: pointer;
}
擬似要素を使ってグラデーションの表現
次に、擬似要素を使って、ホバーしたときのグラデーションを作成します。
まず、beforeを使って、大きめの円を作成します。グラデーションを使うときは、大きめのグラデーションで設定した方が、よく馴染むと思います。

.box{
width: 400px;
height: 400px;
margin: 30px auto;
display: flex;
justify-content: center;
align-items: center;
background-color: #CCC;
}
.button{
width: 160px;
padding: 16px;
background-color: hsl(173, 80%, 80%);
box-shadow: 0 0 10px #b6b6b6;
border: none;
border-radius: 9999px;
cursor: pointer;
position: relative;
}
.button::before{
position: absolute;
background: radial-gradient(circle, hsl(0, 0%, 100%) 0%,
hsl(173, 80%, 80%) 80%, hsl(173, 80%, 80%) 100%);
width: 120px;
height: 120px;
border-radius: 9999px;
top: -60px;
left: -30px;
content: "";
}
そして、ボタンタグを親として、擬似要素をpositionを使って移動させます。今回は、左上付近に移動させていますが、もちろん、他の自由な場所に設定することができます。場所を固定できたら、ボタンタグに「overflow:hidden」を設定し、はみ出した部分を非表示にます。

.box{
width: 400px;
height: 400px;
margin: 30px auto;
display: flex;
justify-content: center;
align-items: center;
background-color: #CCC;
}
.button{
width: 160px;
padding: 16px;
background-color: hsl(173, 80%, 80%);
box-shadow: 0 0 10px #b6b6b6;
border: none;
border-radius: 9999px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.button::before{
position: absolute;
background: radial-gradient(circle, hsl(0, 0%, 100%) 0%,
hsl(173, 80%, 80%) 80%, hsl(173, 80%, 80%) 100%);
width: 120px;
height: 120px;
border-radius: 9999px;
top: -60px;
left: -30px;
content: "";
}
.button span{
position: relative;
}
opacityを使ってアニメーション
最後に、ホバーしたときにアニメーションを設定します。
先ほどふれたように、background-imageでは、アニメーションの設定ができません。そこで、今回は、擬似要素に対してopacityを使ったアニメーションを設定します。
※このopacityを使ったやり方については、こちらのサイトを参考にさせてもらいました。
【CSS】backgroundのlinear-gradientでtransitionが効かない時の対処法 – じゅんぺいブログ
.box{
width: 400px;
height: 400px;
margin: 30px auto;
display: flex;
justify-content: center;
align-items: center;
background-color: #CCC;
}
.button{
width: 160px;
padding: 16px;
background-color: hsl(173, 80%, 80%);
box-shadow: 0 0 10px #b6b6b6;
border: none;
border-radius: 9999px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: all .8s;
}
.button:hover{
box-shadow: 0 0 12px #b6b6b6, 0 0 12px #b6b6b6, 0 0 12px #b6b6b6;
}
.button::before{
position: absolute;
background: radial-gradient(circle, hsl(0, 0%, 100%) 0%,
hsl(173, 80%, 80%) 80%, hsl(173, 80%, 80%) 100%);
width: 120px;
height: 120px;
border-radius: 9999px;
top: -60px;
left: -30px;
content: "";
opacity: 0;
transition: all .8s;
}
.button:hover::before{
opacity: 1;
}
.button span{
position: relative;
}
とはいっても、設定は簡単で、初期状態を「opacity:0」にしておいて、ホバーしたときに「opacity:1」にするだけです。