CSS3でPhotoshopで作ったようなキレイなガラス風ボタンを作るチュートリアル

CSS3でPhotoshopで作ったようなキレイなガラス風ボタンを作るチュートリアル

CSS3 の新しいプロパティーを総動員したら、Photoshopとかで作ったきれいなアクア風(ガラス風)ボタンにどこまで近づけるか? というのを実際にやってみました。

チュートリアル風に、ステップごとに分けて説明していますので、CSS3を使ったリアルな表現のためのテクニックとして、ポイントだけでも覚えておくと、いろんなところで応用できると思います!

  

こんな感じになりました 

何はともあれ↓が出来上がったものです。
今はやりの CSS3ジェネレータ には負けてないと自負しています... 
さて、これを作る手順です。

※Chromeで表示して画像にしています。実際のものはこちらから見れます。

作成ステップ

ステップ1 : ベースとなるHTMLを用意

まずは、こんなHTMLを用意しました。このHTMLをベースに、CSS3を総動員していきます。A タグの中に SPAN が入っていますが、こいつらには後で仕事をさせます。

<a href="#" class="button">
	<span class="text">ここに好きな文字</span>
	<span class="highlight"></span>
</a>

※ SPAN を使わず、After、Before 擬似要素でもいけるかもしれません

  

ステップ2 : CSSでボックスを作る

幅と高さを指定してボックスを作ります。position:relative は、中のSPANタグを絶対値でポジショニングするために指定しています。border も付けて外枠を作ります。

※ ベンダープレフィックスは、わかり易くするために付けていません。

.button {
	display: block;
	width: 80px;
	height: 80px;
	position: relative;
  	border: 1px solid rgba(0,0,0,0.5);
}

 border の色は、CSS3で追加された rgba指定 で透明度(0.5の部分)を指定しています。透明度を指定することで、背景となじむのでリアルな表現では便利です。

  

さて、今のところこんな感じです。

  

ステップ3 : 丸いボタンにする

border-radius を使って丸いボタンにします。border-radius の値に半径以上の値を指定すると円になります。

.button {
	...
	border-radius: 300px;
	
}

 border-radius を使うと丸いボタンを作ることができます。ここら辺の記事でも書いていますので、参考にしてください。

 

ボタンぽくなってきましが、まだ立体感がありませんね。
次は色を入れていきます。

  

ステップ4 : グラデーションで塗りつぶす

background-image の radial-gradient関数 を使って円形グラデーションで塗りつぶします。グラデーションの中心部分は、少し下側にずらしています。

.button {
	...
	background: radial-gradient(50% 80%, circle, #00D1F2, #0055C1);
}

 ガラスの表現では、下地となるグラデーションを作る際に、明るい部分を下側にして作ることがあります。

  

ちょっと楽しくなってきました。
ここから、光の表現を付け加えていきます。

  

ステップ5 : 影を付ける

立体感と言えば影ですね! box-shadow で影を付けます。

.button {
	...
	box-shadow: 0 2px 6px rgba(0,0,0,0.5);
}

 きれいな影を作るには、環境光を意識して、ふんわり付けるのがリアリティーを生み出すセオリーです。ここでは、rgba指定 と、ぼかし具合を調整して、ふんわり影を表現しています。

  

ここまででこんな↓感じです。
だいぶボタンになってきました。

  

ステップ6 : グローを付ける

box-shadow をさらに重ねて、ガラスが乱反射してできる光を表現してみたいと思います。box-shadow は、カンマで区切りで複数指定できるので、ステップ5の影に追加する形で記述します。

.button {
	...
	box-shadow: 
		0 2px 6px rgba(0,0,0,0.5),
		0 2px 10px rgba(0,100,255, 0.7);
}

 透明度とぼかしを使ってぼやーとした光を表現しています。

  

こんな感じです↓うっすら青い光が見えますか?

  

ステップ7 : ハイライトを作る

ガラスと言えばハイライトですね。予め仕込んでおいた SPAN タグをポジショニングし、background-image の gradient関数 でハイライト部分を作ります。

.button .highlight {
	position: absolute;
	border-radius: 100px;
	width: 100%;
	height: 100%;
	background-image: linear-gradient(top, rgba(250, 250, 255, 1) 0%, rgba(250, 250, 255, 0.7) 10%, rgba(250, 250, 255, 0) 100%);
	z-index: 3;
	top: -19px;
	-webkit-transform: scale(0.8, 0.6); 
}

 楕円の光を作るために、border-radius で円を作り、さらにそれを transformで変形させ、楕円を作っています。他にも方法があるかもしれませんね。

 rgba指定を使うと、透明度でグラデーションできます。レイヤーモードのないCSS3では、必須のテクニックです。

  

ここまででこんな感じです。だいぶ最終形に近づいてきました。

  

ステップ8 : 内側の影を付ける

まだ終わりません。ボタンのふちを、浮き上がったような感じにしたいので、box-shadow (inset) と rgba指定 を使って、ふちの内側に黒い影を混ぜます。

※ ステップ6で設定した box-shadow に追記します。

.button {
	...
	box-shadow: 
		0 2px 6px rgba(0,0,0,0.5),
		0 2px 10px rgba(0,100,255, 0.7),
		inset 0 0 10px rgba(0,0,150,0.6);
}

 この表現は、丸いガラスの表現に欠かせません。

  

円の内側の黒いグローが見えますか?
なんというか、ガラスのふちの丸みが表現できていると思います。

  

ステップ9. 鏡面反射(おまけ)

Webkitなら、webkit-reflect が使えるので、鏡面反射を表現できます。ただ鏡面反射するだけだと面白くないので、コースティクスのような光を表現してみました。

具体的には、反射をマイナス値でポジショニングして、本体と重ねてうっすら見えるように調整します。

.button {
	...
	-webkit-box-reflect: 
		below -90px -webkit-gradient(linear, right top, left top, from(rgba(0,0,0,0.1)), to(rgba(0,0,0,0)));
}

ボタンの下側に、うっすら光の輪のようなものが見えますか?
ちょっと蛇足のような気もしますが... 

  

ステップ10. テキストのグロー

お疲れ様です!、最後にテキストを追加して終わりです。テキストは、text-shadow を使って少し発光しているように、表現しています。

.button .text {
	display: block;
	color: rgba(255, 255, 255, 0.9);
	font-size: 15pt;
	text-shadow: 
		0px 0px 2px rgba(0, 0, 0, 0.5) ,
		0px 0px 4px rgba(255, 255, 255, 1);
	position: absolute;
	text-align: center;
	top: 40px;
	width: 100px;
	height: 100px;
	z-index: 1;
}

 テキストがガラスの表面なのか、底にあるのかで表現も変わってきますね。具体的には、ガラスの表面の場合は、底にうっすら影を落とします。反対に底にある場合は、ガラスの表面に反射ができます。

完成!

これで完成です。実際のブラウザで見たい方は、こちらを見てください。ソースコードも見れます。

 

どうでしたか?。今回の内容は、多少マニアックな内容になってしまいましたが、ポイントだけでも覚えておくと、CSSだけでなくグラフィックソフトなどでも、応用が利く内容だと思います。

今回使用したファイルは、ダウンロードもできますので、時間があるときにでも、じっくりと CSS3 と格闘しながら、研究してみてください。

namba

田舎でプログラマーとかWebデザイナーとかやりながらWebサービスを作る人。PHP、jQueryなどの技術系の記事担当してます。 がんばって記事を書くので、リアクションしてくれると嬉しいです。

コメント