transform-style:変形可能要素が配置される空間の次元を切り替える

初期値 flat
適用対象 変形可能要素
継承 しない
アニメーション 離散値
対応ブラウザ caniuseで確認

transform-styleプロパティの説明

transform-styleは、変形可能要素が配置される空間の次元を切り替えます。このプロパティは、ボックスに含まれる子要素を平面に配置するか、三次元空間に配置するのかを定義するために親要素に指定します。

平面に配置された子要素は、座標変換が指定されていても立体的には表示されません。逆に三次元空間に配置されていても、座標変換が指定されていない要素は立体的になりません。

transform-styleに指定できる値

flat
子要素をボックスの平面に配置します。これが初期値です。
preserve-3d
子要素を三次元空間に配置します。

transform-styleの使い方とサンプル

transform-styleプロパティの構文は以下の通りです。

CSS
/* キーワード値 */
transform-style: flat;
transform-style: preserve-3d;

/* グローバル値 */
transform-style: inherit;
transform-style: initial;
transform-style: revert;
transform-style: unset;-style

transform-styleの実例

それでは実際にtransform-styleプロパティの書き方を見ていきましょう。以下の例は、transformプロパティを使って組み立てた立方体を、次元の異なる空間に配置した時の比較です。

二次元空間では、ボックスの変形が適用されているものの立体感が表現できないために、平面に張り付いて見えます。一方の三次元空間では、z軸の奥行きが利用できるために立体感のある表現が実現できています。

表示確認
CSS
.samp_box {
	padding: 1rem;
	background-color: #eee;
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 1rem;
}
.samp_box > section {
	padding: 0 1rem 1rem;
	background-color: #fff;
}
section > h1 {
	margin: 1rem 0 0;
	font-size: 1rem;
}
/* 立方体のコンテナを作成 */
.cube_wrapper {
	position: relative;
	width: 100px;
	height: 100px;
	margin: 5rem auto;
	color: #fff;
	font-size: 3rem;
	font-weight: bold;
	text-align: center;
	line-height: 100px;
	transform: rotate3d(1, 1, 0, 45deg);
	perspective: 500px;
}
/* 立方体のパーツ */
.cube_wrapper > div {
	position: absolute;
	width: 100%;
	height: 100%;
}
.face_1 {
	transform: translateZ(50px);
	background-color: rgba(0, 0, 0, 0.1);
}
.face_2 {
	transform: translateY(-50px) rotateX(90deg);
	background-color: rgba(255, 0, 153, 0.7);
}
.face_3 {
	transform: translateX(-50px) rotateY(-90deg);
	background-color: rgba(255, 153, 0, 0.7);
}
.face_4 {
	transform: translateY(50px) rotateX(-90deg);
	background-color: rgba(250, 59, 59, 0.7);
}
.face_5 {
	transform: translateX(50px) rotateY(90deg);
	background-color: rgba(0, 153, 255, 0.7);
}
.face_6 {
	transform: translateZ(-50px) rotateX(180deg);
	background-color: rgba(0, 191, 115, 0.7);
}
/* 空間の次元を変更 */
#ts_flat > div {
	transform-style: flat;
}
#ts_3d > div {
	transform-style: preserve-3d;
}
HTML
<div class="samp_box">
	<section id="ts_flat">
		<h1>transform-style: flat;</h1>
		<div class="cube_wrapper">
			<div class="face_1">1</div>
			<div class="face_2">2</div>
			<div class="face_3">3</div>
			<div class="face_4">4</div>
			<div class="face_5">5</div>
			<div class="face_6">6</div>
		</div>
	</section>
	<section id="ts_3d">
		<h1>transform-style: preserve-3d;</h1>
		<div class="cube_wrapper">
			<div class="face_1">1</div>
			<div class="face_2">2</div>
			<div class="face_3">3</div>
			<div class="face_4">4</div>
			<div class="face_5">5</div>
			<div class="face_6">6</div>
		</div>
	</section>
</div>

三次元空間を利用したアニメーションの実例

transform-styleを利用すると、三次元空間の中に立体的な表現を確立できます。特に、3Dの表現はアニメーションに向いています。静止した画像では立体感を掴みづらい演出であっても、そこに時間的な動きを加えることで臨場感のある映像に変わります。

以下の内容は、先ほどの立方体を応用してアニメーションを作り上げた例です。コンテナに対してドロップシャドウのフィルタを適用して立体感を足しています。ただし、filterの効果は三次元空間をリセットしてしまうため、ボックスを入れ子にして立方体と切り離して管理します。

表示確認
CSS
.samp_box {
	overflow: auto;
	background-color: #eee;
}
.samp_box > section {
	margin: 100px 1rem;
	background-color: #fff;
}
/* 立方体のコンテナを作成 */
.cube_wrapper {
	position: relative;
	top: 0;
	left: 50%;
	width: 200px;
	height: 200px;
	transform: translateX(-50%);
	perspective: 500px;
	perspective-origin: 100%;
	filter: drop-shadow(20px 20px 20px rgba(0,0,0,0.5));
}
/* 立方体を作成 */
.cube_wrapper > ul {
	width: 100%;
	height: 100%;
	padding: 0;
	color: #fff;
	font-size: 4rem;
	font-weight: bold;
	text-align: center;
	line-height: 200px;
	list-style: none;
	transform-style: preserve-3d;
	animation: 30s linear 0s infinite normal none running TurnCube;
}
/* アニメのキーフレーム */
@keyframes TurnCube {
	0%{ transform: rotateX(0deg) rotateY(0deg);}
	100%{ transform: rotateX(360deg) rotateY(360deg);}
}
/* 立方体のパーツ */
.cube_wrapper li {
	position: absolute;
	width: 100%;
	height: 100%;
}
.face_1 {
	transform: translateZ(100px);
	background-color: rgba(0, 0, 0, 0.1);
}
.face_2 {
	transform: translateY(-100px) rotateX(90deg);
	background-color: rgba(255, 0, 153, 0.7);
}
.face_3 {
	transform: translateX(-100px) rotateY(-90deg);
	background-color: rgba(255, 153, 0, 0.7);
}
.face_4 {
	transform: translateY(100px) rotateX(-90deg);
	background-color: rgba(250, 59, 59, 0.7);
}
.face_5 {
	transform: translateX(100px) rotateY(90deg);
	background-color: rgba(0, 153, 255, 0.7);
}
.face_6 {
	transform: translateZ(-100px) rotateX(180deg);
	background-color: rgba(0, 191, 115, 0.7);
}
HTML
<div class="samp_box">
	<section>
		<div class="cube_wrapper">
			<ul>
				<li class="face_1">1</li>
				<li class="face_2">2</li>
				<li class="face_3">3</li>
				<li class="face_4">4</li>
				<li class="face_5">5</li>
				<li class="face_6">6</li>
			</ul>
		</div>
	</section>
</div>

transform-styleに関連するCSSプロパティ

変形・トランスフォーム
backface-visibility 要素が裏面を向いた時に可視化するかどうかを指定する
perspective 三次元的に配置された要素の遠近感を指定する
perspective-origin 三次元的に配置された要素に対する視点の位置を定める
transform 要素に座標変換を適用して移動、回転、拡大縮小、歪みなどを行う
transform-origin 要素を座標変換させる時の原点を指定する
transform-style 変形可能要素が配置される空間の次元を切り替える