12月 272011
 

カーソルを合わせると文字が消えるフォーム | Inhale n’ Exhale本ブログの検索窓(画面右上)のように、カーソルを合わせると文字が消えるフォームは最近よく見かける。jQueryを使ってこのフォームを作るにはどうしたらいいか。基本テクニックと応用テクニックを紹介しておこう。


サンプルとして紹介するHTMLの基本構造はこんな感じ。

<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
<script type="text/javascript">
$(function() {
    // Implement later...
});
</script>
<style type="text/css">
input#sample {
    width:200px;
    padding:2px;
}
input.dummy_text {
    color:#888;
}
</style>
</head>
<body>
<input type="text" id="sample" value="" />
</body>
</html>

12行目のinput#sampleのようにpaddingを設定しないと、フォーカスが当たった/外れたときに微妙にフォームの配置位置がずれてしまうので注意!

テキストフォームにメッセージを表示させる

まずは最も単純なパターンから。フォームにフォーカスが当たっておらず、かつフォームに何も入力されていない場合にのみ、「Input a keyword here」というメッセージを表示する。

$(function() {
	$('#sample_text').focus(function() {
		if($(this).hasClass('dummy_text')) {
			$(this).removeClass().val('');
		}
	})
	.blur(function() {
		if($(this).val().length == 0) {
			$(this).addClass('dummy_text').val('Input a keyword here');
		}
	})
	.blur();

こんな感じになる。

フォームにイメージを表示させる

テキストの代わりにイメージを表示させる方法。まず、フォーカスが当たっていないときに表示させたいイメージファイルを作っておく。イメージの高さを18pxくらいにしておくとフォームにしっくりはまってくれる。

そして以下のようなCSSを書き足す。

input.dummy_image {
  background:url("bg_search_google.gif") no-repeat 4px;
}

bg_search_google.gifの部分は用意したイメージへのURL。また、最後の4pxも用意したイメージに応じて微調整が必要。

で、jQueryのコード。

$(function() {
	$('#sample_image') .focus(function() {
		if($(this).hasClass('dummy_image')) {
			$(this).removeClass();
		}
	})
	.blur(function() {
		if($(this).val().length == 0) {
			$(this).addClass('dummy_image');
		}
	})
	.blur();
});

テキストの例とほぼ同じ。フォーム内に表示させるものをval()で指定するか、CSSで背景として指定するかの違い。

パスワードフォームにメッセージを表示させる

テキストフォームにメッセージを表示させた例で扱ったフォームはinput要素のtype属性がtextだったが、type属性がpasswordだった場合val()で渡したテキストはマスクされてしまい、ユーザーにまったくメッセージが伝わらなくなってしまう。val()でメッセージを渡す際に、type属性をtextからpasswordに変えればいいのでは?と思い、テキストフォームの例を以下のように変えてみた。

$(function() {
	$('#sample_text').focus(function() {
		if($(this).hasClass('dummy_text')) {
			$(this).removeClass().attr('type', 'password').val('');
		}
	})
	.blur(function() {
		if($(this).val().length == 0) {
			$(this).addClass('dummy_text').attr('type', 'text').val('Input your password here');
		}
	})
	.blur();
});

残念ながらこれはうまくいかない。input要素のtype属性は後から操作することができないようだ。

「Input your password here」という文字をイメージとして作成すれば、フォームにイメージを表示させた例で実現することはできるが、表示メッセージ毎にイメージを作成するのはナンセンス。

パスワードフォームにメッセージを表示させるにはちょっと工夫しなければならない。最初にHTML上でinput要素のtype属性をpasswordに変更しておく。

</head>
<body>
<input type="password" id="sample" value="" />
</body>
</html>

次にCSSクラスを1つ追加。

span.dummy_password {
  color:#888;
  font-size:10pt;
  position:absolute;
  padding:4px;
}

positionプロパティをabsoluteにしてtopプロパティやleftプロパティはjQueryで後から変更する。

$(function() {
	function make_dummy_password(obj, msg)
	{
		var pos = obj.position();
		var dummy = $('<span>');
		dummy.text(msg)
			.addClass('dummy_password')
			.css({top:pos.top,left:pos.left})
			.click(function() { obj.focus(); });
		$('body').append(dummy);
		return dummy;
	}

	var dummy_password = make_dummy_password($('#sample_password'), 'Input your password here');
	$('#sample_password').focus(function() {
		dummy_password.hide();
	})
	.blur(function() {
		if($(this).val().length == 0) {
			dummy_password.show();
		}
	})
	.blur();
});

こんな感じでパスワードフォームにメッセージが表示できるようになった。

9行目のclick()ハンドラの実装を忘れると、「Input your password here」というメッセージにフォーカスが当たってしまい、パスワードフォームにフォーカスが当たらなくなってしまうので注意!

 返信する

以下のHTML タグと属性が利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください