サンプル

See the Pen Codepen by Tora (@webtoranomaki) on CodePen.

コード


<a class="btn01" href=""><span>ボタン</span><span>Button</span></a>

.btn01 {
	position: relative;
	display: block;
	width: 200px;
	height: 50px;
	-webkit-perspective: 200px;
	perspective: 200px;
}
.btn01 span {
	position: absolute;
	display: block;
	box-sizing: border-box;
	width: 200px;
	height: 50px;
	line-height: 50px;
	text-align: center;
	border: 1px solid #333;
	-webkit-transition: .3s;
	transition: .3s;
}
.btn01 span:nth-child(1) {
	color: #fff;
	background-color: #333;
	-webkit-transform: rotateX(90deg);
	-moz-transform: rotateX(90deg);
	transform: rotateX(90deg);
	-webkit-transform-origin: 50% 50% -25px;
	-moz-transform-origin: 50% 50% -25px;
	transform-origin: 50% 50% -25px;
}
.btn01 span:nth-child(2) {
	color: #333;
	background-color: #fff;
	-webkit-transform: rotateX(0deg);
	-moz-transform: rotateX(0deg);
	transform: rotateX(0deg);
	-webkit-transform-origin: 50% 50% -25px;
	-moz-transform-origin: 50% 50% -25px;
	transform-origin: 50% 50% -25px;
}
.btn01:hover span:nth-child(1) {
	-webkit-transform: rotateX(0deg);
	-moz-transform: rotateX(0deg);
	transform: rotateX(0deg);
}
.btn01:hover span:nth-child(2) {
	background-color: #333;
	-webkit-transform: rotateX(-90deg);
	-moz-transform: rotateX(-90deg);
	transform: rotateX(-90deg);
}

もっとHTML自体をシンプルにしたい場合

あまりメリットがないけど、余計なspanとか入れたくないっていう場合はこんな書き方も出来る。ただ、ボタンの文字をCSS側で管理しなきゃいけないし、文字違いの同じボタンをいくつも設置するケースでは全く効率が悪いので使う機会はないと思うが。


<a class="btn02" href=""></a>

.btn02 {
	position: relative;
	display: block;
	width: 200px;
	height: 50px;
	-webkit-perspective: 200px;
	perspective: 200px;
}
.btn02::before,
.btn02::after {
	position: absolute;
	display: block;
	box-sizing: border-box;
	width: 200px;
	height: 50px;
	text-align: center;
	line-height: 50px;
	border: 1px solid #333;
	transition: .3s;
	pointer-events: none;
}
.btn02::before {
	content: "ボタン";
	color: #fff;
	background-color: #333;
	-webkit-transform: rotateX(90deg);
	-moz-transform: rotateX(90deg);
	transform: rotateX(90deg);
	-webkit-transform-origin: 50% 50% -25px;
	-moz-transform-origin: 50% 50% -25px;
	transform-origin: 50% 50% -25px;
}
.btn02::after {
	content: "Button";
	color: #333;
	background-color: #fff;
	-webkit-transform: rotateX(0deg);
	-moz-transform: rotateX(0deg);
	transform: rotateX(0deg);
	-webkit-transform-origin: 50% 50% -25px;
	-moz-transform-origin: 50% 50% -25px;
	transform-origin: 50% 50% -25px;
}
.btn02:hover::before {
	-webkit-transform: rotateX(0deg);
	-moz-transform: rotateX(0deg);
	transform: rotateX(0deg);
}
.btn02:hover::after {
	background-color: #333;
	-webkit-transform: rotateX(-90deg);
	-moz-transform: rotateX(-90deg);
	transform: rotateX(-90deg);
}