マウスの動きに合わせてカーソルが移動するメニュー

以前「jQueryでこういうの作れますか?」と相談を受けた時に作ったサンプルです。

demo

動きは以下のようになります。

  1. なにもしない時は白いカーソルがメニューの上を時計回りに移動
  2. メニューのマウスオーバーで白いカーソルをマウスカーソルまで移動。マウスアウトでその位置から再び時計回りに移動。

ちょっと手こずったのは、白いカーソルが移動中の時にマウスカーソルを動かし、その動きについていけるようにする部分でした。
色々調べると、現在設定されているアニメションを停止するstop()という命令があることがわかり、それをanimate()の前に付け加えることでうまくいくようになりました。

html部分


<div id="box">
	<div id="cursol"></div>
	<ul>
		<li><a href="" id="link1">link1</a></li>
		<li><a href="" id="link2">link2</a></li>
		<li><a href="" id="link3">link3</a></li>
		<li><a href="" id="link4">link4</a></li>
		<li><a href="" id="link5">link5</a></li>
		<li><a href="" id="link6">link6</a></li>
		<li><a href="" id="link7">link7</a></li>
		<li><a href="" id="link8">link8</a></li>
	</ul>
</div>

css部分

h1 {
	margin-left: 20px;
	margin-bottom: 20px;
}
#box {
	position: relative;
	background-image:url(box.gif);
	height:220px;
	width:360px;
	margin-left: 20px;
}
#cursol {
	position: absolute;
	top: 50px;
	left: 50px;
	height: 40px;
	width: 40px;
	border:solid 5px #fff;
}
li a {
	display:block;
	height:50px;
	width:50px;
	line-height: 50px;
	text-align: center;
	position: absolute;
}
#link1 {left: 50px;top: 50px}
#link2 {left: 120px;top: 50px}
#link3 {left: 190px;top: 50px}
#link4 {left: 260px;top: 50px}
#link5 {left: 260px;top: 120px}
#link6 {left:190px;top: 120px}
#link7 {left: 120px;top: 120px}
#link8 {left: 50px;top: 120px}

javascript(jQuery)部分

$(function(){
	var timerID = setInterval(Rotation,2000);
	$("a").mouseover(function(){
		var mx = parseInt($(this).css("left"));
		var my = parseInt($(this).css("top"));
		clearInterval(timerID);
		$("#cursol").stop().animate({
			left : mx + "px",
			top : my+ "px",
		},100,"swing");
	}).mouseout(function(){
		timerID = setInterval(Rotation,2000);
	});
});

function Rotation() {
	x = parseInt($("#cursol").css("left"));
	y = parseInt($("#cursol").css("top"));

	if( (x < 260) && (y == 50)) {
		$("#cursol").animate({
			left : x + 70+ "px",
		},1000,"swing");
	} else if ( (x == 260) && (y == 50)) {
		y = parseInt($("#cursol").css("top"));
		$("#cursol").animate({
			top : y + 70 + "px",
		},1000);
	} else if ( (x > 50) && (y == 120) ) {
		x = parseInt($("#cursol").css("left"));
		$("#cursol").animate({
			left : x - 70 + "px",
		},1000,"swing");
	} else if ( (x == 50) && (y == 120) ) {
		y = parseInt($("#cursol").css("top"));
		$("#cursol").animate({
			top : y - 70 + "px",
		},1000,"swing");
	}
}
Posted in JavaScript and API | Leave a comment

メニュー連動型スライドショー

ウェブサイトのキービジュアルにJavascriptで作ったスライドショーを設置することはよくある話だと思います。

今回ご紹介するのは画像を順番に表示させるだけでなく、メニューと連動したスライドショーです。

demo

動きは以下のようになります。

  1. なにもしない時はキービジュアルの画像を順番に表示。同時に対応するメニューも目立たせる。
  2. キービジュアルまたはメニューのマウスオーバーで動きをストップ。マウスアウトで再びスタート。
  3. メニューのマウスオーバーでそれに対応するキービジュアルを表示。

単純にメニューとキービジュアル画像を対応させるのは難しくないのですが、マウスオーバーの仕方によってはキービジュアル画像の順番が入れ替わってしまいます。

そうなると、メニューの移り変わりが下から上に移動するようになってしまうので、キービジュアル画像の移動は該当の画像とその次の画像を同時に行なってい、画像の順番が入れ替わらないようにしています。

html部分

<div id="keyvisual">
<ul id="keyvisualMenu">
	<li class="visual1"><a class="thisBtn">menu1</a></li>
	<li class="visual2"><a>menu2</a></li>
	<li class="visual3"><a>menu3</a></li>
</ul>
<div id="mainVisual"><img id="visual3" src="http://hidakaya.net/demo/20120430/20120430_main3.jpg" alt="" width="400" height="300" />
 <img id="visual2" src="http://hidakaya.net/demo/20120430/20120430_main2.jpg" alt="" width="400" height="300" />
 <img id="visual1" src="http://hidakaya.net/demo/20120430/20120430_main1.jpg" alt="" width="400" height="300" />
 <!-- /#mainVisual --></div>
