この発想はすごい! モダンCSSで実装する、ボーダーをアニメーションさせるテクニック
Post on:2022年8月9日
モダンCSSで実装する、ボーダーをアニメーションさせるテクニックを紹介します。矩形のHTMLはdiv
要素1つだけ、ボーダーがどのようにアニメーション化されているのか、その仕組みが視覚的に分かるデモもあります。
CSS border animations
by Bramus
下記は各ポイントを意訳したものです。
※元サイト様のライセンスにもとづいて翻訳しています。
はじめに
ボーダーをアニメーションさせるCSSのテクニックを紹介します。
ボーダーをアニメーションさせる仕組み
CSSにおけるボーダーの設定
CSSで要素にボーダーを実装するには、border
, outline
, box-shadow
の3つのプロパティがあります。Modern CSS Solutionsで詳しく説明されているように、それぞれのプロパティ、特にボーダーをアニメーション化する場合は利点と欠点があります。
CSSのborder
プロパティを使用しない主な理由は、このアニメーション化によるものです。
See the Pen
Animating outlines by Kevin (@kevinpowell)
on CodePen.
outline-offset
を使用したボーダーのアニメーション
最近、私が注目した記事はFantastic CSS border animationで、著者のCocoはさらなるオプションを探りました。::before
と::after
を使用して生成されたコンテンツを挿入することで擬似的なボーダーを作成し、それをアニメーション化しています。
私が最も注目したのは、この記事で使用されているビジュアルによる解説です。これは、そのエフェクトを得るために何が行われているかを理解するのに非常に役立ちます。
See the Pen
Rotating border by Chokcoco (@Chokcoco)
on CodePen.
疑似要素によるボーダーのアニメーションの仕組み
白いレイヤーと色のついた線は、どちらも生成されたコンテンツです。白いレイヤーをフェードインおよびアウトさせることで、それらがどのように重なり、どのようにアニメーションするのかが視覚的に理解できると思います。
ボックスモデルの保持
疑似要素によって生成されたコンテンツでボーダーを実装するときの欠点は、壊れたボックスモデルになってしまうことです。ボーダーは下に描画されているため、コンテンツが偽のボーダーを覆い隠す可能性があります。これを回避するにはborder-width
をpadding
として適用します。
真のボーダーを作成し、ボックスモデルの機能を維持するには、複数の背景を使用して、ボーダーのエリアまで引き伸ばします。
基本となるCSS
まずは、点線のボーダーを作成し、複数の背景を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* ボーダーのサイズ */ --border-size: 0.5rem; /* 点線のボーダーを作成 */ border: var(--border-size) dotted lime; /* 複数の背景を作成: 1. ホワイトの半透明 2. 色付きのボックスを含むレイヤー */ background-image: linear-gradient(to right, rgb(255 255 255 / 0.5), rgb(255 255 255 / 0.5)), conic-gradient( from 45deg, #d53e33 0deg 90deg, #fbb300 90deg 180deg, #377af5 180deg 270deg, #399953 270deg 360deg ) ; |
これで下記のようになります。
See the Pen
css-border-animations #1 by web.dev (@web-dot-dev)
on CodePen.
background-originで背景をサイズ調整
上記デモでは背景はボーダーに描画されていますが、conic-gradient
は間違っているように見えます。しかし、これは意図された動作です。デフォルトでは背景画像は要素のpadding-box
であるため、ボーダーに描画されません。つまり、ボーダーを作成するために、設定された背景画像はボーダー自体で繰り返され、奇妙な視覚効果が得られます。
この問題を解決するには、ボーダーのサイズを占めるように背景を引き伸ばす必要があります。背景を引き伸ばして再配置することで手動でもできますが、background-origin
プロパティを使用してborder-box
に対して背景のサイズを調整するのが最もよい方法です。
これはよろしくない例です。
1 2 3 |
/* 手動で調整する方法 */ background-position: calc(var(--border-size) * -1) calc(var(--border-size) * -1); background-size: calc(var(--border-size) * 2 + 100%) calc(var(--border-size) * 2 + 100%); |
こちらのCSSがベストです。
1 |
background-origin: border-box; |
このCSSを追加することで、すべての見栄えが大幅に向上します。
See the Pen
css-border-animations #2 by web.dev (@web-dot-dev)
on CodePen.
background-clipで白い背景レイヤーを縮小
これで背景がすべてのスペースを占めるようになったので、半透明のレイヤーを再び縮小する必要があります。それにはbackground-size
を調整するよりも、簡単な簡単があります。background-clip
を使用してpadding-box
に設定します。そうすれば、背景がボーダーの下に描画されることはなくなります。
CSSは、下記の通りです。
1 2 3 4 |
background-clip: padding-box, /* padding-boxに白い半透明をクリップ */ border-box /* border-boxに色付きのボックスをクリップ (デフォルト)*/ ; |
これで下記のようになります。
See the Pen
css-border-animations #3 (background-clip comparison) by web.dev (@web-dot-dev)
on CodePen.
最後に、ボーダーを透明にしてエフェクトを最大限に引き出します。
1 |
border: 0.3rem dotted transparent; |
See the Pen
css-border-animations #4 by web.dev (@web-dot-dev)
on CodePen.
アニメーションの設定
ボーダーのアニメーションを設定するには、conic-gradient
の開始角度を設定します。
1 2 3 4 5 6 7 8 |
--angle: 0deg; conic-gradient( from var(--angle), #d53e33 0deg 90deg, #fbb300 90deg 180deg, #377af5 180deg 270deg, #399953 270deg 360deg ); |
@property
のおかげで、このプロパティをサポートするブラウザに対して簡単に使用できるようになりました。
1 2 3 4 5 6 7 8 9 10 11 |
@property --angle { syntax: "<angle>"; initial-value: 0deg; inherits: false; } @keyframes rotate { to { --angle: 360deg; } } |
ここまでのCSSを全部組み合わせると、下記のようになります。
See the Pen
css-border-animations #5 (animation) by web.dev (@web-dot-dev)
on CodePen.
ボーナスコンテンツ: border-image
以前、グラデーションのボーダーを描画する方法として、CSSのborder-image
を使用する方法を解説しました。
CSSのconic-gradient()関数を使用した美しいグラデーションの実装方法
※当ブログで翻訳しました。
背景の重なりを処理する必要がないため、CSSのコードをより単純化できます。アニメーションも同じ方法で適用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* ボーダーを作成 */ border: 0.5rem solid transparent; /* ボーダーに画像を描画 */ border-image: conic-gradient( from var(--angle), #d53e33 0deg 90deg, #fbb300 90deg 180deg, #377af5 180deg 270deg, #399953 270deg 360deg ) 1 ; |
このデモでは、border-image
を使用した本物のボーダーと背景、そして最後にHoudiniを使用したアニメーションを解説しています。
See the Pen
css-border-animations #6 (border-image) by web.dev (@web-dot-dev)
on CodePen.
ただし、この実装では機能しないことがいくつかあります
border-image
はborder-radius
に従わず、常に矩形です。border-image-slice
をfill
に設定すると、border-image
は設定された背景の下ではなく、上に描画されます。これは、背景を半透明にしたい場合には厄介です。
終わりに
CSSでボーダーをアニメーションさせる可能性は、たくさんあります。用途に応じて、あなたはどちらか一方に傾くかもしれません。
sponsors