backface-visibilityプロパティの説明
CSSのbackface-visibility
プロパティは、要素が回転して裏面がスクリーンに面した時、その要素を表示させるかどうかを指定します。通常、ひっくり返った要素は内容が左右反転して表示されます。これは三次元空間の表現であり、視点を持たない二次元の座標変換では効果がありません。
このプロパティが必要になる場面としては、例えばカード型のUIを用意してユーザーの操作に応じて立体的な動きを表現したり、箱の中を覗くアニメーションを用意する場合です。この時、要素の裏面を見せるか見せないかで、表現が大きく異なります。
backface-visibilityに指定できる値
visible
- 要素の背面が画面に向いた時、内容を可視のままにします。これが初期値です。
hidden
- 要素の背面が画面に向いた時、内容を不可視にします。
backface-visibilityの使い方とサンプルコード
backface-visibility
プロパティの構文は以下の通りです。
/* キーワード値 */
backface-visibility: visible;
backface-visibility: hidden;
/* グローバル値 */
backface-visibility: inherit;
backface-visibility: initial;
backface-visibility: revert;
backface-visibility: unset;
backface-visibilityの実例
それでは実際にbackface-visibility
プロパティの書き方を見ていきましょう。要素を反転させるスタイルを作成して、backface-visibility
の値だけを変えた場合、以下のように表示されます。
<div class="samp_box">
<input type="checkbox" id="toggle_1">
<label for="toggle_1">切り替え</label>
<div> id="flip_1">表と裏</div>
</div>
<div class="samp_box">
<input type="checkbox" id="toggle_2">
<label for="toggle_2">切り替え</label>
<div id="flip_2">表と裏</div>
</div>
.samp_box > div {
display: inline-block;
margin: 10px 0 0 10px;
padding: 5px;
width: 100px;
background: #ccc;
border: 1px solid #666;
text-align: center;
transition: all 1s ease;
}
.samp_box > label {
display: inline-block;
margin-top: 10px;
padding: 5px;
width: 80px;
border: 1px solid #ccc;
border-radius: 3px;
background-color: #09f;
color: #fff;
text-align: center;
cursor: pointer;
}
input[type="checkbox"] {
display: none;
}
#toggle_1:checked ~ #flip_1 {
transform: rotateY( 180deg );
backface-visibility: visible;
}
#toggle_2:checked ~ #flip_2 {
transform: rotateY( 180deg );
backface-visibility: hidden;
}
要素を裏返した時に隠すメリットは、その状態に別の要素やスタイルを用意できることです。次の例では、二つの要素を重ねて表と裏で表示する内容やスタイルを変えた場合の挙動を確認できます。
<div class="samp_box">
<input type="checkbox" id="toggle">
<label for="toggle">切り替え</label>
<div id="flip_1">表の面</div>
<div id="flip_2">裏の面</div>
</div>
.samp_box {
position: relative;
}
.samp_box > div {
position: absolute;
top: 10px;
left: 90px;
padding: 5px;
width: 100px;
border: 1px solid #666;
text-align: center;
transition: all 1s ease;
backface-visibility: hidden;
}
.samp_box > label {
position: absolute;
top: 10px;
left: 0px;
width: 80px;
padding: 5px;
border: 1px solid #ccc;
border-radius: 3px;
background-color: #09f;
color: #fff;
text-align: center;
cursor: pointer;
}
#flip_1 {
z-index: 2;
background: #fff;
}
#flip_2 {
z-index: 1;
background: #ccc;
transform: rotateY( 180deg );
}
input[type="checkbox"] {
display: none;
}
#toggle:checked ~ #flip_1 {
transform: rotateY( 180deg );
}
#toggle:checked ~ #flip_2 {
transform: rotateY( 0deg );
}