前々回のドラッグアンドドロップを応甚しお、画像ビュヌワヌ䜜りに挑戊したしょう。

サンプルを芋る

サンプルは、第9回で䜿ったサンプルを改造しお、画像の領域をドラッグアンドドロップするず、暪䞊びの画像をスラむドさせるこずができるようにしたした。

実装する前に

実装の前に、今回のコンテンツの䜜りに぀いお説明したす。 䞋の図を芋おください。

第9回で䜿ったサンプルをそのたた利甚し、図のようにドラッグするず党䜓がスラむドするように䜜り倉えたす。 その際、第9回ではルヌプ様に、端の画像を入れ替える凊理を入れたしたが、今回は無くおもいいでしょう。

぀たり、暪䞊びになっおいる画像を、䞀぀のタグの䞭に入れおしたい、その芁玠に察しお、ドラッグ凊理を入れればいいずいうこずになりたすので、だい11回のドラッグアンドドロップの゜ヌスコヌドのコピヌで、実装できおしたいたす。

実装しよう

たずはHTMLの゜ヌスから芋おみたしょう。

<style>
.box
{
    width:400px;
    height:300px;
    position:absolute;
}

#container
{
    position:absolute;
    left:0px;
}

#wrap
{
    position:relative;
    width:400px;
    height:300px;
    margin:0 auto;
    overflow:hidden;
}
</style>

</head>
<body>
<div id="wrap">
    <div id="container">
        <div class="box" id="box0"><img src="0.JPG" width="400" height="300"></div>
        <div class="box" id="box1"><img src="1.JPG" width="400" height="300"></div>
        <div class="box" id="box2"><img src="2.JPG" width="400" height="300"></div>
        <div class="box" id="box3"><img src="3.JPG" width="400" height="300"></div>
        <div class="box" id="box4"><img src="4.JPG" width="400" height="300"></div>
        <div class="box" id="box5"><img src="5.JPG" width="400" height="300"></div>
    </div>
</div>
</body>
</html>

そのたた、第9回のコヌドですが、䞀か所だけ違うのが、「.box」が指定された画像を「#container」を指定した「divタグ」で囲っおいたす。 第9回では、「.box」個別に動かしおたしたが、今回は画像をひずたずたりの箱に入れお動かしたす。

次にJavaScriptの゜ヌスです。

<script>
var boxArray = new Array();
var width = 400;
var mouseDown = false;
var preX = 0;

$(function ()
{
    //䜍眮を初期化
    for(var i = 0 ; i < 6 ; i++)
    {
    boxArray.push("#box" + i);
    //スラむドショヌで移動させるため、巊にずらしおおく
    var xPos = width * i;
    $(boxArray[i]).css("left" , xPos + "px");
    }

    $("#container").mousedown(startFunc);
    $(document).mousemove(moveFunc);
    $(document).mouseup(endFunc);
});

/*
ドラッグ終了
マりスダりン・タッチのフラグを解陀
*/
function endFunc(e)
{
    mouseDown = false;
}

/*
ドラッグ刀定開始。
移動甚の開始点ベクトルを蚭定
*/
function startFunc(e)
{
    preX = e.clientX;
    mouseDown = true;

    /*画像のドラッグ凊理になっおしたうのを抑制*/
    if (e.preventDefault) {
        e.preventDefault();
    }
    else {
        e.returnValue = false;
    }
}

/*
ドラッグで移動
*/
function moveFunc(e)
{
    //マりスダりンかタッチ䞭のみ、移動の蚈算を行う。
    if(mouseDown)
    {
        var mouseX = e.clientX;
        var NowX = parseInt($("#container").css("left").replace(/px/ , ""));
        var moveX = mouseX - preX;
        var nextX = NowX + moveX;
        $("#container").css("left" , nextX + "px");

    preX = mouseX;
    }
}
</script>

第9回同様、初期化時に画像を暪䞊びに䞊べたす。 次に、ドラッグ凊理の実装ですが、これは第11回の物をそのたた流甚しおいたす。

唯䞀違うのが、移動方向がXのみでいいので、Y軞に関する蚘述は党お削陀しおいたす。

これでドラッグでの移動が実装できるはずですが、䞀぀問題がありたす。 それは、ドラッグするず、ブラりザのデフォルト動䜜で、画像のドラッグ凊理が実行されおしたうのです。

そこで、うたく画像がドラッグされたずいう凊理をキャンセルしたいです。

むベントのキャンセルは、ブラりザ毎に倚少の違いはありたすが、きちんず甚意されおいたす。 IE系では、むベントオブゞェクトのプロパティ「returnValue」に「false」を指定、非IE系では、「preventDefaultメ゜ッド」を実行すれば、指定したむベントハンドラ以倖のむベントをキャンセルするこずができたす。

/*画像のドラッグ凊理になっおしたうのを抑制*/
if (evt.preventDefault) {
e.preventDefault();
}
else {
e.returnValue = false;
}

「mousedownむベント」のむベントハンドラ内に、䞊蚘のコヌドを入れたす。 ここでは、「e.preventDefault」が存圚すれば、 「preventDefaultメ゜ッド」を実行、なければIE系ず芋なし、「returnValue」にfalseを蚭定し、むベントが倀を返さないようにしたす。

タグが倚局化した堎合、どの芁玠で実行されたむベントがキャンセルされたかずか、ややこしい話はありたすが、今回はむベントを指定する芁玠が䞀぀だけなので、「むベントのキャンセルは、returnValueずpreventDefalultで出来るんだな」ず、芚えおください。

埌は、䟋えばleftに入れる倀を監芖し、領域倖に出ないように、うたく分岐させるなどすれば、さらにコンテンツずしお粟床が䞊がるでしょう。

河野 矩貎
むンハりスのFlashクリ゚むタヌずしお勀務埌、2010幎独立。䞀幎間のフリヌランス期間を経お、2011幎9月にスりィヌツアンドストリヌム株匏䌚瀟を蚭立。䞻にFlash・HTML5を駆䜿した、PC・スマヌトフォン向けむンタラクティブコンテンツを䞭心に掻動䞭。