BLOG

CSSのみで、3Dボタンを作ってみましょう!

Written by XU

INDEX

はじめまして。

エヴォワークスのアシスタントエンジニア、ジョと申します。入社してから10ヶ月が経ちました。

中国出身で外国籍エンジニアとして働いています。

今回はCSSだけを使用して3Dボタンを作る方法を紹介します!

htmlの書き方

SNSアイコンを持つボタンを作りたいだけでなく、ホバー時にアイコンとテキストの色が一緒に変わる簡単な方法が欲しいので、今回はBootstrap Iconsライブラリを使用します!

Bootstrap Iconsをheadの閉じタグ直前に読み込む。

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css"> 
</head>

Bootstrap Icons公式サイトでコピーしてペーストすればすぐに使える i タグを a タグに挿入する

instagram => <i class="bi bi-instagram"></i>

tiktok => <i class="bi bi-tiktok"></i>

line => <i class="bi bi-line"></i>

<body> 
<ul> <!--instagram--> 
<li> 
<a href="#"> 
<!-- アイコンフォント Bootstrap Icons公式サイトでコピーしてペーストすればすぐに使えます。 --> 
<i class="bi bi-instagram"></i> 
<!-- アイコンフォント Bootstrap Icons公式サイトでコピーしてペーストすればすぐに使えます。END --> 
<span>instagram</span> 
</a> 
</li> 
<!--tiktok--> 
<li> 
<a href="#"> 
<i class="bi bi-tiktok"></i> 
<span>tiktok</span> 
</a> 
</li> 
<!--line--> 
<li> 
<a href="#"> 
<i class="bi bi-line"></i> 
<span>line</span> 
</a> 
</li> 
</ul> 
</body>

CSSの書き方

まず ul を中央に配置する

* { margin: 0; padding: 0; box-sizing: border-box; } 

body { background-color: #ccc; font-family: sans-serif; } 

ul { 
display:flex; 
justify-content: center; 
align-items: center; 
width: 100%; 
height: 100vh; 
}

ボタンの見た目を調整する。

まずは2Dバージョンのボタンを制作します!

見た目が3Dに見えるように、aタグにtransformでボタンを傾斜させ、そしてbox-shadowでシャドウ効果をつけます。

ul li { 
list-style: none; 
margin: 0 10px; 
} 
ul li a i { 
font-size: 30px; 
color: #333; 
transition: .3s; 
line-height: 80px; 
padding-right: 15px; 
transition: .3s; 
} 
ul li a span { 
letter-spacing: 2px; 
color: #333; 
transition: .3s; 
margin-left: 10px; 
font-weight: bolder; 
} 
ul li a { 
text-decoration: none; 
display: block; 
width: 200px; 
height: 74px; 
background-color: #fff; 
padding-left: 20px; 
display: flex; 
justify-content: flex-start; 
align-items: center; 
transform: rotate(-30deg) skew(25deg); box-shadow: -25px 25px 25px rgba(0,0,0,.4); transition: .3s; 
}

https://codepen.io/evolab/pen/GReOpGa

3Dボタンが見えるためを調整する

擬似要素の::before::afterを使って、3Dボタンの様子を表現します。

ul li a::before { 
content: ''; 
position: absolute; 
top: 10px; 
left: -20px; 
width: 20px; 
height: 100%; 
background-color: #888; 
transform: rotate(0deg) skewY(-45deg); 
transition: .3s; 
} 
ul li a::after { 
content: ''; 
position: absolute; 
bottom: -20px; 
left: -10px; 
width: 100%; 
height: 20px; 
background-color: #adadad; 
transform: rotate(0deg) skewX(-45deg); transition: .3s; 
}

hoverやactionに記述を追加して、3Dのような動きを実装する

hover時にtransformのtranslateの垂直方向の値をマイナスに設定すると、ボタンが上に浮かび上がります。

押下時にtransform: translate(0px, 0px)に戻すことで、ボタンを押したときに3D効果が見られます!

ul li:hover a { 
transform: rotate(-30deg) skew(25deg) translate(10px, -10px); 
background-color: #46E678; 
box-shadow: -55px 55px 55px rgba(0,0,0,.4); 
color: #fff; 
} 
ul li:hover a i { color: #fff; } 
ul li:hover a span { color: #fff; } 
ul li:hover a::before { background-color: #57AF72; } 
ul li:hover a::after { background-color: #ABEFC0; } 

ul li:active a { 
transform: rotate(-30deg) skew(25deg) translate(0px, 0px); 
box-shadow: -15px 15px 15px rgba(0,0,0,.3); 
background-color: #fff; 
} 

ul li:active a i { color: #000; } 
ul li:active a span { color: #000; } 
ul li:active a::before { background-color: #888; } 
ul li:active a::after { background-color: #adadad; }


https://codepen.io/evolab/pen/WNmZJoE

いかがでしょうか!3DボタンをCSSのみで作ることができました。興味があれば、ぜひ作ってみてください。

参考

https://icons.getbootstrap.jp/

https://developer.mozilla.org/ja/docs/Web/CSS/transform

https://developer.mozilla.org/ja/docs/Web/API/Element/before

https://developer.mozilla.org/ja/docs/Web/API/Element/after