CSSのrandom()関数でつくる、不規則なデザイン表現

はてなブックマークへ投稿
Xへポスト
URLをコピー
共有

CSSのrandom()関数を使うと、CSSだけでランダムな値を扱えるようになります。random()関数は、Safari 26.2から利用できる新しい関数です。要素ごとのサイズや角度、アニメーションの開始タイミングなどに自然なばらつきを加えられます。

従来、同じような表現を実装するには、:nth-child()で値を個別に指定したり、sibling-index()関数で並び順から計算したり、JavaScriptのMath.random()で値を渡したりする必要がありました。random()関数を使えば、「角度は0〜1turn」「animation-delayは0〜600ms」のように、ばらつかせたい範囲をCSSへそのまま記述できます。

この記事では、random()関数を使ってどんな表現ができるのかを紹介します。

※注意:本記事のデモは、Safari 26.2以上でご覧ください。

random()関数の基本

random()関数は、指定した範囲からランダムな値を返します。CSSの値として記述するため、長さや角度、時間、割合など、プロパティに応じた単位をそのまま扱えます。

以下の例では、100pxから300pxまでの範囲から値が選ばれます。同じスタイルを複数の要素に適用した場合も、それぞれの要素で異なる値になります。

.box {
  width: random(100px, 300px);
}

第3引数には、値を選ぶ間隔を指定できます。

.box {
  width: random(100px, 300px, 50px);
}

この例では、選ばれる値は100px、150px、200px、250px、300pxのいずれかです。細かい連続値ではなく、一定の間隔でばらつかせたいときに便利です。

デモ1:いいねボタンをrandom()で作り直す

過去記事『UI改善にキラリと役立つ! SVGアニメーションの作り方まとめ』で、ハートをクリックすると周囲へパーティクルが飛び出す「いいねボタン」の作り方を紹介しました。この表現をrandom()関数で作り直してみます。

パーティクルが毎回少し違う方向へ飛ぶようにすると、クリック時の演出に自然なばらつきが生まれます。今回のデモでは、粒子ごとに変えたい値をCSSのカスタムプロパティとして定義しています。

ランダムにしているのは、以下の値です。

  • 飛ぶ方向
  • 飛距離
  • アニメーションの再生時間
  • 開始タイミング
  • 色
.particle {
  /* 粒子の飛ぶ方向をランダムにする */
  --particle-angle: random(0turn, 1turn);
  transform: rotate(var(--particle-angle));

  circle {
    --particle-distance: random(220px, 290px);
    --particle-duration: random(1200ms, 1800ms);
    --particle-delay: random(0ms, 160ms);

    /* 色相・彩度・明度をランダムにして、毎回違う配色にする */
    fill: hsl(
      random(145deg, 335deg) random(55%, 85%)
        random(68%, 82%)
    );
  }
}

.is-playing {
  .particle {
    circle {
      /* 再生時間・開始タイミングを粒子ごとに変える */
      animation: particle var(--particle-duration) ease-out
        var(--particle-delay) forwards;
    }
  }
}

@keyframes particle {
  0%,
  25% {
    opacity: 0;
    transform: translateX(130px);
  }

  30%,
  85% {
    opacity: 1;
  }

  100% {
    opacity: 0;
    /* 飛距離を粒子ごとに変える */
    transform: translateX(var(--particle-distance));
  }
}

random()で決まった値はその要素があるあいだ変わらないため、デモではJavaScriptで粒子の要素を作り直しています。

デモ1では、ばらつかせたい値をCSS上で分けて管理しています。「どの値をどの範囲でランダムにしているか」が読み取りやすくなりますね。

過去記事の実装コードと見比べてみてください。角度や移動先を計算していた部分をrandom()関数に置き換えることで、値の意図がCSSから読み取りやすくなりました。

デモ2:ホバーアニメーションのタイミングを文字ごとにランダムにする

ホバーしたときに、文字の色が文字ごとにずれたタイミングで変わる演出も、random()関数なら手軽に実装できます。文字ごとのanimation-delayをばらつかせることで、同じアニメーションでも自然なタイミングのずれを作れます。

デモ2では、ホバー時のanimation-delayにrandom()関数を指定しています。各文字に同じCSSを適用していても、文字ごとに異なる遅延時間が選ばれます。

.headline {
  &:hover {
    .char {
      /* 文字ごとに違う animation-delay を割り当てる */
      animation: flash 500ms ease random(0ms, 600ms);
    }
  }
}

@keyframes flash {
  50% {
    color: #7c71f6;
  }
}

デモ3:星空の位置・大きさ・またたきをランダムにする

星空のように、もともと不規則であるほうが自然に見える装飾では、random()関数がとくに効果的です。リロードするたびに、位置や大きさ、またたき方の違う星空を表示できます。

以下のコードでは、ひとつの.starクラスに対して、位置、大きさ、光の強さ、またたきの再生時間、開始タイミングを指定しています。

.sky {
  .star {
    position: absolute;
    /* 位置・大きさ・発光の強さを星ごとに変える */
    left: random(2%, 98%);
    top: random(3%, 96%);
    width: random(2px, 7px);
    aspect-ratio: 1;
    background: #fff;
    border-radius: 50%;
    box-shadow: 0 0 random(8px, 28px) rgb(184 176 255 / 95%);
    opacity: 0.18;
    animation: twinkle random(600ms, 1.8s) ease-in-out
      random(-1.8s, 0s) infinite alternate;
  }
}

@keyframes twinkle {
  to {
    opacity: 1;
    transform: scale(2.1);
  }
}

random()関数はどんな場面で使うとよい?

random()関数は、情報そのものではなく、見た目の揺らぎを作る場面に向いています。たとえば、背景に散る紙吹雪や花びら、泡、粒子、動物の足跡など、同じ形が規則正しく並ぶと不自然に見える装飾です。

装飾や演出では、次のような値を少しずつ変えると自然な印象を作れます。

  • 位置
  • 角度
  • サイズ
  • 透明度
  • 移動距離
  • アニメーションの再生時間
  • アニメーションの開始タイミング

一方で、読む順番や操作のしやすさに関わる値へ使うと、ユーザーが内容を理解しにくくなる場合があります。たとえば、記事一覧の並び順が毎回変わると、目的の記事を探しにくくなります。本文やメイン画像のサイズが変わると、行の折り返しや余白が安定せず、読みづらさにつながります。購入、送信、削除のような重要な操作に関わるボタンの位置や色も、ランダムに変えるべきではありません。ユーザーが操作対象を見つけにくくなったり、誤操作につながったりするためです。

対応ブラウザ

CSSのrandom()関数は、Safari 26.2以上で利用可能です。

参照:Can I use…

まとめ

CSSのrandom()関数を使うと、値の範囲を指定するだけで、要素ごとに異なる値を設定できます。装飾やアニメーションにあえて不規則さを加えることで、均一な表現にはない、自然な動きやばらつきを作れます。

CSSだけで表現の幅を広げられるのは、うれしいですね!ぜひ、さまざまな表現に応用してみてください。

Google検索でICS MEDIAの記事を見つけやすくしよう

優先するソースに追加すると、GoogleのトップニュースやAI検索でICS MEDIAの記事が表示されやすくなります。

Googleで優先するソースとして追加
SNSでシェアしよう
シェアいただくと、サイト運営の励みになります!
はてなブックマークへ投稿
Xへポスト
URLをコピー
共有
岩間 日菜

フロントエンドエンジニア。学生時代はグラフィックデザインを専攻。読書と可愛いものが好きです。

この担当の記事一覧