var max = 11; var maxY = 1; var minY = 1; var folder = "http://www.img360.net/360sample/admin" + "/data/img/imgcube0100005"; var width = "714"; var height = "500"; var sizes = [{w:714, h:500}]; ;(function($) { $.fn.imglotate = function(options){ var mode = 0; var moveMode = 0; var cycleMode = 0; var gestureMode = 0; var zoom = 0; var picEl = this; var startX = 0; var startY = 0; var startLeft = 0; var startHeight = 0; var dragMode = 0; var startScale = null; var scale = 100; var fromScale = 0; var tmpScale = 0; var startX2 = 0; var startY2 = 0; var centerX = 0; var centerY = 0; var dbTapFlg = 0; var scrollStartX = 0; var scrollStartY = 0; var loadedImageCount = 0; //引数を設定する var defaults = { max:1, maxY:1, minY:1, moveX:20, moveY:20, folder:"img", maxZoom: 2, isMobile: false, scale:100, sizes: [{w:500, h:750}, {w:1000, h:1500}, {w:1500, h:2250}, {w:2832, h:4225}] }; var setting = $.extend(defaults, options); //data-img-lotate-folder属性があればsetting.folderを書き換える if ($(picEl).data("imgLotateFolder")) { setting.folder = $(picEl).data("imgLotateFolder"); } var curNo = 1; var curNoY = 1; //画面リサイズに対応 var timer = false; $(window).resize(function() { if (timer !== false) { clearTimeout(timer); } timer = setTimeout(function() { //リロードする //リサイズ時の再描画 /* var w = $(picEl).width(); var h = 500 * (w / 714); $(picEl).height(h); */ //alert($(picEl).width()); if (714 >= 500) { if ($(picEl).parent("div").width() > 543) { $(picEl).width(543); } else { $(picEl).width($(picEl).parent("div").width()); } var w = $(picEl).width(); var h = 500 * (w / 714); $(picEl).height(h); //alert(w); } else { if (500 > 543) { $(picEl).height(543); } var h = $(picEl).height(); var w = 714 * (h / 500); $(picEl).width(w); } sizes = [{w:w, h:h}]; //回転用エリア $(cycleArea).css("width", $(picEl).width() + "px"); //拡大・縮小エリア if (isTouch && !isGesture) { $(html).css("width", $(picEl).width() + "px"); } }, 200); }); //画像描画関数 function printImage() { //alert ("url(" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + ")") ; //$("#testInput").val("url(" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + ")"); //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + "')"); $(picEl).find(".preloadArea").addClass("img360HideVisible"); $(picEl).find(".preloadArea_" + curNoY + "_" + curNo).removeClass("img360HideVisible"); //画像の位置を計算 //var tmp = $(picEl).css("background-position"); //var tmpAry = tmp.split(" "); var tmpL = $(picEl).find(".preloadArea").css("left"); var tmpT = $(picEl).find(".preloadArea").css("top"); var tmpAry = [tmpL, tmpT]; startLeft = tmpAry[0].replace("px", ""); startLeft = startLeft.replace("%", ""); startHeight = tmpAry[1].replace("px", ""); startHeight = startHeight.replace("%", ""); //比率を計算して、表示するサイズを変更する var tmpZoom = zoom; if (isGesture) { tmpZoom = 0; } var diffX = (centerX - startLeft) / (fromScale / 100) * (scale / 100); var tmpX = centerX - diffX; var tmpXWidth = tmpX + setting.sizes[0].w * (scale / 100) - $(picEl).width(); //var tmpXWidth = centerX + ((setting.sizes[0].w * (scale / 100)) / 2) - $(picEl).width(); //var tmpX = centerX - ((setting.sizes[0].w * (scale / 100)) / 2); //alert(tmpXWidth); if (tmpX > 0) { tmpX = 0; //alert(1); } else if (tmpXWidth < 0) { tmpX = tmpX - tmpXWidth; //alert(2); } var diffY = (centerY - startHeight) / (fromScale / 100) * (scale / 100); var tmpY = centerY - diffY; var tmpYHeight = tmpY + setting.sizes[0].h * (scale / 100) - $(picEl).height(); //var tmpYHeight = centerY + ((setting.sizes[0].h * (scale / 100)) / 2) - $(picEl).height(); //var tmpY = centerY - ((setting.sizes[0].h * (scale / 100)) / 2); if (tmpY > 0) { tmpY = 0; } else if (tmpYHeight < 0) { tmpY = tmpY - tmpYHeight; } //$(picEl).css("background-position", tmpX + 'px ' + tmpY + 'px'); //$(picEl).css("background-size", scale + '% ' + scale + '%'); $(picEl).find(".preloadArea").css("left", (tmpX / (scale / 100) * - 1) + 'px'); $(picEl).find(".preloadArea").css("top", (tmpY / (scale / 100) * - 1) + 'px'); $(picEl).find(".preloadArea").css("transform", "scale(" + scale / 100 + ")"); } //タッチができる環境か判定 var isTouch = ('ontouchstart' in window); //ジェスチャーができる環境か判定 var isGesture = ('ongesturestart' in window); //縦回転できるか var yFlg = (setting.minY < 1 || setting.maxY > 1); if (isGesture) { //zoom = setting.maxZoom; } //表示状態の確認 if ($(picEl).is(':visible')) { //回転用エリアの表示 if (yFlg) { var cycleArea = $('
 
').insertAfter(this); } else { var cycleArea = $('
 
').insertAfter(this); } cycleArea.on("touchstart mousedown", this, function(e){ cycleMode = 1; if (!isTouch) { scrollStartX = e.clientX; scrollStartY = e.clientY; } else { scrollStartX = e.originalEvent.changedTouches[0].clientX; scrollStartY = e.originalEvent.changedTouches[0].clientY; } //var tmp = $(picEl).css("background-position"); var tmpL = $(picEl).find(".preloadArea").css("left"); var tmpT = $(picEl).find(".preloadArea").css("top"); var tmpAry = [tmpL, tmpT]; //var tmpAry = tmp.split(" "); startLeft = tmpAry[0].replace("px", ""); startLeft = startLeft.replace("%", ""); startHeight = tmpAry[1].replace("px", ""); startHeight = startHeight.replace("%", ""); return false; }) cycleArea.on("touchmove mousemove", null, function(e){ //回転のみ if (gestureMode != 1 && cycleMode == 1) { var x; var y; if (!isTouch) { x = e.clientX; y = e.clientY; } else { x = e.originalEvent.changedTouches[0].clientX; y = e.originalEvent.changedTouches[0].clientY; } //画像の回転 //X座標 if (scrollStartX + setting.moveX < x) { scrollStartX += setting.moveX; curNo++; moveMode = 1; if (curNo > setting.max) { curNo = 1; } } else if (scrollStartX - setting.moveX > x) { scrollStartX -= setting.moveX; curNo--; moveMode = 1; if (curNo < 1) { curNo = setting.max; } } $("#aaa").val(curNo); $("#bbb").val(scrollStartX); //Y座標 //alert((scrollStartY + " - " + $(this).height()) + " - " + setting.moveY + " < " + y); if (scrollStartY + setting.moveY < y) { scrollStartY += setting.moveY; curNoY++; moveMode = 1; if (curNoY > setting.maxY) { //curNoY = 1; curNoY = setting.maxY; } } else if (scrollStartY - setting.moveY > y) { scrollStartY -= setting.moveY; curNoY--; moveMode = 1; if (curNoY < setting.minY) { //curNoY = setting.maxY; curNoY = setting.minY; } } //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + "')"); $(picEl).find(".preloadArea").addClass("img360HideVisible"); $(picEl).find(".preloadArea_" + curNoY + "_" + curNo).removeClass("img360HideVisible"); if (isTouch && isGesture) { //$(picEl).css("background-size", scale + '% ' + scale + '%'); } else if (isTouch) { //$(picEl).css("background-size", setting.sizes[zoom].w + 'px ' + setting.sizes[zoom].h + 'px'); } } return false; }); cycleArea.on("mouseup", null, function(e){ cycleMode = 0; }); cycleArea.on("touchend", null, function(e){ cycleMode = 0; //回転させずに手を離したか判定 if (moveMode == 0) { var x; var y; if (!isTouch) { x = e.clientX; y = e.clientY; } else { x = e.originalEvent.changedTouches[0].clientX; y = e.originalEvent.changedTouches[0].clientY; } if (x > $(this).offset().left + ($(this).width() / 2)) { curNo++; if (curNo > setting.max) { curNo = 1; } } else { curNo--; if (curNo < 1) { curNo = setting.max; } } //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + "')"); $(picEl).find(".preloadArea").addClass("img360HideVisible"); $(picEl).find(".preloadArea_" + curNoY + "_" + curNo).removeClass("img360HideVisible"); } moveMode = 0; }); cycleArea.on("click", null, function(e){ //回転させずに手を離したか判定 if (moveMode == 0) { var x; var y; if (!isTouch) { x = e.clientX; y = e.clientY; } else { x = e.originalEvent.changedTouches[0].clientX; y = e.originalEvent.changedTouches[0].clientY; } if (x > $(this).offset().left + ($(this).width() / 2)) { curNo++; if (curNo > setting.max) { curNo = 1; } } else { curNo--; if (curNo < 1) { curNo = setting.max; } } //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + "')"); $(picEl).find(".preloadArea").addClass("img360HideVisible"); $(picEl).find(".preloadArea_" + curNoY + "_" + curNo).removeClass("img360HideVisible"); } moveMode = 0; }); //Android用拡大・縮小エリアの表示 if (isTouch && !isGesture) { var html = '
'; if (yFlg) { var htmlB = $('
 
'); var htmlS = $('
 
'); } else { var htmlB = $('
 
'); var htmlS = $('
 
'); } var resizeArea = $(html).insertAfter(this); htmlB.bind("click", function(e){ centerX = $(picEl).width() / 2; centerY = $(picEl).height() / 2; if (scale < ((setting.maxZoom + 1) * 100)) { fromScale = scale; scale += 30; printImage(); } }); var resizeBigArea = $("#big_small_area").append(htmlB); htmlS.bind("click", function(e){ centerX = $(picEl).width() / 2; centerY = $(picEl).height() / 2; if (scale > 100) { fromScale = scale; scale -= 30; printImage(); } }); var resizeSmallArea = $("#big_small_area").append(htmlS); } //プリロード処理 //var preloadArea = $('').appendTo(this); var dialogArea = $('').insertAfter(this); //プリロード中ダイアログ dialogArea.dialog({ autoOpen: false, title: '', closeOnEscape: false, modal: true, width:"auto", height:"80", resizable:false, open: function(event, ui){ $('.ui-dialog-titlebar').hide();; $(".ui-dialog-titlebar-close").hide(); } }); $(dialogArea).dialog('open'); var visibility = ""; for (loadedImageCount = 1; loadedImageCount <= setting.max; loadedImageCount++) { //alert((loadedImageCount + 1)); var preloadArea = $('').appendTo(this); visibility = "img360HideVisible"; $(preloadArea).attr("src", setting.folder + "/" + zoom + "/" + curNoY + " (" + loadedImageCount + ").JPG"); } $(dialogArea).dialog('close'); /* $(preloadArea).on("load", function(){ loadedImageCount++; $(dialogArea).text('Image Loading... ' + loadedImageCount + '/' + setting.max); if (loadedImageCount < setting.max){ setTimeout(loadImages, 10); } else { //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (1).JPG" + "')"); $(dialogArea).dialog('close'); setTimeout(hidepPreloadArea, 0); //preloadArea.hide(); } }); $(dialogArea).dialog('open'); setTimeout(loadImages, 10); */ } function loadImages() { if ((loadedImageCount + 1) <= setting.max) { //alert((loadedImageCount + 1)); $(preloadArea).attr("src", setting.folder + "/" + zoom + "/" + curNoY + " (" + (loadedImageCount + 1) + ").JPG"); } } function hidepPreloadArea() { preloadArea.hide(); } /* $(picEl).on("dblclick", this, function(e){ if (dragMode == 1) { dragMode = 0; $(picEl).css("cursor", "pointer"); } else { dragMode = 1; $(picEl).css("cursor", "move"); } return false; }) */ $(picEl).on("touchstart mousedown", this, function(e){ moveMode = 0; //拡大時か判定 if (zoom > 0 || scale > 100) { mode = 1; if (!isTouch) { startX = e.clientX; startY = e.clientY; } else { startX = e.originalEvent.changedTouches[0].clientX; startY = e.originalEvent.changedTouches[0].clientY; if (e.originalEvent.changedTouches.length > 1) { //2本目の指 startX2 = e.originalEvent.changedTouches[1].clientX; startY2 = e.originalEvent.changedTouches[1].clientY; } } var tmp = $(picEl).css("background-position"); var tmpL = $(picEl).find(".preloadArea").css("left"); var tmpT = $(picEl).find(".preloadArea").css("top"); var tmpAry = [tmpL, tmpT]; //var tmpAry = tmp.split(" "); startLeft = tmpAry[0].replace("px", ""); startLeft = startLeft.replace("%", ""); startHeight = tmpAry[1].replace("px", ""); startHeight = startHeight.replace("%", ""); } else { //未拡大時 cycleMode = 1; if (!isTouch) { scrollStartX = e.clientX; scrollStartY = e.clientY; } else { scrollStartX = e.originalEvent.changedTouches[0].clientX; scrollStartY = e.originalEvent.changedTouches[0].clientY; } var tmp = $(picEl).css("background-position"); var tmpL = $(picEl).find(".preloadArea").css("left"); var tmpT = $(picEl).find(".preloadArea").css("top"); var tmpAry = [tmpL, tmpT]; //var tmpAry = tmp.split(" "); startLeft = tmpAry[0].replace("px", ""); startLeft = startLeft.replace("%", ""); startHeight = tmpAry[1].replace("px", ""); startHeight = startHeight.replace("%", ""); } return false; }) $(document).on("touchmove mousemove", null, function(e){ //移動のみに変更 if (gestureMode != 1 && mode == 1 && (zoom > 0 || scale > 100)) { //未拡大時 var x; var y; if (!isTouch) { x = e.clientX; y = e.clientY; } else { x = e.originalEvent.changedTouches[0].clientX; y = e.originalEvent.changedTouches[0].clientY; } //画像の移動 var tmpZoom = zoom; if (isGesture) { tmpZoom = 0; } var tmpX = 0; if ((parseInt(startLeft) + (x - startX)) > 0) { tmpX = 0; } else if ((parseInt(startLeft) + (x - startX)) < (0 - ((setting.sizes[tmpZoom].w * (scale / 100)) - $(picEl).width()))) { tmpX = ($(picEl).width() - (setting.sizes[tmpZoom].w * (scale / 100))); } else { tmpX = (parseInt(startLeft) + (x - startX)); } var tmpY = 0; if ((parseInt(startHeight) + (y - startY)) > 0) { tmpY = 0; } else if ((parseInt(startHeight) + (y - startY)) < (0 - ((setting.sizes[tmpZoom].h * (scale / 100)) - $(picEl).height()))) { tmpY = ($(picEl).height() - (setting.sizes[tmpZoom].h * (scale / 100))); } else { tmpY = (parseInt(startHeight) + (y - startY)); } moveMode = 1; //$(picEl).css("background-position", tmpX + 'px ' + tmpY + 'px'); $(picEl).find(".preloadArea").css("left", tmpX + 'px'); $(picEl).find(".preloadArea").css("top", tmpY + 'px'); } else if (gestureMode != 1 && cycleMode == 1 && (zoom == 0 && scale == 100)) { //拡大時 var x; var y; if (!isTouch) { x = e.clientX; y = e.clientY; } else { x = e.originalEvent.changedTouches[0].clientX; y = e.originalEvent.changedTouches[0].clientY; } //画像の回転 //X座標 if (scrollStartX + setting.moveX < x) { scrollStartX += setting.moveX; curNo++; moveMode = 1; if (curNo > setting.max) { curNo = 1; } } else if (scrollStartX - setting.moveX > x) { scrollStartX -= setting.moveX; curNo--; moveMode = 1; if (curNo < 1) { curNo = setting.max; } } $("#aaa").val(curNo); $("#bbb").val(scrollStartX); //Y座標 //alert((scrollStartY + " - " + $(this).height()) + " - " + setting.moveY + " < " + y); if (scrollStartY + setting.moveY < y) { scrollStartY += setting.moveY; curNoY++; moveMode = 1; if (curNoY > setting.maxY) { //curNoY = 1; curNoY = setting.maxY; } } else if (scrollStartY - setting.moveY > y) { scrollStartY -= setting.moveY; curNoY--; moveMode = 1; if (curNoY < setting.minY) { //curNoY = setting.maxY; curNoY = setting.minY; } } //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + "')"); $(picEl).find(".preloadArea").addClass("img360HideVisible"); $(picEl).find(".preloadArea_" + curNoY + "_" + curNo).removeClass("img360HideVisible"); if (isTouch && isGesture) { //$(picEl).css("background-size", scale + '% ' + scale + '%'); } else if (isTouch) { //$(picEl).css("background-size", setting.sizes[zoom].w + 'px ' + setting.sizes[zoom].h + 'px'); } } }); $(document).on("touchend mouseup", null, function(e){ mode = 0; cycleMode = 0; }); $(picEl).on("mouseup", null, function(e){ if (moveMode == 0) { $(cycleArea).toggle(); $(resizeArea).toggle(); } moveMode = 0; }); $(picEl).on("touchend", null, function(e){ if (moveMode == 0) { $(cycleArea).toggle(); $(resizeArea).toggle(); } }); $(picEl).on('mousewheel', function(event) { centerX = event.offsetX; centerY = event.offsetY; //alert(centerX + ", " + centerY); if (event.deltaY > 0 && scale < ((setting.maxZoom + 1) * 100)) { fromScale = scale; scale += 10; printImage(); } else if(event.deltaY < 0 && scale >100) { fromScale = scale; scale -= 10; printImage(); } return false; }); $(document).on("keydown", null, function(e){ //画像の回転 //X座標 //→ if (e.keyCode == 39) { curNo++; if (curNo > setting.max) { curNo = 1; } } //← if (e.keyCode == 37) { curNo--; if (curNo < 1) { curNo = setting.max; } } //Y座標 //↑ if (e.keyCode == 38) { curNoY--; if (curNoY < setting.minY) { //curNoY = setting.maxY; curNoY = setting.minY; } } //↓ if (e.keyCode == 40) { curNoY++; if (curNoY > setting.maxY) { curNoY = setting.maxY; } } //$(picEl).css("background-image", "url('" + setting.folder + "/" + zoom + "/" + curNoY + " (" + curNo + ").JPG" + "')"); $(picEl).find(".preloadArea").addClass("img360HideVisible"); $(picEl).find(".preloadArea_" + curNoY + "_" + curNo).removeClass("img360HideVisible"); if (isTouch && isGesture) { $(picEl).css("background-size", scale + '% ' + scale + '%'); } else if (isTouch) { $(picEl).css("background-size", setting.sizes[zoom].w + 'px ' + setting.sizes[zoom].h + 'px'); } if (yFlg && (e.keyCode == 38 || e.keyCode == 40)) { return false; } }) //2本指の対応 $(picEl).on("gesturestart", this, function(e){ if (isGesture) { gestureMode = 1; //2本の指の中心点を計算 centerX = (startX + startX2) / 2; centerY = (startY + startY2) / 2; $("#aaa").val(centerX + ", " + centerY); //var tmp = $(picEl).css("background-position"); //var tmpAry = tmp.split(" "); var tmpL = $(picEl).find(".preloadArea").css("left"); var tmpT = $(picEl).find(".preloadArea").css("top"); var tmpAry = [tmpL, tmpT]; startLeft = tmpAry[0].replace("px", ""); startLeft = startLeft.replace("%", ""); startHeight = tmpAry[1].replace("px", ""); startHeight = startHeight.replace("%", ""); } }) $(picEl).on("gesturechange", this, function(e){ if (isGesture) { var eo = e.originalEvent; var gestureScale = eo.scale; tmpScale = scale * gestureScale; if (tmpScale < 100) { tmpScale = 100; } else if (tmpScale > ((setting.maxZoom + 1) * 100)) { tmpScale = ((setting.maxZoom + 1) * 100); } //比率を計算して、表示するサイズを変更する var tmpZoom = zoom; if (isGesture) { tmpZoom = 0; } var diffX = (centerX - startLeft) / (scale / 100) * (tmpScale / 100); var tmpX = centerX - diffX; var tmpXWidth = tmpX + setting.sizes[0].w * (tmpScale / 100) - $(picEl).width(); if (tmpX > 0) { tmpX = 0; //alert(1); } else if (tmpXWidth < 0) { tmpX = tmpX - tmpXWidth; //alert(2); } var diffY = (centerY - startHeight) / (scale / 100) * (tmpScale / 100); var tmpY = centerY - diffY; var tmpYHeight = tmpY + setting.sizes[0].h * (tmpScale / 100) - $(picEl).height(); if (tmpY > 0) { tmpY = 0; } else if (tmpYHeight < 0) { tmpY = tmpY - tmpYHeight; } //$(picEl).css("background-position", tmpX + 'px ' + tmpY + 'px'); //$(picEl).css("background-size", tmpScale + '% ' + tmpScale + '%'); $(picEl).find(".preloadArea").css("left", (tmpX / (scale / 100) * - 1) + 'px'); $(picEl).find(".preloadArea").css("top", (tmpY / (scale / 100) * - 1) + 'px'); $(picEl).find(".preloadArea").css("transform", "scale(" + scale / 100 + ")"); $("#bbb").val(eo.scale); moveMode = 1; } }) $(picEl).on("gestureend", this, function(e){ if (isGesture) { gestureMode = 0; scale = tmpScale; //$("#aaa").val(0); } }) //画像をセット printImage(); //メソッドチェーン return(this); }; })(jQuery); jQuery(function(){ var ob = jQuery(".imglotate-360view").get(0); jQuery(ob).attr("style", "background-repeat: no-repeat; cursor: pointer; margin: 0 auto; overflow: hidden; position: relative"); //高さをセットする if (width >= height) { if (jQuery(ob).width() > 543) { jQuery(ob).width(543); } var w = jQuery(ob).width(); var h = height * (w / width); jQuery(ob).height(h); } else { if (height > 543) { jQuery(ob).height(543); } else { jQuery(ob).height(height); } var h = jQuery(ob).height(); var w = width * (h / height); jQuery(ob).width(w); } sizes = [{w:w, h:h}]; jQuery(ob).imglotate({"max":max,"maxY":maxY,"minY":minY,"moveY":30,"folder":"http://www.img360.net/360sample/admin" + "/data/img/imgcube0100005","maxZoom":2, isMobile:false, "sizes":sizes }); jQuery(ob).removeClass("imglotate-360view"); });