見出し画像

CSSだけで煌めく、キラキラサファイア💎

CSS のグラデーションは background: linear-gradient() で描きます。しかし、linear-gradient はアニメーションに対応してないので、つまらない!そこで、無理やりアニメーションさせる方法を研究した作品 "Sapphire" の紹介です。

Only CSS: Codevember #4 Sapphire

この作品で使われている CSS テクニックの一部を紹介します。コードは一部抜粋し、簡素化しています。

背景グラデーションのアニメーション🙅‍♂️

まず、誰もが引っかかりそうな、NGパターンです。animation プロパティで linear-gradient() を指定したら、動きそうな気がしますが...。

<!-- HTML -->

<div class="sapphire">
  <div class="cut"></div>
</div>
/* CSS */

.cut {
  animation: sapphireBlue 1s linear infinite alternate;
}

@keyframes sapphireBlue {
  0% {
    background: linear-gradient(0deg, #eee  0%, #fff  50%, #000  100%);
  }

  100% {
    background: linear-gradient(0deg, #000  0%, #eee  50%, #fff  100%);
  }
}

残念ながら、これは動きません。linear-gradient() は、animation プロパティに対応していないのです。

linear-gradient() は、アニメーション可能な background-color プロパティではなく、background-image プロパティに含まれます。つまり、グラデーション描画は画像として処理されているため、アニメーションできないのかもしれませんね。ともかく、別のアプローチを研究しました。

背景位置のアニメーション🙆‍♂️

background-image はダメでも、background-position プロパティならanimation に対応しています。この作品のポイント、色は変えられないものの、グラデーションを移動してアニメーションさせるテクニックです。

<!-- HTML -->

<div class="sapphire">
  <div class="cut"></div>
</div>
/* CSS */

.cut {
  background-image: linear-gradient(0deg, #000  0%, #fff  50%, #000  100%);
  background-size: 100% 200%;
  animation: sapphireBlue 1s linear infinite alternate;
}

@keyframes sapphireBlue {
  0% {
    background-position: 0% 0%;
  }

  100% {
    background-position: 0% 100%;
  }
}

background-size で背景グラデーションの高さを2倍にしています。そして、background-position には上下にスライドするように指定することで、グラデーションをアニメーションさせています。

宝石のカット

宝石らしいデザインに仕上げるため、三角形で切り抜き、宝石のカットラインを表現しています。三角形は border プロパティでも表現できますが、それでは背景グラデーションが使えません。背景を維持したいときは、clip-path で切り抜くテクニックです。

<!-- HTML -->

<div class="sapphire">
  <div class="cut"></div>
  <div class="cut"></div>
  <div class="cut"></div>
</div>
/* CSS */

.sapphire {
  clip-path: polygon(0% 25%, 100% 0%, 50% 100%);
}

.cut:nth-child(1) {
  clip-path: polygon(10% 20%, 80% 10%, 30% 90%);
}

.cut:nth-child(2) {
  clip-path: polygon(30% 10%, 50% 0%, 80% 100%);
}

.cut:nth-child(3) {
  clip-path: polygon(0% 10%, 30% 70%, 10% 80%);
}

clip-path: polygon() を使って、ランダムな三角形に切り抜きます。作品ではこのカットを60枚、適当に重ねています。仕上げに、親要素も三角形で切り抜いてデザインを整え、綺麗な宝石を表現しています。

煌めきに、もうひと工夫

グラデーションには、透明度を持った青と白を使っています。この白い部分は、光の反射を表現しています。アニメーション中に白い部分が重るとき、より白が目立ち、まるで光の反射のように錯覚するテクニックです。

<!-- HTML -->

<div class="sapphire">
  <div class="cut"></div>
</div>
/* CSS */

.cut {
  mix-blend-mode: color-dodge;
}

mix-blend-mode プロパティで color-dodge(覆い焼き)効果を適用しています。この効果は、白いところほど描画の色を明るくする効果があります。しかしこれは言葉では伝わりにくいので、実際に試してみるとよいでしょう。覆い焼きのほかにも、スクリーンや白黒など、様々なパターンがあります。ちなみに、Photoshop 経験者であれば、馴染み深いかもしれません。

作品名にある Codevember とは

11月は Codevember 月間。 11月になると毎日1テーマ、全30テーマを指定して作品を募る、コーダー向けのイベントです。Code + November というわけですね。日本では12月に行われることで有名なアドベントカレンダーの一種です。CodePen では2016年に始まりました。本記事の作品は、2017年の Codevember Day4 のテーマ "Sapphire" リストに載せた作品です。CSS だけでキラッキラなブルーサファイアを作ってみたい。そう思ったのでした。

画像2

職人技

宝石は、カットが命と言われています。精巧にカットされた面に光が反射して、とても美しい表情を見せますよね。このカットを CSS でどのように表現するかについて、深く考察しました。色、カタチ、光。宝石が醸し出すオーラ。ダイヤモンドに次ぐ硬度を誇るという、鉱物としての質感。頭の中でイメージを膨らませながら、宝石彫刻師になりきって丁寧にチューニングしました。

Only CSS: Colorful Jewelry

こちらは "Sapphire" の派生作品、"Colorful Jewelry" です。翌日、カラフルな宝石も作りたくなったのです。色数を増やし、しかし現れる色域は計算して絞っています。そのほか、カットの露出面積を増やすため、外枠を三角形から矩形に変更しました。かなり派手なデザインに仕上がりましたが、本家の "Sapphire" よりも多くのハートを獲得しています。みなさん、こちらの方がお好きのようですね(笑)。作品はインパクトも大切ですよね。

おわりに

Codevember や 技術系アドベントカレンダーなど、多くの人が一定のテーマに沿ってアウトプットしていくイベントに参加することは、とてもいい経験と思い出になります。気になるイベントがあれば、思い切って飛び込んでみましょう。とっても楽しいですよ!

ステータス

Only CSS: Codevember #4 Sapphire
https://codepen.io/YusukeNakaya/pen/RjQGzg

・作成日:2017年11月20日
・ハート:90 以上
・ページビュー:2,400 以上

Only CSS: Colorful Jewelry
https://codepen.io/YusukeNakaya/pen/BmYGON

・作成日:2017年11月20日
・ハート:140 以上
・ページビュー:3,600 以上


この記事が気に入ったらサポートをしてみませんか?