See the Pen Flip Pen Navigation by webopixel (@webopixel) on CodePen.
HTML
タグはaタグの中にspanを入れてます。
span2つにして表裏にした方が直感的ですがマークアップ的に微妙な気がしたので、aにtitle属性を設定してCSSの擬似要素で裏側のボタンスタイルを作成することにします。
html
<nav class="flip-nav"> <ul> <li class="nav01"> <a href="#" class="flip-btn" title="HOME"> <span>HOME</span> </a> </li> <li class="nav02"> <a href="#" class="flip-btn" title="ABOUT"> <span>ABOUT</span> </a> </li> <li class="nav03"> <a href="#" class="flip-btn" title="WORKS"> <span>WORKS</span> </a> </li> <li class="nav04"> <a href="#" class="flip-btn" title="CONTACT"> <span>CONTACT</span> </a> </li> </ul> </nav>
CSS
拡大するときはscaleだと荒くなってしまうので、matrixを使用するといい感じです。
CSS
nav.flip-nav {
margin: 30px auto;
width: 800px;
max-width: 100%;
}
nav.flip-nav > ul {
list-style: none;
display: flex;
}
nav.flip-nav > ul > li {
width: 100%;
}
.flip-btn {
font-size: 16px;
height: 60px;
line-height: 60px;
display: block;
position: relative;
text-decoration: none;
}
.flip-btn:after,
.flip-btn span {
display: block;
position: absolute;
background: #bbb;
text-align: center;
color: #fff;
width: 100%;
height: 100%;
transition: transform .3s;
}
/* 表側 */
.flip-btn span {
transform: rotateX(0deg) translateZ(30px);
}
.flip-btn:hover span {
transform: rotateX(-90deg) translateZ(30px);
}
/* 裏側 */
.flip-btn:after {
content: attr(title);
transform: rotateX(90deg) translateZ(30px);
}
.flip-btn:hover:after {
transform: rotateX(0deg) translateZ(30px);
}
.nav01 span {
background: #F47BBC;
}
.nav01 .flip-btn:after {
background: #AF5686;
}
.nav02 span {
background: #7BA0F4;
}
.nav02 .flip-btn:after {
background: #5A76B5;
}
.nav03 span {
background: #77C944;
}
.nav03 .flip-btn:after {
background: #5A9834;
}
.nav04 span {
background: #E0A759;
}
.nav04 .flip-btn:after {
background: #A2783E;
}
くるっとなる動きでメインとなるのは、36〜50行目のtransformの部分です。
rotateXだけだと中心から回転するので、translateZも指定することで表裏で入れ替わるような動きになります。
translateZの数値はボタンのheightの半分の値を入れてください。