<!-- /#keyvisual --></div>

css部分

#keyvisual {
	width:615px;
	margin-top: 20px;
	margin-left: 20px;
}
ul {
	width:200px;
	float:right;
}
ul li {
}
ul li a {
	width:200px;
	height:95px;
	display:block;
	background-image:url(http://hidakaya.net/demo/20120430/20120430_menu.jpg);
	background-repeat:no-repeat;
	background-position:0 0;
	text-indent:-9999px;
	border:solid 3px #fff;
	border-radius: 10px;
}
ul .visual1 a {}
ul .visual2 a {
	background-position:0 -100px;
}
ul .visual3 a {
	background-position:0 -200px;
}
ul .visual1 a:hover {
	background-position:-200px 0;
	border-color: #00c2cc;
}
ul .visual2 a:hover {
	background-position:-200px -100px;
	border-color: #00c2cc;
}
ul .visual3 a:hover {
	background-position:-200px -200px;
	border-color: #00c2cc;
}
ul .visual1 a.thisBtn {
	background-position:-200px 0;
	border-color: #00c2cc;
}
ul .visual2 a.thisBtn {
	background-position:-200px -100px;
	border-color: #00c2cc;
}
ul .visual3 a.thisBtn {
	background-position:-200px -200px;
	border-color: #00c2cc;
}
#mainVisual {
	width:400px;
	float:left;
	position:relative;
}
#mainVisual img {
	position:absolute;
	left:0;
	top:3px;
}

javascript(jQuery)部分

$(function(){
    var t = setInterval(slideshow, 5000);
    $("#mainVisual,#keyvisualMenu").mouseover(function() { // over
        clearInterval(t);
    }).mouseout(function() { // out
        t = setInterval(slideshow, 5000);
    });
    $("#keyvisualMenu li").mouseover(function(){
        $("#keyvisualMenu a").removeClass("thisBtn");
        $("a",this).addClass("thisBtn");
        var thisVisual = "#visual" +($(this).attr("class")).substring(6,7);
        var nextVisual = "#visual" +(parseInt(($(this).attr("class")).substring(6,7)) % 3 + 1);
        $(nextVisual).appendTo("#mainVisual");
        $(thisVisual).appendTo("#mainVisual");
        $("#"+$(this).attr("class")).appendTo("#mainVisual");
    });
});

//スライドショー関数
function slideshow(){
	var fo = 2000;//フェードアウトに使う時間。
	$("#keyvisualMenu a").removeClass("thisBtn");
	$("#keyvisualMenu li."+$("#mainVisual img:nth-child(2)").attr("id")+" a").addClass("thisBtn");
	$("#mainVisual img:last").fadeOut(fo,function(){
		$(this).prependTo("#mainVisual").css("display","block");
	});
}
Posted in JavaScript and API | Leave a comment

jQuery1.6.1における$.supportが返す値(ブラウザ判別)

jQuery.supportでのブラウザ判別 | World Wide Web Guide を参考にブラウザ判別のプログラムを書いていたら、どうもうまく動かない。

よくよく調べるとWorld Wide Web Guideさんで使っているjQueryのバージョンが1.4.2で自分が使っていたバージョンが1.6.1なのが原因でした。

というわけで、jQery1.6.1がモダンブラウザ及びIE6~IE9に対して返す値を調べてみました。 Continue reading

Posted in JavaScript and API | Leave a comment

HTML5のcanvasで作ったスライドショー

HTML5のcanvasを利用してスライドショーを作成しました。

demo
http://hidakaya.net/demo/slideshow01/index.html

canvasには様々な図形が描けるので、通常のスライドショーではあまり見かけない「円」の形をしたエフェクトを考えてみました。
Continue reading

Posted in JavaScript and API | Leave a comment

Movable Type のtableタグに簡単にclass属性を追加する方法

このブログはWordPressですが、仕事では取引先の都合上Movable Typeを触る機会が多いです。

Movable Typeの投稿でテーブル(表組み)を使いたい場合はちゃんとテーブル用のボタンが用意されていますが、スタイリングは基本的に属性値を手作業で入力します。ソースを直接いじることもできるのでそこからtableタグにclass属性をつけてCSSでスタイリングすることも可能ですが、クライアントがパソコンに慣れていない場合でそこまでさせるのは現実的ではありません。

そこでjQuery(JavaScript)を使ってMovable Typeのtableタグに簡単にclass属性をつける方法をご紹介します。

Continue reading

Posted in JavaScript and API | Leave a comment

jQuery Mobile でのサイト制作における注意点。

スマートフォン用サイト制作のためのjQueryプラグイン JQuery Mobile のデモサイトを作りました。

デモサイトURL(スマートフォンで御覧ください)
http://www.hidakaya.net/jqmobile/index.html

また、コーディングしていて、通常のマークアップとは勝手が違うことに気がついたので合わせてご紹介します。

Continue reading

Posted in JavaScript and API | Leave a comment