Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【CSS】背景回転アニメーションを強引に実現する方法

f:id:little_strange:20211030233129p:plain

 

 どうも!LSSです!!

 

CSSのキーフレームアニメーションは、「要素」を滑らかに変化させる事ができます。
※ここでいう「要素」はHTMLを構成する<div>などのタグによる領域を指します。

 

「要素」の変化の対象となるCSSプロパティはかなり多くのものが対応しています。

例えば「要素」のうちの「背景」についても、background-positionを変化させる事で表示位置を滑らかに移動させたり、background-sizeを変化させる事で大きさを滑らかに変化させる事ができます。

 

が、このbackground-系のプロパティに「角度」を指定するプロパティが無いんですね。

背景に画像ではなくグラデーションを指定する、 linear-gradient や conic-garadient という関数の中には 表示角度を指定する箇所がありますが、それらはアニメーションの「滑らかな変化」には対応していません。

 

今回は、その「できないはずの背景回転アニメーションを強引に実現する」方法を思いついたので、試してみました^^

 

 

背景回転アニメーション

 
ネオンのよう?
それとも立体的な折り紙のよう?

 

 

コード

<style>
@keyframes bgcnca{
0%{transform:rotate(0deg);}
100%{transform:rotate(360deg);}
}
.bgcnc{
position:relative;
width:300px;
height:200px;
overflow:hidden;
}
.ibgcnc{
position:absolute;
top:-150px;
left:-100px;
width:500px;
height:500px;
background-image:repeating-conic-gradient(#ccffcc,#000000,#ffcccc,#000000,#ccccff,#000000,#ccffcc 120deg);
animation:bgcnca 15s linear 0s infinite;
}
.i2bgcnc{
position:relative;
padding:0.6em;
color:white;
text-shadow:1px 1px 0px black;
}
</style>
<div class="bgcnc">
<div class="ibgcnc"> </div>
<div class="i2bgcnc">ここに文章を書く</div>
</div>

 

 

強引に実現した方法

「背景画像」を回転アニメーションさせる事はできません。が、
transform:rotate(角度);
によって、「要素」を回転アニメーションさせる事はできます。

 

となると、「要素」の下に「要素(背景用)」を配置して、「要素(背景用)」をtransform:rotateさせれば、見た目は「背景回転アニメーション」が実現できます^^

 

まず、HTMLのほうでは、

<div class="bgcnc">
<div class="ibgcnc"> </div>
<div class="i2bgcnc">ここに文章を書く</div>
</div>

とし、「bgcnc」というクラス名を持つdivの中に、「ibgcnc」「i2bgcnc」という2つのdivを入れました。

この「ibgcnc」を「要素(背景用)」として使用し、その上に表示したいものは「i2bgcnc」の中に書く事にします。

 

大枠である、「bgcnc」は、

.bgcnc{
position:relative;
width:300px;
height:200px;
overflow:hidden;
}

としました。

position:relatve;は文脈の流れ上に普通に配置するposition指定、幅300px、高さ200pxとサイズを決め、 overflow:hidden; で「サイズからはみ出した部分は表示しない」と指定しています。

 

次に、「要素(背景用)」である、「ibgcnc」については、

.ibgcnc{
position:absolute;
top:-150px;
left:-100px;
width:500px;
height:500px;
background-image:repeating-conic-gradient(#ccffcc,#000000,#ffcccc,#000000,#ccccff,#000000,#ccffcc 120deg);
animation:bgcnca 15s linear 0s infinite;
}

としました。

幅・高さともに余裕を持たせて500px(回転しても大枠からはみでない大きさ)とし、position:absolute; によって「大枠の中での絶対位置指定」にしています。

top:-150px; left:-100px; と、上下左右位置を調節して、「幅300pxに対して500pxのものを-100pxの位置、高さ200pxに対して500pxのものを-150pxの位置」とする事で、中央を合わせています。

 

背景は、
background-image:repeating-conic-gradient(#ccffcc,#000000,#ffcccc,#000000,#ccccff,#000000,#ccffcc 120deg);
と、最近その存在を知ったconic-gradientを使ってみました^^

「背景回転アニメーション」としては、他に画像ファイルであってもlinear-gradientに変えてもOKな部分です。

 

そして、 animation:bgcnca 15s linear 0s infinite; でこの要素を回転させるキーフレームを呼び出しています。(再生時間15秒、infinite=無限繰り返し)

呼び出しているアニメーションはシンプルで、

@keyframes bgcnca{
0%{transform:rotate(0deg);}
100%{transform:rotate(360deg);}
}

「要素」の角度を「0度」から「360度」に徐々に変化させる=滑らかに回転する、というものですね。

 

最後に、その背景の上に表示する文字の部分は、

.i2bgcnc{
position:relative;
padding:0.6em;
color:white;
text-shadow:1px 1px 0px black;
}

としています。

この「position:relative;」は、入れておかないとposition:absolute;指定した背景用要素の方が前面に来てしまうので書いています。

 

あとは単に見た目の調整で、

padding:0.6em; 内側の余白0.6文字分
color:white; 文字色は白
text-shadow:1px 1px 0px black; 読みやすいように黒の影つき

としました。

 

 

おまけ

記事冒頭で少し触れた「background-size」と「background-position」の背景アニメーションサンプルとコード、書いてみるとこんな感じです。

 

background-sizeのアニメーション

 

コード

<style>
@keyframes bgsimple1a{
0%{background-size:40px 40px;}
100%{background-size:100px 100px;}
}
.bgsimple1{
width:300px;
height:200px;
padding:0.6em;
background-image:radial-gradient(circle at 50% 50%,#ccffccff 10%,#ccffcc00 30%);
border-radius:10px;
border:1px solid black;
animation:bgsimple1a 10s linear 0s infinite alternate;
}
</style>
<div class="bgsimple1">background-sizeのアニメーション</div>

 

 

background-positionのアニメーション

 

コード

<style>
@keyframes bgsimple2a{
0%{background-position:0px 0px;}
100%{background-position:0px 200px;}
}
.bgsimple2{
width:300px;
height:200px;
padding:0.6em;
background-image:linear-gradient(15deg,#ccffccff,#ccffcc00,#ccffccff);
background-size:300px 20px;
border-radius:10px;
border:1px solid black;
animation:bgsimple2a 10s linear 0s infinite;
}
</style>
<div class="bgsimple2">background-positionのアニメーション</div>

 

それぞれ、divタグの二重化もせずに済み、クラスも1つで済みますね^^

 

 

あとがき

背景にまつわる指定に、positionとsizeがあって回転が無いのが不足なのか、要素に対するtransformプロパティが充実しすぎているのか、需要がありそうで実装されていない「背景回転アニメーション」を考えてみました。

ググると同様のネタは見つかりますがw

 

もし、将来的に対応プロパティが実装されるとしたら…
background-rotate:30deg;
または
background-transforom:rotate(30deg);
みたいな感じかな?と妄想してみたり。(※ありません)

 

 

 

ってなとこで、今回はこのへんで!

次回もまた、よろしくお願いします^^