transform-styleプロパティの説明
CSSのtransform-style
プロパティは、変形可能要素が配置される空間の次元を切り替えます。このプロパティは、ボックスに含まれる子要素を平面に配置するか、三次元空間に配置するのかを定義するために親要素に指定します。
平面に配置された子要素は、座標変換が指定されていても立体的には表示されません。逆に三次元空間に配置されていても、座標変換が指定されていない要素は立体的になりません。
transform-styleに指定できる値
flat
- 子要素をボックスの平面に配置します。これが初期値です。
preserve-3d
- 子要素を三次元空間に配置します。
transform-styleの使い方とサンプルコード
transform-style
プロパティの構文は以下の通りです。
/* キーワード値 */
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軸の奥行きが利用できるために立体感のある表現が実現できています。
<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>
.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;
}
三次元空間を利用したアニメーションの実例
transform-style
を利用すると、三次元空間の中に立体的な表現を確立できます。特に、3Dの表現はアニメーションに向いています。静止した画像では立体感を掴みづらい演出であっても、そこに時間的な動きを加えることで臨場感のある映像に変わります。
以下の内容は、先ほどの立方体を応用してアニメーションを作り上げた例です。コンテナに対してドロップシャドウのフィルタを適用して立体感を足しています。ただし、filter
の効果は三次元空間をリセットしてしまうため、ボックスを入れ子にして立方体と切り離して管理します。
<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>
.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);
}