背景を動かす

北の空

夕暮れ時の北の空。

@property

かつては、背景をアニメーションしようとすると、見える範囲を適当にクリップした上で、その後ろで大きめの背景を動かすしかなかった。 要は出来合いの絵の見える位置を変えるだけ。

例えばこんな感じ。

css

.smpl1 { background-image: radial-gradient( circle, #0000ff 25%, #000000 25% ); background-size: 200% 200%; animation: smpl1 10s linear infinite; } @keyframes smpl1 { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }

縦横それぞれ200%の大きさの背景の真ん中に background-image で勾配の無いグラデーション(?)で円を描いている。 で、その背景の位置を変えることで、円が動いているように見せている。

問題は、この円という形やその色を変えられないこと。 そのため css だけだと単純な動きしか見せられなくて、複雑なことをしようとすると JavaScript に頼らざるを得なかった。

それがいつの間にか @property なんてものが使えるようになっていて、位置、角度、色、等をかなり自由に変化させられるようになっていた。

折角なので、いくつか試してみる。

percentage

css

@property --pos-x { syntax: "<percentage>"; inherits: false; initial-value: 0%; } .smpl2 { background: radial-gradient( circle 200px at var( --pos-x ) 50%, #0000ff 50%, #000000 50% ); animation: smpl2 10s linear infinite; } @keyframes smpl2 { 0% { --pos-x: 0%; } 50% { --pos-x: 100%; } 100% { --pos-x: 0%; } }

横方向の位置をパーセント値で持つプロパティを定義し、その値を0%から100%まで、つまり端から端まで動かしている。

従来の例と一見同じだが、こちらは背景全体を動かすのではなく、背景内の円の描画位置を動かしているのだな。

angle

css

@property --deg-a { syntax: "<angle>"; inherits: false; initial-value: 0deg; } .smpl3 { background: conic-gradient( #0000ff var( --deg-a ), #000000 var( --deg-a ) ); animation: smpl3 5s linear infinite; } @keyframes smpl3 { 0% { --deg-a: 0deg; } 100% { --deg-a: 360deg; } }

角度の値を持つプロパティを定義し、その値を0度から360度まで変化させている。

color

css

@property --col-a { syntax: "<color>"; inherits: false; initial-value: #000000; } .smpl4 { background-color: var( --col-a ); animation: smpl4 5s linear infinite; } @keyframes smpl4 { 0% { --col-a: #000000; } 50% { --col-a: #0000ff; } 100% { --col-a: #000000; } }

色の値を持つプロパティを定義し、その値を黒から青に変化させている。

最後に

ここまで色々試しておいて言うのもどうかと思うが、俺はアニメーションでじわっと変わるよりも、スパッと切り替わる方が好きだったりする。